]> git.openstreetmap.org Git - rails.git/blobdiff - vendor/assets/iD/iD/mapillary-js/mapillary.js
Merge remote-tracking branch 'upstream/pull/4735'
[rails.git] / vendor / assets / iD / iD / mapillary-js / mapillary.js
index fb7fe80e2d5bac1c8723486979117bb7ca19dd6c..8359d54f7a200fd0b8c5baa84cec5145c436aec3 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'
-
-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, j, 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, j = 0; i < l; i += 4, j += 3) {
-    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('')
-}
-
-},{}],2:[function(require,module,exports){
-
-},{}],3:[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;
-})();
-
-},{}],4:[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.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; };
-
-},{}],5:[function(require,module,exports){
-(function (global){
-/*!
- * The buffer module from node.js, for the browser.
- *
- * @author   Feross Aboukhadijeh <feross@feross.org> <http://feross.org>
- * @license  MIT
- */
-/* eslint-disable no-proto */
-
-'use strict'
-
-var base64 = require('base64-js')
-var ieee754 = require('ieee754')
-var isArray = require('isarray')
-
-exports.Buffer = Buffer
-exports.SlowBuffer = SlowBuffer
-exports.INSPECT_MAX_BYTES = 50
-
-/**
- * If `Buffer.TYPED_ARRAY_SUPPORT`:
- *   === true    Use Uint8Array implementation (fastest)
- *   === false   Use 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+.
- *
- * Due to various browser bugs, sometimes the Object implementation will be used even
- * when the browser supports typed arrays.
- *
- * Note:
- *
- *   - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances,
- *     See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.
- *
- *   - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.
- *
- *   - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of
- *     incorrect length in some situations.
-
- * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they
- * get the Object implementation, which is slower but behaves correctly.
- */
-Buffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined
-  ? global.TYPED_ARRAY_SUPPORT
-  : typedArraySupport()
-
-/*
- * Export kMaxLength after typed array support is determined.
- */
-exports.kMaxLength = kMaxLength()
-
-function typedArraySupport () {
-  try {
-    var arr = new Uint8Array(1)
-    arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }}
-    return arr.foo() === 42 && // typed array instances can be augmented
-        typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`
-        arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray`
-  } catch (e) {
-    return false
-  }
-}
-
-function kMaxLength () {
-  return Buffer.TYPED_ARRAY_SUPPORT
-    ? 0x7fffffff
-    : 0x3fffffff
-}
-
-function createBuffer (that, length) {
-  if (kMaxLength() < length) {
-    throw new RangeError('Invalid typed array length')
-  }
-  if (Buffer.TYPED_ARRAY_SUPPORT) {
-    // Return an augmented `Uint8Array` instance, for best performance
-    that = new Uint8Array(length)
-    that.__proto__ = Buffer.prototype
-  } else {
-    // Fallback: Return an object instance of the Buffer class
-    if (that === null) {
-      that = new Buffer(length)
-    }
-    that.length = length
-  }
-
-  return that
-}
-
-/**
- * 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) {
-  if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) {
-    return new Buffer(arg, encodingOrOffset, length)
-  }
-
-  // Common case.
-  if (typeof arg === 'number') {
-    if (typeof encodingOrOffset === 'string') {
-      throw new Error(
-        'If encoding is specified then the first argument must be a string'
-      )
-    }
-    return allocUnsafe(this, arg)
-  }
-  return from(this, arg, encodingOrOffset, length)
-}
-
-Buffer.poolSize = 8192 // not used by this implementation
-
-// TODO: Legacy, not needed anymore. Remove in next major version.
-Buffer._augment = function (arr) {
-  arr.__proto__ = Buffer.prototype
-  return arr
-}
-
-function from (that, value, encodingOrOffset, length) {
-  if (typeof value === 'number') {
-    throw new TypeError('"value" argument must not be a number')
-  }
-
-  if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {
-    return fromArrayBuffer(that, value, encodingOrOffset, length)
-  }
-
-  if (typeof value === 'string') {
-    return fromString(that, value, encodingOrOffset)
-  }
-
-  return fromObject(that, 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(null, value, encodingOrOffset, length)
-}
-
-if (Buffer.TYPED_ARRAY_SUPPORT) {
-  Buffer.prototype.__proto__ = Uint8Array.prototype
-  Buffer.__proto__ = Uint8Array
-  if (typeof Symbol !== 'undefined' && Symbol.species &&
-      Buffer[Symbol.species] === Buffer) {
-    // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97
-    Object.defineProperty(Buffer, Symbol.species, {
-      value: null,
-      configurable: true
-    })
-  }
-}
-
-function assertSize (size) {
-  if (typeof size !== 'number') {
-    throw new TypeError('"size" argument must be a number')
-  } else if (size < 0) {
-    throw new RangeError('"size" argument must not be negative')
-  }
-}
-
-function alloc (that, size, fill, encoding) {
-  assertSize(size)
-  if (size <= 0) {
-    return createBuffer(that, 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(that, size).fill(fill, encoding)
-      : createBuffer(that, size).fill(fill)
-  }
-  return createBuffer(that, size)
-}
-
-/**
- * Creates a new filled Buffer instance.
- * alloc(size[, fill[, encoding]])
- **/
-Buffer.alloc = function (size, fill, encoding) {
-  return alloc(null, size, fill, encoding)
-}
-
-function allocUnsafe (that, size) {
-  assertSize(size)
-  that = createBuffer(that, size < 0 ? 0 : checked(size) | 0)
-  if (!Buffer.TYPED_ARRAY_SUPPORT) {
-    for (var i = 0; i < size; ++i) {
-      that[i] = 0
-    }
-  }
-  return that
-}
-
-/**
- * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.
- * */
-Buffer.allocUnsafe = function (size) {
-  return allocUnsafe(null, size)
-}
-/**
- * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.
- */
-Buffer.allocUnsafeSlow = function (size) {
-  return allocUnsafe(null, size)
-}
-
-function fromString (that, string, encoding) {
-  if (typeof encoding !== 'string' || encoding === '') {
-    encoding = 'utf8'
-  }
-
-  if (!Buffer.isEncoding(encoding)) {
-    throw new TypeError('"encoding" must be a valid string encoding')
-  }
-
-  var length = byteLength(string, encoding) | 0
-  that = createBuffer(that, length)
-
-  var actual = that.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')
-    that = that.slice(0, actual)
-  }
-
-  return that
-}
-
-function fromArrayLike (that, array) {
-  var length = array.length < 0 ? 0 : checked(array.length) | 0
-  that = createBuffer(that, length)
-  for (var i = 0; i < length; i += 1) {
-    that[i] = array[i] & 255
-  }
-  return that
-}
-
-function fromArrayBuffer (that, array, byteOffset, length) {
-  array.byteLength // this throws if `array` is not a valid ArrayBuffer
-
-  if (byteOffset < 0 || array.byteLength < byteOffset) {
-    throw new RangeError('\'offset\' is out of bounds')
-  }
-
-  if (array.byteLength < byteOffset + (length || 0)) {
-    throw new RangeError('\'length\' is out of bounds')
-  }
-
-  if (byteOffset === undefined && length === undefined) {
-    array = new Uint8Array(array)
-  } else if (length === undefined) {
-    array = new Uint8Array(array, byteOffset)
-  } else {
-    array = new Uint8Array(array, byteOffset, length)
-  }
-
-  if (Buffer.TYPED_ARRAY_SUPPORT) {
-    // Return an augmented `Uint8Array` instance, for best performance
-    that = array
-    that.__proto__ = Buffer.prototype
-  } else {
-    // Fallback: Return an object instance of the Buffer class
-    that = fromArrayLike(that, array)
-  }
-  return that
-}
-
-function fromObject (that, obj) {
-  if (Buffer.isBuffer(obj)) {
-    var len = checked(obj.length) | 0
-    that = createBuffer(that, len)
-
-    if (that.length === 0) {
-      return that
-    }
-
-    obj.copy(that, 0, 0, len)
-    return that
-  }
-
-  if (obj) {
-    if ((typeof ArrayBuffer !== 'undefined' &&
-        obj.buffer instanceof ArrayBuffer) || 'length' in obj) {
-      if (typeof obj.length !== 'number' || isnan(obj.length)) {
-        return createBuffer(that, 0)
-      }
-      return fromArrayLike(that, obj)
-    }
-
-    if (obj.type === 'Buffer' && isArray(obj.data)) {
-      return fromArrayLike(that, obj.data)
-    }
-  }
-
-  throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.')
-}
-
-function checked (length) {
-  // Note: cannot use `length < kMaxLength()` here because that fails when
-  // length is NaN (which is otherwise coerced to zero.)
-  if (length >= kMaxLength()) {
-    throw new RangeError('Attempt to allocate Buffer larger than maximum ' +
-                         'size: 0x' + kMaxLength().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)
-}
-
-Buffer.compare = function compare (a, b) {
-  if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {
-    throw new TypeError('Arguments must be Buffers')
-  }
-
-  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 (!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 (!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 (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' &&
-      (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) {
-    return string.byteLength
-  }
-  if (typeof string !== 'string') {
-    string = '' + string
-  }
-
-  var len = string.length
-  if (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':
-      case undefined:
-        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 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
-    }
-  }
-}
-
-// The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect
-// Buffer instances.
-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 | 0
-  if (length === 0) return ''
-  if (arguments.length === 0) return utf8Slice(this, 0, length)
-  return slowToString.apply(this, arguments)
-}
-
-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
-  if (this.length > 0) {
-    str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')
-    if (this.length > max) str += ' ... '
-  }
-  return '<Buffer ' + str + '>'
-}
-
-Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {
-  if (!Buffer.isBuffer(target)) {
-    throw new TypeError('Argument must be a Buffer')
-  }
-
-  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 (isNaN(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 (Buffer.TYPED_ARRAY_SUPPORT &&
-        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
-    }
-  }
-
-  // must be an even number of digits
-  var strLen = string.length
-  if (strLen % 2 !== 0) throw new TypeError('Invalid hex string')
-
-  if (length > strLen / 2) {
-    length = strLen / 2
-  }
-  for (var i = 0; i < length; ++i) {
-    var parsed = parseInt(string.substr(i * 2, 2), 16)
-    if (isNaN(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
-    }
-  // legacy write(string, encoding, offset, length) - remove in v0.13
-  } 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
-  if (Buffer.TYPED_ARRAY_SUPPORT) {
-    newBuf = this.subarray(start, end)
-    newBuf.__proto__ = Buffer.prototype
-  } else {
-    var sliceLen = end - start
-    newBuf = new Buffer(sliceLen, undefined)
-    for (var i = 0; i < sliceLen; ++i) {
-      newBuf[i] = this[i + start]
-    }
-  }
-
-  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) {
-  if (!noAssert) checkOffset(offset, 1, this.length)
-  return this[offset]
-}
-
-Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {
-  if (!noAssert) checkOffset(offset, 2, this.length)
-  return this[offset] | (this[offset + 1] << 8)
-}
-
-Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {
-  if (!noAssert) checkOffset(offset, 2, this.length)
-  return (this[offset] << 8) | this[offset + 1]
-}
-
-Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {
-  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) {
-  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) {
-  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) {
-  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) {
-  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) {
-  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) {
-  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) {
-  if (!noAssert) checkOffset(offset, 4, this.length)
-  return ieee754.read(this, offset, true, 23, 4)
-}
-
-Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {
-  if (!noAssert) checkOffset(offset, 4, this.length)
-  return ieee754.read(this, offset, false, 23, 4)
-}
-
-Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {
-  if (!noAssert) checkOffset(offset, 8, this.length)
-  return ieee754.read(this, offset, true, 52, 8)
-}
-
-Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {
-  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)
-  if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)
-  this[offset] = (value & 0xff)
-  return offset + 1
-}
-
-function objectWriteUInt16 (buf, value, offset, littleEndian) {
-  if (value < 0) value = 0xffff + value + 1
-  for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) {
-    buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>
-      (littleEndian ? i : 1 - i) * 8
-  }
-}
-
-Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {
-  value = +value
-  offset = offset | 0
-  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
-  if (Buffer.TYPED_ARRAY_SUPPORT) {
-    this[offset] = (value & 0xff)
-    this[offset + 1] = (value >>> 8)
-  } else {
-    objectWriteUInt16(this, value, offset, true)
-  }
-  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)
-  if (Buffer.TYPED_ARRAY_SUPPORT) {
-    this[offset] = (value >>> 8)
-    this[offset + 1] = (value & 0xff)
-  } else {
-    objectWriteUInt16(this, value, offset, false)
-  }
-  return offset + 2
-}
-
-function objectWriteUInt32 (buf, value, offset, littleEndian) {
-  if (value < 0) value = 0xffffffff + value + 1
-  for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) {
-    buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff
-  }
-}
-
-Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {
-  value = +value
-  offset = offset | 0
-  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
-  if (Buffer.TYPED_ARRAY_SUPPORT) {
-    this[offset + 3] = (value >>> 24)
-    this[offset + 2] = (value >>> 16)
-    this[offset + 1] = (value >>> 8)
-    this[offset] = (value & 0xff)
-  } else {
-    objectWriteUInt32(this, value, offset, true)
-  }
-  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)
-  if (Buffer.TYPED_ARRAY_SUPPORT) {
-    this[offset] = (value >>> 24)
-    this[offset + 1] = (value >>> 16)
-    this[offset + 2] = (value >>> 8)
-    this[offset + 3] = (value & 0xff)
-  } else {
-    objectWriteUInt32(this, value, offset, false)
-  }
-  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 (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)
-  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)
-  if (Buffer.TYPED_ARRAY_SUPPORT) {
-    this[offset] = (value & 0xff)
-    this[offset + 1] = (value >>> 8)
-  } else {
-    objectWriteUInt16(this, value, offset, true)
-  }
-  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)
-  if (Buffer.TYPED_ARRAY_SUPPORT) {
-    this[offset] = (value >>> 8)
-    this[offset + 1] = (value & 0xff)
-  } else {
-    objectWriteUInt16(this, value, offset, false)
-  }
-  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)
-  if (Buffer.TYPED_ARRAY_SUPPORT) {
-    this[offset] = (value & 0xff)
-    this[offset + 1] = (value >>> 8)
-    this[offset + 2] = (value >>> 16)
-    this[offset + 3] = (value >>> 24)
-  } else {
-    objectWriteUInt32(this, value, offset, true)
-  }
-  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
-  if (Buffer.TYPED_ARRAY_SUPPORT) {
-    this[offset] = (value >>> 24)
-    this[offset + 1] = (value >>> 16)
-    this[offset + 2] = (value >>> 8)
-    this[offset + 3] = (value & 0xff)
-  } else {
-    objectWriteUInt32(this, value, offset, false)
-  }
-  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) {
-  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) {
-  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 (!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('sourceStart out of bounds')
-  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
-  var i
-
-  if (this === target && start < targetStart && targetStart < end) {
-    // descending copy from end
-    for (i = len - 1; i >= 0; --i) {
-      target[i + targetStart] = this[i + start]
-    }
-  } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {
-    // ascending copy from start
-    for (i = 0; i < len; ++i) {
-      target[i + targetStart] = this[i + start]
-    }
-  } else {
-    Uint8Array.prototype.set.call(
-      target,
-      this.subarray(start, start + len),
-      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 (val.length === 1) {
-      var code = val.charCodeAt(0)
-      if (code < 256) {
-        val = code
-      }
-    }
-    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)
-    }
-  } 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
-      : utf8ToBytes(new Buffer(val, encoding).toString())
-    var len = bytes.length
-    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 strips out invalid characters like \n and \t from the string, base64-js does not
-  str = stringtrim(str).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 stringtrim (str) {
-  if (str.trim) return str.trim()
-  return str.replace(/^\s+|\s+$/g, '')
-}
-
-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
-}
-
-function isnan (val) {
-  return val !== val // eslint-disable-line no-self-compare
-}
-
-}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-
-},{"base64-js":1,"ieee754":15,"isarray":19}],6:[function(require,module,exports){
-'use strict';
-
-module.exports = 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) return triangles;
-
-    var minX, minY, maxX, maxY, x, y, size;
-
-    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 size are later used to transform coords into integers for z-order calculation
-        size = Math.max(maxX - minX, maxY - minY);
-    }
-
-    earcutLinked(outerNode, triangles, dim, minX, minY, size);
-
-    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) return null;
-            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, size, pass) {
-    if (!ear) return;
-
-    // interlink polygon nodes in z-order
-    if (!pass && size) indexCurve(ear, minX, minY, size);
-
-    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 (size ? isEarHashed(ear, minX, minY, size) : 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 vertice 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, size, 1);
-
-            // if this didn't work, try curing all small self-intersections locally
-            } else if (pass === 1) {
-                ear = cureLocalIntersections(ear, triangles, dim);
-                earcutLinked(ear, triangles, dim, minX, minY, size, 2);
-
-            // as a last resort, try splitting the remaining polygon into two
-            } else if (pass === 2) {
-                splitEarcut(ear, triangles, dim, minX, minY, size);
-            }
-
-            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, size) {
-    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, size),
-        maxZ = zOrder(maxTX, maxTY, minX, minY, size);
-
-    // first look for points inside the triangle in increasing z-order
-    var p = ear.nextZ;
-
-    while (p && p.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.nextZ;
-    }
-
-    // then look for points in decreasing z-order
-    p = ear.prevZ;
-
-    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;
-    }
-
-    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 p;
-}
-
-// try splitting polygon into two and triangulate them independently
-function splitEarcut(start, triangles, dim, minX, minY, size) {
-    // 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, size);
-                earcutLinked(c, triangles, dim, minX, minY, size);
-                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);
-        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) {
-            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.prev; // hole touches outer segment; pick lower 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.next;
-
-    while (p !== stop) {
-        if (hx >= p.x && p.x >= mx &&
-                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 ((tan < tanMin || (tan === tanMin && p.x > m.x)) && locallyInside(p, hole)) {
-                m = p;
-                tanMin = tan;
-            }
-        }
-
-        p = p.next;
-    }
-
-    return m;
-}
-
-// interlink polygon nodes in z-order
-function indexCurve(start, minX, minY, size) {
-    var p = start;
-    do {
-        if (p.z === null) p.z = zOrder(p.x, p.y, minX, minY, size);
-        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) {
-                    e = q;
-                    q = q.nextZ;
-                    qSize--;
-                } else if (qSize === 0 || !q) {
-                    e = p;
-                    p = p.nextZ;
-                    pSize--;
-                } else if (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 size of the data bounding box
-function zOrder(x, y, minX, minY, size) {
-    // coords are transformed into non-negative 15-bit integer range
-    x = 32767 * (x - minX) / size;
-    y = 32767 * (y - minY) / size;
-
-    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) 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) &&
-           locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b);
-}
-
-// 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) {
-    if ((equals(p1, q1) && equals(p2, q2)) ||
-        (equals(p1, q2) && equals(p2, q1))) return true;
-    return area(p1, q1, p2) > 0 !== area(p1, q1, q2) > 0 &&
-           area(p2, q2, p1) > 0 !== area(p2, q2, q1) > 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)) && (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) {
-    // vertice index in coordinates array
-    this.i = i;
-
-    // vertex coordinates
-    this.x = x;
-    this.y = y;
-
-    // previous and next vertice 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;
-};
-
-},{}],7:[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":17}],8:[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":9,"./request":12}],9:[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;
-};
-
-},{}],10:[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 : {})
-
-},{}],11:[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 : {})
-
-},{}],12:[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":10,"./getXMLHttpRequest":11}],13:[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 : {})
-
-},{}],14:[function(require,module,exports){
-(function (global){
-var topLevel = typeof global !== 'undefined' ? global :
-    typeof window !== 'undefined' ? window : {}
-var minDoc = require('min-document');
-
-if (typeof document !== 'undefined') {
-    module.exports = document;
-} else {
-    var 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":2}],15:[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
-}
-
-},{}],16:[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 : {})
-
-},{}],17:[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":16}],18:[function(require,module,exports){
-"use strict";
-
-module.exports = function isObject(x) {
-       return typeof x === "object" && x !== null;
-};
-
-},{}],19:[function(require,module,exports){
-var toString = {}.toString;
-
-module.exports = Array.isArray || function (arr) {
-  return toString.call(arr) == '[object Array]';
-};
-
-},{}],20:[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
-
-},{}],21:[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":4}],22:[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;
-
-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,
-            str = readUtf8(this.buf, this.pos, end);
-        this.pos = end;
-        return str;
-    },
-
-    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) {
-        var end = readPackedEnd(this);
-        arr = arr || [];
-        while (this.pos < end) arr.push(this.readVarint(isSigned));
-        return arr;
-    },
-    readPackedSVarint: function(arr) {
-        var end = readPackedEnd(this);
-        arr = arr || [];
-        while (this.pos < end) arr.push(this.readSVarint());
-        return arr;
-    },
-    readPackedBoolean: function(arr) {
-        var end = readPackedEnd(this);
-        arr = arr || [];
-        while (this.pos < end) arr.push(this.readBoolean());
-        return arr;
-    },
-    readPackedFloat: function(arr) {
-        var end = readPackedEnd(this);
-        arr = arr || [];
-        while (this.pos < end) arr.push(this.readFloat());
-        return arr;
-    },
-    readPackedDouble: function(arr) {
-        var end = readPackedEnd(this);
-        arr = arr || [];
-        while (this.pos < end) arr.push(this.readDouble());
-        return arr;
-    },
-    readPackedFixed32: function(arr) {
-        var end = readPackedEnd(this);
-        arr = arr || [];
-        while (this.pos < end) arr.push(this.readFixed32());
-        return arr;
-    },
-    readPackedSFixed32: function(arr) {
-        var end = readPackedEnd(this);
-        arr = arr || [];
-        while (this.pos < end) arr.push(this.readSFixed32());
-        return arr;
-    },
-    readPackedFixed64: function(arr) {
-        var end = readPackedEnd(this);
-        arr = arr || [];
-        while (this.pos < end) arr.push(this.readFixed64());
-        return arr;
-    },
-    readPackedSFixed64: function(arr) {
-        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) { this.writeMessage(tag, writePackedVarint, arr);   },
-    writePackedSVarint:  function(tag, arr) { this.writeMessage(tag, writePackedSVarint, arr);  },
-    writePackedBoolean:  function(tag, arr) { this.writeMessage(tag, writePackedBoolean, arr);  },
-    writePackedFloat:    function(tag, arr) { this.writeMessage(tag, writePackedFloat, arr);    },
-    writePackedDouble:   function(tag, arr) { this.writeMessage(tag, writePackedDouble, arr);   },
-    writePackedFixed32:  function(tag, arr) { this.writeMessage(tag, writePackedFixed32, arr);  },
-    writePackedSFixed32: function(tag, arr) { this.writeMessage(tag, writePackedSFixed32, arr); },
-    writePackedFixed64:  function(tag, arr) { this.writeMessage(tag, writePackedFixed64, arr);  },
-    writePackedSFixed64: function(tag, arr) { 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.ceil(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 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":15}],23:[function(require,module,exports){
-'use strict';
-
-module.exports = partialSort;
-
-// Floyd-Rivest selection algorithm:
-// Rearrange items so that all items in the [left, k] range are smaller than all items in (k, right];
-// The k-th element will have the (k - left + 1)th smallest value in [left, right]
-
-function partialSort(arr, k, left, right, compare) {
-    left = left || 0;
-    right = right || (arr.length - 1);
-    compare = compare || defaultCompare;
-
-    while (right > left) {
-        if (right - left > 600) {
-            var n = right - left + 1;
-            var m = k - left + 1;
-            var z = Math.log(n);
-            var s = 0.5 * Math.exp(2 * z / 3);
-            var sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1);
-            var newLeft = Math.max(left, Math.floor(k - m * s / n + sd));
-            var newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd));
-            partialSort(arr, k, newLeft, newRight, compare);
-        }
-
-        var t = arr[k];
-        var i = left;
-        var j = right;
-
-        swap(arr, left, k);
-        if (compare(arr[right], t) > 0) swap(arr, left, right);
-
-        while (i < j) {
-            swap(arr, i, j);
-            i++;
-            j--;
-            while (compare(arr[i], t) < 0) i++;
-            while (compare(arr[j], t) > 0) j--;
-        }
-
-        if (compare(arr[left], t) === 0) swap(arr, left, j);
-        else {
-            j++;
-            swap(arr, j, right);
-        }
-
-        if (j <= k) left = j + 1;
-        if (k <= j) right = j - 1;
-    }
-}
-
-function swap(arr, i, j) {
-    var tmp = arr[i];
-    arr[i] = arr[j];
-    arr[j] = tmp;
-}
-
-function defaultCompare(a, b) {
-    return a < b ? -1 : a > b ? 1 : 0;
-}
-
-},{}],24:[function(require,module,exports){
-'use strict';
-
-module.exports = rbush;
-
-var quickselect = require('quickselect');
-
-function rbush(maxEntries, format) {
-    if (!(this instanceof rbush)) return new rbush(maxEntries, format);
-
-    // max entries in a node is 9 by default; min node fill is 40% for best performance
-    this._maxEntries = Math.max(4, maxEntries || 9);
-    this._minEntries = Math.max(2, Math.ceil(this._maxEntries * 0.4));
-
-    if (format) {
-        this._initFormat(format);
-    }
-
-    this.clear();
-}
-
-rbush.prototype = {
-
-    all: function () {
-        return this._all(this.data, []);
-    },
-
-    search: function (bbox) {
-
-        var node = this.data,
-            result = [],
-            toBBox = this.toBBox;
-
-        if (!intersects(bbox, node)) return result;
-
-        var nodesToSearch = [],
-            i, len, child, childBBox;
-
-        while (node) {
-            for (i = 0, len = node.children.length; i < len; i++) {
-
-                child = node.children[i];
-                childBBox = node.leaf ? toBBox(child) : child;
-
-                if (intersects(bbox, childBBox)) {
-                    if (node.leaf) result.push(child);
-                    else if (contains(bbox, childBBox)) this._all(child, result);
-                    else nodesToSearch.push(child);
-                }
-            }
-            node = nodesToSearch.pop();
-        }
-
-        return result;
-    },
-
-    collides: function (bbox) {
-
-        var node = this.data,
-            toBBox = this.toBBox;
-
-        if (!intersects(bbox, node)) return false;
-
-        var nodesToSearch = [],
-            i, len, child, childBBox;
-
-        while (node) {
-            for (i = 0, len = node.children.length; i < len; i++) {
-
-                child = node.children[i];
-                childBBox = node.leaf ? toBBox(child) : child;
-
-                if (intersects(bbox, childBBox)) {
-                    if (node.leaf || contains(bbox, childBBox)) return true;
-                    nodesToSearch.push(child);
-                }
-            }
-            node = nodesToSearch.pop();
-        }
-
-        return false;
-    },
-
-    load: function (data) {
-        if (!(data && data.length)) return this;
-
-        if (data.length < this._minEntries) {
-            for (var i = 0, len = data.length; i < len; i++) {
-                this.insert(data[i]);
-            }
-            return this;
-        }
-
-        // recursively build the tree with the given data from stratch using OMT algorithm
-        var node = this._build(data.slice(), 0, data.length - 1, 0);
-
-        if (!this.data.children.length) {
-            // save as is if tree is empty
-            this.data = node;
-
-        } else if (this.data.height === node.height) {
-            // split root if trees have the same height
-            this._splitRoot(this.data, node);
-
-        } else {
-            if (this.data.height < node.height) {
-                // swap trees if inserted one is bigger
-                var tmpNode = this.data;
-                this.data = node;
-                node = tmpNode;
-            }
-
-            // insert the small tree into the large tree at appropriate level
-            this._insert(node, this.data.height - node.height - 1, true);
-        }
-
-        return this;
-    },
-
-    insert: function (item) {
-        if (item) this._insert(item, this.data.height - 1);
-        return this;
-    },
-
-    clear: function () {
-        this.data = createNode([]);
-        return this;
-    },
-
-    remove: function (item, equalsFn) {
-        if (!item) return this;
-
-        var node = this.data,
-            bbox = this.toBBox(item),
-            path = [],
-            indexes = [],
-            i, parent, index, goingUp;
-
-        // depth-first iterative tree traversal
-        while (node || path.length) {
-
-            if (!node) { // go up
-                node = path.pop();
-                parent = path[path.length - 1];
-                i = indexes.pop();
-                goingUp = true;
-            }
-
-            if (node.leaf) { // check current node
-                index = findItem(item, node.children, equalsFn);
-
-                if (index !== -1) {
-                    // item found, remove the item and condense tree upwards
-                    node.children.splice(index, 1);
-                    path.push(node);
-                    this._condense(path);
-                    return this;
-                }
-            }
-
-            if (!goingUp && !node.leaf && contains(node, bbox)) { // go down
-                path.push(node);
-                indexes.push(i);
-                i = 0;
-                parent = node;
-                node = node.children[0];
-
-            } else if (parent) { // go right
-                i++;
-                node = parent.children[i];
-                goingUp = false;
-
-            } else node = null; // nothing found
-        }
-
-        return this;
-    },
-
-    toBBox: function (item) { return item; },
-
-    compareMinX: compareNodeMinX,
-    compareMinY: compareNodeMinY,
-
-    toJSON: function () { return this.data; },
-
-    fromJSON: function (data) {
-        this.data = data;
-        return this;
-    },
-
-    _all: function (node, result) {
-        var nodesToSearch = [];
-        while (node) {
-            if (node.leaf) result.push.apply(result, node.children);
-            else nodesToSearch.push.apply(nodesToSearch, node.children);
-
-            node = nodesToSearch.pop();
-        }
-        return result;
-    },
-
-    _build: function (items, left, right, height) {
-
-        var N = right - left + 1,
-            M = this._maxEntries,
-            node;
-
-        if (N <= M) {
-            // reached leaf level; return leaf
-            node = createNode(items.slice(left, right + 1));
-            calcBBox(node, this.toBBox);
-            return node;
-        }
-
-        if (!height) {
-            // target height of the bulk-loaded tree
-            height = Math.ceil(Math.log(N) / Math.log(M));
-
-            // target number of root entries to maximize storage utilization
-            M = Math.ceil(N / Math.pow(M, height - 1));
-        }
-
-        node = createNode([]);
-        node.leaf = false;
-        node.height = height;
-
-        // split the items into M mostly square tiles
-
-        var N2 = Math.ceil(N / M),
-            N1 = N2 * Math.ceil(Math.sqrt(M)),
-            i, j, right2, right3;
-
-        multiSelect(items, left, right, N1, this.compareMinX);
-
-        for (i = left; i <= right; i += N1) {
-
-            right2 = Math.min(i + N1 - 1, right);
-
-            multiSelect(items, i, right2, N2, this.compareMinY);
-
-            for (j = i; j <= right2; j += N2) {
-
-                right3 = Math.min(j + N2 - 1, right2);
-
-                // pack each entry recursively
-                node.children.push(this._build(items, j, right3, height - 1));
-            }
-        }
-
-        calcBBox(node, this.toBBox);
-
-        return node;
-    },
-
-    _chooseSubtree: function (bbox, node, level, path) {
-
-        var i, len, child, targetNode, area, enlargement, minArea, minEnlargement;
-
-        while (true) {
-            path.push(node);
-
-            if (node.leaf || path.length - 1 === level) break;
-
-            minArea = minEnlargement = Infinity;
-
-            for (i = 0, len = node.children.length; i < len; i++) {
-                child = node.children[i];
-                area = bboxArea(child);
-                enlargement = enlargedArea(bbox, child) - area;
-
-                // choose entry with the least area enlargement
-                if (enlargement < minEnlargement) {
-                    minEnlargement = enlargement;
-                    minArea = area < minArea ? area : minArea;
-                    targetNode = child;
-
-                } else if (enlargement === minEnlargement) {
-                    // otherwise choose one with the smallest area
-                    if (area < minArea) {
-                        minArea = area;
-                        targetNode = child;
-                    }
-                }
-            }
-
-            node = targetNode || node.children[0];
-        }
-
-        return node;
-    },
-
-    _insert: function (item, level, isNode) {
-
-        var toBBox = this.toBBox,
-            bbox = isNode ? item : toBBox(item),
-            insertPath = [];
-
-        // find the best node for accommodating the item, saving all nodes along the path too
-        var node = this._chooseSubtree(bbox, this.data, level, insertPath);
-
-        // put the item into the node
-        node.children.push(item);
-        extend(node, bbox);
-
-        // split on node overflow; propagate upwards if necessary
-        while (level >= 0) {
-            if (insertPath[level].children.length > this._maxEntries) {
-                this._split(insertPath, level);
-                level--;
-            } else break;
-        }
-
-        // adjust bboxes along the insertion path
-        this._adjustParentBBoxes(bbox, insertPath, level);
-    },
-
-    // split overflowed node into two
-    _split: function (insertPath, level) {
-
-        var node = insertPath[level],
-            M = node.children.length,
-            m = this._minEntries;
-
-        this._chooseSplitAxis(node, m, M);
-
-        var splitIndex = this._chooseSplitIndex(node, m, M);
-
-        var newNode = createNode(node.children.splice(splitIndex, node.children.length - splitIndex));
-        newNode.height = node.height;
-        newNode.leaf = node.leaf;
-
-        calcBBox(node, this.toBBox);
-        calcBBox(newNode, this.toBBox);
-
-        if (level) insertPath[level - 1].children.push(newNode);
-        else this._splitRoot(node, newNode);
-    },
-
-    _splitRoot: function (node, newNode) {
-        // split root node
-        this.data = createNode([node, newNode]);
-        this.data.height = node.height + 1;
-        this.data.leaf = false;
-        calcBBox(this.data, this.toBBox);
-    },
-
-    _chooseSplitIndex: function (node, m, M) {
-
-        var i, bbox1, bbox2, overlap, area, minOverlap, minArea, index;
-
-        minOverlap = minArea = Infinity;
-
-        for (i = m; i <= M - m; i++) {
-            bbox1 = distBBox(node, 0, i, this.toBBox);
-            bbox2 = distBBox(node, i, M, this.toBBox);
-
-            overlap = intersectionArea(bbox1, bbox2);
-            area = bboxArea(bbox1) + bboxArea(bbox2);
-
-            // choose distribution with minimum overlap
-            if (overlap < minOverlap) {
-                minOverlap = overlap;
-                index = i;
-
-                minArea = area < minArea ? area : minArea;
-
-            } else if (overlap === minOverlap) {
-                // otherwise choose distribution with minimum area
-                if (area < minArea) {
-                    minArea = area;
-                    index = i;
-                }
-            }
-        }
-
-        return index;
-    },
-
-    // sorts node children by the best axis for split
-    _chooseSplitAxis: function (node, m, M) {
-
-        var compareMinX = node.leaf ? this.compareMinX : compareNodeMinX,
-            compareMinY = node.leaf ? this.compareMinY : compareNodeMinY,
-            xMargin = this._allDistMargin(node, m, M, compareMinX),
-            yMargin = this._allDistMargin(node, m, M, compareMinY);
-
-        // if total distributions margin value is minimal for x, sort by minX,
-        // otherwise it's already sorted by minY
-        if (xMargin < yMargin) node.children.sort(compareMinX);
-    },
-
-    // total margin of all possible split distributions where each node is at least m full
-    _allDistMargin: function (node, m, M, compare) {
-
-        node.children.sort(compare);
-
-        var toBBox = this.toBBox,
-            leftBBox = distBBox(node, 0, m, toBBox),
-            rightBBox = distBBox(node, M - m, M, toBBox),
-            margin = bboxMargin(leftBBox) + bboxMargin(rightBBox),
-            i, child;
-
-        for (i = m; i < M - m; i++) {
-            child = node.children[i];
-            extend(leftBBox, node.leaf ? toBBox(child) : child);
-            margin += bboxMargin(leftBBox);
-        }
-
-        for (i = M - m - 1; i >= m; i--) {
-            child = node.children[i];
-            extend(rightBBox, node.leaf ? toBBox(child) : child);
-            margin += bboxMargin(rightBBox);
-        }
-
-        return margin;
-    },
-
-    _adjustParentBBoxes: function (bbox, path, level) {
-        // adjust bboxes along the given tree path
-        for (var i = level; i >= 0; i--) {
-            extend(path[i], bbox);
-        }
-    },
-
-    _condense: function (path) {
-        // go through the path, removing empty nodes and updating bboxes
-        for (var i = path.length - 1, siblings; i >= 0; i--) {
-            if (path[i].children.length === 0) {
-                if (i > 0) {
-                    siblings = path[i - 1].children;
-                    siblings.splice(siblings.indexOf(path[i]), 1);
-
-                } else this.clear();
-
-            } else calcBBox(path[i], this.toBBox);
-        }
-    },
-
-    _initFormat: function (format) {
-        // data format (minX, minY, maxX, maxY accessors)
-
-        // uses eval-type function compilation instead of just accepting a toBBox function
-        // because the algorithms are very sensitive to sorting functions performance,
-        // so they should be dead simple and without inner calls
-
-        var compareArr = ['return a', ' - b', ';'];
-
-        this.compareMinX = new Function('a', 'b', compareArr.join(format[0]));
-        this.compareMinY = new Function('a', 'b', compareArr.join(format[1]));
-
-        this.toBBox = new Function('a',
-            'return {minX: a' + format[0] +
-            ', minY: a' + format[1] +
-            ', maxX: a' + format[2] +
-            ', maxY: a' + format[3] + '};');
-    }
-};
-
-function findItem(item, items, equalsFn) {
-    if (!equalsFn) return items.indexOf(item);
-
-    for (var i = 0; i < items.length; i++) {
-        if (equalsFn(item, items[i])) return i;
-    }
-    return -1;
-}
-
-// calculate node's bbox from bboxes of its children
-function calcBBox(node, toBBox) {
-    distBBox(node, 0, node.children.length, toBBox, node);
-}
-
-// min bounding rectangle of node children from k to p-1
-function distBBox(node, k, p, toBBox, destNode) {
-    if (!destNode) destNode = createNode(null);
-    destNode.minX = Infinity;
-    destNode.minY = Infinity;
-    destNode.maxX = -Infinity;
-    destNode.maxY = -Infinity;
-
-    for (var i = k, child; i < p; i++) {
-        child = node.children[i];
-        extend(destNode, node.leaf ? toBBox(child) : child);
-    }
-
-    return destNode;
-}
-
-function extend(a, b) {
-    a.minX = Math.min(a.minX, b.minX);
-    a.minY = Math.min(a.minY, b.minY);
-    a.maxX = Math.max(a.maxX, b.maxX);
-    a.maxY = Math.max(a.maxY, b.maxY);
-    return a;
-}
-
-function compareNodeMinX(a, b) { return a.minX - b.minX; }
-function compareNodeMinY(a, b) { return a.minY - b.minY; }
-
-function bboxArea(a)   { return (a.maxX - a.minX) * (a.maxY - a.minY); }
-function bboxMargin(a) { return (a.maxX - a.minX) + (a.maxY - a.minY); }
-
-function enlargedArea(a, b) {
-    return (Math.max(b.maxX, a.maxX) - Math.min(b.minX, a.minX)) *
-           (Math.max(b.maxY, a.maxY) - Math.min(b.minY, a.minY));
-}
-
-function intersectionArea(a, b) {
-    var minX = Math.max(a.minX, b.minX),
-        minY = Math.max(a.minY, b.minY),
-        maxX = Math.min(a.maxX, b.maxX),
-        maxY = Math.min(a.maxY, b.maxY);
-
-    return Math.max(0, maxX - minX) *
-           Math.max(0, maxY - minY);
-}
-
-function contains(a, b) {
-    return a.minX <= b.minX &&
-           a.minY <= b.minY &&
-           b.maxX <= a.maxX &&
-           b.maxY <= a.maxY;
-}
-
-function intersects(a, b) {
-    return b.minX <= a.maxX &&
-           b.minY <= a.maxY &&
-           b.maxX >= a.minX &&
-           b.maxY >= a.minY;
-}
-
-function createNode(children) {
-    return {
-        children: children,
-        height: 1,
-        leaf: true,
-        minX: Infinity,
-        minY: Infinity,
-        maxX: -Infinity,
-        maxY: -Infinity
-    };
-}
-
-// sort an array so that items come in groups of n unsorted items, with groups sorted between each other;
-// combines selection algorithm with binary divide & conquer approach
-
-function multiSelect(arr, left, right, n, compare) {
-    var stack = [left, right],
-        mid;
-
-    while (stack.length) {
-        right = stack.pop();
-        left = stack.pop();
-
-        if (right - left <= n) continue;
-
-        mid = left + Math.ceil((right - left) / n / 2) * n;
-        quickselect(arr, mid, left, right, compare);
-
-        stack.push(left, mid, mid, right);
-    }
-}
-
-},{"quickselect":23}],25:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subject_1 = require('./Subject');
-var ObjectUnsubscribedError_1 = require('./util/ObjectUnsubscribedError');
-/**
- * @class BehaviorSubject<T>
- */
-var BehaviorSubject = (function (_super) {
-    __extends(BehaviorSubject, _super);
-    function BehaviorSubject(_value) {
-        _super.call(this);
-        this._value = _value;
-    }
-    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":33,"./util/ObjectUnsubscribedError":153}],26:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subscriber_1 = require('./Subscriber');
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var InnerSubscriber = (function (_super) {
-    __extends(InnerSubscriber, _super);
-    function InnerSubscriber(parent, outerValue, outerIndex) {
-        _super.call(this);
-        this.parent = parent;
-        this.outerValue = outerValue;
-        this.outerIndex = outerIndex;
-        this.index = 0;
-    }
-    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":35}],27:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('./Observable');
-/**
- * Represents a push-based event or value that an {@link Observable} can emit.
- * This class is particularly useful for operators that manage notifications,
- * like {@link materialize}, {@link dematerialize}, {@link observeOn}, and
- * others. Besides wrapping the actual delivered value, it also annotates it
- * with metadata of, for instance, what type of push message it is (`next`,
- * `error`, or `complete`).
- *
- * @see {@link materialize}
- * @see {@link dematerialize}
- * @see {@link observeOn}
- *
- * @class Notification<T>
- */
-var Notification = (function () {
-    function Notification(kind, value, error) {
-        this.kind = kind;
-        this.value = value;
-        this.error = error;
-        this.hasValue = kind === 'N';
-    }
-    /**
-     * Delivers to the given `observer` the value wrapped by this Notification.
-     * @param {Observer} observer
-     * @return
-     */
-    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();
-        }
-    };
-    /**
-     * Given some {@link Observer} callbacks, deliver the value represented by the
-     * current Notification to the correctly corresponding callback.
-     * @param {function(value: T): void} next An Observer `next` callback.
-     * @param {function(err: any): void} [error] An Observer `error` callback.
-     * @param {function(): void} [complete] An Observer `complete` callback.
-     * @return {any}
-     */
-    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();
-        }
-    };
-    /**
-     * Takes an Observer or its individual callback functions, and calls `observe`
-     * or `do` methods accordingly.
-     * @param {Observer|function(value: T): void} nextOrObserver An Observer or
-     * the `next` callback.
-     * @param {function(err: any): void} [error] An Observer `error` callback.
-     * @param {function(): void} [complete] An Observer `complete` callback.
-     * @return {any}
-     */
-    Notification.prototype.accept = function (nextOrObserver, error, complete) {
-        if (nextOrObserver && typeof nextOrObserver.next === 'function') {
-            return this.observe(nextOrObserver);
-        }
-        else {
-            return this.do(nextOrObserver, error, complete);
-        }
-    };
-    /**
-     * Returns a simple Observable that just delivers the notification represented
-     * by this Notification instance.
-     * @return {any}
-     */
-    Notification.prototype.toObservable = function () {
-        var kind = this.kind;
-        switch (kind) {
-            case 'N':
-                return Observable_1.Observable.of(this.value);
-            case 'E':
-                return Observable_1.Observable.throw(this.error);
-            case 'C':
-                return Observable_1.Observable.empty();
-        }
-        throw new Error('unexpected notification kind value');
-    };
-    /**
-     * A shortcut to create a Notification instance of the type `next` from a
-     * given value.
-     * @param {T} value The `next` value.
-     * @return {Notification<T>} The "next" Notification representing the
-     * argument.
-     */
-    Notification.createNext = function (value) {
-        if (typeof value !== 'undefined') {
-            return new Notification('N', value);
-        }
-        return this.undefinedValueNotification;
-    };
-    /**
-     * A shortcut to create a Notification instance of the type `error` from a
-     * given error.
-     * @param {any} [err] The `error` error.
-     * @return {Notification<T>} The "error" Notification representing the
-     * argument.
-     */
-    Notification.createError = function (err) {
-        return new Notification('E', undefined, err);
-    };
-    /**
-     * A shortcut to create a Notification instance of the type `complete`.
-     * @return {Notification<any>} The valueless "complete" Notification.
-     */
-    Notification.createComplete = function () {
-        return this.completeNotification;
-    };
-    Notification.completeNotification = new Notification('C');
-    Notification.undefinedValueNotification = new Notification('N', undefined);
-    return Notification;
-}());
-exports.Notification = Notification;
-
-},{"./Observable":28}],28:[function(require,module,exports){
-"use strict";
-var root_1 = require('./util/root');
-var toSubscriber_1 = require('./util/toSubscriber');
-var observable_1 = require('./symbol/observable');
-/**
- * A representation of any set of values over any amount of time. This the most basic building block
- * of RxJS.
- *
- * @class Observable<T>
- */
-var Observable = (function () {
-    /**
-     * @constructor
-     * @param {Function} subscribe the function that is  called when the Observable is
-     * initially subscribed to. This function is given a Subscriber, to which new values
-     * can be `next`ed, or an `error` method can be called to raise an error, or
-     * `complete` can be called to notify of a successful completion.
-     */
-    function Observable(subscribe) {
-        this._isScalar = false;
-        if (subscribe) {
-            this._subscribe = subscribe;
-        }
-    }
-    /**
-     * Creates a new Observable, with this Observable as the source, and the passed
-     * operator defined as the new observable's operator.
-     * @method lift
-     * @param {Operator} operator the operator defining the operation to take on the observable
-     * @return {Observable} a new observable with the Operator applied
-     */
-    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) {
-            operator.call(sink, this.source);
-        }
-        else {
-            sink.add(this._subscribe(sink));
-        }
-        if (sink.syncErrorThrowable) {
-            sink.syncErrorThrowable = false;
-            if (sink.syncErrorThrown) {
-                throw sink.syncErrorValue;
-            }
-        }
-        return sink;
-    };
-    /**
-     * @method forEach
-     * @param {Function} next a handler for each value emitted by the observable
-     * @param {PromiseConstructor} [PromiseCtor] a constructor function used to instantiate the Promise
-     * @return {Promise} a promise that either resolves on observable completion or
-     *  rejects with the handled error
-     */
-    Observable.prototype.forEach = function (next, PromiseCtor) {
-        var _this = this;
-        if (!PromiseCtor) {
-            if (root_1.root.Rx && root_1.root.Rx.config && root_1.root.Rx.config.Promise) {
-                PromiseCtor = root_1.root.Rx.config.Promise;
-            }
-            else if (root_1.root.Promise) {
-                PromiseCtor = root_1.root.Promise;
-            }
-        }
-        if (!PromiseCtor) {
-            throw new Error('no Promise impl found');
-        }
-        return new PromiseCtor(function (resolve, reject) {
-            var subscription = _this.subscribe(function (value) {
-                if (subscription) {
-                    // if there is a subscription, then we can surmise
-                    // the next handling is asynchronous. Any errors thrown
-                    // need to be rejected explicitly and unsubscribe must be
-                    // called manually
-                    try {
-                        next(value);
-                    }
-                    catch (err) {
-                        reject(err);
-                        subscription.unsubscribe();
-                    }
-                }
-                else {
-                    // if there is NO subscription, then we're getting a nexted
-                    // value synchronously during subscription. We can just call it.
-                    // If it errors, Observable's `subscribe` will ensure the
-                    // unsubscription logic is called, then synchronously rethrow the error.
-                    // After that, Promise will trap the error and send it
-                    // down the rejection path.
-                    next(value);
-                }
-            }, reject, resolve);
-        });
-    };
-    Observable.prototype._subscribe = function (subscriber) {
-        return this.source.subscribe(subscriber);
-    };
-    /**
-     * An interop point defined by the es7-observable spec https://github.com/zenparsing/es-observable
-     * @method Symbol.observable
-     * @return {Observable} this instance of the observable
-     */
-    Observable.prototype[observable_1.$$observable] = function () {
-        return this;
-    };
-    // HACK: Since TypeScript inherits static properties too, we have to
-    // fight against TypeScript here so Subject can have a different static create signature
-    /**
-     * Creates a new cold Observable by calling the Observable constructor
-     * @static true
-     * @owner Observable
-     * @method create
-     * @param {Function} subscribe? the subscriber function to be passed to the Observable constructor
-     * @return {Observable} a new cold observable
-     */
-    Observable.create = function (subscribe) {
-        return new Observable(subscribe);
-    };
-    return Observable;
-}());
-exports.Observable = Observable;
-
-},{"./symbol/observable":148,"./util/root":163,"./util/toSubscriber":165}],29:[function(require,module,exports){
-"use strict";
-exports.empty = {
-    closed: true,
-    next: function (value) { },
-    error: function (err) { throw err; },
-    complete: function () { }
-};
-
-},{}],30:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subscriber_1 = require('./Subscriber');
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var OuterSubscriber = (function (_super) {
-    __extends(OuterSubscriber, _super);
-    function OuterSubscriber() {
-        _super.apply(this, arguments);
-    }
-    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":35}],31:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subject_1 = require('./Subject');
-var queue_1 = require('./scheduler/queue');
-var Subscription_1 = require('./Subscription');
-var observeOn_1 = require('./operator/observeOn');
-var ObjectUnsubscribedError_1 = require('./util/ObjectUnsubscribedError');
-var SubjectSubscription_1 = require('./SubjectSubscription');
-/**
- * @class ReplaySubject<T>
- */
-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; }
-        _super.call(this);
-        this.scheduler = scheduler;
-        this._events = [];
-        this._bufferSize = bufferSize < 1 ? 1 : bufferSize;
-        this._windowTime = windowTime < 1 ? 1 : windowTime;
-    }
-    ReplaySubject.prototype.next = function (value) {
-        var now = this._getNow();
-        this._events.push(new ReplayEvent(now, value));
-        this._trimBufferThenGetEvents();
-        _super.prototype.next.call(this, value);
-    };
-    ReplaySubject.prototype._subscribe = function (subscriber) {
-        var _events = this._trimBufferThenGetEvents();
-        var scheduler = this.scheduler;
-        var subscription;
-        if (this.closed) {
-            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();
-        }
-        else if (this.hasError) {
-            subscription = Subscription_1.Subscription.EMPTY;
-        }
-        else if (this.isStopped) {
-            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));
-        }
-        var len = _events.length;
-        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;
-        // Trim events that fall out of the time window.
-        // Start at the front of the list. Break early once
-        // we encounter an event that falls within the window.
-        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":33,"./SubjectSubscription":34,"./Subscription":36,"./operator/observeOn":123,"./scheduler/queue":146,"./util/ObjectUnsubscribedError":153}],32:[function(require,module,exports){
-"use strict";
-/**
- * An execution context and a data structure to order tasks and schedule their
- * execution. Provides a notion of (potentially virtual) time, through the
- * `now()` getter method.
- *
- * Each unit of work in a Scheduler is called an {@link Action}.
- *
- * ```ts
- * class Scheduler {
- *   now(): number;
- *   schedule(work, delay?, state?): Subscription;
- * }
- * ```
- *
- * @class Scheduler
- */
-var Scheduler = (function () {
-    function Scheduler(SchedulerAction, now) {
-        if (now === void 0) { now = Scheduler.now; }
-        this.SchedulerAction = SchedulerAction;
-        this.now = now;
-    }
-    /**
-     * Schedules a function, `work`, for execution. May happen at some point in
-     * the future, according to the `delay` parameter, if specified. May be passed
-     * some context object, `state`, which will be passed to the `work` function.
-     *
-     * The given arguments will be processed an stored as an Action object in a
-     * queue of actions.
-     *
-     * @param {function(state: ?T): ?Subscription} work A function representing a
-     * task, or some unit of work to be executed by the Scheduler.
-     * @param {number} [delay] Time to wait before executing the work, where the
-     * time unit is implicit and defined by the Scheduler itself.
-     * @param {T} [state] Some contextual data that the `work` function uses when
-     * called by the Scheduler.
-     * @return {Subscription} A subscription in order to be able to unsubscribe
-     * the scheduled work.
-     */
-    Scheduler.prototype.schedule = function (work, delay, state) {
-        if (delay === void 0) { delay = 0; }
-        return new this.SchedulerAction(this, work).schedule(state, delay);
-    };
-    Scheduler.now = Date.now ? Date.now : function () { return +new Date(); };
-    return Scheduler;
-}());
-exports.Scheduler = Scheduler;
-
-},{}],33:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-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('./symbol/rxSubscriber');
-/**
- * @class SubjectSubscriber<T>
- */
-var SubjectSubscriber = (function (_super) {
-    __extends(SubjectSubscriber, _super);
-    function SubjectSubscriber(destination) {
-        _super.call(this, destination);
-        this.destination = destination;
-    }
-    return SubjectSubscriber;
-}(Subscriber_1.Subscriber));
-exports.SubjectSubscriber = SubjectSubscriber;
-/**
- * @class Subject<T>
- */
-var Subject = (function (_super) {
-    __extends(Subject, _super);
-    function Subject() {
-        _super.call(this);
-        this.observers = [];
-        this.closed = false;
-        this.isStopped = false;
-        this.hasError = false;
-        this.thrownError = null;
-    }
-    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._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;
-/**
- * @class AnonymousSubject<T>
- */
-var AnonymousSubject = (function (_super) {
-    __extends(AnonymousSubject, _super);
-    function AnonymousSubject(destination, source) {
-        _super.call(this);
-        this.destination = destination;
-        this.source = source;
-    }
-    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;
-
-},{"./Observable":28,"./SubjectSubscription":34,"./Subscriber":35,"./Subscription":36,"./symbol/rxSubscriber":149,"./util/ObjectUnsubscribedError":153}],34:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subscription_1 = require('./Subscription');
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var SubjectSubscription = (function (_super) {
-    __extends(SubjectSubscription, _super);
-    function SubjectSubscription(subject, subscriber) {
-        _super.call(this);
-        this.subject = subject;
-        this.subscriber = subscriber;
-        this.closed = false;
-    }
-    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":36}],35:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var isFunction_1 = require('./util/isFunction');
-var Subscription_1 = require('./Subscription');
-var Observer_1 = require('./Observer');
-var rxSubscriber_1 = require('./symbol/rxSubscriber');
-/**
- * Implements the {@link Observer} interface and extends the
- * {@link Subscription} class. While the {@link Observer} is the public API for
- * consuming the values of an {@link Observable}, all Observers get converted to
- * a Subscriber, in order to provide Subscription-like capabilities such as
- * `unsubscribe`. Subscriber is a common type in RxJS, and crucial for
- * implementing operators, but it is rarely used as a public API.
- *
- * @class Subscriber<T>
- */
-var Subscriber = (function (_super) {
-    __extends(Subscriber, _super);
-    /**
-     * @param {Observer|function(value: T): void} [destinationOrNext] A partially
-     * defined Observer or a `next` callback function.
-     * @param {function(e: ?any): void} [error] The `error` callback of an
-     * Observer.
-     * @param {function(): void} [complete] The `complete` callback of an
-     * Observer.
-     */
-    function Subscriber(destinationOrNext, error, complete) {
-        _super.call(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.destination = destinationOrNext;
-                        this.destination.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;
-        }
-    }
-    Subscriber.prototype[rxSubscriber_1.$$rxSubscriber] = function () { return this; };
-    /**
-     * A static factory for a Subscriber, given a (potentially partial) definition
-     * of an Observer.
-     * @param {function(x: ?T): void} [next] The `next` callback of an Observer.
-     * @param {function(e: ?any): void} [error] The `error` callback of an
-     * Observer.
-     * @param {function(): void} [complete] The `complete` callback of an
-     * Observer.
-     * @return {Subscriber<T>} A Subscriber wrapping the (partially defined)
-     * Observer represented by the given arguments.
-     */
-    Subscriber.create = function (next, error, complete) {
-        var subscriber = new Subscriber(next, error, complete);
-        subscriber.syncErrorThrowable = false;
-        return subscriber;
-    };
-    /**
-     * The {@link Observer} callback to receive notifications of type `next` from
-     * the Observable, with a value. The Observable may call this method 0 or more
-     * times.
-     * @param {T} [value] The `next` value.
-     * @return {void}
-     */
-    Subscriber.prototype.next = function (value) {
-        if (!this.isStopped) {
-            this._next(value);
-        }
-    };
-    /**
-     * The {@link Observer} callback to receive notifications of type `error` from
-     * the Observable, with an attached {@link Error}. Notifies the Observer that
-     * the Observable has experienced an error condition.
-     * @param {any} [err] The `error` exception.
-     * @return {void}
-     */
-    Subscriber.prototype.error = function (err) {
-        if (!this.isStopped) {
-            this.isStopped = true;
-            this._error(err);
-        }
-    };
-    /**
-     * The {@link Observer} callback to receive a valueless notification of type
-     * `complete` from the Observable. Notifies the Observer that the Observable
-     * has finished sending push-based notifications.
-     * @return {void}
-     */
-    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();
-    };
-    return Subscriber;
-}(Subscription_1.Subscription));
-exports.Subscriber = Subscriber;
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var SafeSubscriber = (function (_super) {
-    __extends(SafeSubscriber, _super);
-    function SafeSubscriber(_parent, observerOrNext, error, complete) {
-        _super.call(this);
-        this._parent = _parent;
-        var next;
-        var context = this;
-        if (isFunction_1.isFunction(observerOrNext)) {
-            next = observerOrNext;
-        }
-        else if (observerOrNext) {
-            context = observerOrNext;
-            next = observerOrNext.next;
-            error = observerOrNext.error;
-            complete = observerOrNext.complete;
-            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;
-    }
-    SafeSubscriber.prototype.next = function (value) {
-        if (!this.isStopped && this._next) {
-            var _parent = this._parent;
-            if (!_parent.syncErrorThrowable) {
-                this.__tryOrUnsub(this._next, value);
-            }
-            else if (this.__tryOrSetError(_parent, this._next, value)) {
-                this.unsubscribe();
-            }
-        }
-    };
-    SafeSubscriber.prototype.error = function (err) {
-        if (!this.isStopped) {
-            var _parent = this._parent;
-            if (this._error) {
-                if (!_parent.syncErrorThrowable) {
-                    this.__tryOrUnsub(this._error, err);
-                    this.unsubscribe();
-                }
-                else {
-                    this.__tryOrSetError(_parent, this._error, err);
-                    this.unsubscribe();
-                }
-            }
-            else if (!_parent.syncErrorThrowable) {
-                this.unsubscribe();
-                throw err;
-            }
-            else {
-                _parent.syncErrorValue = err;
-                _parent.syncErrorThrown = true;
-                this.unsubscribe();
-            }
-        }
-    };
-    SafeSubscriber.prototype.complete = function () {
-        if (!this.isStopped) {
-            var _parent = this._parent;
-            if (this._complete) {
-                if (!_parent.syncErrorThrowable) {
-                    this.__tryOrUnsub(this._complete);
-                    this.unsubscribe();
-                }
-                else {
-                    this.__tryOrSetError(_parent, this._complete);
-                    this.unsubscribe();
-                }
-            }
-            else {
-                this.unsubscribe();
-            }
-        }
-    };
-    SafeSubscriber.prototype.__tryOrUnsub = function (fn, value) {
-        try {
-            fn.call(this._context, value);
-        }
-        catch (err) {
-            this.unsubscribe();
-            throw err;
-        }
-    };
-    SafeSubscriber.prototype.__tryOrSetError = function (parent, fn, value) {
-        try {
-            fn.call(this._context, value);
-        }
-        catch (err) {
-            parent.syncErrorValue = err;
-            parent.syncErrorThrown = true;
-            return true;
-        }
-        return false;
-    };
-    SafeSubscriber.prototype._unsubscribe = function () {
-        var _parent = this._parent;
-        this._context = null;
-        this._parent = null;
-        _parent.unsubscribe();
-    };
-    return SafeSubscriber;
-}(Subscriber));
-
-},{"./Observer":29,"./Subscription":36,"./symbol/rxSubscriber":149,"./util/isFunction":159}],36:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var isArray_1 = require('./util/isArray');
-var isObject_1 = require('./util/isObject');
-var isFunction_1 = require('./util/isFunction');
-var tryCatch_1 = require('./util/tryCatch');
-var errorObject_1 = require('./util/errorObject');
-var UnsubscriptionError_1 = require('./util/UnsubscriptionError');
-/**
- * Represents a disposable resource, such as the execution of an Observable. A
- * Subscription has one important method, `unsubscribe`, that takes no argument
- * and just disposes the resource held by the subscription.
- *
- * Additionally, subscriptions may be grouped together through the `add()`
- * method, which will attach a child Subscription to the current Subscription.
- * When a Subscription is unsubscribed, all its children (and its grandchildren)
- * will be unsubscribed as well.
- *
- * @class Subscription
- */
-var Subscription = (function () {
-    /**
-     * @param {function(): void} [unsubscribe] A function describing how to
-     * perform the disposal of resources when the `unsubscribe` method is called.
-     */
-    function Subscription(unsubscribe) {
-        /**
-         * A flag to indicate whether this Subscription has already been unsubscribed.
-         * @type {boolean}
-         */
-        this.closed = false;
-        if (unsubscribe) {
-            this._unsubscribe = unsubscribe;
-        }
-    }
-    /**
-     * Disposes the resources held by the subscription. May, for instance, cancel
-     * an ongoing Observable execution or cancel any other type of work that
-     * started when the Subscription was created.
-     * @return {void}
-     */
-    Subscription.prototype.unsubscribe = function () {
-        var hasErrors = false;
-        var errors;
-        if (this.closed) {
-            return;
-        }
-        this.closed = true;
-        var _a = this, _unsubscribe = _a._unsubscribe, _subscriptions = _a._subscriptions;
-        this._subscriptions = null;
-        if (isFunction_1.isFunction(_unsubscribe)) {
-            var trial = tryCatch_1.tryCatch(_unsubscribe).call(this);
-            if (trial === errorObject_1.errorObject) {
-                hasErrors = true;
-                errors = errors || (errorObject_1.errorObject.e instanceof UnsubscriptionError_1.UnsubscriptionError ?
-                    flattenUnsubscriptionErrors(errorObject_1.errorObject.e.errors) : [errorObject_1.errorObject.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)) {
-                    var trial = tryCatch_1.tryCatch(sub.unsubscribe).call(sub);
-                    if (trial === errorObject_1.errorObject) {
-                        hasErrors = true;
-                        errors = errors || [];
-                        var err = errorObject_1.errorObject.e;
-                        if (err instanceof UnsubscriptionError_1.UnsubscriptionError) {
-                            errors = errors.concat(flattenUnsubscriptionErrors(err.errors));
-                        }
-                        else {
-                            errors.push(err);
-                        }
-                    }
-                }
-            }
-        }
-        if (hasErrors) {
-            throw new UnsubscriptionError_1.UnsubscriptionError(errors);
-        }
-    };
-    /**
-     * Adds a tear down to be called during the unsubscribe() of this
-     * Subscription.
-     *
-     * If the tear down being added is a subscription that is already
-     * unsubscribed, is the same reference `add` is being called on, or is
-     * `Subscription.EMPTY`, it will not be added.
-     *
-     * If this subscription is already in an `closed` state, the passed
-     * tear down logic will be executed immediately.
-     *
-     * @param {TeardownLogic} teardown The additional logic to execute on
-     * teardown.
-     * @return {Subscription} Returns the Subscription used or created to be
-     * added to the inner subscriptions list. This Subscription can be used with
-     * `remove()` to remove the passed teardown logic from the inner subscriptions
-     * list.
-     */
-    Subscription.prototype.add = function (teardown) {
-        if (!teardown || (teardown === Subscription.EMPTY)) {
-            return Subscription.EMPTY;
-        }
-        if (teardown === this) {
-            return this;
-        }
-        var sub = teardown;
-        switch (typeof teardown) {
-            case 'function':
-                sub = new Subscription(teardown);
-            case 'object':
-                if (sub.closed || typeof sub.unsubscribe !== 'function') {
-                    return sub;
-                }
-                else if (this.closed) {
-                    sub.unsubscribe();
-                    return sub;
-                }
-                break;
-            default:
-                throw new Error('unrecognized teardown ' + teardown + ' added to Subscription.');
-        }
-        var childSub = new ChildSubscription(sub, this);
-        this._subscriptions = this._subscriptions || [];
-        this._subscriptions.push(childSub);
-        return childSub;
-    };
-    /**
-     * Removes a Subscription from the internal list of subscriptions that will
-     * unsubscribe during the unsubscribe process of this Subscription.
-     * @param {Subscription} subscription The subscription to remove.
-     * @return {void}
-     */
-    Subscription.prototype.remove = function (subscription) {
-        // HACK: This might be redundant because of the logic in `add()`
-        if (subscription == null || (subscription === this) || (subscription === Subscription.EMPTY)) {
-            return;
-        }
-        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;
-var ChildSubscription = (function (_super) {
-    __extends(ChildSubscription, _super);
-    function ChildSubscription(_innerSub, _parent) {
-        _super.call(this);
-        this._innerSub = _innerSub;
-        this._parent = _parent;
-    }
-    ChildSubscription.prototype._unsubscribe = function () {
-        var _a = this, _innerSub = _a._innerSub, _parent = _a._parent;
-        _parent.remove(this);
-        _innerSub.unsubscribe();
-    };
-    return ChildSubscription;
-}(Subscription));
-exports.ChildSubscription = ChildSubscription;
-function flattenUnsubscriptionErrors(errors) {
-    return errors.reduce(function (errs, err) { return errs.concat((err instanceof UnsubscriptionError_1.UnsubscriptionError) ? err.errors : err); }, []);
-}
-
-},{"./util/UnsubscriptionError":155,"./util/errorObject":156,"./util/isArray":157,"./util/isFunction":159,"./util/isObject":160,"./util/tryCatch":166}],37:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var combineLatest_1 = require('../../observable/combineLatest');
-Observable_1.Observable.combineLatest = combineLatest_1.combineLatest;
-
-},{"../../Observable":28,"../../observable/combineLatest":93}],38:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var defer_1 = require('../../observable/defer');
-Observable_1.Observable.defer = defer_1.defer;
-
-},{"../../Observable":28,"../../observable/defer":94}],39:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var empty_1 = require('../../observable/empty');
-Observable_1.Observable.empty = empty_1.empty;
-
-},{"../../Observable":28,"../../observable/empty":95}],40:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var from_1 = require('../../observable/from');
-Observable_1.Observable.from = from_1.from;
-
-},{"../../Observable":28,"../../observable/from":96}],41:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var fromEvent_1 = require('../../observable/fromEvent');
-Observable_1.Observable.fromEvent = fromEvent_1.fromEvent;
-
-},{"../../Observable":28,"../../observable/fromEvent":97}],42:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var fromPromise_1 = require('../../observable/fromPromise');
-Observable_1.Observable.fromPromise = fromPromise_1.fromPromise;
-
-},{"../../Observable":28,"../../observable/fromPromise":98}],43:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var merge_1 = require('../../observable/merge');
-Observable_1.Observable.merge = merge_1.merge;
-
-},{"../../Observable":28,"../../observable/merge":99}],44:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var of_1 = require('../../observable/of');
-Observable_1.Observable.of = of_1.of;
-
-},{"../../Observable":28,"../../observable/of":100}],45:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var throw_1 = require('../../observable/throw');
-Observable_1.Observable.throw = throw_1._throw;
-
-},{"../../Observable":28,"../../observable/throw":101}],46:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var zip_1 = require('../../observable/zip');
-Observable_1.Observable.zip = zip_1.zip;
-
-},{"../../Observable":28,"../../observable/zip":102}],47:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var buffer_1 = require('../../operator/buffer');
-Observable_1.Observable.prototype.buffer = buffer_1.buffer;
-
-},{"../../Observable":28,"../../operator/buffer":103}],48:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var bufferCount_1 = require('../../operator/bufferCount');
-Observable_1.Observable.prototype.bufferCount = bufferCount_1.bufferCount;
-
-},{"../../Observable":28,"../../operator/bufferCount":104}],49:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var catch_1 = require('../../operator/catch');
-Observable_1.Observable.prototype.catch = catch_1._catch;
-Observable_1.Observable.prototype._catch = catch_1._catch;
-
-},{"../../Observable":28,"../../operator/catch":105}],50:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var combineLatest_1 = require('../../operator/combineLatest');
-Observable_1.Observable.prototype.combineLatest = combineLatest_1.combineLatest;
-
-},{"../../Observable":28,"../../operator/combineLatest":106}],51:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var concat_1 = require('../../operator/concat');
-Observable_1.Observable.prototype.concat = concat_1.concat;
-
-},{"../../Observable":28,"../../operator/concat":107}],52:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var debounceTime_1 = require('../../operator/debounceTime');
-Observable_1.Observable.prototype.debounceTime = debounceTime_1.debounceTime;
-
-},{"../../Observable":28,"../../operator/debounceTime":108}],53:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var delay_1 = require('../../operator/delay');
-Observable_1.Observable.prototype.delay = delay_1.delay;
-
-},{"../../Observable":28,"../../operator/delay":109}],54:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var distinct_1 = require('../../operator/distinct');
-Observable_1.Observable.prototype.distinct = distinct_1.distinct;
-
-},{"../../Observable":28,"../../operator/distinct":110}],55:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var distinctUntilChanged_1 = require('../../operator/distinctUntilChanged');
-Observable_1.Observable.prototype.distinctUntilChanged = distinctUntilChanged_1.distinctUntilChanged;
-
-},{"../../Observable":28,"../../operator/distinctUntilChanged":111}],56:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var do_1 = require('../../operator/do');
-Observable_1.Observable.prototype.do = do_1._do;
-Observable_1.Observable.prototype._do = do_1._do;
-
-},{"../../Observable":28,"../../operator/do":112}],57:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var expand_1 = require('../../operator/expand');
-Observable_1.Observable.prototype.expand = expand_1.expand;
-
-},{"../../Observable":28,"../../operator/expand":113}],58:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var filter_1 = require('../../operator/filter');
-Observable_1.Observable.prototype.filter = filter_1.filter;
-
-},{"../../Observable":28,"../../operator/filter":114}],59:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var finally_1 = require('../../operator/finally');
-Observable_1.Observable.prototype.finally = finally_1._finally;
-Observable_1.Observable.prototype._finally = finally_1._finally;
-
-},{"../../Observable":28,"../../operator/finally":115}],60:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var first_1 = require('../../operator/first');
-Observable_1.Observable.prototype.first = first_1.first;
-
-},{"../../Observable":28,"../../operator/first":116}],61:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var last_1 = require('../../operator/last');
-Observable_1.Observable.prototype.last = last_1.last;
-
-},{"../../Observable":28,"../../operator/last":117}],62:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var map_1 = require('../../operator/map');
-Observable_1.Observable.prototype.map = map_1.map;
-
-},{"../../Observable":28,"../../operator/map":118}],63:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var merge_1 = require('../../operator/merge');
-Observable_1.Observable.prototype.merge = merge_1.merge;
-
-},{"../../Observable":28,"../../operator/merge":119}],64:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var mergeAll_1 = require('../../operator/mergeAll');
-Observable_1.Observable.prototype.mergeAll = mergeAll_1.mergeAll;
-
-},{"../../Observable":28,"../../operator/mergeAll":120}],65:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var mergeMap_1 = require('../../operator/mergeMap');
-Observable_1.Observable.prototype.mergeMap = mergeMap_1.mergeMap;
-Observable_1.Observable.prototype.flatMap = mergeMap_1.mergeMap;
-
-},{"../../Observable":28,"../../operator/mergeMap":121}],66:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var pairwise_1 = require('../../operator/pairwise');
-Observable_1.Observable.prototype.pairwise = pairwise_1.pairwise;
-
-},{"../../Observable":28,"../../operator/pairwise":124}],67:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var pluck_1 = require('../../operator/pluck');
-Observable_1.Observable.prototype.pluck = pluck_1.pluck;
-
-},{"../../Observable":28,"../../operator/pluck":125}],68:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var publish_1 = require('../../operator/publish');
-Observable_1.Observable.prototype.publish = publish_1.publish;
-
-},{"../../Observable":28,"../../operator/publish":126}],69:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var publishReplay_1 = require('../../operator/publishReplay');
-Observable_1.Observable.prototype.publishReplay = publishReplay_1.publishReplay;
-
-},{"../../Observable":28,"../../operator/publishReplay":127}],70:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var scan_1 = require('../../operator/scan');
-Observable_1.Observable.prototype.scan = scan_1.scan;
-
-},{"../../Observable":28,"../../operator/scan":128}],71:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var share_1 = require('../../operator/share');
-Observable_1.Observable.prototype.share = share_1.share;
-
-},{"../../Observable":28,"../../operator/share":129}],72:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var skip_1 = require('../../operator/skip');
-Observable_1.Observable.prototype.skip = skip_1.skip;
-
-},{"../../Observable":28,"../../operator/skip":130}],73:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var skipUntil_1 = require('../../operator/skipUntil');
-Observable_1.Observable.prototype.skipUntil = skipUntil_1.skipUntil;
-
-},{"../../Observable":28,"../../operator/skipUntil":131}],74:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var skipWhile_1 = require('../../operator/skipWhile');
-Observable_1.Observable.prototype.skipWhile = skipWhile_1.skipWhile;
-
-},{"../../Observable":28,"../../operator/skipWhile":132}],75:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var startWith_1 = require('../../operator/startWith');
-Observable_1.Observable.prototype.startWith = startWith_1.startWith;
-
-},{"../../Observable":28,"../../operator/startWith":133}],76:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var switchMap_1 = require('../../operator/switchMap');
-Observable_1.Observable.prototype.switchMap = switchMap_1.switchMap;
-
-},{"../../Observable":28,"../../operator/switchMap":134}],77:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var take_1 = require('../../operator/take');
-Observable_1.Observable.prototype.take = take_1.take;
-
-},{"../../Observable":28,"../../operator/take":135}],78:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var takeUntil_1 = require('../../operator/takeUntil');
-Observable_1.Observable.prototype.takeUntil = takeUntil_1.takeUntil;
-
-},{"../../Observable":28,"../../operator/takeUntil":136}],79:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var throttleTime_1 = require('../../operator/throttleTime');
-Observable_1.Observable.prototype.throttleTime = throttleTime_1.throttleTime;
-
-},{"../../Observable":28,"../../operator/throttleTime":137}],80:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var withLatestFrom_1 = require('../../operator/withLatestFrom');
-Observable_1.Observable.prototype.withLatestFrom = withLatestFrom_1.withLatestFrom;
-
-},{"../../Observable":28,"../../operator/withLatestFrom":138}],81:[function(require,module,exports){
-"use strict";
-var Observable_1 = require('../../Observable');
-var zip_1 = require('../../operator/zip');
-Observable_1.Observable.prototype.zip = zip_1.zipProto;
-
-},{"../../Observable":28,"../../operator/zip":139}],82:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Observable_1 = require('../Observable');
-var ScalarObservable_1 = require('./ScalarObservable');
-var EmptyObservable_1 = require('./EmptyObservable');
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @extends {Ignored}
- * @hide true
- */
-var ArrayLikeObservable = (function (_super) {
-    __extends(ArrayLikeObservable, _super);
-    function ArrayLikeObservable(arrayLike, scheduler) {
-        _super.call(this);
-        this.arrayLike = arrayLike;
-        this.scheduler = scheduler;
-        if (!scheduler && arrayLike.length === 1) {
-            this._isScalar = true;
-            this.value = arrayLike[0];
-        }
-    }
-    ArrayLikeObservable.create = function (arrayLike, scheduler) {
-        var length = arrayLike.length;
-        if (length === 0) {
-            return new EmptyObservable_1.EmptyObservable();
-        }
-        else if (length === 1) {
-            return new ScalarObservable_1.ScalarObservable(arrayLike[0], scheduler);
-        }
-        else {
-            return new ArrayLikeObservable(arrayLike, scheduler);
-        }
-    };
-    ArrayLikeObservable.dispatch = function (state) {
-        var arrayLike = state.arrayLike, index = state.index, length = state.length, subscriber = state.subscriber;
-        if (subscriber.closed) {
-            return;
-        }
-        if (index >= length) {
-            subscriber.complete();
-            return;
-        }
-        subscriber.next(arrayLike[index]);
-        state.index = index + 1;
-        this.schedule(state);
-    };
-    ArrayLikeObservable.prototype._subscribe = function (subscriber) {
-        var index = 0;
-        var _a = this, arrayLike = _a.arrayLike, scheduler = _a.scheduler;
-        var length = arrayLike.length;
-        if (scheduler) {
-            return scheduler.schedule(ArrayLikeObservable.dispatch, 0, {
-                arrayLike: arrayLike, index: index, length: length, subscriber: subscriber
-            });
-        }
-        else {
-            for (var i = 0; i < length && !subscriber.closed; i++) {
-                subscriber.next(arrayLike[i]);
-            }
-            subscriber.complete();
-        }
-    };
-    return ArrayLikeObservable;
-}(Observable_1.Observable));
-exports.ArrayLikeObservable = ArrayLikeObservable;
-
-},{"../Observable":28,"./EmptyObservable":86,"./ScalarObservable":92}],83:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Observable_1 = require('../Observable');
-var ScalarObservable_1 = require('./ScalarObservable');
-var EmptyObservable_1 = require('./EmptyObservable');
-var isScheduler_1 = require('../util/isScheduler');
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @extends {Ignored}
- * @hide true
- */
-var ArrayObservable = (function (_super) {
-    __extends(ArrayObservable, _super);
-    function ArrayObservable(array, scheduler) {
-        _super.call(this);
-        this.array = array;
-        this.scheduler = scheduler;
-        if (!scheduler && array.length === 1) {
-            this._isScalar = true;
-            this.value = array[0];
-        }
-    }
-    ArrayObservable.create = function (array, scheduler) {
-        return new ArrayObservable(array, scheduler);
-    };
-    /**
-     * Creates an Observable that emits some values you specify as arguments,
-     * immediately one after the other, and then emits a complete notification.
-     *
-     * <span class="informal">Emits the arguments you provide, then completes.
-     * </span>
-     *
-     * <img src="./img/of.png" width="100%">
-     *
-     * This static operator is useful for creating a simple Observable that only
-     * emits the arguments given, and the complete notification thereafter. It can
-     * be used for composing with other Observables, such as with {@link concat}.
-     * By default, it uses a `null` IScheduler, which means the `next`
-     * notifications are sent synchronously, although with a different IScheduler
-     * it is possible to determine when those notifications will be delivered.
-     *
-     * @example <caption>Emit 10, 20, 30, then 'a', 'b', 'c', then start ticking every second.</caption>
-     * var numbers = Rx.Observable.of(10, 20, 30);
-     * var letters = Rx.Observable.of('a', 'b', 'c');
-     * var interval = Rx.Observable.interval(1000);
-     * var result = numbers.concat(letters).concat(interval);
-     * result.subscribe(x => console.log(x));
-     *
-     * @see {@link create}
-     * @see {@link empty}
-     * @see {@link never}
-     * @see {@link throw}
-     *
-     * @param {...T} values Arguments that represent `next` values to be emitted.
-     * @param {Scheduler} [scheduler] A {@link IScheduler} to use for scheduling
-     * the emissions of the `next` notifications.
-     * @return {Observable<T>} An Observable that emits each given input value.
-     * @static true
-     * @name of
-     * @owner Observable
-     */
-    ArrayObservable.of = function () {
-        var array = [];
-        for (var _i = 0; _i < arguments.length; _i++) {
-            array[_i - 0] = arguments[_i];
-        }
-        var scheduler = array[array.length - 1];
-        if (isScheduler_1.isScheduler(scheduler)) {
-            array.pop();
-        }
-        else {
-            scheduler = null;
-        }
-        var len = array.length;
-        if (len > 1) {
-            return new ArrayObservable(array, scheduler);
-        }
-        else if (len === 1) {
-            return new ScalarObservable_1.ScalarObservable(array[0], scheduler);
-        }
-        else {
-            return new EmptyObservable_1.EmptyObservable(scheduler);
-        }
-    };
-    ArrayObservable.dispatch = function (state) {
-        var array = state.array, index = state.index, count = state.count, subscriber = state.subscriber;
-        if (index >= count) {
-            subscriber.complete();
-            return;
-        }
-        subscriber.next(array[index]);
-        if (subscriber.closed) {
-            return;
-        }
-        state.index = index + 1;
-        this.schedule(state);
-    };
-    ArrayObservable.prototype._subscribe = function (subscriber) {
-        var index = 0;
-        var array = this.array;
-        var count = array.length;
-        var scheduler = this.scheduler;
-        if (scheduler) {
-            return scheduler.schedule(ArrayObservable.dispatch, 0, {
-                array: array, index: index, count: count, subscriber: subscriber
-            });
-        }
-        else {
-            for (var i = 0; i < count && !subscriber.closed; i++) {
-                subscriber.next(array[i]);
-            }
-            subscriber.complete();
-        }
-    };
-    return ArrayObservable;
-}(Observable_1.Observable));
-exports.ArrayObservable = ArrayObservable;
-
-},{"../Observable":28,"../util/isScheduler":162,"./EmptyObservable":86,"./ScalarObservable":92}],84:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subject_1 = require('../Subject');
-var Observable_1 = require('../Observable');
-var Subscriber_1 = require('../Subscriber');
-var Subscription_1 = require('../Subscription');
-/**
- * @class ConnectableObservable<T>
- */
-var ConnectableObservable = (function (_super) {
-    __extends(ConnectableObservable, _super);
-    function ConnectableObservable(source, subjectFactory) {
-        _super.call(this);
-        this.source = source;
-        this.subjectFactory = subjectFactory;
-        this._refCount = 0;
-    }
-    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) {
-            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;
-            }
-            else {
-                this._connection = connection;
-            }
-        }
-        return connection;
-    };
-    ConnectableObservable.prototype.refCount = function () {
-        return this.lift(new RefCountOperator(this));
-    };
-    return ConnectableObservable;
-}(Observable_1.Observable));
-exports.ConnectableObservable = ConnectableObservable;
-exports.connectableObservableDescriptor = {
-    operator: { value: null },
-    _refCount: { value: 0, writable: true },
-    _subscribe: { value: ConnectableObservable.prototype._subscribe },
-    getSubject: { value: ConnectableObservable.prototype.getSubject },
-    connect: { value: ConnectableObservable.prototype.connect },
-    refCount: { value: ConnectableObservable.prototype.refCount }
-};
-var ConnectableSubscriber = (function (_super) {
-    __extends(ConnectableSubscriber, _super);
-    function ConnectableSubscriber(destination, connectable) {
-        _super.call(this, destination);
-        this.connectable = connectable;
-    }
-    ConnectableSubscriber.prototype._error = function (err) {
-        this._unsubscribe();
-        _super.prototype._error.call(this, err);
-    };
-    ConnectableSubscriber.prototype._complete = function () {
-        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) {
-        _super.call(this, destination);
-        this.connectable = connectable;
-    }
-    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;
-        }
-        ///
-        // Compare the local RefCountSubscriber's connection Subscription to the
-        // connection Subscription on the shared ConnectableObservable. In cases
-        // where the ConnectableObservable source synchronously emits values, and
-        // the RefCountSubscriber's downstream Observers synchronously unsubscribe,
-        // execution continues to here before the RefCountOperator has a chance to
-        // supply the RefCountSubscriber with the shared connection Subscription.
-        // For example:
-        // ```
-        // Observable.range(0, 10)
-        //   .publish()
-        //   .refCount()
-        //   .take(5)
-        //   .subscribe();
-        // ```
-        // In order to account for this case, RefCountSubscriber should only dispose
-        // the ConnectableObservable's shared connection Subscription if the
-        // connection Subscription exists, *and* either:
-        //   a. RefCountSubscriber doesn't have a reference to the shared connection
-        //      Subscription yet, or,
-        //   b. RefCountSubscriber's connection Subscription reference is identical
-        //      to the shared connection Subscription
-        ///
-        var connection = this.connection;
-        var sharedConnection = connectable._connection;
-        this.connection = null;
-        if (sharedConnection && (!connection || sharedConnection === connection)) {
-            sharedConnection.unsubscribe();
-        }
-    };
-    return RefCountSubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Observable":28,"../Subject":33,"../Subscriber":35,"../Subscription":36}],85:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Observable_1 = require('../Observable');
-var subscribeToResult_1 = require('../util/subscribeToResult');
-var OuterSubscriber_1 = require('../OuterSubscriber');
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @extends {Ignored}
- * @hide true
- */
-var DeferObservable = (function (_super) {
-    __extends(DeferObservable, _super);
-    function DeferObservable(observableFactory) {
-        _super.call(this);
-        this.observableFactory = observableFactory;
-    }
-    /**
-     * Creates an Observable that, on subscribe, calls an Observable factory to
-     * make an Observable for each new Observer.
-     *
-     * <span class="informal">Creates the Observable lazily, that is, only when it
-     * is subscribed.
-     * </span>
-     *
-     * <img src="./img/defer.png" width="100%">
-     *
-     * `defer` allows you to create the Observable only when the Observer
-     * subscribes, and create a fresh Observable for each Observer. It waits until
-     * an Observer subscribes to it, and then it generates an Observable,
-     * typically with an Observable factory function. It does this afresh for each
-     * subscriber, so although each subscriber may think it is subscribing to the
-     * same Observable, in fact each subscriber gets its own individual
-     * Observable.
-     *
-     * @example <caption>Subscribe to either an Observable of clicks or an Observable of interval, at random</caption>
-     * var clicksOrInterval = Rx.Observable.defer(function () {
-     *   if (Math.random() > 0.5) {
-     *     return Rx.Observable.fromEvent(document, 'click');
-     *   } else {
-     *     return Rx.Observable.interval(1000);
-     *   }
-     * });
-     * clicksOrInterval.subscribe(x => console.log(x));
-     *
-     * // Results in the following behavior:
-     * // If the result of Math.random() is greater than 0.5 it will listen
-     * // for clicks anywhere on the "document"; when document is clicked it
-     * // will log a MouseEvent object to the console. If the result is less
-     * // than 0.5 it will emit ascending numbers, one every second(1000ms).
-     *
-     * @see {@link create}
-     *
-     * @param {function(): Observable|Promise} observableFactory The Observable
-     * factory function to invoke for each Observer that subscribes to the output
-     * Observable. May also return a Promise, which will be converted on the fly
-     * to an Observable.
-     * @return {Observable} An Observable whose Observers' subscriptions trigger
-     * an invocation of the given Observable factory function.
-     * @static true
-     * @name defer
-     * @owner Observable
-     */
-    DeferObservable.create = function (observableFactory) {
-        return new DeferObservable(observableFactory);
-    };
-    DeferObservable.prototype._subscribe = function (subscriber) {
-        return new DeferSubscriber(subscriber, this.observableFactory);
-    };
-    return DeferObservable;
-}(Observable_1.Observable));
-exports.DeferObservable = DeferObservable;
-var DeferSubscriber = (function (_super) {
-    __extends(DeferSubscriber, _super);
-    function DeferSubscriber(destination, factory) {
-        _super.call(this, destination);
-        this.factory = factory;
-        this.tryDefer();
-    }
-    DeferSubscriber.prototype.tryDefer = function () {
-        try {
-            this._callFactory();
-        }
-        catch (err) {
-            this._error(err);
-        }
-    };
-    DeferSubscriber.prototype._callFactory = function () {
-        var result = this.factory();
-        if (result) {
-            this.add(subscribeToResult_1.subscribeToResult(this, result));
-        }
-    };
-    return DeferSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-
-},{"../Observable":28,"../OuterSubscriber":30,"../util/subscribeToResult":164}],86:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Observable_1 = require('../Observable');
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @extends {Ignored}
- * @hide true
- */
-var EmptyObservable = (function (_super) {
-    __extends(EmptyObservable, _super);
-    function EmptyObservable(scheduler) {
-        _super.call(this);
-        this.scheduler = scheduler;
-    }
-    /**
-     * Creates an Observable that emits no items to the Observer and immediately
-     * emits a complete notification.
-     *
-     * <span class="informal">Just emits 'complete', and nothing else.
-     * </span>
-     *
-     * <img src="./img/empty.png" width="100%">
-     *
-     * This static operator is useful for creating a simple Observable that only
-     * emits the complete notification. It can be used for composing with other
-     * Observables, such as in a {@link mergeMap}.
-     *
-     * @example <caption>Emit the number 7, then complete.</caption>
-     * var result = Rx.Observable.empty().startWith(7);
-     * result.subscribe(x => console.log(x));
-     *
-     * @example <caption>Map and flatten only odd numbers to the sequence 'a', 'b', 'c'</caption>
-     * var interval = Rx.Observable.interval(1000);
-     * var result = interval.mergeMap(x =>
-     *   x % 2 === 1 ? Rx.Observable.of('a', 'b', 'c') : Rx.Observable.empty()
-     * );
-     * result.subscribe(x => console.log(x));
-     *
-     * // Results in the following to the console:
-     * // x is equal to the count on the interval eg(0,1,2,3,...)
-     * // x will occur every 1000ms
-     * // if x % 2 is equal to 1 print abc
-     * // if x % 2 is not equal to 1 nothing will be output
-     *
-     * @see {@link create}
-     * @see {@link never}
-     * @see {@link of}
-     * @see {@link throw}
-     *
-     * @param {Scheduler} [scheduler] A {@link IScheduler} to use for scheduling
-     * the emission of the complete notification.
-     * @return {Observable} An "empty" Observable: emits only the complete
-     * notification.
-     * @static true
-     * @name empty
-     * @owner Observable
-     */
-    EmptyObservable.create = function (scheduler) {
-        return new EmptyObservable(scheduler);
-    };
-    EmptyObservable.dispatch = function (arg) {
-        var subscriber = arg.subscriber;
-        subscriber.complete();
-    };
-    EmptyObservable.prototype._subscribe = function (subscriber) {
-        var scheduler = this.scheduler;
-        if (scheduler) {
-            return scheduler.schedule(EmptyObservable.dispatch, 0, { subscriber: subscriber });
-        }
-        else {
-            subscriber.complete();
-        }
-    };
-    return EmptyObservable;
-}(Observable_1.Observable));
-exports.EmptyObservable = EmptyObservable;
-
-},{"../Observable":28}],87:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Observable_1 = require('../Observable');
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @extends {Ignored}
- * @hide true
- */
-var ErrorObservable = (function (_super) {
-    __extends(ErrorObservable, _super);
-    function ErrorObservable(error, scheduler) {
-        _super.call(this);
-        this.error = error;
-        this.scheduler = scheduler;
-    }
-    /**
-     * Creates an Observable that emits no items to the Observer and immediately
-     * emits an error notification.
-     *
-     * <span class="informal">Just emits 'error', and nothing else.
-     * </span>
-     *
-     * <img src="./img/throw.png" width="100%">
-     *
-     * This static operator is useful for creating a simple Observable that only
-     * emits the error notification. It can be used for composing with other
-     * Observables, such as in a {@link mergeMap}.
-     *
-     * @example <caption>Emit the number 7, then emit an error.</caption>
-     * var result = Rx.Observable.throw(new Error('oops!')).startWith(7);
-     * result.subscribe(x => console.log(x), e => console.error(e));
-     *
-     * @example <caption>Map and flattens numbers to the sequence 'a', 'b', 'c', but throw an error for 13</caption>
-     * var interval = Rx.Observable.interval(1000);
-     * var result = interval.mergeMap(x =>
-     *   x === 13 ?
-     *     Rx.Observable.throw('Thirteens are bad') :
-     *     Rx.Observable.of('a', 'b', 'c')
-     * );
-     * result.subscribe(x => console.log(x), e => console.error(e));
-     *
-     * @see {@link create}
-     * @see {@link empty}
-     * @see {@link never}
-     * @see {@link of}
-     *
-     * @param {any} error The particular Error to pass to the error notification.
-     * @param {Scheduler} [scheduler] A {@link IScheduler} to use for scheduling
-     * the emission of the error notification.
-     * @return {Observable} An error Observable: emits only the error notification
-     * using the given error argument.
-     * @static true
-     * @name throw
-     * @owner Observable
-     */
-    ErrorObservable.create = function (error, scheduler) {
-        return new ErrorObservable(error, scheduler);
-    };
-    ErrorObservable.dispatch = function (arg) {
-        var error = arg.error, subscriber = arg.subscriber;
-        subscriber.error(error);
-    };
-    ErrorObservable.prototype._subscribe = function (subscriber) {
-        var error = this.error;
-        var scheduler = this.scheduler;
-        if (scheduler) {
-            return scheduler.schedule(ErrorObservable.dispatch, 0, {
-                error: error, subscriber: subscriber
-            });
-        }
-        else {
-            subscriber.error(error);
-        }
-    };
-    return ErrorObservable;
-}(Observable_1.Observable));
-exports.ErrorObservable = ErrorObservable;
-
-},{"../Observable":28}],88:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Observable_1 = require('../Observable');
-var tryCatch_1 = require('../util/tryCatch');
-var isFunction_1 = require('../util/isFunction');
-var errorObject_1 = require('../util/errorObject');
-var Subscription_1 = require('../Subscription');
-var toString = Object.prototype.toString;
-function isNodeStyleEventEmmitter(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 isNodeList(sourceObj) {
-    return !!sourceObj && toString.call(sourceObj) === '[object NodeList]';
-}
-function isHTMLCollection(sourceObj) {
-    return !!sourceObj && toString.call(sourceObj) === '[object HTMLCollection]';
-}
-function isEventTarget(sourceObj) {
-    return !!sourceObj && typeof sourceObj.addEventListener === 'function' && typeof sourceObj.removeEventListener === 'function';
-}
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @extends {Ignored}
- * @hide true
- */
-var FromEventObservable = (function (_super) {
-    __extends(FromEventObservable, _super);
-    function FromEventObservable(sourceObj, eventName, selector, options) {
-        _super.call(this);
-        this.sourceObj = sourceObj;
-        this.eventName = eventName;
-        this.selector = selector;
-        this.options = options;
-    }
-    /* tslint:enable:max-line-length */
-    /**
-     * Creates an Observable that emits events of a specific type coming from the
-     * given event target.
-     *
-     * <span class="informal">Creates an Observable from DOM events, or Node
-     * EventEmitter events or others.</span>
-     *
-     * <img src="./img/fromEvent.png" width="100%">
-     *
-     * Creates an Observable by attaching an event listener to an "event target",
-     * which may be an object with `addEventListener` and `removeEventListener`,
-     * a Node.js EventEmitter, a jQuery style EventEmitter, a NodeList from the
-     * DOM, or an HTMLCollection from the DOM. The event handler is attached when
-     * the output Observable is subscribed, and removed when the Subscription is
-     * unsubscribed.
-     *
-     * @example <caption>Emits clicks happening on the DOM document</caption>
-     * var clicks = Rx.Observable.fromEvent(document, 'click');
-     * clicks.subscribe(x => console.log(x));
-     *
-     * // Results in:
-     * // MouseEvent object logged to console everytime a click
-     * // occurs on the document.
-     *
-     * @see {@link from}
-     * @see {@link fromEventPattern}
-     *
-     * @param {EventTargetLike} target The DOMElement, event target, Node.js
-     * EventEmitter, NodeList or HTMLCollection to attach the event handler to.
-     * @param {string} eventName The event name of interest, being emitted by the
-     * `target`.
-     * @param {EventListenerOptions} [options] Options to pass through to addEventListener
-     * @param {SelectorMethodSignature<T>} [selector] An optional function to
-     * post-process results. It takes the arguments from the event handler and
-     * should return a single value.
-     * @return {Observable<T>}
-     * @static true
-     * @name fromEvent
-     * @owner Observable
-     */
-    FromEventObservable.create = function (target, eventName, options, selector) {
-        if (isFunction_1.isFunction(options)) {
-            selector = options;
-            options = undefined;
-        }
-        return new FromEventObservable(target, eventName, selector, options);
-    };
-    FromEventObservable.setupSubscription = function (sourceObj, eventName, handler, subscriber, options) {
-        var unsubscribe;
-        if (isNodeList(sourceObj) || isHTMLCollection(sourceObj)) {
-            for (var i = 0, len = sourceObj.length; i < len; i++) {
-                FromEventObservable.setupSubscription(sourceObj[i], eventName, handler, subscriber, options);
-            }
-        }
-        else if (isEventTarget(sourceObj)) {
-            var source_1 = sourceObj;
-            sourceObj.addEventListener(eventName, handler, options);
-            unsubscribe = function () { return source_1.removeEventListener(eventName, handler); };
-        }
-        else if (isJQueryStyleEventEmitter(sourceObj)) {
-            var source_2 = sourceObj;
-            sourceObj.on(eventName, handler);
-            unsubscribe = function () { return source_2.off(eventName, handler); };
-        }
-        else if (isNodeStyleEventEmmitter(sourceObj)) {
-            var source_3 = sourceObj;
-            sourceObj.addListener(eventName, handler);
-            unsubscribe = function () { return source_3.removeListener(eventName, handler); };
-        }
-        else {
-            throw new TypeError('Invalid event target');
-        }
-        subscriber.add(new Subscription_1.Subscription(unsubscribe));
-    };
-    FromEventObservable.prototype._subscribe = function (subscriber) {
-        var sourceObj = this.sourceObj;
-        var eventName = this.eventName;
-        var options = this.options;
-        var selector = this.selector;
-        var handler = selector ? function () {
-            var args = [];
-            for (var _i = 0; _i < arguments.length; _i++) {
-                args[_i - 0] = arguments[_i];
-            }
-            var result = tryCatch_1.tryCatch(selector).apply(void 0, args);
-            if (result === errorObject_1.errorObject) {
-                subscriber.error(errorObject_1.errorObject.e);
-            }
-            else {
-                subscriber.next(result);
-            }
-        } : function (e) { return subscriber.next(e); };
-        FromEventObservable.setupSubscription(sourceObj, eventName, handler, subscriber, options);
-    };
-    return FromEventObservable;
-}(Observable_1.Observable));
-exports.FromEventObservable = FromEventObservable;
-
-},{"../Observable":28,"../Subscription":36,"../util/errorObject":156,"../util/isFunction":159,"../util/tryCatch":166}],89:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var isArray_1 = require('../util/isArray');
-var isPromise_1 = require('../util/isPromise');
-var PromiseObservable_1 = require('./PromiseObservable');
-var IteratorObservable_1 = require('./IteratorObservable');
-var ArrayObservable_1 = require('./ArrayObservable');
-var ArrayLikeObservable_1 = require('./ArrayLikeObservable');
-var iterator_1 = require('../symbol/iterator');
-var Observable_1 = require('../Observable');
-var observeOn_1 = require('../operator/observeOn');
-var observable_1 = require('../symbol/observable');
-var isArrayLike = (function (x) { return x && typeof x.length === 'number'; });
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @extends {Ignored}
- * @hide true
- */
-var FromObservable = (function (_super) {
-    __extends(FromObservable, _super);
-    function FromObservable(ish, scheduler) {
-        _super.call(this, null);
-        this.ish = ish;
-        this.scheduler = scheduler;
-    }
-    /**
-     * Creates an Observable from an Array, an array-like object, a Promise, an
-     * iterable object, or an Observable-like object.
-     *
-     * <span class="informal">Converts almost anything to an Observable.</span>
-     *
-     * <img src="./img/from.png" width="100%">
-     *
-     * Convert various other objects and data types into Observables. `from`
-     * converts a Promise or an array-like or an
-     * [iterable](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols#iterable)
-     * object into an Observable that emits the items in that promise or array or
-     * iterable. A String, in this context, is treated as an array of characters.
-     * Observable-like objects (contains a function named with the ES2015 Symbol
-     * for Observable) can also be converted through this operator.
-     *
-     * @example <caption>Converts an array to an Observable</caption>
-     * var array = [10, 20, 30];
-     * var result = Rx.Observable.from(array);
-     * result.subscribe(x => console.log(x));
-     *
-     * // Results in the following:
-     * // 10 20 30
-     *
-     * @example <caption>Convert an infinite iterable (from a generator) to an Observable</caption>
-     * function* generateDoubles(seed) {
-     *   var i = seed;
-     *   while (true) {
-     *     yield i;
-     *     i = 2 * i; // double it
-     *   }
-     * }
-     *
-     * var iterator = generateDoubles(3);
-     * var result = Rx.Observable.from(iterator).take(10);
-     * result.subscribe(x => console.log(x));
-     *
-     * // Results in the following:
-     * // 3 6 12 24 48 96 192 384 768 1536
-     *
-     * @see {@link create}
-     * @see {@link fromEvent}
-     * @see {@link fromEventPattern}
-     * @see {@link fromPromise}
-     *
-     * @param {ObservableInput<T>} ish A subscribable object, a Promise, an
-     * Observable-like, an Array, an iterable or an array-like object to be
-     * converted.
-     * @param {Scheduler} [scheduler] The scheduler on which to schedule the
-     * emissions of values.
-     * @return {Observable<T>} The Observable whose values are originally from the
-     * input object that was converted.
-     * @static true
-     * @name from
-     * @owner Observable
-     */
-    FromObservable.create = function (ish, scheduler) {
-        if (ish != null) {
-            if (typeof ish[observable_1.$$observable] === 'function') {
-                if (ish instanceof Observable_1.Observable && !scheduler) {
-                    return ish;
-                }
-                return new FromObservable(ish, scheduler);
-            }
-            else if (isArray_1.isArray(ish)) {
-                return new ArrayObservable_1.ArrayObservable(ish, scheduler);
-            }
-            else if (isPromise_1.isPromise(ish)) {
-                return new PromiseObservable_1.PromiseObservable(ish, scheduler);
-            }
-            else if (typeof ish[iterator_1.$$iterator] === 'function' || typeof ish === 'string') {
-                return new IteratorObservable_1.IteratorObservable(ish, scheduler);
-            }
-            else if (isArrayLike(ish)) {
-                return new ArrayLikeObservable_1.ArrayLikeObservable(ish, scheduler);
-            }
-        }
-        throw new TypeError((ish !== null && typeof ish || ish) + ' is not observable');
-    };
-    FromObservable.prototype._subscribe = function (subscriber) {
-        var ish = this.ish;
-        var scheduler = this.scheduler;
-        if (scheduler == null) {
-            return ish[observable_1.$$observable]().subscribe(subscriber);
-        }
-        else {
-            return ish[observable_1.$$observable]().subscribe(new observeOn_1.ObserveOnSubscriber(subscriber, scheduler, 0));
-        }
-    };
-    return FromObservable;
-}(Observable_1.Observable));
-exports.FromObservable = FromObservable;
-
-},{"../Observable":28,"../operator/observeOn":123,"../symbol/iterator":147,"../symbol/observable":148,"../util/isArray":157,"../util/isPromise":161,"./ArrayLikeObservable":82,"./ArrayObservable":83,"./IteratorObservable":90,"./PromiseObservable":91}],90:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var root_1 = require('../util/root');
-var Observable_1 = require('../Observable');
-var iterator_1 = require('../symbol/iterator');
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @extends {Ignored}
- * @hide true
- */
-var IteratorObservable = (function (_super) {
-    __extends(IteratorObservable, _super);
-    function IteratorObservable(iterator, scheduler) {
-        _super.call(this);
-        this.scheduler = scheduler;
-        if (iterator == null) {
-            throw new Error('iterator cannot be null.');
-        }
-        this.iterator = getIterator(iterator);
-    }
-    IteratorObservable.create = function (iterator, scheduler) {
-        return new IteratorObservable(iterator, scheduler);
-    };
-    IteratorObservable.dispatch = function (state) {
-        var index = state.index, hasError = state.hasError, iterator = state.iterator, subscriber = state.subscriber;
-        if (hasError) {
-            subscriber.error(state.error);
-            return;
-        }
-        var result = iterator.next();
-        if (result.done) {
-            subscriber.complete();
-            return;
-        }
-        subscriber.next(result.value);
-        state.index = index + 1;
-        if (subscriber.closed) {
-            if (typeof iterator.return === 'function') {
-                iterator.return();
-            }
-            return;
-        }
-        this.schedule(state);
-    };
-    IteratorObservable.prototype._subscribe = function (subscriber) {
-        var index = 0;
-        var _a = this, iterator = _a.iterator, scheduler = _a.scheduler;
-        if (scheduler) {
-            return scheduler.schedule(IteratorObservable.dispatch, 0, {
-                index: index, iterator: iterator, subscriber: subscriber
-            });
-        }
-        else {
-            do {
-                var result = iterator.next();
-                if (result.done) {
-                    subscriber.complete();
-                    break;
-                }
-                else {
-                    subscriber.next(result.value);
-                }
-                if (subscriber.closed) {
-                    if (typeof iterator.return === 'function') {
-                        iterator.return();
-                    }
-                    break;
-                }
-            } while (true);
-        }
-    };
-    return IteratorObservable;
-}(Observable_1.Observable));
-exports.IteratorObservable = IteratorObservable;
-var StringIterator = (function () {
-    function StringIterator(str, idx, len) {
-        if (idx === void 0) { idx = 0; }
-        if (len === void 0) { len = str.length; }
-        this.str = str;
-        this.idx = idx;
-        this.len = len;
-    }
-    StringIterator.prototype[iterator_1.$$iterator] = function () { return (this); };
-    StringIterator.prototype.next = function () {
-        return this.idx < this.len ? {
-            done: false,
-            value: this.str.charAt(this.idx++)
-        } : {
-            done: true,
-            value: undefined
-        };
-    };
-    return StringIterator;
-}());
-var ArrayIterator = (function () {
-    function ArrayIterator(arr, idx, len) {
-        if (idx === void 0) { idx = 0; }
-        if (len === void 0) { len = toLength(arr); }
-        this.arr = arr;
-        this.idx = idx;
-        this.len = len;
-    }
-    ArrayIterator.prototype[iterator_1.$$iterator] = function () { return this; };
-    ArrayIterator.prototype.next = function () {
-        return this.idx < this.len ? {
-            done: false,
-            value: this.arr[this.idx++]
-        } : {
-            done: true,
-            value: undefined
-        };
-    };
-    return ArrayIterator;
-}());
-function getIterator(obj) {
-    var i = obj[iterator_1.$$iterator];
-    if (!i && typeof obj === 'string') {
-        return new StringIterator(obj);
-    }
-    if (!i && obj.length !== undefined) {
-        return new ArrayIterator(obj);
-    }
-    if (!i) {
-        throw new TypeError('object is not iterable');
-    }
-    return obj[iterator_1.$$iterator]();
-}
-var maxSafeInteger = Math.pow(2, 53) - 1;
-function toLength(o) {
-    var len = +o.length;
-    if (isNaN(len)) {
-        return 0;
-    }
-    if (len === 0 || !numberIsFinite(len)) {
-        return len;
-    }
-    len = sign(len) * Math.floor(Math.abs(len));
-    if (len <= 0) {
-        return 0;
-    }
-    if (len > maxSafeInteger) {
-        return maxSafeInteger;
-    }
-    return len;
-}
-function numberIsFinite(value) {
-    return typeof value === 'number' && root_1.root.isFinite(value);
-}
-function sign(value) {
-    var valueAsNumber = +value;
-    if (valueAsNumber === 0) {
-        return valueAsNumber;
-    }
-    if (isNaN(valueAsNumber)) {
-        return valueAsNumber;
-    }
-    return valueAsNumber < 0 ? -1 : 1;
-}
-
-},{"../Observable":28,"../symbol/iterator":147,"../util/root":163}],91:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var root_1 = require('../util/root');
-var Observable_1 = require('../Observable');
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @extends {Ignored}
- * @hide true
- */
-var PromiseObservable = (function (_super) {
-    __extends(PromiseObservable, _super);
-    function PromiseObservable(promise, scheduler) {
-        _super.call(this);
-        this.promise = promise;
-        this.scheduler = scheduler;
-    }
-    /**
-     * Converts a Promise to an Observable.
-     *
-     * <span class="informal">Returns an Observable that just emits the Promise's
-     * resolved value, then completes.</span>
-     *
-     * Converts an ES2015 Promise or a Promises/A+ spec compliant Promise to an
-     * Observable. If the Promise resolves with a value, the output Observable
-     * emits that resolved value as a `next`, and then completes. If the Promise
-     * is rejected, then the output Observable emits the corresponding Error.
-     *
-     * @example <caption>Convert the Promise returned by Fetch to an Observable</caption>
-     * var result = Rx.Observable.fromPromise(fetch('http://myserver.com/'));
-     * result.subscribe(x => console.log(x), e => console.error(e));
-     *
-     * @see {@link bindCallback}
-     * @see {@link from}
-     *
-     * @param {Promise<T>} promise The promise to be converted.
-     * @param {Scheduler} [scheduler] An optional IScheduler to use for scheduling
-     * the delivery of the resolved value (or the rejection).
-     * @return {Observable<T>} An Observable which wraps the Promise.
-     * @static true
-     * @name fromPromise
-     * @owner Observable
-     */
-    PromiseObservable.create = function (promise, scheduler) {
-        return new PromiseObservable(promise, scheduler);
-    };
-    PromiseObservable.prototype._subscribe = function (subscriber) {
-        var _this = this;
-        var promise = this.promise;
-        var scheduler = this.scheduler;
-        if (scheduler == null) {
-            if (this._isScalar) {
-                if (!subscriber.closed) {
-                    subscriber.next(this.value);
-                    subscriber.complete();
-                }
-            }
-            else {
-                promise.then(function (value) {
-                    _this.value = value;
-                    _this._isScalar = true;
-                    if (!subscriber.closed) {
-                        subscriber.next(value);
-                        subscriber.complete();
-                    }
-                }, function (err) {
-                    if (!subscriber.closed) {
-                        subscriber.error(err);
-                    }
-                })
-                    .then(null, function (err) {
-                    // escape the promise trap, throw unhandled errors
-                    root_1.root.setTimeout(function () { throw err; });
-                });
-            }
-        }
-        else {
-            if (this._isScalar) {
-                if (!subscriber.closed) {
-                    return scheduler.schedule(dispatchNext, 0, { value: this.value, subscriber: subscriber });
-                }
-            }
-            else {
-                promise.then(function (value) {
-                    _this.value = value;
-                    _this._isScalar = true;
-                    if (!subscriber.closed) {
-                        subscriber.add(scheduler.schedule(dispatchNext, 0, { value: value, subscriber: subscriber }));
-                    }
-                }, function (err) {
-                    if (!subscriber.closed) {
-                        subscriber.add(scheduler.schedule(dispatchError, 0, { err: err, subscriber: subscriber }));
-                    }
-                })
-                    .then(null, function (err) {
-                    // escape the promise trap, throw unhandled errors
-                    root_1.root.setTimeout(function () { throw err; });
-                });
-            }
-        }
-    };
-    return PromiseObservable;
-}(Observable_1.Observable));
-exports.PromiseObservable = PromiseObservable;
-function dispatchNext(arg) {
-    var value = arg.value, subscriber = arg.subscriber;
-    if (!subscriber.closed) {
-        subscriber.next(value);
-        subscriber.complete();
-    }
-}
-function dispatchError(arg) {
-    var err = arg.err, subscriber = arg.subscriber;
-    if (!subscriber.closed) {
-        subscriber.error(err);
-    }
-}
-
-},{"../Observable":28,"../util/root":163}],92:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Observable_1 = require('../Observable');
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @extends {Ignored}
- * @hide true
- */
-var ScalarObservable = (function (_super) {
-    __extends(ScalarObservable, _super);
-    function ScalarObservable(value, scheduler) {
-        _super.call(this);
-        this.value = value;
-        this.scheduler = scheduler;
-        this._isScalar = true;
-        if (scheduler) {
-            this._isScalar = false;
-        }
-    }
-    ScalarObservable.create = function (value, scheduler) {
-        return new ScalarObservable(value, scheduler);
-    };
-    ScalarObservable.dispatch = function (state) {
-        var done = state.done, value = state.value, subscriber = state.subscriber;
-        if (done) {
-            subscriber.complete();
-            return;
-        }
-        subscriber.next(value);
-        if (subscriber.closed) {
-            return;
-        }
-        state.done = true;
-        this.schedule(state);
-    };
-    ScalarObservable.prototype._subscribe = function (subscriber) {
-        var value = this.value;
-        var scheduler = this.scheduler;
-        if (scheduler) {
-            return scheduler.schedule(ScalarObservable.dispatch, 0, {
-                done: false, value: value, subscriber: subscriber
-            });
-        }
-        else {
-            subscriber.next(value);
-            if (!subscriber.closed) {
-                subscriber.complete();
-            }
-        }
-    };
-    return ScalarObservable;
-}(Observable_1.Observable));
-exports.ScalarObservable = ScalarObservable;
-
-},{"../Observable":28}],93:[function(require,module,exports){
-"use strict";
-var isScheduler_1 = require('../util/isScheduler');
-var isArray_1 = require('../util/isArray');
-var ArrayObservable_1 = require('./ArrayObservable');
-var combineLatest_1 = require('../operator/combineLatest');
-/* tslint:enable:max-line-length */
-/**
- * Combines multiple Observables to create an Observable whose values are
- * calculated from the latest values of each of its input Observables.
- *
- * <span class="informal">Whenever any input Observable emits a value, it
- * computes a formula using the latest values from all the inputs, then emits
- * the output of that formula.</span>
- *
- * <img src="./img/combineLatest.png" width="100%">
- *
- * `combineLatest` combines the values from all the Observables passed as
- * arguments. This is done by subscribing to each Observable, in order, and
- * collecting an array of each of the most recent values any time any of the
- * input Observables emits, then either taking that array and passing it as
- * arguments to an optional `project` function and emitting the return value of
- * that, or just emitting the array of recent values directly if there is no
- * `project` function.
- *
- * @example <caption>Dynamically calculate the Body-Mass Index from an Observable of weight and one for height</caption>
- * var weight = Rx.Observable.of(70, 72, 76, 79, 75);
- * var height = Rx.Observable.of(1.76, 1.77, 1.78);
- * var bmi = Rx.Observable.combineLatest(weight, height, (w, h) => w / (h * h));
- * bmi.subscribe(x => console.log('BMI is ' + x));
- *
- * // With output to console:
- * // BMI is 24.212293388429753
- * // BMI is 23.93948099205209
- * // BMI is 23.671253629592222
- *
- * @see {@link combineAll}
- * @see {@link merge}
- * @see {@link withLatestFrom}
- *
- * @param {Observable} observable1 An input Observable to combine with the
- * source Observable.
- * @param {Observable} observable2 An input Observable to combine with the
- * source Observable. More than one input Observables may be given as argument.
- * @param {function} [project] An optional function to project the values from
- * the combined latest values into a new value on the output Observable.
- * @param {Scheduler} [scheduler=null] The IScheduler to use for subscribing to
- * each input Observable.
- * @return {Observable} An Observable of projected values from the most recent
- * values from each input Observable, or an array of the most recent values from
- * each input Observable.
- * @static true
- * @name combineLatest
- * @owner Observable
- */
-function combineLatest() {
-    var observables = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        observables[_i - 0] = arguments[_i];
-    }
-    var project = null;
-    var scheduler = null;
-    if (isScheduler_1.isScheduler(observables[observables.length - 1])) {
-        scheduler = observables.pop();
-    }
-    if (typeof observables[observables.length - 1] === 'function') {
-        project = observables.pop();
-    }
-    // if the first and only other argument besides the resultSelector is an array
-    // assume it's been called with `combineLatest([obs1, obs2, obs3], project)`
-    if (observables.length === 1 && isArray_1.isArray(observables[0])) {
-        observables = observables[0];
-    }
-    return new ArrayObservable_1.ArrayObservable(observables, scheduler).lift(new combineLatest_1.CombineLatestOperator(project));
-}
-exports.combineLatest = combineLatest;
-
-},{"../operator/combineLatest":106,"../util/isArray":157,"../util/isScheduler":162,"./ArrayObservable":83}],94:[function(require,module,exports){
-"use strict";
-var DeferObservable_1 = require('./DeferObservable');
-exports.defer = DeferObservable_1.DeferObservable.create;
-
-},{"./DeferObservable":85}],95:[function(require,module,exports){
-"use strict";
-var EmptyObservable_1 = require('./EmptyObservable');
-exports.empty = EmptyObservable_1.EmptyObservable.create;
-
-},{"./EmptyObservable":86}],96:[function(require,module,exports){
-"use strict";
-var FromObservable_1 = require('./FromObservable');
-exports.from = FromObservable_1.FromObservable.create;
-
-},{"./FromObservable":89}],97:[function(require,module,exports){
-"use strict";
-var FromEventObservable_1 = require('./FromEventObservable');
-exports.fromEvent = FromEventObservable_1.FromEventObservable.create;
-
-},{"./FromEventObservable":88}],98:[function(require,module,exports){
-"use strict";
-var PromiseObservable_1 = require('./PromiseObservable');
-exports.fromPromise = PromiseObservable_1.PromiseObservable.create;
-
-},{"./PromiseObservable":91}],99:[function(require,module,exports){
-"use strict";
-var merge_1 = require('../operator/merge');
-exports.merge = merge_1.mergeStatic;
-
-},{"../operator/merge":119}],100:[function(require,module,exports){
-"use strict";
-var ArrayObservable_1 = require('./ArrayObservable');
-exports.of = ArrayObservable_1.ArrayObservable.of;
-
-},{"./ArrayObservable":83}],101:[function(require,module,exports){
-"use strict";
-var ErrorObservable_1 = require('./ErrorObservable');
-exports._throw = ErrorObservable_1.ErrorObservable.create;
-
-},{"./ErrorObservable":87}],102:[function(require,module,exports){
-"use strict";
-var zip_1 = require('../operator/zip');
-exports.zip = zip_1.zipStatic;
-
-},{"../operator/zip":139}],103:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var OuterSubscriber_1 = require('../OuterSubscriber');
-var subscribeToResult_1 = require('../util/subscribeToResult');
-/**
- * Buffers the source Observable values until `closingNotifier` emits.
- *
- * <span class="informal">Collects values from the past as an array, and emits
- * that array only when another Observable emits.</span>
- *
- * <img src="./img/buffer.png" width="100%">
- *
- * Buffers the incoming Observable values until the given `closingNotifier`
- * Observable emits a value, at which point it emits the buffer on the output
- * Observable and starts a new buffer internally, awaiting the next time
- * `closingNotifier` emits.
- *
- * @example <caption>On every click, emit array of most recent interval events</caption>
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var interval = Rx.Observable.interval(1000);
- * var buffered = interval.buffer(clicks);
- * buffered.subscribe(x => console.log(x));
- *
- * @see {@link bufferCount}
- * @see {@link bufferTime}
- * @see {@link bufferToggle}
- * @see {@link bufferWhen}
- * @see {@link window}
- *
- * @param {Observable<any>} closingNotifier An Observable that signals the
- * buffer to be emitted on the output Observable.
- * @return {Observable<T[]>} An Observable of buffers, which are arrays of
- * values.
- * @method buffer
- * @owner Observable
- */
-function buffer(closingNotifier) {
-    return this.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;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var BufferSubscriber = (function (_super) {
-    __extends(BufferSubscriber, _super);
-    function BufferSubscriber(destination, closingNotifier) {
-        _super.call(this, destination);
-        this.buffer = [];
-        this.add(subscribeToResult_1.subscribeToResult(this, closingNotifier));
-    }
-    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":30,"../util/subscribeToResult":164}],104:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subscriber_1 = require('../Subscriber');
-/**
- * Buffers the source Observable values until the size hits the maximum
- * `bufferSize` given.
- *
- * <span class="informal">Collects values from the past as an array, and emits
- * that array only when its size reaches `bufferSize`.</span>
- *
- * <img src="./img/bufferCount.png" width="100%">
- *
- * Buffers a number of values from the source Observable by `bufferSize` then
- * emits the buffer and clears it, and starts a new buffer each
- * `startBufferEvery` values. If `startBufferEvery` is not provided or is
- * `null`, then new buffers are started immediately at the start of the source
- * and when each buffer closes and is emitted.
- *
- * @example <caption>Emit the last two click events as an array</caption>
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var buffered = clicks.bufferCount(2);
- * buffered.subscribe(x => console.log(x));
- *
- * @example <caption>On every click, emit the last two click events as an array</caption>
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var buffered = clicks.bufferCount(2, 1);
- * buffered.subscribe(x => console.log(x));
- *
- * @see {@link buffer}
- * @see {@link bufferTime}
- * @see {@link bufferToggle}
- * @see {@link bufferWhen}
- * @see {@link pairwise}
- * @see {@link windowCount}
- *
- * @param {number} bufferSize The maximum size of the buffer emitted.
- * @param {number} [startBufferEvery] Interval at which to start a new buffer.
- * For example if `startBufferEvery` is `2`, then a new buffer will be started
- * on every other value from the source. A new buffer is started at the
- * beginning of the source by default.
- * @return {Observable<T[]>} An Observable of arrays of buffered values.
- * @method bufferCount
- * @owner Observable
- */
-function bufferCount(bufferSize, startBufferEvery) {
-    if (startBufferEvery === void 0) { startBufferEvery = null; }
-    return this.lift(new BufferCountOperator(bufferSize, startBufferEvery));
-}
-exports.bufferCount = bufferCount;
-var BufferCountOperator = (function () {
-    function BufferCountOperator(bufferSize, startBufferEvery) {
-        this.bufferSize = bufferSize;
-        this.startBufferEvery = startBufferEvery;
-    }
-    BufferCountOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new BufferCountSubscriber(subscriber, this.bufferSize, this.startBufferEvery));
-    };
-    return BufferCountOperator;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var BufferCountSubscriber = (function (_super) {
-    __extends(BufferCountSubscriber, _super);
-    function BufferCountSubscriber(destination, bufferSize, startBufferEvery) {
-        _super.call(this, destination);
-        this.bufferSize = bufferSize;
-        this.startBufferEvery = startBufferEvery;
-        this.buffers = [];
-        this.count = 0;
-    }
-    BufferCountSubscriber.prototype._next = function (value) {
-        var count = this.count++;
-        var _a = this, destination = _a.destination, bufferSize = _a.bufferSize, startBufferEvery = _a.startBufferEvery, buffers = _a.buffers;
-        var startOn = (startBufferEvery == null) ? bufferSize : startBufferEvery;
-        if (count % startOn === 0) {
-            buffers.push([]);
-        }
-        for (var i = buffers.length; i--;) {
-            var buffer = buffers[i];
-            buffer.push(value);
-            if (buffer.length === bufferSize) {
-                buffers.splice(i, 1);
-                destination.next(buffer);
-            }
-        }
-    };
-    BufferCountSubscriber.prototype._complete = function () {
-        var destination = this.destination;
-        var buffers = this.buffers;
-        while (buffers.length > 0) {
-            var buffer = buffers.shift();
-            if (buffer.length > 0) {
-                destination.next(buffer);
-            }
-        }
-        _super.prototype._complete.call(this);
-    };
-    return BufferCountSubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subscriber":35}],105:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var OuterSubscriber_1 = require('../OuterSubscriber');
-var subscribeToResult_1 = require('../util/subscribeToResult');
-/**
- * Catches errors on the observable to be handled by returning a new observable or throwing an error.
- * @param {function} selector a function that takes as arguments `err`, which is the error, and `caught`, which
- *  is the source observable, in case you'd like to "retry" that observable by returning it again. Whatever observable
- *  is returned by the `selector` will be used to continue the observable chain.
- * @return {Observable} an observable that originates from either the source or the observable returned by the
- *  catch `selector` function.
- * @method catch
- * @name catch
- * @owner Observable
- */
-function _catch(selector) {
-    var operator = new CatchOperator(selector);
-    var caught = this.lift(operator);
-    return (operator.caught = caught);
-}
-exports._catch = _catch;
-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;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var CatchSubscriber = (function (_super) {
-    __extends(CatchSubscriber, _super);
-    function CatchSubscriber(destination, selector, caught) {
-        _super.call(this, destination);
-        this.selector = selector;
-        this.caught = caught;
-    }
-    // NOTE: overriding `error` instead of `_error` because we don't want
-    // to have this flag this subscriber as `isStopped`.
-    CatchSubscriber.prototype.error = function (err) {
-        if (!this.isStopped) {
-            var result = void 0;
-            try {
-                result = this.selector(err, this.caught);
-            }
-            catch (err) {
-                this.destination.error(err);
-                return;
-            }
-            this.unsubscribe();
-            this.destination.remove(this);
-            subscribeToResult_1.subscribeToResult(this, result);
-        }
-    };
-    return CatchSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-
-},{"../OuterSubscriber":30,"../util/subscribeToResult":164}],106:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var ArrayObservable_1 = require('../observable/ArrayObservable');
-var isArray_1 = require('../util/isArray');
-var OuterSubscriber_1 = require('../OuterSubscriber');
-var subscribeToResult_1 = require('../util/subscribeToResult');
-var none = {};
-/* tslint:disable:max-line-length */
-/**
- * Combines multiple Observables to create an Observable whose values are
- * calculated from the latest values of each of its input Observables.
- *
- * <span class="informal">Whenever any input Observable emits a value, it
- * computes a formula using the latest values from all the inputs, then emits
- * the output of that formula.</span>
- *
- * <img src="./img/combineLatest.png" width="100%">
- *
- * `combineLatest` combines the values from this Observable with values from
- * Observables passed as arguments. This is done by subscribing to each
- * Observable, in order, and collecting an array of each of the most recent
- * values any time any of the input Observables emits, then either taking that
- * array and passing it as arguments to an optional `project` function and
- * emitting the return value of that, or just emitting the array of recent
- * values directly if there is no `project` function.
- *
- * @example <caption>Dynamically calculate the Body-Mass Index from an Observable of weight and one for height</caption>
- * var weight = Rx.Observable.of(70, 72, 76, 79, 75);
- * var height = Rx.Observable.of(1.76, 1.77, 1.78);
- * var bmi = weight.combineLatest(height, (w, h) => w / (h * h));
- * bmi.subscribe(x => console.log('BMI is ' + x));
- *
- * // With output to console:
- * // BMI is 24.212293388429753
- * // BMI is 23.93948099205209
- * // BMI is 23.671253629592222
- *
- * @see {@link combineAll}
- * @see {@link merge}
- * @see {@link withLatestFrom}
- *
- * @param {Observable} other An input Observable to combine with the source
- * Observable. More than one input Observables may be given as argument.
- * @param {function} [project] An optional function to project the values from
- * the combined latest values into a new value on the output Observable.
- * @return {Observable} An Observable of projected values from the most recent
- * values from each input Observable, or an array of the most recent values from
- * each input Observable.
- * @method combineLatest
- * @owner Observable
- */
-function combineLatest() {
-    var observables = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        observables[_i - 0] = arguments[_i];
-    }
-    var project = null;
-    if (typeof observables[observables.length - 1] === 'function') {
-        project = observables.pop();
-    }
-    // if the first and only other argument besides the resultSelector is an array
-    // assume it's been called with `combineLatest([obs1, obs2, obs3], project)`
-    if (observables.length === 1 && isArray_1.isArray(observables[0])) {
-        observables = observables[0];
-    }
-    observables.unshift(this);
-    return this.lift.call(new ArrayObservable_1.ArrayObservable(observables), new CombineLatestOperator(project));
-}
-exports.combineLatest = combineLatest;
-var CombineLatestOperator = (function () {
-    function CombineLatestOperator(project) {
-        this.project = project;
-    }
-    CombineLatestOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new CombineLatestSubscriber(subscriber, this.project));
-    };
-    return CombineLatestOperator;
-}());
-exports.CombineLatestOperator = CombineLatestOperator;
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var CombineLatestSubscriber = (function (_super) {
-    __extends(CombineLatestSubscriber, _super);
-    function CombineLatestSubscriber(destination, project) {
-        _super.call(this, destination);
-        this.project = project;
-        this.active = 0;
-        this.values = [];
-        this.observables = [];
-    }
-    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.project) {
-                this._tryProject(values);
-            }
-            else {
-                this.destination.next(values.slice());
-            }
-        }
-    };
-    CombineLatestSubscriber.prototype._tryProject = function (values) {
-        var result;
-        try {
-            result = this.project.apply(this, values);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        this.destination.next(result);
-    };
-    return CombineLatestSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-exports.CombineLatestSubscriber = CombineLatestSubscriber;
-
-},{"../OuterSubscriber":30,"../observable/ArrayObservable":83,"../util/isArray":157,"../util/subscribeToResult":164}],107:[function(require,module,exports){
-"use strict";
-var isScheduler_1 = require('../util/isScheduler');
-var ArrayObservable_1 = require('../observable/ArrayObservable');
-var mergeAll_1 = require('./mergeAll');
-/* tslint:disable:max-line-length */
-/**
- * Creates an output Observable which sequentially emits all values from every
- * given input Observable after the current Observable.
- *
- * <span class="informal">Concatenates multiple Observables together by
- * sequentially emitting their values, one Observable after the other.</span>
- *
- * <img src="./img/concat.png" width="100%">
- *
- * Joins this Observable with multiple other Observables by subscribing to them
- * one at a time, starting with the source, and merging their results into the
- * output Observable. Will wait for each Observable to complete before moving
- * on to the next.
- *
- * @example <caption>Concatenate a timer counting from 0 to 3 with a synchronous sequence from 1 to 10</caption>
- * var timer = Rx.Observable.interval(1000).take(4);
- * var sequence = Rx.Observable.range(1, 10);
- * var result = timer.concat(sequence);
- * result.subscribe(x => console.log(x));
- *
- * // results in:
- * // 1000ms-> 0 -1000ms-> 1 -1000ms-> 2 -1000ms-> 3 -immediate-> 1 ... 10
- *
- * @example <caption>Concatenate 3 Observables</caption>
- * var timer1 = Rx.Observable.interval(1000).take(10);
- * var timer2 = Rx.Observable.interval(2000).take(6);
- * var timer3 = Rx.Observable.interval(500).take(10);
- * var result = timer1.concat(timer2, timer3);
- * result.subscribe(x => console.log(x));
- *
- * // results in the following:
- * // (Prints to console sequentially)
- * // -1000ms-> 0 -1000ms-> 1 -1000ms-> ... 9
- * // -2000ms-> 0 -2000ms-> 1 -2000ms-> ... 5
- * // -500ms-> 0 -500ms-> 1 -500ms-> ... 9
- *
- * @see {@link concatAll}
- * @see {@link concatMap}
- * @see {@link concatMapTo}
- *
- * @param {Observable} other An input Observable to concatenate after the source
- * Observable. More than one input Observables may be given as argument.
- * @param {Scheduler} [scheduler=null] An optional IScheduler to schedule each
- * Observable subscription on.
- * @return {Observable} All values of each passed Observable merged into a
- * single Observable, in order, in serial fashion.
- * @method concat
- * @owner Observable
- */
-function concat() {
-    var observables = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        observables[_i - 0] = arguments[_i];
-    }
-    return this.lift.call(concatStatic.apply(void 0, [this].concat(observables)));
-}
-exports.concat = concat;
-/* tslint:enable:max-line-length */
-/**
- * Creates an output Observable which sequentially emits all values from every
- * given input Observable after the current Observable.
- *
- * <span class="informal">Concatenates multiple Observables together by
- * sequentially emitting their values, one Observable after the other.</span>
- *
- * <img src="./img/concat.png" width="100%">
- *
- * Joins multiple Observables together by subscribing to them one at a time and
- * merging their results into the output Observable. Will wait for each
- * Observable to complete before moving on to the next.
- *
- * @example <caption>Concatenate a timer counting from 0 to 3 with a synchronous sequence from 1 to 10</caption>
- * var timer = Rx.Observable.interval(1000).take(4);
- * var sequence = Rx.Observable.range(1, 10);
- * var result = Rx.Observable.concat(timer, sequence);
- * result.subscribe(x => console.log(x));
- *
- * // results in:
- * // 0 -1000ms-> 1 -1000ms-> 2 -1000ms-> 3 -immediate-> 1 ... 10
- *
- * @example <caption>Concatenate 3 Observables</caption>
- * var timer1 = Rx.Observable.interval(1000).take(10);
- * var timer2 = Rx.Observable.interval(2000).take(6);
- * var timer3 = Rx.Observable.interval(500).take(10);
- * var result = Rx.Observable.concat(timer1, timer2, timer3);
- * result.subscribe(x => console.log(x));
- *
- * // results in the following:
- * // (Prints to console sequentially)
- * // -1000ms-> 0 -1000ms-> 1 -1000ms-> ... 9
- * // -2000ms-> 0 -2000ms-> 1 -2000ms-> ... 5
- * // -500ms-> 0 -500ms-> 1 -500ms-> ... 9
- *
- * @see {@link concatAll}
- * @see {@link concatMap}
- * @see {@link concatMapTo}
- *
- * @param {Observable} input1 An input Observable to concatenate with others.
- * @param {Observable} input2 An input Observable to concatenate with others.
- * More than one input Observables may be given as argument.
- * @param {Scheduler} [scheduler=null] An optional IScheduler to schedule each
- * Observable subscription on.
- * @return {Observable} All values of each passed Observable merged into a
- * single Observable, in order, in serial fashion.
- * @static true
- * @name concat
- * @owner Observable
- */
-function concatStatic() {
-    var observables = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        observables[_i - 0] = arguments[_i];
-    }
-    var scheduler = null;
-    var args = observables;
-    if (isScheduler_1.isScheduler(args[observables.length - 1])) {
-        scheduler = args.pop();
-    }
-    if (scheduler === null && observables.length === 1) {
-        return observables[0];
-    }
-    return new ArrayObservable_1.ArrayObservable(observables, scheduler).lift(new mergeAll_1.MergeAllOperator(1));
-}
-exports.concatStatic = concatStatic;
-
-},{"../observable/ArrayObservable":83,"../util/isScheduler":162,"./mergeAll":120}],108:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subscriber_1 = require('../Subscriber');
-var async_1 = require('../scheduler/async');
-/**
- * Emits a value from the source Observable only after a particular time span
- * has passed without another source emission.
- *
- * <span class="informal">It's like {@link delay}, but passes only the most
- * recent value from each burst of emissions.</span>
- *
- * <img src="./img/debounceTime.png" width="100%">
- *
- * `debounceTime` delays values emitted by the source Observable, but drops
- * previous pending delayed emissions if a new value arrives on the source
- * Observable. This operator keeps track of the most recent value from the
- * source Observable, and emits that only when `dueTime` enough time has passed
- * without any other value appearing on the source Observable. If a new value
- * appears before `dueTime` silence occurs, the previous value will be dropped
- * and will not be emitted on the output Observable.
- *
- * This is a rate-limiting operator, because it is impossible for more than one
- * value to be emitted in any time window of duration `dueTime`, but it is also
- * a delay-like operator since output emissions do not occur at the same time as
- * they did on the source Observable. Optionally takes a {@link IScheduler} for
- * managing timers.
- *
- * @example <caption>Emit the most recent click after a burst of clicks</caption>
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var result = clicks.debounceTime(1000);
- * result.subscribe(x => console.log(x));
- *
- * @see {@link auditTime}
- * @see {@link debounce}
- * @see {@link delay}
- * @see {@link sampleTime}
- * @see {@link throttleTime}
- *
- * @param {number} dueTime The timeout duration in milliseconds (or the time
- * unit determined internally by the optional `scheduler`) for the window of
- * time required to wait for emission silence before emitting the most recent
- * source value.
- * @param {Scheduler} [scheduler=async] The {@link IScheduler} to use for
- * managing the timers that handle the timeout for each value.
- * @return {Observable} An Observable that delays the emissions of the source
- * Observable by the specified `dueTime`, and may drop some values if they occur
- * too frequently.
- * @method debounceTime
- * @owner Observable
- */
-function debounceTime(dueTime, scheduler) {
-    if (scheduler === void 0) { scheduler = async_1.async; }
-    return this.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;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var DebounceTimeSubscriber = (function (_super) {
-    __extends(DebounceTimeSubscriber, _super);
-    function DebounceTimeSubscriber(destination, dueTime, scheduler) {
-        _super.call(this, destination);
-        this.dueTime = dueTime;
-        this.scheduler = scheduler;
-        this.debouncedSubscription = null;
-        this.lastValue = null;
-        this.hasValue = false;
-    }
-    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) {
-            this.destination.next(this.lastValue);
-            this.lastValue = null;
-            this.hasValue = false;
-        }
-    };
-    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":35,"../scheduler/async":145}],109:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var async_1 = require('../scheduler/async');
-var isDate_1 = require('../util/isDate');
-var Subscriber_1 = require('../Subscriber');
-var Notification_1 = require('../Notification');
-/**
- * Delays the emission of items from the source Observable by a given timeout or
- * until a given Date.
- *
- * <span class="informal">Time shifts each item by some specified amount of
- * milliseconds.</span>
- *
- * <img src="./img/delay.png" width="100%">
- *
- * If the delay argument is a Number, this operator time shifts the source
- * Observable by that amount of time expressed in milliseconds. The relative
- * time intervals between the values are preserved.
- *
- * If the delay argument is a Date, this operator time shifts the start of the
- * Observable execution until the given date occurs.
- *
- * @example <caption>Delay each click by one second</caption>
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var delayedClicks = clicks.delay(1000); // each click emitted after 1 second
- * delayedClicks.subscribe(x => console.log(x));
- *
- * @example <caption>Delay all clicks until a future date happens</caption>
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var date = new Date('March 15, 2050 12:00:00'); // in the future
- * var delayedClicks = clicks.delay(date); // click emitted only after that date
- * delayedClicks.subscribe(x => console.log(x));
- *
- * @see {@link debounceTime}
- * @see {@link delayWhen}
- *
- * @param {number|Date} delay The delay duration in milliseconds (a `number`) or
- * a `Date` until which the emission of the source items is delayed.
- * @param {Scheduler} [scheduler=async] The IScheduler to use for
- * managing the timers that handle the time-shift for each item.
- * @return {Observable} An Observable that delays the emissions of the source
- * Observable by the specified timeout or Date.
- * @method delay
- * @owner Observable
- */
-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 this.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;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var DelaySubscriber = (function (_super) {
-    __extends(DelaySubscriber, _super);
-    function DelaySubscriber(destination, delay, scheduler) {
-        _super.call(this, destination);
-        this.delay = delay;
-        this.scheduler = scheduler;
-        this.queue = [];
-        this.active = false;
-        this.errored = false;
-    }
-    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 {
-            source.active = false;
-        }
-    };
-    DelaySubscriber.prototype._schedule = function (scheduler) {
-        this.active = true;
-        this.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);
-    };
-    DelaySubscriber.prototype._complete = function () {
-        this.scheduleNotification(Notification_1.Notification.createComplete());
-    };
-    return DelaySubscriber;
-}(Subscriber_1.Subscriber));
-var DelayMessage = (function () {
-    function DelayMessage(time, notification) {
-        this.time = time;
-        this.notification = notification;
-    }
-    return DelayMessage;
-}());
-
-},{"../Notification":27,"../Subscriber":35,"../scheduler/async":145,"../util/isDate":158}],110:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var OuterSubscriber_1 = require('../OuterSubscriber');
-var subscribeToResult_1 = require('../util/subscribeToResult');
-var Set_1 = require('../util/Set');
-/**
- * Returns an Observable that emits all items emitted by the source Observable that are distinct by comparison from previous items.
- *
- * If a keySelector function is provided, then it will project each value from the source observable into a new value that it will
- * check for equality with previously projected values. If a keySelector function is not provided, it will use each value from the
- * source observable directly with an equality check against previous values.
- *
- * In JavaScript runtimes that support `Set`, this operator will use a `Set` to improve performance of the distinct value checking.
- *
- * In other runtimes, this operator will use a minimal implementation of `Set` that relies on an `Array` and `indexOf` under the
- * hood, so performance will degrade as more values are checked for distinction. Even in newer browsers, a long-running `distinct`
- * use might result in memory leaks. To help alleviate this in some scenarios, an optional `flushes` parameter is also provided so
- * that the internal `Set` can be "flushed", basically clearing it of values.
- *
- * @example <caption>A simple example with numbers</caption>
- * Observable.of(1, 1, 2, 2, 2, 1, 2, 3, 4, 3, 2, 1)
- *   .distinct()
- *   .subscribe(x => console.log(x)); // 1, 2, 3, 4
- *
- * @example <caption>An example using a keySelector function</caption>
- * interface Person {
- *    age: number,
- *    name: string
- * }
- *
- * Observable.of<Person>(
- *     { age: 4, name: 'Foo'},
- *     { age: 7, name: 'Bar'},
- *     { age: 5, name: 'Foo'})
- *     .distinct((p: Person) => p.name)
- *     .subscribe(x => console.log(x));
- *
- * // displays:
- * // { age: 4, name: 'Foo' }
- * // { age: 7, name: 'Bar' }
- *
- * @see {@link distinctUntilChanged}
- * @see {@link distinctUntilKeyChanged}
- *
- * @param {function} [keySelector] optional function to select which value you want to check as distinct.
- * @param {Observable} [flushes] optional Observable for flushing the internal HashSet of the operator.
- * @return {Observable} an Observable that emits items from the source Observable with distinct values.
- * @method distinct
- * @owner Observable
- */
-function distinct(keySelector, flushes) {
-    return this.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;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var DistinctSubscriber = (function (_super) {
-    __extends(DistinctSubscriber, _super);
-    function DistinctSubscriber(destination, keySelector, flushes) {
-        _super.call(this, destination);
-        this.keySelector = keySelector;
-        this.values = new Set_1.Set();
-        if (flushes) {
-            this.add(subscribeToResult_1.subscribeToResult(this, flushes));
-        }
-    }
-    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":30,"../util/Set":154,"../util/subscribeToResult":164}],111:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subscriber_1 = require('../Subscriber');
-var tryCatch_1 = require('../util/tryCatch');
-var errorObject_1 = require('../util/errorObject');
-/* tslint:disable:max-line-length */
-/**
- * Returns an Observable that emits all items emitted by the source Observable that are distinct by comparison from the previous item.
- *
- * If a comparator function is provided, then it will be called for each item to test for whether or not that value should be emitted.
- *
- * If a comparator function is not provided, an equality check is used by default.
- *
- * @example <caption>A simple example with numbers</caption>
- * Observable.of(1, 1, 2, 2, 2, 1, 1, 2, 3, 3, 4)
- *   .distinctUntilChanged()
- *   .subscribe(x => console.log(x)); // 1, 2, 1, 2, 3, 4
- *
- * @example <caption>An example using a compare function</caption>
- * interface Person {
- *    age: number,
- *    name: string
- * }
- *
- * Observable.of<Person>(
- *     { age: 4, name: 'Foo'},
- *     { age: 7, name: 'Bar'},
- *     { age: 5, name: 'Foo'})
- *     { age: 6, name: 'Foo'})
- *     .distinctUntilChanged((p: Person, q: Person) => p.name === q.name)
- *     .subscribe(x => console.log(x));
- *
- * // displays:
- * // { age: 4, name: 'Foo' }
- * // { age: 7, name: 'Bar' }
- * // { age: 5, name: 'Foo' }
- *
- * @see {@link distinct}
- * @see {@link distinctUntilKeyChanged}
- *
- * @param {function} [compare] optional comparison function called to test if an item is distinct from the previous item in the source.
- * @return {Observable} an Observable that emits items from the source Observable with distinct values.
- * @method distinctUntilChanged
- * @owner Observable
- */
-function distinctUntilChanged(compare, keySelector) {
-    return this.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;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var DistinctUntilChangedSubscriber = (function (_super) {
-    __extends(DistinctUntilChangedSubscriber, _super);
-    function DistinctUntilChangedSubscriber(destination, compare, keySelector) {
-        _super.call(this, destination);
-        this.keySelector = keySelector;
-        this.hasKey = false;
-        if (typeof compare === 'function') {
-            this.compare = compare;
-        }
-    }
-    DistinctUntilChangedSubscriber.prototype.compare = function (x, y) {
-        return x === y;
-    };
-    DistinctUntilChangedSubscriber.prototype._next = function (value) {
-        var keySelector = this.keySelector;
-        var key = value;
-        if (keySelector) {
-            key = tryCatch_1.tryCatch(this.keySelector)(value);
-            if (key === errorObject_1.errorObject) {
-                return this.destination.error(errorObject_1.errorObject.e);
-            }
-        }
-        var result = false;
-        if (this.hasKey) {
-            result = tryCatch_1.tryCatch(this.compare)(this.key, key);
-            if (result === errorObject_1.errorObject) {
-                return this.destination.error(errorObject_1.errorObject.e);
-            }
-        }
-        else {
-            this.hasKey = true;
-        }
-        if (Boolean(result) === false) {
-            this.key = key;
-            this.destination.next(value);
-        }
-    };
-    return DistinctUntilChangedSubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subscriber":35,"../util/errorObject":156,"../util/tryCatch":166}],112:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subscriber_1 = require('../Subscriber');
-/* tslint:disable:max-line-length */
-/**
- * Perform a side effect for every emission on the source Observable, but return
- * an Observable that is identical to the source.
- *
- * <span class="informal">Intercepts each emission on the source and runs a
- * function, but returns an output which is identical to the source.</span>
- *
- * <img src="./img/do.png" width="100%">
- *
- * Returns a mirrored Observable of the source Observable, but modified so that
- * the provided Observer is called to perform a side effect for every value,
- * error, and completion emitted by the source. Any errors that are thrown in
- * the aforementioned Observer or handlers are safely sent down the error path
- * of the output Observable.
- *
- * This operator is useful for debugging your Observables for the correct values
- * or performing other side effects.
- *
- * Note: this is different to a `subscribe` on the Observable. If the Observable
- * returned by `do` is not subscribed, the side effects specified by the
- * Observer will never happen. `do` therefore simply spies on existing
- * execution, it does not trigger an execution to happen like `subscribe` does.
- *
- * @example <caption>Map every every click to the clientX position of that click, while also logging the click event</caption>
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var positions = clicks
- *   .do(ev => console.log(ev))
- *   .map(ev => ev.clientX);
- * positions.subscribe(x => console.log(x));
- *
- * @see {@link map}
- * @see {@link subscribe}
- *
- * @param {Observer|function} [nextOrObserver] A normal Observer object or a
- * callback for `next`.
- * @param {function} [error] Callback for errors in the source.
- * @param {function} [complete] Callback for the completion of the source.
- * @return {Observable} An Observable identical to the source, but runs the
- * specified Observer or callback(s) for each item.
- * @method do
- * @name do
- * @owner Observable
- */
-function _do(nextOrObserver, error, complete) {
-    return this.lift(new DoOperator(nextOrObserver, error, complete));
-}
-exports._do = _do;
-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 DoSubscriber(subscriber, this.nextOrObserver, this.error, this.complete));
-    };
-    return DoOperator;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var DoSubscriber = (function (_super) {
-    __extends(DoSubscriber, _super);
-    function DoSubscriber(destination, nextOrObserver, error, complete) {
-        _super.call(this, destination);
-        var safeSubscriber = new Subscriber_1.Subscriber(nextOrObserver, error, complete);
-        safeSubscriber.syncErrorThrowable = true;
-        this.add(safeSubscriber);
-        this.safeSubscriber = safeSubscriber;
-    }
-    DoSubscriber.prototype._next = function (value) {
-        var safeSubscriber = this.safeSubscriber;
-        safeSubscriber.next(value);
-        if (safeSubscriber.syncErrorThrown) {
-            this.destination.error(safeSubscriber.syncErrorValue);
-        }
-        else {
-            this.destination.next(value);
-        }
-    };
-    DoSubscriber.prototype._error = function (err) {
-        var safeSubscriber = this.safeSubscriber;
-        safeSubscriber.error(err);
-        if (safeSubscriber.syncErrorThrown) {
-            this.destination.error(safeSubscriber.syncErrorValue);
-        }
-        else {
-            this.destination.error(err);
-        }
-    };
-    DoSubscriber.prototype._complete = function () {
-        var safeSubscriber = this.safeSubscriber;
-        safeSubscriber.complete();
-        if (safeSubscriber.syncErrorThrown) {
-            this.destination.error(safeSubscriber.syncErrorValue);
-        }
-        else {
-            this.destination.complete();
-        }
-    };
-    return DoSubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subscriber":35}],113:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var tryCatch_1 = require('../util/tryCatch');
-var errorObject_1 = require('../util/errorObject');
-var OuterSubscriber_1 = require('../OuterSubscriber');
-var subscribeToResult_1 = require('../util/subscribeToResult');
-/* tslint:disable:max-line-length */
-/**
- * Recursively projects each source value to an Observable which is merged in
- * the output Observable.
- *
- * <span class="informal">It's similar to {@link mergeMap}, but applies the
- * projection function to every source value as well as every output value.
- * It's recursive.</span>
- *
- * <img src="./img/expand.png" width="100%">
- *
- * Returns an Observable that emits items based on applying a function that you
- * supply to each item emitted by the source Observable, where that function
- * returns an Observable, and then merging those resulting Observables and
- * emitting the results of this merger. *Expand* will re-emit on the output
- * Observable every source value. Then, each output value is given to the
- * `project` function which returns an inner Observable to be merged on the
- * output Observable. Those output values resulting from the projection are also
- * given to the `project` function to produce new output values. This is how
- * *expand* behaves recursively.
- *
- * @example <caption>Start emitting the powers of two on every click, at most 10 of them</caption>
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var powersOfTwo = clicks
- *   .mapTo(1)
- *   .expand(x => Rx.Observable.of(2 * x).delay(1000))
- *   .take(10);
- * powersOfTwo.subscribe(x => console.log(x));
- *
- * @see {@link mergeMap}
- * @see {@link mergeScan}
- *
- * @param {function(value: T, index: number) => Observable} project A function
- * that, when applied to an item emitted by the source or the output Observable,
- * returns an Observable.
- * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of input
- * Observables being subscribed to concurrently.
- * @param {Scheduler} [scheduler=null] The IScheduler to use for subscribing to
- * each projected inner Observable.
- * @return {Observable} An Observable that emits the source values and also
- * result of applying the projection function to each value emitted on the
- * output Observable and and merging the results of the Observables obtained
- * from this transformation.
- * @method expand
- * @owner Observable
- */
-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 this.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;
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var ExpandSubscriber = (function (_super) {
-    __extends(ExpandSubscriber, _super);
-    function ExpandSubscriber(destination, project, concurrent, scheduler) {
-        _super.call(this, destination);
-        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 = [];
-        }
-    }
-    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);
-            var result = tryCatch_1.tryCatch(this.project)(value, index);
-            if (result === errorObject_1.errorObject) {
-                destination.error(errorObject_1.errorObject.e);
-            }
-            else if (!this.scheduler) {
-                this.subscribeToProjection(result, value, index);
-            }
-            else {
-                var state = { subscriber: this, result: result, value: value, index: index };
-                this.add(this.scheduler.schedule(ExpandSubscriber.dispatch, 0, state));
-            }
-        }
-        else {
-            this.buffer.push(value);
-        }
-    };
-    ExpandSubscriber.prototype.subscribeToProjection = function (result, value, index) {
-        this.active++;
-        this.add(subscribeToResult_1.subscribeToResult(this, result, value, index));
-    };
-    ExpandSubscriber.prototype._complete = function () {
-        this.hasCompleted = true;
-        if (this.hasCompleted && this.active === 0) {
-            this.destination.complete();
-        }
-    };
-    ExpandSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this._next(innerValue);
-    };
-    ExpandSubscriber.prototype.notifyComplete = function (innerSub) {
-        var buffer = this.buffer;
-        this.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":30,"../util/errorObject":156,"../util/subscribeToResult":164,"../util/tryCatch":166}],114:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subscriber_1 = require('../Subscriber');
-/* tslint:disable:max-line-length */
-/**
- * Filter items emitted by the source Observable by only emitting those that
- * satisfy a specified predicate.
- *
- * <span class="informal">Like
- * [Array.prototype.filter()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter),
- * it only emits a value from the source if it passes a criterion function.</span>
- *
- * <img src="./img/filter.png" width="100%">
- *
- * Similar to the well-known `Array.prototype.filter` method, this operator
- * takes values from the source Observable, passes them through a `predicate`
- * function and only emits those values that yielded `true`.
- *
- * @example <caption>Emit only click events whose target was a DIV element</caption>
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var clicksOnDivs = clicks.filter(ev => ev.target.tagName === 'DIV');
- * clicksOnDivs.subscribe(x => console.log(x));
- *
- * @see {@link distinct}
- * @see {@link distinctUntilChanged}
- * @see {@link distinctUntilKeyChanged}
- * @see {@link ignoreElements}
- * @see {@link partition}
- * @see {@link skip}
- *
- * @param {function(value: T, index: number): boolean} predicate A function that
- * evaluates each value emitted by the source Observable. If it returns `true`,
- * the value is emitted, if `false` the value is not passed to the output
- * Observable. The `index` parameter is the number `i` for the i-th source
- * emission that has happened since the subscription, starting from the number
- * `0`.
- * @param {any} [thisArg] An optional argument to determine the value of `this`
- * in the `predicate` function.
- * @return {Observable} An Observable of values from the source that were
- * allowed by the `predicate` function.
- * @method filter
- * @owner Observable
- */
-function filter(predicate, thisArg) {
-    return this.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;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var FilterSubscriber = (function (_super) {
-    __extends(FilterSubscriber, _super);
-    function FilterSubscriber(destination, predicate, thisArg) {
-        _super.call(this, destination);
-        this.predicate = predicate;
-        this.thisArg = thisArg;
-        this.count = 0;
-        this.predicate = predicate;
-    }
-    // the try catch block below is left specifically for
-    // optimization and perf reasons. a tryCatcher is not necessary here.
-    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":35}],115:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subscriber_1 = require('../Subscriber');
-var Subscription_1 = require('../Subscription');
-/**
- * Returns an Observable that mirrors the source Observable, but will call a specified function when
- * the source terminates on complete or error.
- * @param {function} callback function to be called when source terminates.
- * @return {Observable} an Observable that mirrors the source, but will call the specified function on termination.
- * @method finally
- * @owner Observable
- */
-function _finally(callback) {
-    return this.lift(new FinallyOperator(callback));
-}
-exports._finally = _finally;
-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;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var FinallySubscriber = (function (_super) {
-    __extends(FinallySubscriber, _super);
-    function FinallySubscriber(destination, callback) {
-        _super.call(this, destination);
-        this.add(new Subscription_1.Subscription(callback));
-    }
-    return FinallySubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subscriber":35,"../Subscription":36}],116:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subscriber_1 = require('../Subscriber');
-var EmptyError_1 = require('../util/EmptyError');
-/**
- * Emits only the first value (or the first value that meets some condition)
- * emitted by the source Observable.
- *
- * <span class="informal">Emits only the first value. Or emits only the first
- * value that passes some test.</span>
- *
- * <img src="./img/first.png" width="100%">
- *
- * If called with no arguments, `first` emits the first value of the source
- * Observable, then completes. If called with a `predicate` function, `first`
- * emits the first value of the source that matches the specified condition. It
- * may also take a `resultSelector` function to produce the output value from
- * the input value, and a `defaultValue` to emit in case the source completes
- * before it is able to emit a valid value. Throws an error if `defaultValue`
- * was not provided and a matching element is not found.
- *
- * @example <caption>Emit only the first click that happens on the DOM</caption>
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var result = clicks.first();
- * result.subscribe(x => console.log(x));
- *
- * @example <caption>Emits the first click that happens on a DIV</caption>
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var result = clicks.first(ev => ev.target.tagName === 'DIV');
- * result.subscribe(x => console.log(x));
- *
- * @see {@link filter}
- * @see {@link find}
- * @see {@link take}
- *
- * @throws {EmptyError} Delivers an EmptyError to the Observer's `error`
- * callback if the Observable completes before any `next` notification was sent.
- *
- * @param {function(value: T, index: number, source: Observable<T>): boolean} [predicate]
- * An optional function called with each item to test for condition matching.
- * @param {function(value: T, index: number): R} [resultSelector] A function to
- * produce the value on the output Observable based on the values
- * and the indices of the source Observable. The arguments passed to this
- * function are:
- * - `value`: the value that was emitted on the source.
- * - `index`: the "index" of the value from the source.
- * @param {R} [defaultValue] The default value emitted in case no valid value
- * was found on the source.
- * @return {Observable<T|R>} an Observable of the first item that matches the
- * condition.
- * @method first
- * @owner Observable
- */
-function first(predicate, resultSelector, defaultValue) {
-    return this.lift(new FirstOperator(predicate, resultSelector, defaultValue, this));
-}
-exports.first = first;
-var FirstOperator = (function () {
-    function FirstOperator(predicate, resultSelector, defaultValue, source) {
-        this.predicate = predicate;
-        this.resultSelector = resultSelector;
-        this.defaultValue = defaultValue;
-        this.source = source;
-    }
-    FirstOperator.prototype.call = function (observer, source) {
-        return source.subscribe(new FirstSubscriber(observer, this.predicate, this.resultSelector, this.defaultValue, this.source));
-    };
-    return FirstOperator;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var FirstSubscriber = (function (_super) {
-    __extends(FirstSubscriber, _super);
-    function FirstSubscriber(destination, predicate, resultSelector, defaultValue, source) {
-        _super.call(this, destination);
-        this.predicate = predicate;
-        this.resultSelector = resultSelector;
-        this.defaultValue = defaultValue;
-        this.source = source;
-        this.index = 0;
-        this.hasCompleted = false;
-        this._emitted = false;
-    }
-    FirstSubscriber.prototype._next = function (value) {
-        var index = this.index++;
-        if (this.predicate) {
-            this._tryPredicate(value, index);
-        }
-        else {
-            this._emit(value, index);
-        }
-    };
-    FirstSubscriber.prototype._tryPredicate = function (value, index) {
-        var result;
-        try {
-            result = this.predicate(value, index, this.source);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        if (result) {
-            this._emit(value, index);
-        }
-    };
-    FirstSubscriber.prototype._emit = function (value, index) {
-        if (this.resultSelector) {
-            this._tryResultSelector(value, index);
-            return;
-        }
-        this._emitFinal(value);
-    };
-    FirstSubscriber.prototype._tryResultSelector = function (value, index) {
-        var result;
-        try {
-            result = this.resultSelector(value, index);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        this._emitFinal(result);
-    };
-    FirstSubscriber.prototype._emitFinal = function (value) {
-        var destination = this.destination;
-        if (!this._emitted) {
-            this._emitted = true;
-            destination.next(value);
-            destination.complete();
-            this.hasCompleted = true;
-        }
-    };
-    FirstSubscriber.prototype._complete = function () {
-        var destination = this.destination;
-        if (!this.hasCompleted && typeof this.defaultValue !== 'undefined') {
-            destination.next(this.defaultValue);
-            destination.complete();
-        }
-        else if (!this.hasCompleted) {
-            destination.error(new EmptyError_1.EmptyError);
-        }
-    };
-    return FirstSubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subscriber":35,"../util/EmptyError":152}],117:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subscriber_1 = require('../Subscriber');
-var EmptyError_1 = require('../util/EmptyError');
-/* tslint:disable:max-line-length */
-/**
- * Returns an Observable that emits only the last item emitted by the source Observable.
- * It optionally takes a predicate function as a parameter, in which case, rather than emitting
- * the last item from the source Observable, the resulting Observable will emit the last item
- * from the source Observable that satisfies the predicate.
- *
- * <img src="./img/last.png" width="100%">
- *
- * @throws {EmptyError} Delivers an EmptyError to the Observer's `error`
- * callback if the Observable completes before any `next` notification was sent.
- * @param {function} predicate - the condition any source emitted item has to satisfy.
- * @return {Observable} an Observable that emits only the last item satisfying the given condition
- * from the source, or an NoSuchElementException if no such items are emitted.
- * @throws - Throws if no items that match the predicate are emitted by the source Observable.
- * @method last
- * @owner Observable
- */
-function last(predicate, resultSelector, defaultValue) {
-    return this.lift(new LastOperator(predicate, resultSelector, defaultValue, this));
-}
-exports.last = last;
-var LastOperator = (function () {
-    function LastOperator(predicate, resultSelector, defaultValue, source) {
-        this.predicate = predicate;
-        this.resultSelector = resultSelector;
-        this.defaultValue = defaultValue;
-        this.source = source;
-    }
-    LastOperator.prototype.call = function (observer, source) {
-        return source.subscribe(new LastSubscriber(observer, this.predicate, this.resultSelector, this.defaultValue, this.source));
-    };
-    return LastOperator;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var LastSubscriber = (function (_super) {
-    __extends(LastSubscriber, _super);
-    function LastSubscriber(destination, predicate, resultSelector, defaultValue, source) {
-        _super.call(this, destination);
-        this.predicate = predicate;
-        this.resultSelector = resultSelector;
-        this.defaultValue = defaultValue;
-        this.source = source;
-        this.hasValue = false;
-        this.index = 0;
-        if (typeof defaultValue !== 'undefined') {
-            this.lastValue = defaultValue;
-            this.hasValue = true;
-        }
-    }
-    LastSubscriber.prototype._next = function (value) {
-        var index = this.index++;
-        if (this.predicate) {
-            this._tryPredicate(value, index);
-        }
-        else {
-            if (this.resultSelector) {
-                this._tryResultSelector(value, index);
-                return;
-            }
-            this.lastValue = value;
-            this.hasValue = true;
-        }
-    };
-    LastSubscriber.prototype._tryPredicate = function (value, index) {
-        var result;
-        try {
-            result = this.predicate(value, index, this.source);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        if (result) {
-            if (this.resultSelector) {
-                this._tryResultSelector(value, index);
-                return;
-            }
-            this.lastValue = value;
-            this.hasValue = true;
-        }
-    };
-    LastSubscriber.prototype._tryResultSelector = function (value, index) {
-        var result;
-        try {
-            result = this.resultSelector(value, index);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        this.lastValue = result;
-        this.hasValue = true;
-    };
-    LastSubscriber.prototype._complete = function () {
-        var destination = this.destination;
-        if (this.hasValue) {
-            destination.next(this.lastValue);
-            destination.complete();
-        }
-        else {
-            destination.error(new EmptyError_1.EmptyError);
-        }
-    };
-    return LastSubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subscriber":35,"../util/EmptyError":152}],118:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subscriber_1 = require('../Subscriber');
-/**
- * Applies a given `project` function to each value emitted by the source
- * Observable, and emits the resulting values as an Observable.
- *
- * <span class="informal">Like [Array.prototype.map()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map),
- * it passes each source value through a transformation function to get
- * corresponding output values.</span>
- *
- * <img src="./img/map.png" width="100%">
- *
- * Similar to the well known `Array.prototype.map` function, this operator
- * applies a projection to each value and emits that projection in the output
- * Observable.
- *
- * @example <caption>Map every every click to the clientX position of that click</caption>
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var positions = clicks.map(ev => ev.clientX);
- * positions.subscribe(x => console.log(x));
- *
- * @see {@link mapTo}
- * @see {@link pluck}
- *
- * @param {function(value: T, index: number): R} project The function to apply
- * to each `value` emitted by the source Observable. The `index` parameter is
- * the number `i` for the i-th emission that has happened since the
- * subscription, starting from the number `0`.
- * @param {any} [thisArg] An optional argument to define what `this` is in the
- * `project` function.
- * @return {Observable<R>} An Observable that emits the values from the source
- * Observable transformed by the given `project` function.
- * @method map
- * @owner Observable
- */
-function map(project, thisArg) {
-    if (typeof project !== 'function') {
-        throw new TypeError('argument is not a function. Are you looking for `mapTo()`?');
-    }
-    return this.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;
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var MapSubscriber = (function (_super) {
-    __extends(MapSubscriber, _super);
-    function MapSubscriber(destination, project, thisArg) {
-        _super.call(this, destination);
-        this.project = project;
-        this.count = 0;
-        this.thisArg = thisArg || this;
-    }
-    // NOTE: This looks unoptimized, but it's actually purposefully NOT
-    // using try/catch optimizations.
-    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":35}],119:[function(require,module,exports){
-"use strict";
-var ArrayObservable_1 = require('../observable/ArrayObservable');
-var mergeAll_1 = require('./mergeAll');
-var isScheduler_1 = require('../util/isScheduler');
-/* tslint:disable:max-line-length */
-/**
- * Creates an output Observable which concurrently emits all values from every
- * given input Observable.
- *
- * <span class="informal">Flattens multiple Observables together by blending
- * their values into one Observable.</span>
- *
- * <img src="./img/merge.png" width="100%">
- *
- * `merge` subscribes to each given input Observable (either the source or an
- * Observable given as argument), and simply forwards (without doing any
- * transformation) all the values from all the input Observables to the output
- * Observable. The output Observable only completes once all input Observables
- * have completed. Any error delivered by an input Observable will be immediately
- * emitted on the output Observable.
- *
- * @example <caption>Merge together two Observables: 1s interval and clicks</caption>
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var timer = Rx.Observable.interval(1000);
- * var clicksOrTimer = clicks.merge(timer);
- * clicksOrTimer.subscribe(x => console.log(x));
- *
- * @example <caption>Merge together 3 Observables, but only 2 run concurrently</caption>
- * var timer1 = Rx.Observable.interval(1000).take(10);
- * var timer2 = Rx.Observable.interval(2000).take(6);
- * var timer3 = Rx.Observable.interval(500).take(10);
- * var concurrent = 2; // the argument
- * var merged = timer1.merge(timer2, timer3, concurrent);
- * merged.subscribe(x => console.log(x));
- *
- * @see {@link mergeAll}
- * @see {@link mergeMap}
- * @see {@link mergeMapTo}
- * @see {@link mergeScan}
- *
- * @param {Observable} other An input Observable to merge with the source
- * Observable. More than one input Observables may be given as argument.
- * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of input
- * Observables being subscribed to concurrently.
- * @param {Scheduler} [scheduler=null] The IScheduler to use for managing
- * concurrency of input Observables.
- * @return {Observable} an Observable that emits items that are the result of
- * every input Observable.
- * @method merge
- * @owner Observable
- */
-function merge() {
-    var observables = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        observables[_i - 0] = arguments[_i];
-    }
-    return this.lift.call(mergeStatic.apply(void 0, [this].concat(observables)));
-}
-exports.merge = merge;
-/* tslint:enable:max-line-length */
-/**
- * Creates an output Observable which concurrently emits all values from every
- * given input Observable.
- *
- * <span class="informal">Flattens multiple Observables together by blending
- * their values into one Observable.</span>
- *
- * <img src="./img/merge.png" width="100%">
- *
- * `merge` subscribes to each given input Observable (as arguments), and simply
- * forwards (without doing any transformation) all the values from all the input
- * Observables to the output Observable. The output Observable only completes
- * once all input Observables have completed. Any error delivered by an input
- * Observable will be immediately emitted on the output Observable.
- *
- * @example <caption>Merge together two Observables: 1s interval and clicks</caption>
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var timer = Rx.Observable.interval(1000);
- * var clicksOrTimer = Rx.Observable.merge(clicks, timer);
- * clicksOrTimer.subscribe(x => console.log(x));
- *
- * // Results in the following:
- * // timer will emit ascending values, one every second(1000ms) to console
- * // clicks logs MouseEvents to console everytime the "document" is clicked
- * // Since the two streams are merged you see these happening
- * // as they occur.
- *
- * @example <caption>Merge together 3 Observables, but only 2 run concurrently</caption>
- * var timer1 = Rx.Observable.interval(1000).take(10);
- * var timer2 = Rx.Observable.interval(2000).take(6);
- * var timer3 = Rx.Observable.interval(500).take(10);
- * var concurrent = 2; // the argument
- * var merged = Rx.Observable.merge(timer1, timer2, timer3, concurrent);
- * merged.subscribe(x => console.log(x));
- *
- * // Results in the following:
- * // - First timer1 and timer2 will run concurrently
- * // - timer1 will emit a value every 1000ms for 10 iterations
- * // - timer2 will emit a value every 2000ms for 6 iterations
- * // - after timer1 hits it's max iteration, timer2 will
- * //   continue, and timer3 will start to run concurrently with timer2
- * // - when timer2 hits it's max iteration it terminates, and
- * //   timer3 will continue to emit a value every 500ms until it is complete
- *
- * @see {@link mergeAll}
- * @see {@link mergeMap}
- * @see {@link mergeMapTo}
- * @see {@link mergeScan}
- *
- * @param {...Observable} observables Input Observables to merge together.
- * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of input
- * Observables being subscribed to concurrently.
- * @param {Scheduler} [scheduler=null] The IScheduler to use for managing
- * concurrency of input Observables.
- * @return {Observable} an Observable that emits items that are the result of
- * every input Observable.
- * @static true
- * @name merge
- * @owner Observable
- */
-function mergeStatic() {
-    var observables = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        observables[_i - 0] = 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) {
-        return observables[0];
-    }
-    return new ArrayObservable_1.ArrayObservable(observables, scheduler).lift(new mergeAll_1.MergeAllOperator(concurrent));
-}
-exports.mergeStatic = mergeStatic;
-
-},{"../observable/ArrayObservable":83,"../util/isScheduler":162,"./mergeAll":120}],120:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var OuterSubscriber_1 = require('../OuterSubscriber');
-var subscribeToResult_1 = require('../util/subscribeToResult');
-/**
- * Converts a higher-order Observable into a first-order Observable which
- * concurrently delivers all values that are emitted on the inner Observables.
- *
- * <span class="informal">Flattens an Observable-of-Observables.</span>
- *
- * <img src="./img/mergeAll.png" width="100%">
- *
- * `mergeAll` subscribes to an Observable that emits Observables, also known as
- * a higher-order Observable. Each time it observes one of these emitted inner
- * Observables, it subscribes to that and delivers all the values from the
- * inner Observable on the output Observable. The output Observable only
- * completes once all inner Observables have completed. Any error delivered by
- * a inner Observable will be immediately emitted on the output Observable.
- *
- * @example <caption>Spawn a new interval Observable for each click event, and blend their outputs as one Observable</caption>
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var higherOrder = clicks.map((ev) => Rx.Observable.interval(1000));
- * var firstOrder = higherOrder.mergeAll();
- * firstOrder.subscribe(x => console.log(x));
- *
- * @example <caption>Count from 0 to 9 every second for each click, but only allow 2 concurrent timers</caption>
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var higherOrder = clicks.map((ev) => Rx.Observable.interval(1000).take(10));
- * var firstOrder = higherOrder.mergeAll(2);
- * firstOrder.subscribe(x => console.log(x));
- *
- * @see {@link combineAll}
- * @see {@link concatAll}
- * @see {@link exhaust}
- * @see {@link merge}
- * @see {@link mergeMap}
- * @see {@link mergeMapTo}
- * @see {@link mergeScan}
- * @see {@link switch}
- * @see {@link zipAll}
- *
- * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of inner
- * Observables being subscribed to concurrently.
- * @return {Observable} An Observable that emits values coming from all the
- * inner Observables emitted by the source Observable.
- * @method mergeAll
- * @owner Observable
- */
-function mergeAll(concurrent) {
-    if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
-    return this.lift(new MergeAllOperator(concurrent));
-}
-exports.mergeAll = mergeAll;
-var MergeAllOperator = (function () {
-    function MergeAllOperator(concurrent) {
-        this.concurrent = concurrent;
-    }
-    MergeAllOperator.prototype.call = function (observer, source) {
-        return source.subscribe(new MergeAllSubscriber(observer, this.concurrent));
-    };
-    return MergeAllOperator;
-}());
-exports.MergeAllOperator = MergeAllOperator;
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var MergeAllSubscriber = (function (_super) {
-    __extends(MergeAllSubscriber, _super);
-    function MergeAllSubscriber(destination, concurrent) {
-        _super.call(this, destination);
-        this.concurrent = concurrent;
-        this.hasCompleted = false;
-        this.buffer = [];
-        this.active = 0;
-    }
-    MergeAllSubscriber.prototype._next = function (observable) {
-        if (this.active < this.concurrent) {
-            this.active++;
-            this.add(subscribeToResult_1.subscribeToResult(this, observable));
-        }
-        else {
-            this.buffer.push(observable);
-        }
-    };
-    MergeAllSubscriber.prototype._complete = function () {
-        this.hasCompleted = true;
-        if (this.active === 0 && this.buffer.length === 0) {
-            this.destination.complete();
-        }
-    };
-    MergeAllSubscriber.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 MergeAllSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-exports.MergeAllSubscriber = MergeAllSubscriber;
-
-},{"../OuterSubscriber":30,"../util/subscribeToResult":164}],121:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var subscribeToResult_1 = require('../util/subscribeToResult');
-var OuterSubscriber_1 = require('../OuterSubscriber');
-/* tslint:disable:max-line-length */
-/**
- * Projects each source value to an Observable which is merged in the output
- * Observable.
- *
- * <span class="informal">Maps each value to an Observable, then flattens all of
- * these inner Observables using {@link mergeAll}.</span>
- *
- * <img src="./img/mergeMap.png" width="100%">
- *
- * Returns an Observable that emits items based on applying a function that you
- * supply to each item emitted by the source Observable, where that function
- * returns an Observable, and then merging those resulting Observables and
- * emitting the results of this merger.
- *
- * @example <caption>Map and flatten each letter to an Observable ticking every 1 second</caption>
- * var letters = Rx.Observable.of('a', 'b', 'c');
- * var result = letters.mergeMap(x =>
- *   Rx.Observable.interval(1000).map(i => x+i)
- * );
- * result.subscribe(x => console.log(x));
- *
- * // Results in the following:
- * // a0
- * // b0
- * // c0
- * // a1
- * // b1
- * // c1
- * // continues to list a,b,c with respective ascending integers
- *
- * @see {@link concatMap}
- * @see {@link exhaustMap}
- * @see {@link merge}
- * @see {@link mergeAll}
- * @see {@link mergeMapTo}
- * @see {@link mergeScan}
- * @see {@link switchMap}
- *
- * @param {function(value: T, ?index: number): Observable} project A function
- * that, when applied to an item emitted by the source Observable, returns an
- * Observable.
- * @param {function(outerValue: T, innerValue: I, outerIndex: number, innerIndex: number): any} [resultSelector]
- * A function to produce the value on the output Observable based on the values
- * and the indices of the source (outer) emission and the inner Observable
- * emission. The arguments passed to this function are:
- * - `outerValue`: the value that came from the source
- * - `innerValue`: the value that came from the projected Observable
- * - `outerIndex`: the "index" of the value that came from the source
- * - `innerIndex`: the "index" of the value from the projected Observable
- * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of input
- * Observables being subscribed to concurrently.
- * @return {Observable} An Observable that emits the result of applying the
- * projection function (and the optional `resultSelector`) to each item emitted
- * by the source Observable and merging the results of the Observables obtained
- * from this transformation.
- * @method mergeMap
- * @owner Observable
- */
-function mergeMap(project, resultSelector, concurrent) {
-    if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
-    if (typeof resultSelector === 'number') {
-        concurrent = resultSelector;
-        resultSelector = null;
-    }
-    return this.lift(new MergeMapOperator(project, resultSelector, concurrent));
-}
-exports.mergeMap = mergeMap;
-var MergeMapOperator = (function () {
-    function MergeMapOperator(project, resultSelector, concurrent) {
-        if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
-        this.project = project;
-        this.resultSelector = resultSelector;
-        this.concurrent = concurrent;
-    }
-    MergeMapOperator.prototype.call = function (observer, source) {
-        return source.subscribe(new MergeMapSubscriber(observer, this.project, this.resultSelector, this.concurrent));
-    };
-    return MergeMapOperator;
-}());
-exports.MergeMapOperator = MergeMapOperator;
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var MergeMapSubscriber = (function (_super) {
-    __extends(MergeMapSubscriber, _super);
-    function MergeMapSubscriber(destination, project, resultSelector, concurrent) {
-        if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
-        _super.call(this, destination);
-        this.project = project;
-        this.resultSelector = resultSelector;
-        this.concurrent = concurrent;
-        this.hasCompleted = false;
-        this.buffer = [];
-        this.active = 0;
-        this.index = 0;
-    }
-    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) {
-        this.add(subscribeToResult_1.subscribeToResult(this, ish, value, index));
-    };
-    MergeMapSubscriber.prototype._complete = function () {
-        this.hasCompleted = true;
-        if (this.active === 0 && this.buffer.length === 0) {
-            this.destination.complete();
-        }
-    };
-    MergeMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        if (this.resultSelector) {
-            this._notifyResultSelector(outerValue, innerValue, outerIndex, innerIndex);
-        }
-        else {
-            this.destination.next(innerValue);
-        }
-    };
-    MergeMapSubscriber.prototype._notifyResultSelector = function (outerValue, innerValue, outerIndex, innerIndex) {
-        var result;
-        try {
-            result = this.resultSelector(outerValue, innerValue, outerIndex, innerIndex);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        this.destination.next(result);
-    };
-    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;
-
-},{"../OuterSubscriber":30,"../util/subscribeToResult":164}],122:[function(require,module,exports){
-"use strict";
-var ConnectableObservable_1 = require('../observable/ConnectableObservable');
-/* tslint:disable:max-line-length */
-/**
- * Returns an Observable that emits the results of invoking a specified selector on items
- * emitted by a ConnectableObservable that shares a single subscription to the underlying stream.
- *
- * <img src="./img/multicast.png" width="100%">
- *
- * @param {Function|Subject} Factory function to create an intermediate subject through
- * which the source sequence's elements will be multicast to the selector function
- * or Subject to push source elements into.
- * @param {Function} Optional selector function that can use the multicasted source stream
- * as many times as needed, without causing multiple subscriptions to the source stream.
- * Subscribers to the given source will receive all notifications of the source from the
- * time of the subscription forward.
- * @return {Observable} an Observable that emits the results of invoking the selector
- * on the items emitted by a `ConnectableObservable` that shares a single subscription to
- * the underlying stream.
- * @method multicast
- * @owner Observable
- */
-function multicast(subjectOrSubjectFactory, selector) {
-    var subjectFactory;
-    if (typeof subjectOrSubjectFactory === 'function') {
-        subjectFactory = subjectOrSubjectFactory;
-    }
-    else {
-        subjectFactory = function subjectFactory() {
-            return subjectOrSubjectFactory;
-        };
-    }
-    if (typeof selector === 'function') {
-        return this.lift(new MulticastOperator(subjectFactory, selector));
-    }
-    var connectable = Object.create(this, ConnectableObservable_1.connectableObservableDescriptor);
-    connectable.source = this;
-    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":84}],123:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subscriber_1 = require('../Subscriber');
-var Notification_1 = require('../Notification');
-/**
- * @see {@link Notification}
- *
- * @param scheduler
- * @param delay
- * @return {Observable<R>|WebSocketSubject<T>|Observable<T>}
- * @method observeOn
- * @owner Observable
- */
-function observeOn(scheduler, delay) {
-    if (delay === void 0) { delay = 0; }
-    return this.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;
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var ObserveOnSubscriber = (function (_super) {
-    __extends(ObserveOnSubscriber, _super);
-    function ObserveOnSubscriber(destination, scheduler, delay) {
-        if (delay === void 0) { delay = 0; }
-        _super.call(this, destination);
-        this.scheduler = scheduler;
-        this.delay = delay;
-    }
-    ObserveOnSubscriber.dispatch = function (arg) {
-        var notification = arg.notification, destination = arg.destination, subscription = arg.subscription;
-        notification.observe(destination);
-        if (subscription) {
-            subscription.unsubscribe();
-        }
-    };
-    ObserveOnSubscriber.prototype.scheduleMessage = function (notification) {
-        var message = new ObserveOnMessage(notification, this.destination);
-        message.subscription = this.add(this.scheduler.schedule(ObserveOnSubscriber.dispatch, this.delay, message));
-    };
-    ObserveOnSubscriber.prototype._next = function (value) {
-        this.scheduleMessage(Notification_1.Notification.createNext(value));
-    };
-    ObserveOnSubscriber.prototype._error = function (err) {
-        this.scheduleMessage(Notification_1.Notification.createError(err));
-    };
-    ObserveOnSubscriber.prototype._complete = function () {
-        this.scheduleMessage(Notification_1.Notification.createComplete());
-    };
-    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":27,"../Subscriber":35}],124:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subscriber_1 = require('../Subscriber');
-/**
- * Groups pairs of consecutive emissions together and emits them as an array of
- * two values.
- *
- * <span class="informal">Puts the current value and previous value together as
- * an array, and emits that.</span>
- *
- * <img src="./img/pairwise.png" width="100%">
- *
- * The Nth emission from the source Observable will cause the output Observable
- * to emit an array [(N-1)th, Nth] of the previous and the current value, as a
- * pair. For this reason, `pairwise` emits on the second and subsequent
- * emissions from the source Observable, but not on the first emission, because
- * there is no previous value in that case.
- *
- * @example <caption>On every click (starting from the second), emit the relative distance to the previous click</caption>
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var pairs = clicks.pairwise();
- * var distance = pairs.map(pair => {
- *   var x0 = pair[0].clientX;
- *   var y0 = pair[0].clientY;
- *   var x1 = pair[1].clientX;
- *   var y1 = pair[1].clientY;
- *   return Math.sqrt(Math.pow(x0 - x1, 2) + Math.pow(y0 - y1, 2));
- * });
- * distance.subscribe(x => console.log(x));
- *
- * @see {@link buffer}
- * @see {@link bufferCount}
- *
- * @return {Observable<Array<T>>} An Observable of pairs (as arrays) of
- * consecutive values from the source Observable.
- * @method pairwise
- * @owner Observable
- */
-function pairwise() {
-    return this.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;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var PairwiseSubscriber = (function (_super) {
-    __extends(PairwiseSubscriber, _super);
-    function PairwiseSubscriber(destination) {
-        _super.call(this, destination);
-        this.hasPrev = false;
-    }
-    PairwiseSubscriber.prototype._next = function (value) {
-        if (this.hasPrev) {
-            this.destination.next([this.prev, value]);
-        }
-        else {
-            this.hasPrev = true;
-        }
-        this.prev = value;
-    };
-    return PairwiseSubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subscriber":35}],125:[function(require,module,exports){
-"use strict";
-var map_1 = require('./map');
-/**
- * Maps each source value (an object) to its specified nested property.
- *
- * <span class="informal">Like {@link map}, but meant only for picking one of
- * the nested properties of every emitted object.</span>
- *
- * <img src="./img/pluck.png" width="100%">
- *
- * Given a list of strings describing a path to an object property, retrieves
- * the value of a specified nested property from all values in the source
- * Observable. If a property can't be resolved, it will return `undefined` for
- * that value.
- *
- * @example <caption>Map every every click to the tagName of the clicked target element</caption>
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var tagNames = clicks.pluck('target', 'tagName');
- * tagNames.subscribe(x => console.log(x));
- *
- * @see {@link map}
- *
- * @param {...string} properties The nested properties to pluck from each source
- * value (an object).
- * @return {Observable} Returns a new Observable of property values from the
- * source values.
- * @method pluck
- * @owner Observable
- */
-function pluck() {
-    var properties = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        properties[_i - 0] = arguments[_i];
-    }
-    var length = properties.length;
-    if (length === 0) {
-        throw new Error('list of properties cannot be empty.');
-    }
-    return map_1.map.call(this, plucker(properties, length));
-}
-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":118}],126:[function(require,module,exports){
-"use strict";
-var Subject_1 = require('../Subject');
-var multicast_1 = require('./multicast');
-/* tslint:disable:max-line-length */
-/**
- * Returns a ConnectableObservable, which is a variety of Observable that waits until its connect method is called
- * before it begins emitting items to those Observers that have subscribed to it.
- *
- * <img src="./img/publish.png" width="100%">
- *
- * @param {Function} Optional selector function which can use the multicasted source sequence as many times as needed,
- * without causing multiple subscriptions to the source sequence.
- * Subscribers to the given source will receive all notifications of the source from the time of the subscription on.
- * @return a ConnectableObservable that upon connection causes the source Observable to emit items to its Observers.
- * @method publish
- * @owner Observable
- */
-function publish(selector) {
-    return selector ? multicast_1.multicast.call(this, function () { return new Subject_1.Subject(); }, selector) :
-        multicast_1.multicast.call(this, new Subject_1.Subject());
-}
-exports.publish = publish;
-
-},{"../Subject":33,"./multicast":122}],127:[function(require,module,exports){
-"use strict";
-var ReplaySubject_1 = require('../ReplaySubject');
-var multicast_1 = require('./multicast');
-/**
- * @param bufferSize
- * @param windowTime
- * @param scheduler
- * @return {ConnectableObservable<T>}
- * @method publishReplay
- * @owner Observable
- */
-function publishReplay(bufferSize, windowTime, scheduler) {
-    if (bufferSize === void 0) { bufferSize = Number.POSITIVE_INFINITY; }
-    if (windowTime === void 0) { windowTime = Number.POSITIVE_INFINITY; }
-    return multicast_1.multicast.call(this, new ReplaySubject_1.ReplaySubject(bufferSize, windowTime, scheduler));
-}
-exports.publishReplay = publishReplay;
-
-},{"../ReplaySubject":31,"./multicast":122}],128:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subscriber_1 = require('../Subscriber');
-/* tslint:disable:max-line-length */
-/**
- * Applies an accumulator function over the source Observable, and returns each
- * intermediate result, with an optional seed value.
- *
- * <span class="informal">It's like {@link reduce}, but emits the current
- * accumulation whenever the source emits a value.</span>
- *
- * <img src="./img/scan.png" width="100%">
- *
- * Combines together all values emitted on the source, using an accumulator
- * function that knows how to join a new source value into the accumulation from
- * the past. Is similar to {@link reduce}, but emits the intermediate
- * accumulations.
- *
- * Returns an Observable that applies a specified `accumulator` function to each
- * item emitted by the source Observable. If a `seed` value is specified, then
- * that value will be used as the initial value for the accumulator. If no seed
- * value is specified, the first item of the source is used as the seed.
- *
- * @example <caption>Count the number of click events</caption>
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var ones = clicks.mapTo(1);
- * var seed = 0;
- * var count = ones.scan((acc, one) => acc + one, seed);
- * count.subscribe(x => console.log(x));
- *
- * @see {@link expand}
- * @see {@link mergeScan}
- * @see {@link reduce}
- *
- * @param {function(acc: R, value: T, index: number): R} accumulator
- * The accumulator function called on each source value.
- * @param {T|R} [seed] The initial accumulation value.
- * @return {Observable<R>} An observable of the accumulated values.
- * @method scan
- * @owner Observable
- */
-function scan(accumulator, seed) {
-    var hasSeed = false;
-    // providing a seed of `undefined` *should* be valid and trigger
-    // hasSeed! so don't use `seed !== undefined` checks!
-    // For this reason, we have to check it here at the original call site
-    // otherwise inside Operator/Subscriber we won't know if `undefined`
-    // means they didn't provide anything or if they literally provided `undefined`
-    if (arguments.length >= 2) {
-        hasSeed = true;
-    }
-    return this.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;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var ScanSubscriber = (function (_super) {
-    __extends(ScanSubscriber, _super);
-    function ScanSubscriber(destination, accumulator, _seed, hasSeed) {
-        _super.call(this, destination);
-        this.accumulator = accumulator;
-        this._seed = _seed;
-        this.hasSeed = hasSeed;
-        this.index = 0;
-    }
-    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":35}],129:[function(require,module,exports){
-"use strict";
-var multicast_1 = require('./multicast');
-var Subject_1 = require('../Subject');
-function shareSubjectFactory() {
-    return new Subject_1.Subject();
-}
-/**
- * Returns a new Observable that multicasts (shares) the original Observable. As long as there is at least one
- * Subscriber this Observable will be subscribed and emitting data. When all subscribers have unsubscribed it will
- * unsubscribe from the source Observable. Because the Observable is multicasting it makes the stream `hot`.
- * This is an alias for .publish().refCount().
- *
- * <img src="./img/share.png" width="100%">
- *
- * @return {Observable<T>} an Observable that upon connection causes the source Observable to emit items to its Observers
- * @method share
- * @owner Observable
- */
-function share() {
-    return multicast_1.multicast.call(this, shareSubjectFactory).refCount();
-}
-exports.share = share;
-;
-
-},{"../Subject":33,"./multicast":122}],130:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subscriber_1 = require('../Subscriber');
-/**
- * Returns an Observable that skips `n` items emitted by an Observable.
- *
- * <img src="./img/skip.png" width="100%">
- *
- * @param {Number} the `n` of times, items emitted by source Observable should be skipped.
- * @return {Observable} an Observable that skips values emitted by the source Observable.
- *
- * @method skip
- * @owner Observable
- */
-function skip(total) {
-    return this.lift(new SkipOperator(total));
-}
-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;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var SkipSubscriber = (function (_super) {
-    __extends(SkipSubscriber, _super);
-    function SkipSubscriber(destination, total) {
-        _super.call(this, destination);
-        this.total = total;
-        this.count = 0;
-    }
-    SkipSubscriber.prototype._next = function (x) {
-        if (++this.count > this.total) {
-            this.destination.next(x);
-        }
-    };
-    return SkipSubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subscriber":35}],131:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var OuterSubscriber_1 = require('../OuterSubscriber');
-var subscribeToResult_1 = require('../util/subscribeToResult');
-/**
- * Returns an Observable that skips items emitted by the source Observable until a second Observable emits an item.
- *
- * <img src="./img/skipUntil.png" width="100%">
- *
- * @param {Observable} the second Observable that has to emit an item before the source Observable's elements begin to
- * be mirrored by the resulting Observable.
- * @return {Observable<T>} an Observable that skips items from the source Observable until the second Observable emits
- * an item, then emits the remaining items.
- * @method skipUntil
- * @owner Observable
- */
-function skipUntil(notifier) {
-    return this.lift(new SkipUntilOperator(notifier));
-}
-exports.skipUntil = skipUntil;
-var SkipUntilOperator = (function () {
-    function SkipUntilOperator(notifier) {
-        this.notifier = notifier;
-    }
-    SkipUntilOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new SkipUntilSubscriber(subscriber, this.notifier));
-    };
-    return SkipUntilOperator;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var SkipUntilSubscriber = (function (_super) {
-    __extends(SkipUntilSubscriber, _super);
-    function SkipUntilSubscriber(destination, notifier) {
-        _super.call(this, destination);
-        this.hasValue = false;
-        this.isInnerStopped = false;
-        this.add(subscribeToResult_1.subscribeToResult(this, notifier));
-    }
-    SkipUntilSubscriber.prototype._next = function (value) {
-        if (this.hasValue) {
-            _super.prototype._next.call(this, value);
-        }
-    };
-    SkipUntilSubscriber.prototype._complete = function () {
-        if (this.isInnerStopped) {
-            _super.prototype._complete.call(this);
-        }
-        else {
-            this.unsubscribe();
-        }
-    };
-    SkipUntilSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.hasValue = true;
-    };
-    SkipUntilSubscriber.prototype.notifyComplete = function () {
-        this.isInnerStopped = true;
-        if (this.isStopped) {
-            _super.prototype._complete.call(this);
-        }
-    };
-    return SkipUntilSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-
-},{"../OuterSubscriber":30,"../util/subscribeToResult":164}],132:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subscriber_1 = require('../Subscriber');
-/**
- * Returns an Observable that skips all items emitted by the source Observable as long as a specified condition holds
- * true, but emits all further source items as soon as the condition becomes false.
- *
- * <img src="./img/skipWhile.png" width="100%">
- *
- * @param {Function} predicate - a function to test each item emitted from the source Observable.
- * @return {Observable<T>} an Observable that begins emitting items emitted by the source Observable when the
- * specified predicate becomes false.
- * @method skipWhile
- * @owner Observable
- */
-function skipWhile(predicate) {
-    return this.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;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var SkipWhileSubscriber = (function (_super) {
-    __extends(SkipWhileSubscriber, _super);
-    function SkipWhileSubscriber(destination, predicate) {
-        _super.call(this, destination);
-        this.predicate = predicate;
-        this.skipping = true;
-        this.index = 0;
-    }
-    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":35}],133:[function(require,module,exports){
-"use strict";
-var ArrayObservable_1 = require('../observable/ArrayObservable');
-var ScalarObservable_1 = require('../observable/ScalarObservable');
-var EmptyObservable_1 = require('../observable/EmptyObservable');
-var concat_1 = require('./concat');
-var isScheduler_1 = require('../util/isScheduler');
-/* tslint:disable:max-line-length */
-/**
- * Returns an Observable that emits the items in a specified Iterable before it begins to emit items emitted by the
- * source Observable.
- *
- * <img src="./img/startWith.png" width="100%">
- *
- * @param {Values} an Iterable that contains the items you want the modified Observable to emit first.
- * @return {Observable} an Observable that emits the items in the specified Iterable and then emits the items
- * emitted by the source Observable.
- * @method startWith
- * @owner Observable
- */
-function startWith() {
-    var array = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        array[_i - 0] = arguments[_i];
-    }
-    var scheduler = array[array.length - 1];
-    if (isScheduler_1.isScheduler(scheduler)) {
-        array.pop();
-    }
-    else {
-        scheduler = null;
-    }
-    var len = array.length;
-    if (len === 1) {
-        return concat_1.concatStatic(new ScalarObservable_1.ScalarObservable(array[0], scheduler), this);
-    }
-    else if (len > 1) {
-        return concat_1.concatStatic(new ArrayObservable_1.ArrayObservable(array, scheduler), this);
-    }
-    else {
-        return concat_1.concatStatic(new EmptyObservable_1.EmptyObservable(scheduler), this);
-    }
-}
-exports.startWith = startWith;
-
-},{"../observable/ArrayObservable":83,"../observable/EmptyObservable":86,"../observable/ScalarObservable":92,"../util/isScheduler":162,"./concat":107}],134:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var OuterSubscriber_1 = require('../OuterSubscriber');
-var subscribeToResult_1 = require('../util/subscribeToResult');
-/* tslint:disable:max-line-length */
-/**
- * Projects each source value to an Observable which is merged in the output
- * Observable, emitting values only from the most recently projected Observable.
- *
- * <span class="informal">Maps each value to an Observable, then flattens all of
- * these inner Observables using {@link switch}.</span>
- *
- * <img src="./img/switchMap.png" width="100%">
- *
- * Returns an Observable that emits items based on applying a function that you
- * supply to each item emitted by the source Observable, where that function
- * returns an (so-called "inner") Observable. Each time it observes one of these
- * inner Observables, the output Observable begins emitting the items emitted by
- * that inner Observable. When a new inner Observable is emitted, `switchMap`
- * stops emitting items from the earlier-emitted inner Observable and begins
- * emitting items from the new one. It continues to behave like this for
- * subsequent inner Observables.
- *
- * @example <caption>Rerun an interval Observable on every click event</caption>
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var result = clicks.switchMap((ev) => Rx.Observable.interval(1000));
- * result.subscribe(x => console.log(x));
- *
- * @see {@link concatMap}
- * @see {@link exhaustMap}
- * @see {@link mergeMap}
- * @see {@link switch}
- * @see {@link switchMapTo}
- *
- * @param {function(value: T, ?index: number): Observable} project A function
- * that, when applied to an item emitted by the source Observable, returns an
- * Observable.
- * @param {function(outerValue: T, innerValue: I, outerIndex: number, innerIndex: number): any} [resultSelector]
- * A function to produce the value on the output Observable based on the values
- * and the indices of the source (outer) emission and the inner Observable
- * emission. The arguments passed to this function are:
- * - `outerValue`: the value that came from the source
- * - `innerValue`: the value that came from the projected Observable
- * - `outerIndex`: the "index" of the value that came from the source
- * - `innerIndex`: the "index" of the value from the projected Observable
- * @return {Observable} An Observable that emits the result of applying the
- * projection function (and the optional `resultSelector`) to each item emitted
- * by the source Observable and taking only the values from the most recently
- * projected inner Observable.
- * @method switchMap
- * @owner Observable
- */
-function switchMap(project, resultSelector) {
-    return this.lift(new SwitchMapOperator(project, resultSelector));
-}
-exports.switchMap = switchMap;
-var SwitchMapOperator = (function () {
-    function SwitchMapOperator(project, resultSelector) {
-        this.project = project;
-        this.resultSelector = resultSelector;
-    }
-    SwitchMapOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new SwitchMapSubscriber(subscriber, this.project, this.resultSelector));
-    };
-    return SwitchMapOperator;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var SwitchMapSubscriber = (function (_super) {
-    __extends(SwitchMapSubscriber, _super);
-    function SwitchMapSubscriber(destination, project, resultSelector) {
-        _super.call(this, destination);
-        this.project = project;
-        this.resultSelector = resultSelector;
-        this.index = 0;
-    }
-    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();
-        }
-        this.add(this.innerSubscription = subscribeToResult_1.subscribeToResult(this, result, value, index));
-    };
-    SwitchMapSubscriber.prototype._complete = function () {
-        var innerSubscription = this.innerSubscription;
-        if (!innerSubscription || innerSubscription.closed) {
-            _super.prototype._complete.call(this);
-        }
-    };
-    SwitchMapSubscriber.prototype._unsubscribe = function () {
-        this.innerSubscription = null;
-    };
-    SwitchMapSubscriber.prototype.notifyComplete = function (innerSub) {
-        this.remove(innerSub);
-        this.innerSubscription = null;
-        if (this.isStopped) {
-            _super.prototype._complete.call(this);
-        }
-    };
-    SwitchMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        if (this.resultSelector) {
-            this._tryNotifyNext(outerValue, innerValue, outerIndex, innerIndex);
-        }
-        else {
-            this.destination.next(innerValue);
-        }
-    };
-    SwitchMapSubscriber.prototype._tryNotifyNext = function (outerValue, innerValue, outerIndex, innerIndex) {
-        var result;
-        try {
-            result = this.resultSelector(outerValue, innerValue, outerIndex, innerIndex);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        this.destination.next(result);
-    };
-    return SwitchMapSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-
-},{"../OuterSubscriber":30,"../util/subscribeToResult":164}],135:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subscriber_1 = require('../Subscriber');
-var ArgumentOutOfRangeError_1 = require('../util/ArgumentOutOfRangeError');
-var EmptyObservable_1 = require('../observable/EmptyObservable');
-/**
- * Emits only the first `count` values emitted by the source Observable.
- *
- * <span class="informal">Takes the first `count` values from the source, then
- * completes.</span>
- *
- * <img src="./img/take.png" width="100%">
- *
- * `take` returns an Observable that emits only the first `count` values emitted
- * by the source Observable. If the source emits fewer than `count` values then
- * all of its values are emitted. After that, it completes, regardless if the
- * source completes.
- *
- * @example <caption>Take the first 5 seconds of an infinite 1-second interval Observable</caption>
- * var interval = Rx.Observable.interval(1000);
- * var five = interval.take(5);
- * five.subscribe(x => console.log(x));
- *
- * @see {@link takeLast}
- * @see {@link takeUntil}
- * @see {@link takeWhile}
- * @see {@link skip}
- *
- * @throws {ArgumentOutOfRangeError} When using `take(i)`, it delivers an
- * ArgumentOutOrRangeError to the Observer's `error` callback if `i < 0`.
- *
- * @param {number} count The maximum number of `next` values to emit.
- * @return {Observable<T>} An Observable that emits only the first `count`
- * values emitted by the source Observable, or all of the values from the source
- * if the source emits fewer than `count` values.
- * @method take
- * @owner Observable
- */
-function take(count) {
-    if (count === 0) {
-        return new EmptyObservable_1.EmptyObservable();
-    }
-    else {
-        return this.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;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var TakeSubscriber = (function (_super) {
-    __extends(TakeSubscriber, _super);
-    function TakeSubscriber(destination, total) {
-        _super.call(this, destination);
-        this.total = total;
-        this.count = 0;
-    }
-    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":35,"../observable/EmptyObservable":86,"../util/ArgumentOutOfRangeError":151}],136:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var OuterSubscriber_1 = require('../OuterSubscriber');
-var subscribeToResult_1 = require('../util/subscribeToResult');
-/**
- * Emits the values emitted by the source Observable until a `notifier`
- * Observable emits a value.
- *
- * <span class="informal">Lets values pass until a second Observable,
- * `notifier`, emits something. Then, it completes.</span>
- *
- * <img src="./img/takeUntil.png" width="100%">
- *
- * `takeUntil` subscribes and begins mirroring the source Observable. It also
- * monitors a second Observable, `notifier` that you provide. If the `notifier`
- * emits a value or a complete notification, the output Observable stops
- * mirroring the source Observable and completes.
- *
- * @example <caption>Tick every second until the first click happens</caption>
- * var interval = Rx.Observable.interval(1000);
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var result = interval.takeUntil(clicks);
- * result.subscribe(x => console.log(x));
- *
- * @see {@link take}
- * @see {@link takeLast}
- * @see {@link takeWhile}
- * @see {@link skip}
- *
- * @param {Observable} notifier The Observable whose first emitted value will
- * cause the output Observable of `takeUntil` to stop emitting values from the
- * source Observable.
- * @return {Observable<T>} An Observable that emits the values from the source
- * Observable until such time as `notifier` emits its first value.
- * @method takeUntil
- * @owner Observable
- */
-function takeUntil(notifier) {
-    return this.lift(new TakeUntilOperator(notifier));
-}
-exports.takeUntil = takeUntil;
-var TakeUntilOperator = (function () {
-    function TakeUntilOperator(notifier) {
-        this.notifier = notifier;
-    }
-    TakeUntilOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new TakeUntilSubscriber(subscriber, this.notifier));
-    };
-    return TakeUntilOperator;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var TakeUntilSubscriber = (function (_super) {
-    __extends(TakeUntilSubscriber, _super);
-    function TakeUntilSubscriber(destination, notifier) {
-        _super.call(this, destination);
-        this.notifier = notifier;
-        this.add(subscribeToResult_1.subscribeToResult(this, notifier));
-    }
-    TakeUntilSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.complete();
-    };
-    TakeUntilSubscriber.prototype.notifyComplete = function () {
-        // noop
-    };
-    return TakeUntilSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-
-},{"../OuterSubscriber":30,"../util/subscribeToResult":164}],137:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subscriber_1 = require('../Subscriber');
-var async_1 = require('../scheduler/async');
-/**
- * Emits a value from the source Observable, then ignores subsequent source
- * values for `duration` milliseconds, then repeats this process.
- *
- * <span class="informal">Lets a value pass, then ignores source values for the
- * next `duration` milliseconds.</span>
- *
- * <img src="./img/throttleTime.png" width="100%">
- *
- * `throttleTime` emits the source Observable values on the output Observable
- * when its internal timer is disabled, and ignores source values when the timer
- * is enabled. Initially, the timer is disabled. As soon as the first source
- * value arrives, it is forwarded to the output Observable, and then the timer
- * is enabled. After `duration` milliseconds (or the time unit determined
- * internally by the optional `scheduler`) has passed, the timer is disabled,
- * and this process repeats for the next source value. Optionally takes a
- * {@link IScheduler} for managing timers.
- *
- * @example <caption>Emit clicks at a rate of at most one click per second</caption>
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var result = clicks.throttleTime(1000);
- * result.subscribe(x => console.log(x));
- *
- * @see {@link auditTime}
- * @see {@link debounceTime}
- * @see {@link delay}
- * @see {@link sampleTime}
- * @see {@link throttle}
- *
- * @param {number} duration Time to wait before emitting another value after
- * emitting the last value, measured in milliseconds or the time unit determined
- * internally by the optional `scheduler`.
- * @param {Scheduler} [scheduler=async] The {@link IScheduler} to use for
- * managing the timers that handle the sampling.
- * @return {Observable<T>} An Observable that performs the throttle operation to
- * limit the rate of emissions from the source.
- * @method throttleTime
- * @owner Observable
- */
-function throttleTime(duration, scheduler) {
-    if (scheduler === void 0) { scheduler = async_1.async; }
-    return this.lift(new ThrottleTimeOperator(duration, scheduler));
-}
-exports.throttleTime = throttleTime;
-var ThrottleTimeOperator = (function () {
-    function ThrottleTimeOperator(duration, scheduler) {
-        this.duration = duration;
-        this.scheduler = scheduler;
-    }
-    ThrottleTimeOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new ThrottleTimeSubscriber(subscriber, this.duration, this.scheduler));
-    };
-    return ThrottleTimeOperator;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var ThrottleTimeSubscriber = (function (_super) {
-    __extends(ThrottleTimeSubscriber, _super);
-    function ThrottleTimeSubscriber(destination, duration, scheduler) {
-        _super.call(this, destination);
-        this.duration = duration;
-        this.scheduler = scheduler;
-    }
-    ThrottleTimeSubscriber.prototype._next = function (value) {
-        if (!this.throttled) {
-            this.add(this.throttled = this.scheduler.schedule(dispatchNext, this.duration, { subscriber: this }));
-            this.destination.next(value);
-        }
-    };
-    ThrottleTimeSubscriber.prototype.clearThrottle = function () {
-        var throttled = this.throttled;
-        if (throttled) {
-            throttled.unsubscribe();
-            this.remove(throttled);
-            this.throttled = null;
-        }
-    };
-    return ThrottleTimeSubscriber;
-}(Subscriber_1.Subscriber));
-function dispatchNext(arg) {
-    var subscriber = arg.subscriber;
-    subscriber.clearThrottle();
-}
-
-},{"../Subscriber":35,"../scheduler/async":145}],138:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var OuterSubscriber_1 = require('../OuterSubscriber');
-var subscribeToResult_1 = require('../util/subscribeToResult');
-/* tslint:disable:max-line-length */
-/**
- * Combines the source Observable with other Observables to create an Observable
- * whose values are calculated from the latest values of each, only when the
- * source emits.
- *
- * <span class="informal">Whenever the source Observable emits a value, it
- * computes a formula using that value plus the latest values from other input
- * Observables, then emits the output of that formula.</span>
- *
- * <img src="./img/withLatestFrom.png" width="100%">
- *
- * `withLatestFrom` combines each value from the source Observable (the
- * instance) with the latest values from the other input Observables only when
- * the source emits a value, optionally using a `project` function to determine
- * the value to be emitted on the output Observable. All input Observables must
- * emit at least one value before the output Observable will emit a value.
- *
- * @example <caption>On every click event, emit an array with the latest timer event plus the click event</caption>
- * var clicks = Rx.Observable.fromEvent(document, 'click');
- * var timer = Rx.Observable.interval(1000);
- * var result = clicks.withLatestFrom(timer);
- * result.subscribe(x => console.log(x));
- *
- * @see {@link combineLatest}
- *
- * @param {Observable} other An input Observable to combine with the source
- * Observable. More than one input Observables may be given as argument.
- * @param {Function} [project] Projection function for combining values
- * together. Receives all values in order of the Observables passed, where the
- * first parameter is a value from the source Observable. (e.g.
- * `a.withLatestFrom(b, c, (a1, b1, c1) => a1 + b1 + c1)`). If this is not
- * passed, arrays will be emitted on the output Observable.
- * @return {Observable} An Observable of projected values from the most recent
- * values from each input Observable, or an array of the most recent values from
- * each input Observable.
- * @method withLatestFrom
- * @owner Observable
- */
-function withLatestFrom() {
-    var args = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        args[_i - 0] = arguments[_i];
-    }
-    var project;
-    if (typeof args[args.length - 1] === 'function') {
-        project = args.pop();
-    }
-    var observables = args;
-    return this.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;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var WithLatestFromSubscriber = (function (_super) {
-    __extends(WithLatestFromSubscriber, _super);
-    function WithLatestFromSubscriber(destination, observables, project) {
-        _super.call(this, destination);
-        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));
-        }
-    }
-    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 () {
-        // noop
-    };
-    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":30,"../util/subscribeToResult":164}],139:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var ArrayObservable_1 = require('../observable/ArrayObservable');
-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('../symbol/iterator');
-/* tslint:disable:max-line-length */
-/**
- * @param observables
- * @return {Observable<R>}
- * @method zip
- * @owner Observable
- */
-function zipProto() {
-    var observables = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        observables[_i - 0] = arguments[_i];
-    }
-    return this.lift.call(zipStatic.apply(void 0, [this].concat(observables)));
-}
-exports.zipProto = zipProto;
-/* tslint:enable:max-line-length */
-/**
- * Combines multiple Observables to create an Observable whose values are calculated from the values, in order, of each
- * of its input Observables.
- *
- * If the latest parameter is a function, this function is used to compute the created value from the input values.
- * Otherwise, an array of the input values is returned.
- *
- * @example <caption>Combine age and name from different sources</caption>
- *
- * let age$ = Observable.of<number>(27, 25, 29);
- * let name$ = Observable.of<string>('Foo', 'Bar', 'Beer');
- * let isDev$ = Observable.of<boolean>(true, true, false);
- *
- * Observable
- *     .zip(age$,
- *          name$,
- *          isDev$,
- *          (age: number, name: string, isDev: boolean) => ({ age, name, isDev }))
- *     .subscribe(x => console.log(x));
- *
- * // outputs
- * // { age: 7, name: 'Foo', isDev: true }
- * // { age: 5, name: 'Bar', isDev: true }
- * // { age: 9, name: 'Beer', isDev: false }
- *
- * @param observables
- * @return {Observable<R>}
- * @static true
- * @name zip
- * @owner Observable
- */
-function zipStatic() {
-    var observables = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        observables[_i - 0] = arguments[_i];
-    }
-    var project = observables[observables.length - 1];
-    if (typeof project === 'function') {
-        observables.pop();
-    }
-    return new ArrayObservable_1.ArrayObservable(observables).lift(new ZipOperator(project));
-}
-exports.zipStatic = zipStatic;
-var ZipOperator = (function () {
-    function ZipOperator(project) {
-        this.project = project;
-    }
-    ZipOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new ZipSubscriber(subscriber, this.project));
-    };
-    return ZipOperator;
-}());
-exports.ZipOperator = ZipOperator;
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var ZipSubscriber = (function (_super) {
-    __extends(ZipSubscriber, _super);
-    function ZipSubscriber(destination, project, values) {
-        if (values === void 0) { values = Object.create(null); }
-        _super.call(this, destination);
-        this.iterators = [];
-        this.active = 0;
-        this.project = (typeof project === 'function') ? project : null;
-        this.values = values;
-    }
-    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.active = len;
-        for (var i = 0; i < len; i++) {
-            var iterator = iterators[i];
-            if (iterator.stillUnsubscribed) {
-                this.add(iterator.subscribe(iterator, i));
-            }
-            else {
-                this.active--; // not an observable
-            }
-        }
-    };
-    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;
-        // abort if not all of them have values
-        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();
-            // check to see if it's completed now that you've gotten
-            // the next value.
-            if (iterator.hasCompleted()) {
-                shouldComplete = true;
-            }
-            if (result.done) {
-                destination.complete();
-                return;
-            }
-            args.push(result.value);
-        }
-        if (this.project) {
-            this._tryProject(args);
-        }
-        else {
-            destination.next(args);
-        }
-        if (shouldComplete) {
-            destination.complete();
-        }
-    };
-    ZipSubscriber.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 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;
-}());
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var ZipBufferIterator = (function (_super) {
-    __extends(ZipBufferIterator, _super);
-    function ZipBufferIterator(destination, parent, observable) {
-        _super.call(this, destination);
-        this.parent = parent;
-        this.observable = observable;
-        this.stillUnsubscribed = true;
-        this.buffer = [];
-        this.isComplete = false;
-    }
-    ZipBufferIterator.prototype[iterator_1.$$iterator] = function () {
-        return this;
-    };
-    // NOTE: there is actually a name collision here with Subscriber.next and Iterator.next
-    //    this is legit because `next()` will never be called by a subscription in this case.
-    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));
-
-},{"../OuterSubscriber":30,"../Subscriber":35,"../observable/ArrayObservable":83,"../symbol/iterator":147,"../util/isArray":157,"../util/subscribeToResult":164}],140:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subscription_1 = require('../Subscription');
-/**
- * A unit of work to be executed in a {@link Scheduler}. An action is typically
- * created from within a Scheduler and an RxJS user does not need to concern
- * themselves about creating and manipulating an Action.
- *
- * ```ts
- * class Action<T> extends Subscription {
- *   new (scheduler: Scheduler, work: (state?: T) => void);
- *   schedule(state?: T, delay: number = 0): Subscription;
- * }
- * ```
- *
- * @class Action<T>
- */
-var Action = (function (_super) {
-    __extends(Action, _super);
-    function Action(scheduler, work) {
-        _super.call(this);
-    }
-    /**
-     * Schedules this action on its parent Scheduler for execution. May be passed
-     * some context object, `state`. May happen at some point in the future,
-     * according to the `delay` parameter, if specified.
-     * @param {T} [state] Some contextual data that the `work` function uses when
-     * called by the Scheduler.
-     * @param {number} [delay] Time to wait before executing the work, where the
-     * time unit is implicit and defined by the Scheduler.
-     * @return {void}
-     */
-    Action.prototype.schedule = function (state, delay) {
-        if (delay === void 0) { delay = 0; }
-        return this;
-    };
-    return Action;
-}(Subscription_1.Subscription));
-exports.Action = Action;
-
-},{"../Subscription":36}],141:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var root_1 = require('../util/root');
-var Action_1 = require('./Action');
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var AsyncAction = (function (_super) {
-    __extends(AsyncAction, _super);
-    function AsyncAction(scheduler, work) {
-        _super.call(this, scheduler, work);
-        this.scheduler = scheduler;
-        this.work = work;
-        this.pending = false;
-    }
-    AsyncAction.prototype.schedule = function (state, delay) {
-        if (delay === void 0) { delay = 0; }
-        if (this.closed) {
-            return this;
-        }
-        // Always replace the current state with the new state.
-        this.state = state;
-        // Set the pending flag indicating that this action has been scheduled, or
-        // has recursively rescheduled itself.
-        this.pending = true;
-        var id = this.id;
-        var scheduler = this.scheduler;
-        //
-        // Important implementation note:
-        //
-        // Actions only execute once by default, unless rescheduled from within the
-        // scheduled callback. This allows us to implement single and repeat
-        // actions via the same code path, without adding API surface area, as well
-        // as mimic traditional recursion but across asynchronous boundaries.
-        //
-        // However, JS runtimes and timers distinguish between intervals achieved by
-        // serial `setTimeout` calls vs. a single `setInterval` call. An interval of
-        // serial `setTimeout` calls can be individually delayed, which delays
-        // scheduling the next `setTimeout`, and so on. `setInterval` attempts to
-        // guarantee the interval callback will be invoked more precisely to the
-        // interval period, regardless of load.
-        //
-        // Therefore, we use `setInterval` to schedule single and repeat actions.
-        // If the action reschedules itself with the same delay, the interval is not
-        // canceled. If the action doesn't reschedule, or reschedules with a
-        // different delay, the interval will be canceled after scheduled callback
-        // execution.
-        //
-        if (id != null) {
-            this.id = this.recycleAsyncId(scheduler, id, delay);
-        }
-        this.delay = delay;
-        // If this action has already an async Id, don't request a new one.
-        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 root_1.root.setInterval(scheduler.flush.bind(scheduler, this), delay);
-    };
-    AsyncAction.prototype.recycleAsyncId = function (scheduler, id, delay) {
-        if (delay === void 0) { delay = 0; }
-        // If this action is rescheduled with the same delay time, don't clear the interval id.
-        if (delay !== null && this.delay === delay) {
-            return id;
-        }
-        // Otherwise, if the action's delay time is different from the current delay,
-        // clear the interval id
-        return root_1.root.clearInterval(id) && undefined || undefined;
-    };
-    /**
-     * Immediately executes this action and the `work` it contains.
-     * @return {any}
-     */
-    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) {
-            // Dequeue if the action didn't reschedule itself. Don't call
-            // unsubscribe(), because the action could reschedule later.
-            // For example:
-            // ```
-            // scheduler.schedule(function doWork(counter) {
-            //   /* ... I'm a busy worker bee ... */
-            //   var originalAction = this;
-            //   /* wait 100ms before rescheduling the action */
-            //   setTimeout(function () {
-            //     originalAction.schedule(counter + 1);
-            //   }, 100);
-            // }, 1000);
-            // ```
-            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.delay = 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);
-        }
-    };
-    return AsyncAction;
-}(Action_1.Action));
-exports.AsyncAction = AsyncAction;
-
-},{"../util/root":163,"./Action":140}],142:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Scheduler_1 = require('../Scheduler');
-var AsyncScheduler = (function (_super) {
-    __extends(AsyncScheduler, _super);
-    function AsyncScheduler() {
-        _super.apply(this, arguments);
-        this.actions = [];
-        /**
-         * A flag to indicate whether the Scheduler is currently executing a batch of
-         * queued actions.
-         * @type {boolean}
-         */
-        this.active = false;
-        /**
-         * An internal ID used to track the latest asynchronous task such as those
-         * coming from `setTimeout`, `setInterval`, `requestAnimationFrame`, and
-         * others.
-         * @type {any}
-         */
-        this.scheduled = undefined;
-    }
-    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()); // exhaust the scheduler queue
-        this.active = false;
-        if (error) {
-            while (action = actions.shift()) {
-                action.unsubscribe();
-            }
-            throw error;
-        }
-    };
-    return AsyncScheduler;
-}(Scheduler_1.Scheduler));
-exports.AsyncScheduler = AsyncScheduler;
-
-},{"../Scheduler":32}],143:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var AsyncAction_1 = require('./AsyncAction');
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-var QueueAction = (function (_super) {
-    __extends(QueueAction, _super);
-    function QueueAction(scheduler, work) {
-        _super.call(this, scheduler, work);
-        this.scheduler = scheduler;
-        this.work = work;
-    }
-    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 exists and is greater than 0, or if the delay is null (the
-        // action wasn't rescheduled) but was originally scheduled as an async
-        // action, then recycle as an async action.
-        if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) {
-            return _super.prototype.requestAsyncId.call(this, scheduler, id, delay);
-        }
-        // Otherwise flush the scheduler starting with this action.
-        return scheduler.flush(this);
-    };
-    return QueueAction;
-}(AsyncAction_1.AsyncAction));
-exports.QueueAction = QueueAction;
-
-},{"./AsyncAction":141}],144:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var AsyncScheduler_1 = require('./AsyncScheduler');
-var QueueScheduler = (function (_super) {
-    __extends(QueueScheduler, _super);
-    function QueueScheduler() {
-        _super.apply(this, arguments);
-    }
-    return QueueScheduler;
-}(AsyncScheduler_1.AsyncScheduler));
-exports.QueueScheduler = QueueScheduler;
-
-},{"./AsyncScheduler":142}],145:[function(require,module,exports){
-"use strict";
-var AsyncAction_1 = require('./AsyncAction');
-var AsyncScheduler_1 = require('./AsyncScheduler');
-exports.async = new AsyncScheduler_1.AsyncScheduler(AsyncAction_1.AsyncAction);
-
-},{"./AsyncAction":141,"./AsyncScheduler":142}],146:[function(require,module,exports){
-"use strict";
-var QueueAction_1 = require('./QueueAction');
-var QueueScheduler_1 = require('./QueueScheduler');
-exports.queue = new QueueScheduler_1.QueueScheduler(QueueAction_1.QueueAction);
-
-},{"./QueueAction":143,"./QueueScheduler":144}],147:[function(require,module,exports){
-"use strict";
-var root_1 = require('../util/root');
-function symbolIteratorPonyfill(root) {
-    var Symbol = root.Symbol;
-    if (typeof Symbol === 'function') {
-        if (!Symbol.iterator) {
-            Symbol.iterator = Symbol('iterator polyfill');
-        }
-        return Symbol.iterator;
-    }
-    else {
-        // [for Mozilla Gecko 27-35:](https://mzl.la/2ewE1zC)
-        var Set_1 = root.Set;
-        if (Set_1 && typeof new Set_1()['@@iterator'] === 'function') {
-            return '@@iterator';
-        }
-        var Map_1 = root.Map;
-        // required for compatability with es6-shim
-        if (Map_1) {
-            var keys = Object.getOwnPropertyNames(Map_1.prototype);
-            for (var i = 0; i < keys.length; ++i) {
-                var key = keys[i];
-                // according to spec, Map.prototype[@@iterator] and Map.orototype.entries must be equal.
-                if (key !== 'entries' && key !== 'size' && Map_1.prototype[key] === Map_1.prototype['entries']) {
-                    return key;
-                }
-            }
-        }
-        return '@@iterator';
-    }
-}
-exports.symbolIteratorPonyfill = symbolIteratorPonyfill;
-exports.$$iterator = symbolIteratorPonyfill(root_1.root);
-
-},{"../util/root":163}],148:[function(require,module,exports){
-"use strict";
-var root_1 = require('../util/root');
-function getSymbolObservable(context) {
-    var $$observable;
-    var Symbol = context.Symbol;
-    if (typeof Symbol === 'function') {
-        if (Symbol.observable) {
-            $$observable = Symbol.observable;
-        }
-        else {
-            $$observable = Symbol('observable');
-            Symbol.observable = $$observable;
-        }
-    }
-    else {
-        $$observable = '@@observable';
-    }
-    return $$observable;
-}
-exports.getSymbolObservable = getSymbolObservable;
-exports.$$observable = getSymbolObservable(root_1.root);
-
-},{"../util/root":163}],149:[function(require,module,exports){
-"use strict";
-var root_1 = require('../util/root');
-var Symbol = root_1.root.Symbol;
-exports.$$rxSubscriber = (typeof Symbol === 'function' && typeof Symbol.for === 'function') ?
-    Symbol.for('rxSubscriber') : '@@rxSubscriber';
-
-},{"../util/root":163}],150:[function(require,module,exports){
-"use strict";
-var root_1 = require('./root');
-var RequestAnimationFrameDefinition = (function () {
-    function RequestAnimationFrameDefinition(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); };
-        }
-    }
-    return RequestAnimationFrameDefinition;
-}());
-exports.RequestAnimationFrameDefinition = RequestAnimationFrameDefinition;
-exports.AnimationFrame = new RequestAnimationFrameDefinition(root_1.root);
-
-},{"./root":163}],151:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-/**
- * An error thrown when an element was queried at a certain index of an
- * Observable, but no such index or position exists in that sequence.
- *
- * @see {@link elementAt}
- * @see {@link take}
- * @see {@link takeLast}
- *
- * @class ArgumentOutOfRangeError
- */
-var ArgumentOutOfRangeError = (function (_super) {
-    __extends(ArgumentOutOfRangeError, _super);
-    function ArgumentOutOfRangeError() {
-        var err = _super.call(this, 'argument out of range');
-        this.name = err.name = 'ArgumentOutOfRangeError';
-        this.stack = err.stack;
-        this.message = err.message;
-    }
-    return ArgumentOutOfRangeError;
-}(Error));
-exports.ArgumentOutOfRangeError = ArgumentOutOfRangeError;
-
-},{}],152:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-/**
- * An error thrown when an Observable or a sequence was queried but has no
- * elements.
- *
- * @see {@link first}
- * @see {@link last}
- * @see {@link single}
- *
- * @class EmptyError
- */
-var EmptyError = (function (_super) {
-    __extends(EmptyError, _super);
-    function EmptyError() {
-        var err = _super.call(this, 'no elements in sequence');
-        this.name = err.name = 'EmptyError';
-        this.stack = err.stack;
-        this.message = err.message;
-    }
-    return EmptyError;
-}(Error));
-exports.EmptyError = EmptyError;
-
-},{}],153:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-/**
- * An error thrown when an action is invalid because the object has been
- * unsubscribed.
- *
- * @see {@link Subject}
- * @see {@link BehaviorSubject}
- *
- * @class ObjectUnsubscribedError
- */
-var ObjectUnsubscribedError = (function (_super) {
-    __extends(ObjectUnsubscribedError, _super);
-    function ObjectUnsubscribedError() {
-        var err = _super.call(this, 'object unsubscribed');
-        this.name = err.name = 'ObjectUnsubscribedError';
-        this.stack = err.stack;
-        this.message = err.message;
-    }
-    return ObjectUnsubscribedError;
-}(Error));
-exports.ObjectUnsubscribedError = ObjectUnsubscribedError;
-
-},{}],154:[function(require,module,exports){
-"use strict";
-var root_1 = require('./root');
-function minimalSetImpl() {
-    // THIS IS NOT a full impl of Set, this is just the minimum
-    // bits of functionality we need for this library.
-    return (function () {
-        function MinimalSet() {
-            this._values = [];
-        }
-        MinimalSet.prototype.add = function (value) {
-            if (!this.has(value)) {
-                this._values.push(value);
-            }
-        };
-        MinimalSet.prototype.has = function (value) {
-            return this._values.indexOf(value) !== -1;
-        };
-        Object.defineProperty(MinimalSet.prototype, "size", {
-            get: function () {
-                return this._values.length;
-            },
-            enumerable: true,
-            configurable: true
-        });
-        MinimalSet.prototype.clear = function () {
-            this._values.length = 0;
-        };
-        return MinimalSet;
-    }());
-}
-exports.minimalSetImpl = minimalSetImpl;
-exports.Set = root_1.root.Set || minimalSetImpl();
-
-},{"./root":163}],155:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-/**
- * An error thrown when one or more errors have occurred during the
- * `unsubscribe` of a {@link Subscription}.
- */
-var UnsubscriptionError = (function (_super) {
-    __extends(UnsubscriptionError, _super);
-    function UnsubscriptionError(errors) {
-        _super.call(this);
-        this.errors = errors;
-        var err = Error.call(this, errors ?
-            errors.length + " errors occurred during unsubscription:\n  " + errors.map(function (err, i) { return ((i + 1) + ") " + err.toString()); }).join('\n  ') : '');
-        this.name = err.name = 'UnsubscriptionError';
-        this.stack = err.stack;
-        this.message = err.message;
-    }
-    return UnsubscriptionError;
-}(Error));
-exports.UnsubscriptionError = UnsubscriptionError;
-
-},{}],156:[function(require,module,exports){
-"use strict";
-// typeof any so that it we don't have to cast when comparing a result to the error object
-exports.errorObject = { e: {} };
-
-},{}],157:[function(require,module,exports){
-"use strict";
-exports.isArray = Array.isArray || (function (x) { return x && typeof x.length === 'number'; });
-
-},{}],158:[function(require,module,exports){
-"use strict";
-function isDate(value) {
-    return value instanceof Date && !isNaN(+value);
-}
-exports.isDate = isDate;
-
-},{}],159:[function(require,module,exports){
-"use strict";
-function isFunction(x) {
-    return typeof x === 'function';
-}
-exports.isFunction = isFunction;
-
-},{}],160:[function(require,module,exports){
-"use strict";
-function isObject(x) {
-    return x != null && typeof x === 'object';
-}
-exports.isObject = isObject;
-
-},{}],161:[function(require,module,exports){
-"use strict";
-function isPromise(value) {
-    return value && typeof value.subscribe !== 'function' && typeof value.then === 'function';
-}
-exports.isPromise = isPromise;
-
-},{}],162:[function(require,module,exports){
-"use strict";
-function isScheduler(value) {
-    return value && typeof value.schedule === 'function';
-}
-exports.isScheduler = isScheduler;
-
-},{}],163:[function(require,module,exports){
-(function (global){
-"use strict";
-/**
- * window: browser in DOM main thread
- * self: browser in WebWorker
- * global: Node.js/other
- */
-exports.root = (typeof window == 'object' && window.window === window && window
-    || typeof self == 'object' && self.self === self && self
-    || typeof global == 'object' && global.global === global && global);
-if (!exports.root) {
-    throw new Error('RxJS could not find any global context (window, self, global)');
-}
-
-}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-
-},{}],164:[function(require,module,exports){
-"use strict";
-var root_1 = require('./root');
-var isArray_1 = require('./isArray');
-var isPromise_1 = require('./isPromise');
-var isObject_1 = require('./isObject');
-var Observable_1 = require('../Observable');
-var iterator_1 = require('../symbol/iterator');
-var InnerSubscriber_1 = require('../InnerSubscriber');
-var observable_1 = require('../symbol/observable');
-function subscribeToResult(outerSubscriber, result, outerValue, outerIndex) {
-    var destination = new InnerSubscriber_1.InnerSubscriber(outerSubscriber, outerValue, outerIndex);
-    if (destination.closed) {
-        return null;
-    }
-    if (result instanceof Observable_1.Observable) {
-        if (result._isScalar) {
-            destination.next(result.value);
-            destination.complete();
-            return null;
-        }
-        else {
-            return result.subscribe(destination);
-        }
-    }
-    else if (isArray_1.isArray(result)) {
-        for (var i = 0, len = result.length; i < len && !destination.closed; i++) {
-            destination.next(result[i]);
-        }
-        if (!destination.closed) {
-            destination.complete();
-        }
-    }
-    else if (isPromise_1.isPromise(result)) {
-        result.then(function (value) {
-            if (!destination.closed) {
-                destination.next(value);
-                destination.complete();
-            }
-        }, function (err) { return destination.error(err); })
-            .then(null, function (err) {
-            // Escaping the Promise trap: globally throw unhandled errors
-            root_1.root.setTimeout(function () { throw err; });
-        });
-        return destination;
-    }
-    else if (result && typeof result[iterator_1.$$iterator] === 'function') {
-        var iterator = result[iterator_1.$$iterator]();
-        do {
-            var item = iterator.next();
-            if (item.done) {
-                destination.complete();
-                break;
-            }
-            destination.next(item.value);
-            if (destination.closed) {
-                break;
-            }
-        } while (true);
-    }
-    else if (result && typeof result[observable_1.$$observable] === 'function') {
-        var obs = result[observable_1.$$observable]();
-        if (typeof obs.subscribe !== 'function') {
-            destination.error(new TypeError('Provided object does not correctly implement Symbol.observable'));
-        }
-        else {
-            return obs.subscribe(new InnerSubscriber_1.InnerSubscriber(outerSubscriber, outerValue, outerIndex));
-        }
-    }
-    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.';
-        destination.error(new TypeError(msg));
-    }
-    return null;
-}
-exports.subscribeToResult = subscribeToResult;
-
-},{"../InnerSubscriber":26,"../Observable":28,"../symbol/iterator":147,"../symbol/observable":148,"./isArray":157,"./isObject":160,"./isPromise":161,"./root":163}],165:[function(require,module,exports){
-"use strict";
-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":29,"../Subscriber":35,"../symbol/rxSubscriber":149}],166:[function(require,module,exports){
-"use strict";
-var errorObject_1 = require('./errorObject');
-var tryCatchTarget;
-function tryCatcher() {
-    try {
-        return tryCatchTarget.apply(this, arguments);
-    }
-    catch (e) {
-        errorObject_1.errorObject.e = e;
-        return errorObject_1.errorObject;
-    }
-}
-function tryCatch(fn) {
-    tryCatchTarget = fn;
-    return tryCatcher;
-}
-exports.tryCatch = tryCatch;
-;
-
-},{"./errorObject":156}],167:[function(require,module,exports){
-// threejs.org/license
-(function(l,oa){"object"===typeof exports&&"undefined"!==typeof module?oa(exports):"function"===typeof define&&define.amd?define(["exports"],oa):oa(l.THREE=l.THREE||{})})(this,function(l){function oa(){}function C(a,b){this.x=a||0;this.y=b||0}function ea(a,b,c,d,e,f,g,h,k,m){Object.defineProperty(this,"id",{value:Oe++});this.uuid=Q.generateUUID();this.name="";this.image=void 0!==a?a:ea.DEFAULT_IMAGE;this.mipmaps=[];this.mapping=void 0!==b?b:ea.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!==k?k:1;this.format=void 0!==g?g:1023;this.type=void 0!==h?h:1009;this.offset=new C(0,0);this.repeat=new C(1,1);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 ga(a,b,c,d){this.x=a||0;this.y=b||0;this.z=c||0;this.w=void 0!==d?d:1}function Db(a,b,c){this.uuid=Q.generateUUID();this.width=
-a;this.height=b;this.scissor=new ga(0,0,a,b);this.scissorTest=!1;this.viewport=new ga(0,0,a,b);c=c||{};void 0===c.minFilter&&(c.minFilter=1006);this.texture=new ea(void 0,void 0,c.wrapS,c.wrapT,c.magFilter,c.minFilter,c.format,c.type,c.anisotropy,c.encoding);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 Eb(a,b,c){Db.call(this,a,b,c);this.activeMipMapLevel=
-this.activeCubeFace=0}function da(a,b,c,d){this._x=a||0;this._y=b||0;this._z=c||0;this._w=void 0!==d?d:1}function q(a,b,c){this.x=a||0;this.y=b||0;this.z=c||0}function H(){this.elements=new Float32Array([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 Za(a,b,c,d,e,f,g,h,k,m){a=void 0!==a?a:[];ea.call(this,a,void 0!==b?b:301,c,d,e,f,g,h,k,m);this.flipY=!1}function Fb(a,b,c){var d=a[0];if(0>=
-d||0<d)return a;var e=b*c,f=pe[e];void 0===f&&(f=new Float32Array(e),pe[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 qe(a,b){var c=re[b];void 0===c&&(c=new Int32Array(b),re[b]=c);for(var d=0;d!==b;++d)c[d]=a.allocTextureUnit();return c}function Pe(a,b){a.uniform1f(this.addr,b)}function Qe(a,b){a.uniform1i(this.addr,b)}function Re(a,b){void 0===b.x?a.uniform2fv(this.addr,b):a.uniform2f(this.addr,b.x,b.y)}function Se(a,b){void 0!==b.x?a.uniform3f(this.addr,
-b.x,b.y,b.z):void 0!==b.r?a.uniform3f(this.addr,b.r,b.g,b.b):a.uniform3fv(this.addr,b)}function Te(a,b){void 0===b.x?a.uniform4fv(this.addr,b):a.uniform4f(this.addr,b.x,b.y,b.z,b.w)}function Ue(a,b){a.uniformMatrix2fv(this.addr,!1,b.elements||b)}function Ve(a,b){a.uniformMatrix3fv(this.addr,!1,b.elements||b)}function We(a,b){a.uniformMatrix4fv(this.addr,!1,b.elements||b)}function Xe(a,b,c){var d=c.allocTextureUnit();a.uniform1i(this.addr,d);c.setTexture2D(b||se,d)}function Ye(a,b,c){var d=c.allocTextureUnit();
-a.uniform1i(this.addr,d);c.setTextureCube(b||te,d)}function ue(a,b){a.uniform2iv(this.addr,b)}function ve(a,b){a.uniform3iv(this.addr,b)}function we(a,b){a.uniform4iv(this.addr,b)}function Ze(a){switch(a){case 5126:return Pe;case 35664:return Re;case 35665:return Se;case 35666:return Te;case 35674:return Ue;case 35675:return Ve;case 35676:return We;case 35678:return Xe;case 35680:return Ye;case 5124:case 35670:return Qe;case 35667:case 35671:return ue;case 35668:case 35672:return ve;case 35669:case 35673:return we}}
-function $e(a,b){a.uniform1fv(this.addr,b)}function af(a,b){a.uniform1iv(this.addr,b)}function bf(a,b){a.uniform2fv(this.addr,Fb(b,this.size,2))}function cf(a,b){a.uniform3fv(this.addr,Fb(b,this.size,3))}function df(a,b){a.uniform4fv(this.addr,Fb(b,this.size,4))}function ef(a,b){a.uniformMatrix2fv(this.addr,!1,Fb(b,this.size,4))}function ff(a,b){a.uniformMatrix3fv(this.addr,!1,Fb(b,this.size,9))}function gf(a,b){a.uniformMatrix4fv(this.addr,!1,Fb(b,this.size,16))}function hf(a,b,c){var d=b.length,
-e=qe(c,d);a.uniform1iv(this.addr,e);for(a=0;a!==d;++a)c.setTexture2D(b[a]||se,e[a])}function jf(a,b,c){var d=b.length,e=qe(c,d);a.uniform1iv(this.addr,e);for(a=0;a!==d;++a)c.setTextureCube(b[a]||te,e[a])}function kf(a){switch(a){case 5126:return $e;case 35664:return bf;case 35665:return cf;case 35666:return df;case 35674:return ef;case 35675:return ff;case 35676:return gf;case 35678:return hf;case 35680:return jf;case 5124:case 35670:return af;case 35667:case 35671:return ue;case 35668:case 35672:return ve;
-case 35669:case 35673:return we}}function lf(a,b,c){this.id=a;this.addr=c;this.setValue=Ze(b.type)}function mf(a,b,c){this.id=a;this.addr=c;this.size=b.size;this.setValue=kf(b.type)}function xe(a){this.id=a;this.seq=[];this.map={}}function $a(a,b,c){this.seq=[];this.map={};this.renderer=c;c=a.getProgramParameter(b,a.ACTIVE_UNIFORMS);for(var d=0;d!==c;++d){var e=a.getActiveUniform(b,d),f=a.getUniformLocation(b,e.name),g=this,h=e.name,k=h.length;for(Id.lastIndex=0;;){var m=Id.exec(h),x=Id.lastIndex,
-p=m[1],n=m[3];"]"===m[2]&&(p|=0);if(void 0===n||"["===n&&x+2===k){h=g;e=void 0===n?new lf(p,e,f):new mf(p,e,f);h.seq.push(e);h.map[e.id]=e;break}else n=g.map[p],void 0===n&&(n=new xe(p),p=g,g=n,p.seq.push(g),p.map[g.id]=g),g=n}}}function N(a,b,c){return void 0===b&&void 0===c?this.set(a):this.setRGB(a,b,c)}function db(a,b,c,d,e,f,g,h,k,m,x,p){ea.call(this,null,f,g,h,k,m,d,e,x,p);this.image={data:a,width:b,height:c};this.magFilter=void 0!==k?k:1003;this.minFilter=void 0!==m?m:1003;this.flipY=this.generateMipmaps=
-!1;this.unpackAlignment=1}function pc(a,b){this.min=void 0!==a?a:new C(Infinity,Infinity);this.max=void 0!==b?b:new C(-Infinity,-Infinity)}function nf(a,b){var c,d,e,f,g,h,k,m,x,p,n=a.context,r=a.state,w,l,F,t,v,M;this.render=function(z,A,I){if(0!==b.length){z=new q;var E=I.w/I.z,K=.5*I.z,la=.5*I.w,J=16/I.w,ca=new C(J*E,J),Da=new q(1,1,0),eb=new C(1,1),Na=new pc;Na.min.set(I.x,I.y);Na.max.set(I.x+(I.z-16),I.y+(I.w-16));if(void 0===t){var J=new Float32Array([-1,-1,0,0,1,-1,1,0,1,1,1,1,-1,1,0,1]),O=
-new Uint16Array([0,1,2,0,2,3]);w=n.createBuffer();l=n.createBuffer();n.bindBuffer(n.ARRAY_BUFFER,w);n.bufferData(n.ARRAY_BUFFER,J,n.STATIC_DRAW);n.bindBuffer(n.ELEMENT_ARRAY_BUFFER,l);n.bufferData(n.ELEMENT_ARRAY_BUFFER,O,n.STATIC_DRAW);v=n.createTexture();M=n.createTexture();r.bindTexture(n.TEXTURE_2D,v);n.texImage2D(n.TEXTURE_2D,0,n.RGB,16,16,0,n.RGB,n.UNSIGNED_BYTE,null);n.texParameteri(n.TEXTURE_2D,n.TEXTURE_WRAP_S,n.CLAMP_TO_EDGE);n.texParameteri(n.TEXTURE_2D,n.TEXTURE_WRAP_T,n.CLAMP_TO_EDGE);
-n.texParameteri(n.TEXTURE_2D,n.TEXTURE_MAG_FILTER,n.NEAREST);n.texParameteri(n.TEXTURE_2D,n.TEXTURE_MIN_FILTER,n.NEAREST);r.bindTexture(n.TEXTURE_2D,M);n.texImage2D(n.TEXTURE_2D,0,n.RGBA,16,16,0,n.RGBA,n.UNSIGNED_BYTE,null);n.texParameteri(n.TEXTURE_2D,n.TEXTURE_WRAP_S,n.CLAMP_TO_EDGE);n.texParameteri(n.TEXTURE_2D,n.TEXTURE_WRAP_T,n.CLAMP_TO_EDGE);n.texParameteri(n.TEXTURE_2D,n.TEXTURE_MAG_FILTER,n.NEAREST);n.texParameteri(n.TEXTURE_2D,n.TEXTURE_MIN_FILTER,n.NEAREST);var J=F={vertexShader:"uniform lowp int renderType;\nuniform vec3 screenPosition;\nuniform vec2 scale;\nuniform float rotation;\nuniform sampler2D occlusionMap;\nattribute vec2 position;\nattribute vec2 uv;\nvarying vec2 vUV;\nvarying float vVisibility;\nvoid main() {\nvUV = uv;\nvec2 pos = position;\nif ( renderType == 2 ) {\nvec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.5, 0.1 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.9, 0.1 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.9, 0.5 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.9, 0.9 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.5, 0.9 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.1, 0.9 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.1, 0.5 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.5, 0.5 ) );\nvVisibility =        visibility.r / 9.0;\nvVisibility *= 1.0 - visibility.g / 9.0;\nvVisibility *=       visibility.b / 9.0;\nvVisibility *= 1.0 - visibility.a / 9.0;\npos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;\npos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;\n}\ngl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\n}",
-fragmentShader:"uniform lowp int renderType;\nuniform sampler2D map;\nuniform float opacity;\nuniform vec3 color;\nvarying vec2 vUV;\nvarying float vVisibility;\nvoid main() {\nif ( renderType == 0 ) {\ngl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );\n} else if ( renderType == 1 ) {\ngl_FragColor = texture2D( map, vUV );\n} else {\nvec4 texture = texture2D( map, vUV );\ntexture.a *= opacity * vVisibility;\ngl_FragColor = texture;\ngl_FragColor.rgb *= color;\n}\n}"},O=n.createProgram(),P=n.createShader(n.FRAGMENT_SHADER),
-R=n.createShader(n.VERTEX_SHADER),T="precision "+a.getPrecision()+" float;\n";n.shaderSource(P,T+J.fragmentShader);n.shaderSource(R,T+J.vertexShader);n.compileShader(P);n.compileShader(R);n.attachShader(O,P);n.attachShader(O,R);n.linkProgram(O);t=O;x=n.getAttribLocation(t,"position");p=n.getAttribLocation(t,"uv");c=n.getUniformLocation(t,"renderType");d=n.getUniformLocation(t,"map");e=n.getUniformLocation(t,"occlusionMap");f=n.getUniformLocation(t,"opacity");g=n.getUniformLocation(t,"color");h=n.getUniformLocation(t,
-"scale");k=n.getUniformLocation(t,"rotation");m=n.getUniformLocation(t,"screenPosition")}n.useProgram(t);r.initAttributes();r.enableAttribute(x);r.enableAttribute(p);r.disableUnusedAttributes();n.uniform1i(e,0);n.uniform1i(d,1);n.bindBuffer(n.ARRAY_BUFFER,w);n.vertexAttribPointer(x,2,n.FLOAT,!1,16,0);n.vertexAttribPointer(p,2,n.FLOAT,!1,16,8);n.bindBuffer(n.ELEMENT_ARRAY_BUFFER,l);r.disable(n.CULL_FACE);r.setDepthWrite(!1);O=0;for(P=b.length;O<P;O++)if(J=16/I.w,ca.set(J*E,J),R=b[O],z.set(R.matrixWorld.elements[12],
-R.matrixWorld.elements[13],R.matrixWorld.elements[14]),z.applyMatrix4(A.matrixWorldInverse),z.applyProjection(A.projectionMatrix),Da.copy(z),eb.x=I.x+Da.x*K+K-8,eb.y=I.y+Da.y*la+la-8,!0===Na.containsPoint(eb)){r.activeTexture(n.TEXTURE0);r.bindTexture(n.TEXTURE_2D,null);r.activeTexture(n.TEXTURE1);r.bindTexture(n.TEXTURE_2D,v);n.copyTexImage2D(n.TEXTURE_2D,0,n.RGB,eb.x,eb.y,16,16,0);n.uniform1i(c,0);n.uniform2f(h,ca.x,ca.y);n.uniform3f(m,Da.x,Da.y,Da.z);r.disable(n.BLEND);r.enable(n.DEPTH_TEST);n.drawElements(n.TRIANGLES,
-6,n.UNSIGNED_SHORT,0);r.activeTexture(n.TEXTURE0);r.bindTexture(n.TEXTURE_2D,M);n.copyTexImage2D(n.TEXTURE_2D,0,n.RGBA,eb.x,eb.y,16,16,0);n.uniform1i(c,1);r.disable(n.DEPTH_TEST);r.activeTexture(n.TEXTURE1);r.bindTexture(n.TEXTURE_2D,v);n.drawElements(n.TRIANGLES,6,n.UNSIGNED_SHORT,0);R.positionScreen.copy(Da);R.customUpdateCallback?R.customUpdateCallback(R):R.updateLensFlares();n.uniform1i(c,2);r.enable(n.BLEND);for(var T=0,y=R.lensFlares.length;T<y;T++){var V=R.lensFlares[T];.001<V.opacity&&.001<
-V.scale&&(Da.x=V.x,Da.y=V.y,Da.z=V.z,J=V.size*V.scale/I.w,ca.x=J*E,ca.y=J,n.uniform3f(m,Da.x,Da.y,Da.z),n.uniform2f(h,ca.x,ca.y),n.uniform1f(k,V.rotation),n.uniform1f(f,V.opacity),n.uniform3f(g,V.color.r,V.color.g,V.color.b),r.setBlending(V.blending,V.blendEquation,V.blendSrc,V.blendDst),a.setTexture2D(V.texture,1),n.drawElements(n.TRIANGLES,6,n.UNSIGNED_SHORT,0))}}r.enable(n.CULL_FACE);r.enable(n.DEPTH_TEST);r.setDepthWrite(!0);a.resetGLState()}}}function of(a,b){var c,d,e,f,g,h,k,m,x,p,n,r,w,l,
-F,t,v;function M(a,b){return a.renderOrder!==b.renderOrder?a.renderOrder-b.renderOrder:a.z!==b.z?b.z-a.z:b.id-a.id}var z=a.context,A=a.state,I,E,K,la,J=new q,ca=new da,Da=new q;this.render=function(q,Na){if(0!==b.length){if(void 0===K){var O=new Float32Array([-.5,-.5,0,0,.5,-.5,1,0,.5,.5,1,1,-.5,.5,0,1]),P=new Uint16Array([0,1,2,0,2,3]);I=z.createBuffer();E=z.createBuffer();z.bindBuffer(z.ARRAY_BUFFER,I);z.bufferData(z.ARRAY_BUFFER,O,z.STATIC_DRAW);z.bindBuffer(z.ELEMENT_ARRAY_BUFFER,E);z.bufferData(z.ELEMENT_ARRAY_BUFFER,
-P,z.STATIC_DRAW);var O=z.createProgram(),P=z.createShader(z.VERTEX_SHADER),R=z.createShader(z.FRAGMENT_SHADER);z.shaderSource(P,["precision "+a.getPrecision()+" float;","uniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\nuniform float rotation;\nuniform vec2 scale;\nuniform vec2 uvOffset;\nuniform vec2 uvScale;\nattribute vec2 position;\nattribute vec2 uv;\nvarying vec2 vUV;\nvoid main() {\nvUV = uvOffset + uv * uvScale;\nvec2 alignedPosition = position * scale;\nvec2 rotatedPosition;\nrotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\nrotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\nvec4 finalPosition;\nfinalPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\nfinalPosition.xy += rotatedPosition;\nfinalPosition = projectionMatrix * finalPosition;\ngl_Position = finalPosition;\n}"].join("\n"));
-z.shaderSource(R,["precision "+a.getPrecision()+" float;","uniform vec3 color;\nuniform sampler2D map;\nuniform float opacity;\nuniform int fogType;\nuniform vec3 fogColor;\nuniform float fogDensity;\nuniform float fogNear;\nuniform float fogFar;\nuniform float alphaTest;\nvarying vec2 vUV;\nvoid main() {\nvec4 texture = texture2D( map, vUV );\nif ( texture.a < alphaTest ) discard;\ngl_FragColor = vec4( color * texture.xyz, texture.a * opacity );\nif ( fogType > 0 ) {\nfloat depth = gl_FragCoord.z / gl_FragCoord.w;\nfloat fogFactor = 0.0;\nif ( fogType == 1 ) {\nfogFactor = smoothstep( fogNear, fogFar, depth );\n} else {\nconst float LOG2 = 1.442695;\nfogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );\nfogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );\n}\ngl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );\n}\n}"].join("\n"));
-z.compileShader(P);z.compileShader(R);z.attachShader(O,P);z.attachShader(O,R);z.linkProgram(O);K=O;t=z.getAttribLocation(K,"position");v=z.getAttribLocation(K,"uv");c=z.getUniformLocation(K,"uvOffset");d=z.getUniformLocation(K,"uvScale");e=z.getUniformLocation(K,"rotation");f=z.getUniformLocation(K,"scale");g=z.getUniformLocation(K,"color");h=z.getUniformLocation(K,"map");k=z.getUniformLocation(K,"opacity");m=z.getUniformLocation(K,"modelViewMatrix");x=z.getUniformLocation(K,"projectionMatrix");p=
-z.getUniformLocation(K,"fogType");n=z.getUniformLocation(K,"fogDensity");r=z.getUniformLocation(K,"fogNear");w=z.getUniformLocation(K,"fogFar");l=z.getUniformLocation(K,"fogColor");F=z.getUniformLocation(K,"alphaTest");O=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");O.width=8;O.height=8;P=O.getContext("2d");P.fillStyle="white";P.fillRect(0,0,8,8);la=new ea(O);la.needsUpdate=!0}z.useProgram(K);A.initAttributes();A.enableAttribute(t);A.enableAttribute(v);A.disableUnusedAttributes();
-A.disable(z.CULL_FACE);A.enable(z.BLEND);z.bindBuffer(z.ARRAY_BUFFER,I);z.vertexAttribPointer(t,2,z.FLOAT,!1,16,0);z.vertexAttribPointer(v,2,z.FLOAT,!1,16,8);z.bindBuffer(z.ELEMENT_ARRAY_BUFFER,E);z.uniformMatrix4fv(x,!1,Na.projectionMatrix.elements);A.activeTexture(z.TEXTURE0);z.uniform1i(h,0);P=O=0;(R=q.fog)?(z.uniform3f(l,R.color.r,R.color.g,R.color.b),R.isFog?(z.uniform1f(r,R.near),z.uniform1f(w,R.far),z.uniform1i(p,1),P=O=1):R.isFogExp2&&(z.uniform1f(n,R.density),z.uniform1i(p,2),P=O=2)):(z.uniform1i(p,
-0),P=O=0);for(var R=0,T=b.length;R<T;R++){var y=b[R];y.modelViewMatrix.multiplyMatrices(Na.matrixWorldInverse,y.matrixWorld);y.z=-y.modelViewMatrix.elements[14]}b.sort(M);for(var V=[],R=0,T=b.length;R<T;R++){var y=b[R],ra=y.material;!1!==ra.visible&&(z.uniform1f(F,ra.alphaTest),z.uniformMatrix4fv(m,!1,y.modelViewMatrix.elements),y.matrixWorld.decompose(J,ca,Da),V[0]=Da.x,V[1]=Da.y,y=0,q.fog&&ra.fog&&(y=P),O!==y&&(z.uniform1i(p,y),O=y),null!==ra.map?(z.uniform2f(c,ra.map.offset.x,ra.map.offset.y),
-z.uniform2f(d,ra.map.repeat.x,ra.map.repeat.y)):(z.uniform2f(c,0,0),z.uniform2f(d,1,1)),z.uniform1f(k,ra.opacity),z.uniform3f(g,ra.color.r,ra.color.g,ra.color.b),z.uniform1f(e,ra.rotation),z.uniform2fv(f,V),A.setBlending(ra.blending,ra.blendEquation,ra.blendSrc,ra.blendDst),A.setDepthTest(ra.depthTest),A.setDepthWrite(ra.depthWrite),ra.map?a.setTexture2D(ra.map,0):a.setTexture2D(la,0),z.drawElements(z.TRIANGLES,6,z.UNSIGNED_SHORT,0))}A.enable(z.CULL_FACE);a.resetGLState()}}}function W(){Object.defineProperty(this,
-"id",{value:pf++});this.uuid=Q.generateUUID();this.name="";this.type="Material";this.lights=this.fog=!0;this.blending=1;this.side=0;this.shading=2;this.vertexColors=0;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.clippingPlanes=null;this.clipShadows=this.clipIntersection=!1;this.colorWrite=!0;this.precision=null;this.polygonOffset=
-!1;this.alphaTest=this.polygonOffsetUnits=this.polygonOffsetFactor=0;this.premultipliedAlpha=!1;this.overdraw=0;this._needsUpdate=this.visible=!0}function Ia(a){W.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;void 0!==a&&(void 0!==a.attributes&&console.error("THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead."),this.setValues(a))}function ab(a){W.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.lights=this.fog=!1;this.setValues(a)}function ya(a,b){this.min=void 0!==a?a:new q(Infinity,Infinity,Infinity);this.max=void 0!==b?b:new q(-Infinity,-Infinity,-Infinity)}function Fa(a,b){this.center=void 0!==a?a:new q;this.radius=void 0!==b?b:0}function za(){this.elements=new Float32Array([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 ma(a,b){this.normal=void 0!==a?a:new q(1,0,0);this.constant=void 0!==b?b:0}function qc(a,b,c,d,e,f){this.planes=[void 0!==a?a:new ma,void 0!==b?b:new ma,void 0!==c?c:new ma,void 0!==d?d:new ma,void 0!==e?e:new ma,void 0!==f?f:new ma]}function ye(a,b,c,d){function e(b,c,d,e){var f=b.geometry,g;g=F;var h=b.customDepthMaterial;d&&(g=t,h=b.customDistanceMaterial);h?g=h:(h=!1,c.morphTargets&&(f&&f.isBufferGeometry?h=f.morphAttributes&&f.morphAttributes.position&&0<f.morphAttributes.position.length:
-f&&f.isGeometry&&(h=f.morphTargets&&0<f.morphTargets.length)),b=b.isSkinnedMesh&&c.skinning,f=0,h&&(f|=1),b&&(f|=2),g=g[f]);a.localClippingEnabled&&!0===c.clipShadows&&0!==c.clippingPlanes.length&&(f=g.uuid,h=c.uuid,b=v[f],void 0===b&&(b={},v[f]=b),f=b[h],void 0===f&&(f=g.clone(),b[h]=f),g=f);g.visible=c.visible;g.wireframe=c.wireframe;h=c.side;ca.renderSingleSided&&2==h&&(h=0);ca.renderReverseSided&&(0===h?h=1:1===h&&(h=0));g.side=h;g.clipShadows=c.clipShadows;g.clippingPlanes=c.clippingPlanes;g.wireframeLinewidth=
-c.wireframeLinewidth;g.linewidth=c.linewidth;d&&void 0!==g.uniforms.lightPos&&g.uniforms.lightPos.value.copy(e);return g}function f(a,b,c){if(!1!==a.visible){0!==(a.layers.mask&b.layers.mask)&&(a.isMesh||a.isLine||a.isPoints)&&a.castShadow&&(!1===a.frustumCulled||!0===k.intersectsObject(a))&&!0===a.material.visible&&(a.modelViewMatrix.multiplyMatrices(c.matrixWorldInverse,a.matrixWorld),l.push(a));a=a.children;for(var d=0,e=a.length;d<e;d++)f(a[d],b,c)}}var g=a.context,h=a.state,k=new qc,m=new H,
-x=b.shadows,p=new C,n=new C(d.maxTextureSize,d.maxTextureSize),r=new q,w=new q,l=[],F=Array(4),t=Array(4),v={},M=[new q(1,0,0),new q(-1,0,0),new q(0,0,1),new q(0,0,-1),new q(0,1,0),new q(0,-1,0)],z=[new q(0,1,0),new q(0,1,0),new q(0,1,0),new q(0,1,0),new q(0,0,1),new q(0,0,-1)],A=[new ga,new ga,new ga,new ga,new ga,new ga];b=new ab;b.depthPacking=3201;b.clipping=!0;d=Gb.distanceRGBA;for(var I=Ja.clone(d.uniforms),E=0;4!==E;++E){var K=0!==(E&1),la=0!==(E&2),J=b.clone();J.morphTargets=K;J.skinning=
-la;F[E]=J;K=new Ia({defines:{USE_SHADOWMAP:""},uniforms:I,vertexShader:d.vertexShader,fragmentShader:d.fragmentShader,morphTargets:K,skinning:la,clipping:!0});t[E]=K}var ca=this;this.enabled=!1;this.autoUpdate=!0;this.needsUpdate=!1;this.type=1;this.renderSingleSided=this.renderReverseSided=!0;this.render=function(b,d){if(!1!==ca.enabled&&(!1!==ca.autoUpdate||!1!==ca.needsUpdate)&&0!==x.length){h.buffers.color.setClear(1,1,1,1);h.disable(g.BLEND);h.setDepthTest(!0);h.setScissorTest(!1);for(var v,
-q,t=0,F=x.length;t<F;t++){var I=x[t],E=I.shadow;if(void 0===E)console.warn("THREE.WebGLShadowMap:",I,"has no shadow.");else{var K=E.camera;p.copy(E.mapSize);p.min(n);if(I&&I.isPointLight){v=6;q=!0;var J=p.x,la=p.y;A[0].set(2*J,la,J,la);A[1].set(0,la,J,la);A[2].set(3*J,la,J,la);A[3].set(J,la,J,la);A[4].set(3*J,0,J,la);A[5].set(J,0,J,la);p.x*=4;p.y*=2}else v=1,q=!1;null===E.map&&(E.map=new Db(p.x,p.y,{minFilter:1003,magFilter:1003,format:1023}),K.updateProjectionMatrix());E.isSpotLightShadow&&E.update(I);
-E&&E.isRectAreaLightShadow&&E.update(I);J=E.map;E=E.matrix;w.setFromMatrixPosition(I.matrixWorld);K.position.copy(w);a.setRenderTarget(J);a.clear();for(J=0;J<v;J++){q?(r.copy(K.position),r.add(M[J]),K.up.copy(z[J]),K.lookAt(r),h.viewport(A[J])):(r.setFromMatrixPosition(I.target.matrixWorld),K.lookAt(r));K.updateMatrixWorld();K.matrixWorldInverse.getInverse(K.matrixWorld);E.set(.5,0,0,.5,0,.5,0,.5,0,0,.5,.5,0,0,0,1);E.multiply(K.projectionMatrix);E.multiply(K.matrixWorldInverse);m.multiplyMatrices(K.projectionMatrix,
-K.matrixWorldInverse);k.setFromMatrix(m);l.length=0;f(b,d,K);for(var la=0,y=l.length;la<y;la++){var C=l[la],Jd=c.update(C),Ta=C.material;if(Ta&&Ta.isMultiMaterial)for(var G=Jd.groups,Ta=Ta.materials,D=0,Ga=G.length;D<Ga;D++){var N=G[D],H=Ta[N.materialIndex];!0===H.visible&&(H=e(C,H,q,w),a.renderBufferDirect(K,null,Jd,H,C,N))}else H=e(C,Ta,q,w),a.renderBufferDirect(K,null,Jd,H,C,null)}}}}v=a.getClearColor();q=a.getClearAlpha();a.setClearColor(v,q);ca.needsUpdate=!1}}}function bb(a,b){this.origin=void 0!==
-a?a:new q;this.direction=void 0!==b?b:new q}function cb(a,b,c,d){this._x=a||0;this._y=b||0;this._z=c||0;this._order=d||cb.DefaultOrder}function gd(){this.mask=1}function G(){Object.defineProperty(this,"id",{value:qf++});this.uuid=Q.generateUUID();this.name="";this.type="Object3D";this.parent=null;this.children=[];this.up=G.DefaultUp.clone();var a=new q,b=new cb,c=new da,d=new q(1,1,1);b.onChange(function(){c.setFromEuler(b,!1)});c.onChange(function(){b.setFromQuaternion(c,void 0,!1)});Object.defineProperties(this,
-{position:{enumerable:!0,value:a},rotation:{enumerable:!0,value:b},quaternion:{enumerable:!0,value:c},scale:{enumerable:!0,value:d},modelViewMatrix:{value:new H},normalMatrix:{value:new za}});this.matrix=new H;this.matrixWorld=new H;this.matrixAutoUpdate=G.DefaultMatrixAutoUpdate;this.matrixWorldNeedsUpdate=!1;this.layers=new gd;this.visible=!0;this.receiveShadow=this.castShadow=!1;this.frustumCulled=!0;this.renderOrder=0;this.userData={};this.onBeforeRender=function(){};this.onAfterRender=function(){}}
-function gb(a,b){this.start=void 0!==a?a:new q;this.end=void 0!==b?b:new q}function Aa(a,b,c){this.a=void 0!==a?a:new q;this.b=void 0!==b?b:new q;this.c=void 0!==c?c:new q}function ha(a,b,c,d,e,f){this.a=a;this.b=b;this.c=c;this.normal=d&&d.isVector3?d:new q;this.vertexNormals=Array.isArray(d)?d:[];this.color=e&&e.isColor?e:new N;this.vertexColors=Array.isArray(e)?e:[];this.materialIndex=void 0!==f?f:0}function Ka(a){W.call(this);this.type="MeshBasicMaterial";this.color=new N(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.lights=this.morphTargets=this.skinning=!1;this.setValues(a)}function y(a,b,c){if(Array.isArray(a))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.uuid=Q.generateUUID();this.array=a;
-this.itemSize=b;this.count=void 0!==a?a.length/b:0;this.normalized=!0===c;this.dynamic=!1;this.updateRange={offset:0,count:-1};this.onUploadCallback=function(){};this.version=0}function rc(a,b){y.call(this,new Int8Array(a),b)}function sc(a,b){y.call(this,new Uint8Array(a),b)}function tc(a,b){y.call(this,new Uint8ClampedArray(a),b)}function uc(a,b){y.call(this,new Int16Array(a),b)}function Ra(a,b){y.call(this,new Uint16Array(a),b)}function vc(a,b){y.call(this,new Int32Array(a),b)}function Ua(a,b){y.call(this,
-new Uint32Array(a),b)}function X(a,b){y.call(this,new Float32Array(a),b)}function wc(a,b){y.call(this,new Float64Array(a),b)}function ze(){this.indices=[];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 S(){Object.defineProperty(this,"id",
-{value:Kd++});this.uuid=Q.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 D(){Object.defineProperty(this,"id",
-{value:Kd++});this.uuid=Q.generateUUID();this.name="";this.type="BufferGeometry";this.index=null;this.attributes={};this.morphAttributes={};this.groups=[];this.boundingSphere=this.boundingBox=null;this.drawRange={start:0,count:Infinity}}function Ba(a,b){G.call(this);this.type="Mesh";this.geometry=void 0!==a?a:new D;this.material=void 0!==b?b:new Ka({color:16777215*Math.random()});this.drawMode=0;this.updateMorphTargets()}function hb(a,b,c,d,e,f){function g(a,b,c,d,e,f,g,k,m,y,C){var Na=f/m,O=g/y,
-P=f/2,R=g/2,T=k/2;g=m+1;for(var G=y+1,V=f=0,D=new q,L=0;L<G;L++)for(var N=L*O-R,H=0;H<g;H++)D[a]=(H*Na-P)*d,D[b]=N*e,D[c]=T,p[w]=D.x,p[w+1]=D.y,p[w+2]=D.z,D[a]=0,D[b]=0,D[c]=0<k?1:-1,n[w]=D.x,n[w+1]=D.y,n[w+2]=D.z,r[l]=H/m,r[l+1]=1-L/y,w+=3,l+=2,f+=1;for(L=0;L<y;L++)for(H=0;H<m;H++)a=t+H+g*(L+1),b=t+(H+1)+g*(L+1),c=t+(H+1)+g*L,x[F]=t+H+g*L,x[F+1]=a,x[F+2]=c,x[F+3]=a,x[F+4]=b,x[F+5]=c,F+=6,V+=6;h.addGroup(v,V,C);v+=V;t+=f}D.call(this);this.type="BoxBufferGeometry";this.parameters={width:a,height:b,
-depth:c,widthSegments:d,heightSegments:e,depthSegments:f};var h=this;d=Math.floor(d)||1;e=Math.floor(e)||1;f=Math.floor(f)||1;var k=function(a,b,c){return a=0+(a+1)*(b+1)*2+(a+1)*(c+1)*2+(c+1)*(b+1)*2}(d,e,f),m=function(a,b,c){a=0+a*b*2+a*c*2+c*b*2;return 6*a}(d,e,f),x=new (65535<m?Uint32Array:Uint16Array)(m),p=new Float32Array(3*k),n=new Float32Array(3*k),r=new Float32Array(2*k),w=0,l=0,F=0,t=0,v=0;g("z","y","x",-1,-1,c,b,a,f,e,0);g("z","y","x",1,-1,c,b,-a,f,e,1);g("x","z","y",1,1,a,c,b,d,f,2);g("x",
-"z","y",1,-1,a,c,-b,d,f,3);g("x","y","z",1,-1,a,b,c,d,e,4);g("x","y","z",-1,-1,a,b,-c,d,e,5);this.setIndex(new y(x,1));this.addAttribute("position",new y(p,3));this.addAttribute("normal",new y(n,3));this.addAttribute("uv",new y(r,2))}function ib(a,b,c,d){D.call(this);this.type="PlaneBufferGeometry";this.parameters={width:a,height:b,widthSegments:c,heightSegments:d};var e=a/2,f=b/2;c=Math.floor(c)||1;d=Math.floor(d)||1;var g=c+1,h=d+1,k=a/c,m=b/d;b=new Float32Array(g*h*3);a=new Float32Array(g*h*3);
-for(var x=new Float32Array(g*h*2),p=0,n=0,r=0;r<h;r++)for(var w=r*m-f,l=0;l<g;l++)b[p]=l*k-e,b[p+1]=-w,a[p+2]=1,x[n]=l/c,x[n+1]=1-r/d,p+=3,n+=2;p=0;e=new (65535<b.length/3?Uint32Array:Uint16Array)(c*d*6);for(r=0;r<d;r++)for(l=0;l<c;l++)f=l+g*(r+1),h=l+1+g*(r+1),k=l+1+g*r,e[p]=l+g*r,e[p+1]=f,e[p+2]=k,e[p+3]=f,e[p+4]=h,e[p+5]=k,p+=6;this.setIndex(new y(e,1));this.addAttribute("position",new y(b,3));this.addAttribute("normal",new y(a,3));this.addAttribute("uv",new y(x,2))}function sa(){G.call(this);
-this.type="Camera";this.matrixWorldInverse=new H;this.projectionMatrix=new H}function Ha(a,b,c,d){sa.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 Hb(a,b,c,d,e,f){sa.call(this);this.type="OrthographicCamera";this.zoom=1;this.view=null;this.left=a;this.right=b;this.top=c;this.bottom=d;this.near=
-void 0!==e?e:.1;this.far=void 0!==f?f:2E3;this.updateProjectionMatrix()}function rf(a,b,c){var d,e,f;return{setMode:function(a){d=a},setIndex:function(c){c.array instanceof Uint32Array&&b.get("OES_element_index_uint")?(e=a.UNSIGNED_INT,f=4):c.array instanceof Uint16Array?(e=a.UNSIGNED_SHORT,f=2):(e=a.UNSIGNED_BYTE,f=1)},render:function(b,h){a.drawElements(d,h,e,b*f);c.calls++;c.vertices+=h;d===a.TRIANGLES&&(c.faces+=h/3)},renderInstances:function(g,h,k){var m=b.get("ANGLE_instanced_arrays");null===
-m?console.error("THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays."):(m.drawElementsInstancedANGLE(d,k,e,h*f,g.maxInstancedCount),c.calls++,c.vertices+=k*g.maxInstancedCount,d===a.TRIANGLES&&(c.faces+=g.maxInstancedCount*k/3))}}}function sf(a,b,c){var d;return{setMode:function(a){d=a},render:function(b,f){a.drawArrays(d,b,f);c.calls++;c.vertices+=f;d===a.TRIANGLES&&(c.faces+=f/3)},renderInstances:function(e){var f=b.get("ANGLE_instanced_arrays");
-if(null===f)console.error("THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");else{var g=e.attributes.position,g=g.isInterleavedBufferAttribute?g.data.count:g.count;f.drawArraysInstancedANGLE(d,0,g,e.maxInstancedCount);c.calls++;c.vertices+=g*e.maxInstancedCount;d===a.TRIANGLES&&(c.faces+=e.maxInstancedCount*g/3)}}}}function tf(){var a={};return{get:function(b){if(void 0!==a[b.id])return a[b.id];var c;switch(b.type){case "DirectionalLight":c=
-{direction:new q,color:new N,shadow:!1,shadowBias:0,shadowRadius:1,shadowMapSize:new C};break;case "SpotLight":c={position:new q,direction:new q,color:new N,distance:0,coneCos:0,penumbraCos:0,decay:0,shadow:!1,shadowBias:0,shadowRadius:1,shadowMapSize:new C};break;case "PointLight":c={position:new q,color:new N,distance:0,decay:0,shadow:!1,shadowBias:0,shadowRadius:1,shadowMapSize:new C};break;case "HemisphereLight":c={direction:new q,skyColor:new N,groundColor:new N};break;case "RectAreaLight":c=
-{color:new N,position:new q,halfWidth:new q,halfHeight:new q}}return a[b.id]=c}}}function uf(a){a=a.split("\n");for(var b=0;b<a.length;b++)a[b]=b+1+": "+a[b];return a.join("\n")}function Ae(a,b,c){var d=a.createShader(b);a.shaderSource(d,c);a.compileShader(d);!1===a.getShaderParameter(d,a.COMPILE_STATUS)&&console.error("THREE.WebGLShader: Shader couldn't compile.");""!==a.getShaderInfoLog(d)&&console.warn("THREE.WebGLShader: gl.getShaderInfoLog()",b===a.VERTEX_SHADER?"vertex":"fragment",a.getShaderInfoLog(d),
-uf(c));return d}function Be(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 ) )"];default:throw Error("unsupported encoding: "+a);}}function Ld(a,b){var c=Be(b);return"vec4 "+a+"( vec4 value ) { return "+c[0]+"ToLinear"+c[1]+"; }"}function vf(a,
-b){var c=Be(b);return"vec4 "+a+"( vec4 value ) { return LinearTo"+c[0]+c[1]+"; }"}function wf(a,b){var c;switch(b){case 1:c="Linear";break;case 2:c="Reinhard";break;case 3:c="Uncharted2";break;case 4:c="OptimizedCineon";break;default:throw Error("unsupported toneMapping: "+b);}return"vec3 "+a+"( vec3 color ) { return "+c+"ToneMapping( color ); }"}function xf(a,b,c){a=a||{};return[a.derivatives||b.envMapCubeUV||b.bumpMap||b.normalMap||b.flatShading?"#extension GL_OES_standard_derivatives : enable":
-"",(a.fragDepth||b.logarithmicDepthBuffer)&&c.get("EXT_frag_depth")?"#extension GL_EXT_frag_depth : enable":"",a.drawBuffers&&c.get("WEBGL_draw_buffers")?"#extension GL_EXT_draw_buffers : require":"",(a.shaderTextureLOD||b.envMap)&&c.get("EXT_shader_texture_lod")?"#extension GL_EXT_shader_texture_lod : enable":""].filter(xc).join("\n")}function yf(a){var b=[],c;for(c in a){var d=a[c];!1!==d&&b.push("#define "+c+" "+d)}return b.join("\n")}function xc(a){return""!==a}function Ce(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)}function Md(a){return a.replace(/#include +<([\w\d.]+)>/g,function(a,c){var d=Z[c];if(void 0===d)throw Error("Can not resolve #include <"+c+">");return Md(d)})}function De(a){return a.replace(/for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g,function(a,c,d,e){a="";for(c=parseInt(c);c<
-parseInt(d);c++)a+=e.replace(/\[ i \]/g,"[ "+c+" ]");return a})}function zf(a,b,c,d){var e=a.context,f=c.extensions,g=c.defines,h=c.__webglShader.vertexShader,k=c.__webglShader.fragmentShader,m="SHADOWMAP_TYPE_BASIC";1===d.shadowMapType?m="SHADOWMAP_TYPE_PCF":2===d.shadowMapType&&(m="SHADOWMAP_TYPE_PCF_SOFT");var x="ENVMAP_TYPE_CUBE",p="ENVMAP_MODE_REFLECTION",n="ENVMAP_BLENDING_MULTIPLY";if(d.envMap){switch(c.envMap.mapping){case 301:case 302:x="ENVMAP_TYPE_CUBE";break;case 306:case 307:x="ENVMAP_TYPE_CUBE_UV";
-break;case 303:case 304:x="ENVMAP_TYPE_EQUIREC";break;case 305:x="ENVMAP_TYPE_SPHERE"}switch(c.envMap.mapping){case 302:case 304:p="ENVMAP_MODE_REFRACTION"}switch(c.combine){case 0:n="ENVMAP_BLENDING_MULTIPLY";break;case 1:n="ENVMAP_BLENDING_MIX";break;case 2:n="ENVMAP_BLENDING_ADD"}}var r=0<a.gammaFactor?a.gammaFactor:1,f=xf(f,d,a.extensions),l=yf(g),u=e.createProgram();c.isRawShaderMaterial?(g=[l,"\n"].filter(xc).join("\n"),m=[f,l,"\n"].filter(xc).join("\n")):(g=["precision "+d.precision+" float;",
-"precision "+d.precision+" int;","#define SHADER_NAME "+c.__webglShader.name,l,d.supportsVertexTextures?"#define VERTEX_TEXTURES":"","#define GAMMA_FACTOR "+r,"#define MAX_BONES "+d.maxBones,d.map?"#define USE_MAP":"",d.envMap?"#define USE_ENVMAP":"",d.envMap?"#define "+p:"",d.lightMap?"#define USE_LIGHTMAP":"",d.aoMap?"#define USE_AOMAP":"",d.emissiveMap?"#define USE_EMISSIVEMAP":"",d.bumpMap?"#define USE_BUMPMAP":"",d.normalMap?"#define USE_NORMALMAP":"",d.displacementMap&&d.supportsVertexTextures?
-"#define USE_DISPLACEMENTMAP":"",d.specularMap?"#define USE_SPECULARMAP":"",d.roughnessMap?"#define USE_ROUGHNESSMAP":"",d.metalnessMap?"#define USE_METALNESSMAP":"",d.alphaMap?"#define USE_ALPHAMAP":"",d.vertexColors?"#define USE_COLOR":"",d.flatShading?"#define FLAT_SHADED":"",d.skinning?"#define USE_SKINNING":"",d.useVertexTexture?"#define BONE_TEXTURE":"",d.morphTargets?"#define USE_MORPHTARGETS":"",d.morphNormals&&!1===d.flatShading?"#define USE_MORPHNORMALS":"",d.doubleSided?"#define DOUBLE_SIDED":
-"",d.flipSided?"#define FLIP_SIDED":"","#define NUM_CLIPPING_PLANES "+d.numClippingPlanes,d.shadowMapEnabled?"#define USE_SHADOWMAP":"",d.shadowMapEnabled?"#define "+m:"",d.sizeAttenuation?"#define USE_SIZEATTENUATION":"",d.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",d.logarithmicDepthBuffer&&a.extensions.get("EXT_frag_depth")?"#define USE_LOGDEPTHBUF_EXT":"","uniform mat4 modelMatrix;","uniform mat4 modelViewMatrix;","uniform mat4 projectionMatrix;","uniform mat4 viewMatrix;","uniform mat3 normalMatrix;",
-"uniform vec3 cameraPosition;","attribute vec3 position;","attribute vec3 normal;","attribute vec2 uv;","#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(xc).join("\n"),m=[f,"precision "+d.precision+" float;","precision "+d.precision+" int;","#define SHADER_NAME "+c.__webglShader.name,l,d.alphaTest?"#define ALPHATEST "+d.alphaTest:"","#define GAMMA_FACTOR "+r,d.useFog&&d.fog?"#define USE_FOG":"",d.useFog&&d.fogExp?"#define FOG_EXP2":
-"",d.map?"#define USE_MAP":"",d.envMap?"#define USE_ENVMAP":"",d.envMap?"#define "+x:"",d.envMap?"#define "+p:"",d.envMap?"#define "+n:"",d.lightMap?"#define USE_LIGHTMAP":"",d.aoMap?"#define USE_AOMAP":"",d.emissiveMap?"#define USE_EMISSIVEMAP":"",d.bumpMap?"#define USE_BUMPMAP":"",d.normalMap?"#define USE_NORMALMAP":"",d.specularMap?"#define USE_SPECULARMAP":"",d.roughnessMap?"#define USE_ROUGHNESSMAP":"",d.metalnessMap?"#define USE_METALNESSMAP":"",d.alphaMap?"#define USE_ALPHAMAP":"",d.vertexColors?
-"#define USE_COLOR":"",d.gradientMap?"#define USE_GRADIENTMAP":"",d.flatShading?"#define FLAT_SHADED":"",d.doubleSided?"#define DOUBLE_SIDED":"",d.flipSided?"#define FLIP_SIDED":"","#define NUM_CLIPPING_PLANES "+d.numClippingPlanes,"#define UNION_CLIPPING_PLANES "+(d.numClippingPlanes-d.numClipIntersection),d.shadowMapEnabled?"#define USE_SHADOWMAP":"",d.shadowMapEnabled?"#define "+m:"",d.premultipliedAlpha?"#define PREMULTIPLIED_ALPHA":"",d.physicallyCorrectLights?"#define PHYSICALLY_CORRECT_LIGHTS":
-"",d.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",d.logarithmicDepthBuffer&&a.extensions.get("EXT_frag_depth")?"#define USE_LOGDEPTHBUF_EXT":"",d.envMap&&a.extensions.get("EXT_shader_texture_lod")?"#define TEXTURE_LOD_EXT":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;",0!==d.toneMapping?"#define TONE_MAPPING":"",0!==d.toneMapping?Z.tonemapping_pars_fragment:"",0!==d.toneMapping?wf("toneMapping",d.toneMapping):"",d.outputEncoding||d.mapEncoding||d.envMapEncoding||d.emissiveMapEncoding?
-Z.encodings_pars_fragment:"",d.mapEncoding?Ld("mapTexelToLinear",d.mapEncoding):"",d.envMapEncoding?Ld("envMapTexelToLinear",d.envMapEncoding):"",d.emissiveMapEncoding?Ld("emissiveMapTexelToLinear",d.emissiveMapEncoding):"",d.outputEncoding?vf("linearToOutputTexel",d.outputEncoding):"",d.depthPacking?"#define DEPTH_PACKING "+c.depthPacking:"","\n"].filter(xc).join("\n"));h=Md(h,d);h=Ce(h,d);k=Md(k,d);k=Ce(k,d);c.isShaderMaterial||(h=De(h),k=De(k));k=m+k;h=Ae(e,e.VERTEX_SHADER,g+h);k=Ae(e,e.FRAGMENT_SHADER,
-k);e.attachShader(u,h);e.attachShader(u,k);void 0!==c.index0AttributeName?e.bindAttribLocation(u,0,c.index0AttributeName):!0===d.morphTargets&&e.bindAttribLocation(u,0,"position");e.linkProgram(u);d=e.getProgramInfoLog(u);x=e.getShaderInfoLog(h);p=e.getShaderInfoLog(k);r=n=!0;if(!1===e.getProgramParameter(u,e.LINK_STATUS))n=!1,console.error("THREE.WebGLProgram: shader error: ",e.getError(),"gl.VALIDATE_STATUS",e.getProgramParameter(u,e.VALIDATE_STATUS),"gl.getProgramInfoLog",d,x,p);else if(""!==d)console.warn("THREE.WebGLProgram: gl.getProgramInfoLog()",
-d);else if(""===x||""===p)r=!1;r&&(this.diagnostics={runnable:n,material:c,programLog:d,vertexShader:{log:x,prefix:g},fragmentShader:{log:p,prefix:m}});e.deleteShader(h);e.deleteShader(k);var q;this.getUniforms=function(){void 0===q&&(q=new $a(e,u,a));return q};var t;this.getAttributes=function(){if(void 0===t){for(var a={},b=e.getProgramParameter(u,e.ACTIVE_ATTRIBUTES),c=0;c<b;c++){var d=e.getActiveAttrib(u,c).name;a[d]=e.getAttribLocation(u,d)}t=a}return t};this.destroy=function(){e.deleteProgram(u);
-this.program=void 0};Object.defineProperties(this,{uniforms:{get:function(){console.warn("THREE.WebGLProgram: .uniforms is now .getUniforms().");return this.getUniforms()}},attributes:{get:function(){console.warn("THREE.WebGLProgram: .attributes is now .getAttributes().");return this.getAttributes()}}});this.id=Af++;this.code=b;this.usedTimes=1;this.program=u;this.vertexShader=h;this.fragmentShader=k;return this}function Bf(a,b){function c(a,b){var c;a?a.isTexture?c=a.encoding:a.isWebGLRenderTarget&&
-(console.warn("THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead."),c=a.texture.encoding):c=3E3;3E3===c&&b&&(c=3007);return c}var d=[],e={MeshDepthMaterial:"depth",MeshNormalMaterial:"normal",MeshBasicMaterial:"basic",MeshLambertMaterial:"lambert",MeshPhongMaterial:"phong",MeshToonMaterial:"phong",MeshStandardMaterial:"physical",MeshPhysicalMaterial:"physical",LineBasicMaterial:"basic",LineDashedMaterial:"dashed",PointsMaterial:"points"},
-f="precision supportsVertexTextures map mapEncoding envMap envMapMode envMapEncoding lightMap aoMap emissiveMap emissiveMapEncoding bumpMap normalMap displacementMap specularMap roughnessMap metalnessMap gradientMap alphaMap combine vertexColors fog useFog fogExp flatShading sizeAttenuation logarithmicDepthBuffer skinning maxBones useVertexTexture morphTargets morphNormals maxMorphTargets maxMorphNormals premultipliedAlpha numDirLights numPointLights numSpotLights numHemiLights numRectAreaLights shadowMapEnabled shadowMapType toneMapping physicallyCorrectLights alphaTest doubleSided flipSided numClippingPlanes numClipIntersection depthPacking".split(" ");
-this.getParameters=function(d,f,k,m,x,p){var n=e[d.type],r;b.floatVertexTextures&&p&&p.skeleton&&p.skeleton.useVertexTexture?r=1024:(r=Math.floor((b.maxVertexUniforms-20)/4),void 0!==p&&p&&p.isSkinnedMesh&&(r=Math.min(p.skeleton.bones.length,r),r<p.skeleton.bones.length&&console.warn("WebGLRenderer: too many bones - "+p.skeleton.bones.length+", this GPU supports just "+r+" (try OpenGL instead of ANGLE)")));var l=a.getPrecision();null!==d.precision&&(l=b.getMaxPrecision(d.precision),l!==d.precision&&
-console.warn("THREE.WebGLProgram.getParameters:",d.precision,"not supported, using",l,"instead."));var u=a.getCurrentRenderTarget();return{shaderID:n,precision:l,supportsVertexTextures:b.vertexTextures,outputEncoding:c(u?u.texture:null,a.gammaOutput),map:!!d.map,mapEncoding:c(d.map,a.gammaInput),envMap:!!d.envMap,envMapMode:d.envMap&&d.envMap.mapping,envMapEncoding:c(d.envMap,a.gammaInput),envMapCubeUV:!!d.envMap&&(306===d.envMap.mapping||307===d.envMap.mapping),lightMap:!!d.lightMap,aoMap:!!d.aoMap,
-emissiveMap:!!d.emissiveMap,emissiveMapEncoding:c(d.emissiveMap,a.gammaInput),bumpMap:!!d.bumpMap,normalMap:!!d.normalMap,displacementMap:!!d.displacementMap,roughnessMap:!!d.roughnessMap,metalnessMap:!!d.metalnessMap,specularMap:!!d.specularMap,alphaMap:!!d.alphaMap,gradientMap:!!d.gradientMap,combine:d.combine,vertexColors:d.vertexColors,fog:!!k,useFog:d.fog,fogExp:k&&k.isFogExp2,flatShading:1===d.shading,sizeAttenuation:d.sizeAttenuation,logarithmicDepthBuffer:b.logarithmicDepthBuffer,skinning:d.skinning,
-maxBones:r,useVertexTexture:b.floatVertexTextures&&p&&p.skeleton&&p.skeleton.useVertexTexture,morphTargets:d.morphTargets,morphNormals:d.morphNormals,maxMorphTargets:a.maxMorphTargets,maxMorphNormals:a.maxMorphNormals,numDirLights:f.directional.length,numPointLights:f.point.length,numSpotLights:f.spot.length,numRectAreaLights:f.rectArea.length,numHemiLights:f.hemi.length,numClippingPlanes:m,numClipIntersection:x,shadowMapEnabled:a.shadowMap.enabled&&p.receiveShadow&&0<f.shadows.length,shadowMapType:a.shadowMap.type,
-toneMapping:a.toneMapping,physicallyCorrectLights:a.physicallyCorrectLights,premultipliedAlpha:d.premultipliedAlpha,alphaTest:d.alphaTest,doubleSided:2===d.side,flipSided:1===d.side,depthPacking:void 0!==d.depthPacking?d.depthPacking:!1}};this.getProgramCode=function(a,b){var c=[];b.shaderID?c.push(b.shaderID):(c.push(a.fragmentShader),c.push(a.vertexShader));if(void 0!==a.defines)for(var d in a.defines)c.push(d),c.push(a.defines[d]);for(d=0;d<f.length;d++)c.push(b[f[d]]);return c.join()};this.acquireProgram=
-function(b,c,e){for(var f,x=0,p=d.length;x<p;x++){var n=d[x];if(n.code===e){f=n;++f.usedTimes;break}}void 0===f&&(f=new zf(a,e,b,c),d.push(f));return f};this.releaseProgram=function(a){if(0===--a.usedTimes){var b=d.indexOf(a);d[b]=d[d.length-1];d.pop();a.destroy()}};this.programs=d}function Cf(a,b,c){function d(a){var h=a.target;a=f[h.id];null!==a.index&&e(a.index);var k=a.attributes,m;for(m in k)e(k[m]);h.removeEventListener("dispose",d);delete f[h.id];m=b.get(h);m.wireframe&&e(m.wireframe);b["delete"](h);
-h=b.get(a);h.wireframe&&e(h.wireframe);b["delete"](a);c.memory.geometries--}function e(c){var d;d=c.isInterleavedBufferAttribute?b.get(c.data).__webglBuffer:b.get(c).__webglBuffer;void 0!==d&&(a.deleteBuffer(d),c.isInterleavedBufferAttribute?b["delete"](c.data):b["delete"](c))}var f={};return{get:function(a){var b=a.geometry;if(void 0!==f[b.id])return f[b.id];b.addEventListener("dispose",d);var e;b.isBufferGeometry?e=b:b.isGeometry&&(void 0===b._bufferGeometry&&(b._bufferGeometry=(new D).setFromObject(a)),
-e=b._bufferGeometry);f[b.id]=e;c.memory.geometries++;return e}}}function Df(a,b,c){function d(c,d){var e=c.isInterleavedBufferAttribute?c.data:c,k=b.get(e);if(void 0===k.__webglBuffer){k.__webglBuffer=a.createBuffer();a.bindBuffer(d,k.__webglBuffer);a.bufferData(d,e.array,e.dynamic?a.DYNAMIC_DRAW:a.STATIC_DRAW);var m=a.FLOAT,x=e.array;x instanceof Float32Array?m=a.FLOAT:x instanceof Float64Array?console.warn("Unsupported data buffer format: Float64Array"):x instanceof Uint16Array?m=a.UNSIGNED_SHORT:
-x instanceof Int16Array?m=a.SHORT:x instanceof Uint32Array?m=a.UNSIGNED_INT:x instanceof Int32Array?m=a.INT:x instanceof Int8Array?m=a.BYTE:x instanceof Uint8Array&&(m=a.UNSIGNED_BYTE);k.bytesPerElement=x.BYTES_PER_ELEMENT;k.type=m;k.version=e.version;e.onUploadCallback()}else k.version!==e.version&&(a.bindBuffer(d,k.__webglBuffer),!1===e.dynamic?a.bufferData(d,e.array,a.STATIC_DRAW):-1===e.updateRange.count?a.bufferSubData(d,0,e.array):0===e.updateRange.count?console.error("THREE.WebGLObjects.updateBuffer: dynamic THREE.BufferAttribute marked as needsUpdate but updateRange.count is 0, ensure you are using set methods or updating manually."):
-(a.bufferSubData(d,e.updateRange.offset*e.array.BYTES_PER_ELEMENT,e.array.subarray(e.updateRange.offset,e.updateRange.offset+e.updateRange.count)),e.updateRange.count=0),k.version=e.version)}var e=new Cf(a,b,c);return{getAttributeBuffer:function(a){return a.isInterleavedBufferAttribute?b.get(a.data).__webglBuffer:b.get(a).__webglBuffer},getAttributeProperties:function(a){return a.isInterleavedBufferAttribute?b.get(a.data):b.get(a)},getWireframeAttribute:function(c){var e=b.get(c);if(void 0!==e.wireframe)return e.wireframe;
-var h=[],k=c.index,m=c.attributes;c=m.position;if(null!==k)for(var k=k.array,m=0,x=k.length;m<x;m+=3){var p=k[m+0],n=k[m+1],r=k[m+2];h.push(p,n,n,r,r,p)}else for(k=m.position.array,m=0,x=k.length/3-1;m<x;m+=3)p=m+0,n=m+1,r=m+2,h.push(p,n,n,r,r,p);h=new y(new (65535<c.count?Uint32Array:Uint16Array)(h),1);d(h,a.ELEMENT_ARRAY_BUFFER);return e.wireframe=h},update:function(b){var c=e.get(b);b.geometry.isGeometry&&c.updateFromObject(b);b=c.index;var h=c.attributes;null!==b&&d(b,a.ELEMENT_ARRAY_BUFFER);
-for(var k in h)d(h[k],a.ARRAY_BUFFER);b=c.morphAttributes;for(k in b)for(var h=b[k],m=0,x=h.length;m<x;m++)d(h[m],a.ARRAY_BUFFER);return c}}}function Ef(a,b,c,d,e,f,g){function h(a,b){if(a.width>b||a.height>b){var c=b/Math.max(a.width,a.height),d=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");d.width=Math.floor(a.width*c);d.height=Math.floor(a.height*c);d.getContext("2d").drawImage(a,0,0,a.width,a.height,0,0,d.width,d.height);console.warn("THREE.WebGLRenderer: image is too big ("+
-a.width+"x"+a.height+"). Resized to "+d.width+"x"+d.height,a);return d}return a}function k(a){return Q.isPowerOfTwo(a.width)&&Q.isPowerOfTwo(a.height)}function m(b){return 1003===b||1004===b||1005===b?a.NEAREST:a.LINEAR}function x(b){b=b.target;b.removeEventListener("dispose",x);a:{var c=d.get(b);if(b.image&&c.__image__webglTextureCube)a.deleteTexture(c.__image__webglTextureCube);else{if(void 0===c.__webglInit)break a;a.deleteTexture(c.__webglTexture)}d["delete"](b)}q.textures--}function p(b){b=b.target;
-b.removeEventListener("dispose",p);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.isWebGLRenderTargetCube)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);d["delete"](b.texture);d["delete"](b)}q.textures--}function n(b,
-g){var m=d.get(b);if(0<b.version&&m.__version!==b.version){var n=b.image;if(void 0===n)console.warn("THREE.WebGLRenderer: Texture marked for update but image is undefined",b);else if(!1===n.complete)console.warn("THREE.WebGLRenderer: Texture marked for update but image is incomplete",b);else{void 0===m.__webglInit&&(m.__webglInit=!0,b.addEventListener("dispose",x),m.__webglTexture=a.createTexture(),q.textures++);c.activeTexture(a.TEXTURE0+g);c.bindTexture(a.TEXTURE_2D,m.__webglTexture);a.pixelStorei(a.UNPACK_FLIP_Y_WEBGL,
-b.flipY);a.pixelStorei(a.UNPACK_PREMULTIPLY_ALPHA_WEBGL,b.premultiplyAlpha);a.pixelStorei(a.UNPACK_ALIGNMENT,b.unpackAlignment);var p=h(b.image,e.maxTextureSize);if((1001!==b.wrapS||1001!==b.wrapT||1003!==b.minFilter&&1006!==b.minFilter)&&!1===k(p))if(n=p,n instanceof HTMLImageElement||n instanceof HTMLCanvasElement){var l=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");l.width=Q.nearestPowerOfTwo(n.width);l.height=Q.nearestPowerOfTwo(n.height);l.getContext("2d").drawImage(n,0,0,
-l.width,l.height);console.warn("THREE.WebGLRenderer: image is not power of two ("+n.width+"x"+n.height+"). Resized to "+l.width+"x"+l.height,n);p=l}else p=n;var n=k(p),l=f(b.format),w=f(b.type);r(a.TEXTURE_2D,b,n);var u=b.mipmaps;if(b.isDepthTexture){u=a.DEPTH_COMPONENT;if(1015===b.type){if(!t)throw Error("Float Depth Texture only supported in WebGL2.0");u=a.DEPTH_COMPONENT32F}else t&&(u=a.DEPTH_COMPONENT16);1026===b.format&&u===a.DEPTH_COMPONENT&&1012!==b.type&&1014!==b.type&&(console.warn("THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture."),
-b.type=1012,w=f(b.type));1027===b.format&&(u=a.DEPTH_STENCIL,1020!==b.type&&(console.warn("THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture."),b.type=1020,w=f(b.type)));c.texImage2D(a.TEXTURE_2D,0,u,p.width,p.height,0,l,w,null)}else if(b.isDataTexture)if(0<u.length&&n){for(var J=0,ca=u.length;J<ca;J++)p=u[J],c.texImage2D(a.TEXTURE_2D,J,l,p.width,p.height,0,l,w,p.data);b.generateMipmaps=!1}else c.texImage2D(a.TEXTURE_2D,0,l,p.width,p.height,0,l,w,p.data);else if(b.isCompressedTexture)for(J=
-0,ca=u.length;J<ca;J++)p=u[J],1023!==b.format&&1022!==b.format?-1<c.getCompressedTextureFormats().indexOf(l)?c.compressedTexImage2D(a.TEXTURE_2D,J,l,p.width,p.height,0,p.data):console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()"):c.texImage2D(a.TEXTURE_2D,J,l,p.width,p.height,0,l,w,p.data);else if(0<u.length&&n){J=0;for(ca=u.length;J<ca;J++)p=u[J],c.texImage2D(a.TEXTURE_2D,J,l,l,w,p);b.generateMipmaps=!1}else c.texImage2D(a.TEXTURE_2D,0,l,l,
-w,p);b.generateMipmaps&&n&&a.generateMipmap(a.TEXTURE_2D);m.__version=b.version;if(b.onUpdate)b.onUpdate(b);return}}c.activeTexture(a.TEXTURE0+g);c.bindTexture(a.TEXTURE_2D,m.__webglTexture)}function r(c,g,h){h?(a.texParameteri(c,a.TEXTURE_WRAP_S,f(g.wrapS)),a.texParameteri(c,a.TEXTURE_WRAP_T,f(g.wrapT)),a.texParameteri(c,a.TEXTURE_MAG_FILTER,f(g.magFilter)),a.texParameteri(c,a.TEXTURE_MIN_FILTER,f(g.minFilter))):(a.texParameteri(c,a.TEXTURE_WRAP_S,a.CLAMP_TO_EDGE),a.texParameteri(c,a.TEXTURE_WRAP_T,
-a.CLAMP_TO_EDGE),1001===g.wrapS&&1001===g.wrapT||console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.",g),a.texParameteri(c,a.TEXTURE_MAG_FILTER,m(g.magFilter)),a.texParameteri(c,a.TEXTURE_MIN_FILTER,m(g.minFilter)),1003!==g.minFilter&&1006!==g.minFilter&&console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.",g));!(h=b.get("EXT_texture_filter_anisotropic"))||
-1015===g.type&&null===b.get("OES_texture_float_linear")||1016===g.type&&null===b.get("OES_texture_half_float_linear")||!(1<g.anisotropy||d.get(g).__currentAnisotropy)||(a.texParameterf(c,h.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(g.anisotropy,e.getMaxAnisotropy())),d.get(g).__currentAnisotropy=g.anisotropy)}function l(b,e,g,h){var k=f(e.texture.format),m=f(e.texture.type);c.texImage2D(h,0,k,e.width,e.height,0,k,m,null);a.bindFramebuffer(a.FRAMEBUFFER,b);a.framebufferTexture2D(a.FRAMEBUFFER,g,h,d.get(e.texture).__webglTexture,
-0);a.bindFramebuffer(a.FRAMEBUFFER,null)}function u(b,c){a.bindRenderbuffer(a.RENDERBUFFER,b);c.depthBuffer&&!c.stencilBuffer?(a.renderbufferStorage(a.RENDERBUFFER,a.DEPTH_COMPONENT16,c.width,c.height),a.framebufferRenderbuffer(a.FRAMEBUFFER,a.DEPTH_ATTACHMENT,a.RENDERBUFFER,b)):c.depthBuffer&&c.stencilBuffer?(a.renderbufferStorage(a.RENDERBUFFER,a.DEPTH_STENCIL,c.width,c.height),a.framebufferRenderbuffer(a.FRAMEBUFFER,a.DEPTH_STENCIL_ATTACHMENT,a.RENDERBUFFER,b)):a.renderbufferStorage(a.RENDERBUFFER,
-a.RGBA4,c.width,c.height);a.bindRenderbuffer(a.RENDERBUFFER,null)}var q=g.memory,t="undefined"!==typeof WebGL2RenderingContext&&a instanceof WebGL2RenderingContext;this.setTexture2D=n;this.setTextureCube=function(b,g){var m=d.get(b);if(6===b.image.length)if(0<b.version&&m.__version!==b.version){m.__image__webglTextureCube||(b.addEventListener("dispose",x),m.__image__webglTextureCube=a.createTexture(),q.textures++);c.activeTexture(a.TEXTURE0+g);c.bindTexture(a.TEXTURE_CUBE_MAP,m.__image__webglTextureCube);
-a.pixelStorei(a.UNPACK_FLIP_Y_WEBGL,b.flipY);for(var n=b&&b.isCompressedTexture,p=b.image[0]&&b.image[0].isDataTexture,l=[],w=0;6>w;w++)l[w]=n||p?p?b.image[w].image:b.image[w]:h(b.image[w],e.maxCubemapSize);var u=k(l[0]),t=f(b.format),ca=f(b.type);r(a.TEXTURE_CUBE_MAP,b,u);for(w=0;6>w;w++)if(n)for(var y,C=l[w].mipmaps,D=0,O=C.length;D<O;D++)y=C[D],1023!==b.format&&1022!==b.format?-1<c.getCompressedTextureFormats().indexOf(t)?c.compressedTexImage2D(a.TEXTURE_CUBE_MAP_POSITIVE_X+w,D,t,y.width,y.height,
-0,y.data):console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()"):c.texImage2D(a.TEXTURE_CUBE_MAP_POSITIVE_X+w,D,t,y.width,y.height,0,t,ca,y.data);else p?c.texImage2D(a.TEXTURE_CUBE_MAP_POSITIVE_X+w,0,t,l[w].width,l[w].height,0,t,ca,l[w].data):c.texImage2D(a.TEXTURE_CUBE_MAP_POSITIVE_X+w,0,t,t,ca,l[w]);b.generateMipmaps&&u&&a.generateMipmap(a.TEXTURE_CUBE_MAP);m.__version=b.version;if(b.onUpdate)b.onUpdate(b)}else c.activeTexture(a.TEXTURE0+
-g),c.bindTexture(a.TEXTURE_CUBE_MAP,m.__image__webglTextureCube)};this.setTextureCubeDynamic=function(b,e){c.activeTexture(a.TEXTURE0+e);c.bindTexture(a.TEXTURE_CUBE_MAP,d.get(b).__webglTexture)};this.setupRenderTarget=function(b){var e=d.get(b),f=d.get(b.texture);b.addEventListener("dispose",p);f.__webglTexture=a.createTexture();q.textures++;var g=!0===b.isWebGLRenderTargetCube,h=k(b);if(g){e.__webglFramebuffer=[];for(var m=0;6>m;m++)e.__webglFramebuffer[m]=a.createFramebuffer()}else e.__webglFramebuffer=
-a.createFramebuffer();if(g){c.bindTexture(a.TEXTURE_CUBE_MAP,f.__webglTexture);r(a.TEXTURE_CUBE_MAP,b.texture,h);for(m=0;6>m;m++)l(e.__webglFramebuffer[m],b,a.COLOR_ATTACHMENT0,a.TEXTURE_CUBE_MAP_POSITIVE_X+m);b.texture.generateMipmaps&&h&&a.generateMipmap(a.TEXTURE_CUBE_MAP);c.bindTexture(a.TEXTURE_CUBE_MAP,null)}else c.bindTexture(a.TEXTURE_2D,f.__webglTexture),r(a.TEXTURE_2D,b.texture,h),l(e.__webglFramebuffer,b,a.COLOR_ATTACHMENT0,a.TEXTURE_2D),b.texture.generateMipmaps&&h&&a.generateMipmap(a.TEXTURE_2D),
-c.bindTexture(a.TEXTURE_2D,null);if(b.depthBuffer){e=d.get(b);f=!0===b.isWebGLRenderTargetCube;if(b.depthTexture){if(f)throw Error("target.depthTexture not supported in Cube render targets");if(b&&b.isWebGLRenderTargetCube)throw Error("Depth Texture with cube render targets is not supported!");a.bindFramebuffer(a.FRAMEBUFFER,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);n(b.depthTexture,0);e=d.get(b.depthTexture).__webglTexture;if(1026===b.depthTexture.format)a.framebufferTexture2D(a.FRAMEBUFFER,a.DEPTH_ATTACHMENT,a.TEXTURE_2D,e,0);else if(1027===b.depthTexture.format)a.framebufferTexture2D(a.FRAMEBUFFER,a.DEPTH_STENCIL_ATTACHMENT,a.TEXTURE_2D,e,0);else throw Error("Unknown depthTexture format");
-}else if(f)for(e.__webglDepthbuffer=[],f=0;6>f;f++)a.bindFramebuffer(a.FRAMEBUFFER,e.__webglFramebuffer[f]),e.__webglDepthbuffer[f]=a.createRenderbuffer(),u(e.__webglDepthbuffer[f],b);else a.bindFramebuffer(a.FRAMEBUFFER,e.__webglFramebuffer),e.__webglDepthbuffer=a.createRenderbuffer(),u(e.__webglDepthbuffer,b);a.bindFramebuffer(a.FRAMEBUFFER,null)}};this.updateRenderTargetMipmap=function(b){var e=b.texture;e.generateMipmaps&&k(b)&&1003!==e.minFilter&&1006!==e.minFilter&&(b=b&&b.isWebGLRenderTargetCube?
-a.TEXTURE_CUBE_MAP:a.TEXTURE_2D,e=d.get(e).__webglTexture,c.bindTexture(b,e),a.generateMipmap(b),c.bindTexture(b,null))}}function Ff(){var a={};return{get:function(b){b=b.uuid;var c=a[b];void 0===c&&(c={},a[b]=c);return c},"delete":function(b){delete a[b.uuid]},clear:function(){a={}}}}function Gf(a,b,c){function d(b,c,d){var e=new Uint8Array(4),f=a.createTexture();a.bindTexture(b,f);a.texParameteri(b,a.TEXTURE_MIN_FILTER,a.NEAREST);a.texParameteri(b,a.TEXTURE_MAG_FILTER,a.NEAREST);for(b=0;b<d;b++)a.texImage2D(c+
-b,0,a.RGBA,1,1,0,a.RGBA,a.UNSIGNED_BYTE,e);return f}function e(b){!0!==v[b]&&(a.enable(b),v[b]=!0)}function f(b){!1!==v[b]&&(a.disable(b),v[b]=!1)}function g(b,d,g,h,k,m,n,p){0!==b?e(a.BLEND):f(a.BLEND);if(b!==z||p!==ca)2===b?p?(a.blendEquationSeparate(a.FUNC_ADD,a.FUNC_ADD),a.blendFuncSeparate(a.ONE,a.ONE,a.ONE,a.ONE)):(a.blendEquation(a.FUNC_ADD),a.blendFunc(a.SRC_ALPHA,a.ONE)):3===b?p?(a.blendEquationSeparate(a.FUNC_ADD,a.FUNC_ADD),a.blendFuncSeparate(a.ZERO,a.ZERO,a.ONE_MINUS_SRC_COLOR,a.ONE_MINUS_SRC_ALPHA)):
-(a.blendEquation(a.FUNC_ADD),a.blendFunc(a.ZERO,a.ONE_MINUS_SRC_COLOR)):4===b?p?(a.blendEquationSeparate(a.FUNC_ADD,a.FUNC_ADD),a.blendFuncSeparate(a.ZERO,a.SRC_COLOR,a.ZERO,a.SRC_ALPHA)):(a.blendEquation(a.FUNC_ADD),a.blendFunc(a.ZERO,a.SRC_COLOR)):p?(a.blendEquationSeparate(a.FUNC_ADD,a.FUNC_ADD),a.blendFuncSeparate(a.ONE,a.ONE_MINUS_SRC_ALPHA,a.ONE,a.ONE_MINUS_SRC_ALPHA)):(a.blendEquationSeparate(a.FUNC_ADD,a.FUNC_ADD),a.blendFuncSeparate(a.SRC_ALPHA,a.ONE_MINUS_SRC_ALPHA,a.ONE,a.ONE_MINUS_SRC_ALPHA)),
-z=b,ca=p;if(5===b){k=k||d;m=m||g;n=n||h;if(d!==A||k!==K)a.blendEquationSeparate(c(d),c(k)),A=d,K=k;if(g!==I||h!==E||m!==y||n!==J)a.blendFuncSeparate(c(g),c(h),c(m),c(n)),I=g,E=h,y=m,J=n}else J=y=K=E=I=A=null}function h(a){n.setFunc(a)}function k(b){C!==b&&(b?a.frontFace(a.CW):a.frontFace(a.CCW),C=b)}function m(b){0!==b?(e(a.CULL_FACE),b!==D&&(1===b?a.cullFace(a.BACK):2===b?a.cullFace(a.FRONT):a.cullFace(a.FRONT_AND_BACK))):f(a.CULL_FACE);D=b}function x(b){void 0===b&&(b=a.TEXTURE0+T-1);V!==b&&(a.activeTexture(b),
-V=b)}var p=new function(){var b=!1,c=new ga,d=null,e=new ga;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(0,0,0,1)}}},n=new function(){var b=!1,c=null,d=null,g=null;return{setTest:function(b){b?e(a.DEPTH_TEST):f(a.DEPTH_TEST)},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(a.NEVER);break;case 1:a.depthFunc(a.ALWAYS);break;case 2:a.depthFunc(a.LESS);break;case 3:a.depthFunc(a.LEQUAL);break;case 4:a.depthFunc(a.EQUAL);break;case 5:a.depthFunc(a.GEQUAL);break;case 6:a.depthFunc(a.GREATER);break;case 7:a.depthFunc(a.NOTEQUAL);break;default:a.depthFunc(a.LEQUAL)}else a.depthFunc(a.LEQUAL);d=b}},setLocked:function(a){b=a},setClear:function(b){g!==b&&(a.clearDepth(b),g=b)},reset:function(){b=!1;g=d=c=null}}},r=new function(){var b=!1,c=
-null,d=null,g=null,h=null,k=null,m=null,n=null,p=null;return{setTest:function(b){b?e(a.STENCIL_TEST):f(a.STENCIL_TEST)},setMask:function(d){c===d||b||(a.stencilMask(d),c=d)},setFunc:function(b,c,e){if(d!==b||g!==c||h!==e)a.stencilFunc(b,c,e),d=b,g=c,h=e},setOp:function(b,c,d){if(k!==b||m!==c||n!==d)a.stencilOp(b,c,d),k=b,m=c,n=d},setLocked:function(a){b=a},setClear:function(b){p!==b&&(a.clearStencil(b),p=b)},reset:function(){b=!1;p=n=m=k=h=g=d=c=null}}},l=a.getParameter(a.MAX_VERTEX_ATTRIBS),u=new Uint8Array(l),
-q=new Uint8Array(l),t=new Uint8Array(l),v={},M=null,z=null,A=null,I=null,E=null,K=null,y=null,J=null,ca=!1,C=null,D=null,G=null,O=null,P=null,R=null,T=a.getParameter(a.MAX_TEXTURE_IMAGE_UNITS),l=parseFloat(/^WebGL\ ([0-9])/.exec(a.getParameter(a.VERSION))[1]),H=1<=parseFloat(l),V=null,N={},L=new ga,S=new ga,Q={};Q[a.TEXTURE_2D]=d(a.TEXTURE_2D,a.TEXTURE_2D,1);Q[a.TEXTURE_CUBE_MAP]=d(a.TEXTURE_CUBE_MAP,a.TEXTURE_CUBE_MAP_POSITIVE_X,6);return{buffers:{color:p,depth:n,stencil:r},init:function(){p.setClear(0,
-0,0,1);n.setClear(1);r.setClear(0);e(a.DEPTH_TEST);h(3);k(!1);m(1);e(a.CULL_FACE);e(a.BLEND);g(1)},initAttributes:function(){for(var a=0,b=u.length;a<b;a++)u[a]=0},enableAttribute:function(c){u[c]=1;0===q[c]&&(a.enableVertexAttribArray(c),q[c]=1);0!==t[c]&&(b.get("ANGLE_instanced_arrays").vertexAttribDivisorANGLE(c,0),t[c]=0)},enableAttributeAndDivisor:function(b,c,d){u[b]=1;0===q[b]&&(a.enableVertexAttribArray(b),q[b]=1);t[b]!==c&&(d.vertexAttribDivisorANGLE(b,c),t[b]=c)},disableUnusedAttributes:function(){for(var b=
-0,c=q.length;b!==c;++b)q[b]!==u[b]&&(a.disableVertexAttribArray(b),q[b]=0)},enable:e,disable:f,getCompressedTextureFormats:function(){if(null===M&&(M=[],b.get("WEBGL_compressed_texture_pvrtc")||b.get("WEBGL_compressed_texture_s3tc")||b.get("WEBGL_compressed_texture_etc1")))for(var c=a.getParameter(a.COMPRESSED_TEXTURE_FORMATS),d=0;d<c.length;d++)M.push(c[d]);return M},setBlending:g,setColorWrite:function(a){p.setMask(a)},setDepthTest:function(a){n.setTest(a)},setDepthWrite:function(a){n.setMask(a)},
-setDepthFunc:h,setStencilTest:function(a){r.setTest(a)},setStencilWrite:function(a){r.setMask(a)},setStencilFunc:function(a,b,c){r.setFunc(a,b,c)},setStencilOp:function(a,b,c){r.setOp(a,b,c)},setFlipSided:k,setCullFace:m,setLineWidth:function(b){b!==G&&(H&&a.lineWidth(b),G=b)},setPolygonOffset:function(b,c,d){if(b){if(e(a.POLYGON_OFFSET_FILL),O!==c||P!==d)a.polygonOffset(c,d),O=c,P=d}else f(a.POLYGON_OFFSET_FILL)},getScissorTest:function(){return R},setScissorTest:function(b){(R=b)?e(a.SCISSOR_TEST):
-f(a.SCISSOR_TEST)},activeTexture:x,bindTexture:function(b,c){null===V&&x();var d=N[V];void 0===d&&(d={type:void 0,texture:void 0},N[V]=d);if(d.type!==b||d.texture!==c)a.bindTexture(b,c||Q[b]),d.type=b,d.texture=c},compressedTexImage2D:function(){try{a.compressedTexImage2D.apply(a,arguments)}catch(b){console.error(b)}},texImage2D:function(){try{a.texImage2D.apply(a,arguments)}catch(b){console.error(b)}},scissor:function(b){!1===L.equals(b)&&(a.scissor(b.x,b.y,b.z,b.w),L.copy(b))},viewport:function(b){!1===
-S.equals(b)&&(a.viewport(b.x,b.y,b.z,b.w),S.copy(b))},reset:function(){for(var b=0;b<q.length;b++)1===q[b]&&(a.disableVertexAttribArray(b),q[b]=0);v={};V=M=null;N={};D=C=z=null;p.reset();n.reset();r.reset()}}}function Hf(a,b,c){function d(b){if("highp"===b){if(0<a.getShaderPrecisionFormat(a.VERTEX_SHADER,a.HIGH_FLOAT).precision&&0<a.getShaderPrecisionFormat(a.FRAGMENT_SHADER,a.HIGH_FLOAT).precision)return"highp";b="mediump"}return"mediump"===b&&0<a.getShaderPrecisionFormat(a.VERTEX_SHADER,a.MEDIUM_FLOAT).precision&&
-0<a.getShaderPrecisionFormat(a.FRAGMENT_SHADER,a.MEDIUM_FLOAT).precision?"mediump":"lowp"}var e,f=void 0!==c.precision?c.precision:"highp",g=d(f);g!==f&&(console.warn("THREE.WebGLRenderer:",f,"not supported, using",g,"instead."),f=g);c=!0===c.logarithmicDepthBuffer&&!!b.get("EXT_frag_depth");var g=a.getParameter(a.MAX_TEXTURE_IMAGE_UNITS),h=a.getParameter(a.MAX_VERTEX_TEXTURE_IMAGE_UNITS),k=a.getParameter(a.MAX_TEXTURE_SIZE),m=a.getParameter(a.MAX_CUBE_MAP_TEXTURE_SIZE),x=a.getParameter(a.MAX_VERTEX_ATTRIBS),
-p=a.getParameter(a.MAX_VERTEX_UNIFORM_VECTORS),n=a.getParameter(a.MAX_VARYING_VECTORS),r=a.getParameter(a.MAX_FRAGMENT_UNIFORM_VECTORS),l=0<h,u=!!b.get("OES_texture_float");return{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:f,logarithmicDepthBuffer:c,maxTextures:g,maxVertexTextures:h,maxTextureSize:k,maxCubemapSize:m,maxAttributes:x,maxVertexUniforms:p,
-maxVaryings:n,maxFragmentUniforms:r,vertexTextures:l,floatFragmentTextures:u,floatVertexTextures:l&&u}}function If(a){var b={};return{get:function(c){if(void 0!==b[c])return b[c];var d;switch(c){case "WEBGL_depth_texture":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;case "WEBGL_compressed_texture_etc1":d=a.getExtension("WEBGL_compressed_texture_etc1");
-break;default:d=a.getExtension(c)}null===d&&console.warn("THREE.WebGLRenderer: "+c+" extension not supported.");return b[c]=d}}}function Jf(){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;k.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,k),h.normal.toArray(g,d),g[d+
-3]=h.constant}m.value=g;m.needsUpdate=!0}c.numPlanes=f;return g}var c=this,d=null,e=0,f=!1,g=!1,h=new ma,k=new za,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,k,r,l,u){if(!f||null===c||0===c.length||g&&!k)g?b(null):a();else{k=g?0:e;var q=4*k,t=l.clippingState||null;
-m.value=t;t=b(c,r,q,u);for(c=0;c!==q;++c)t[c]=d[c];l.clippingState=t;this.numIntersection=h?this.numPlanes:0;this.numPlanes+=k}}}function Nd(a){function b(){Y.init();Y.scissor(X.copy(fa).multiplyScalar(Sa));Y.viewport(Z.copy(ia).multiplyScalar(Sa));Y.buffers.color.setClear(Ga.r,Ga.g,Ga.b,fb,K)}function c(){W=Q=null;U="";L=-1;Y.reset()}function d(a){a.preventDefault();c();b();ha.clear()}function e(a){a=a.target;a.removeEventListener("dispose",e);f(a);ha["delete"](a)}function f(a){var b=ha.get(a).program;
-a.program=void 0;void 0!==b&&za.releaseProgram(b)}function g(a,b){return Math.abs(b[0])-Math.abs(a[0])}function h(a,b){return a.object.renderOrder!==b.object.renderOrder?a.object.renderOrder-b.object.renderOrder:a.material.program&&b.material.program&&a.material.program!==b.material.program?a.material.program.id-b.material.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 k(a,b){return a.object.renderOrder!==b.object.renderOrder?a.object.renderOrder-
-b.object.renderOrder:a.z!==b.z?b.z-a.z:a.id-b.id}function m(a,b,c,d,e){var f;c.transparent?(d=G,f=++Na):(d=ca,f=++C);f=d[f];void 0!==f?(f.id=a.id,f.object=a,f.geometry=b,f.material=c,f.z=ba.z,f.group=e):(f={id:a.id,object:a,geometry:b,material:c,z:ba.z,group:e},d.push(f))}function x(a){if(!na.intersectsSphere(a))return!1;var b=da.numPlanes;if(0===b)return!0;var c=T.clippingPlanes,d=a.center;a=-a.radius;var e=0;do if(c[e].distanceToPoint(d)<a)return!1;while(++e!==b);return!0}function p(a,b){if(!1!==
-a.visible){if(0!==(a.layers.mask&b.layers.mask))if(a.isLight)J.push(a);else if(a.isSprite){var c;(c=!1===a.frustumCulled)||(oa.center.set(0,0,0),oa.radius=.7071067811865476,oa.applyMatrix4(a.matrixWorld),c=!0===x(oa));c&&P.push(a)}else if(a.isLensFlare)R.push(a);else if(a.isImmediateRenderObject)!0===T.sortObjects&&(ba.setFromMatrixPosition(a.matrixWorld),ba.applyProjection(sa)),m(a,null,a.material,ba.z,null);else if(a.isMesh||a.isLine||a.isPoints)if(a.isSkinnedMesh&&a.skeleton.update(),(c=!1===a.frustumCulled)||
-(c=a.geometry,null===c.boundingSphere&&c.computeBoundingSphere(),oa.copy(c.boundingSphere).applyMatrix4(a.matrixWorld),c=!0===x(oa)),c){var d=a.material;if(!0===d.visible)if(!0===T.sortObjects&&(ba.setFromMatrixPosition(a.matrixWorld),ba.applyProjection(sa)),c=ta.update(a),d.isMultiMaterial)for(var e=c.groups,f=d.materials,d=0,g=e.length;d<g;d++){var h=e[d],k=f[h.materialIndex];!0===k.visible&&m(a,c,k,ba.z,h)}else m(a,c,d,ba.z,null)}c=a.children;d=0;for(g=c.length;d<g;d++)p(c[d],b)}}function n(a,
-b,c,d){for(var e=0,f=a.length;e<f;e++){var g=a[e],h=g.object,k=g.geometry,m=void 0===d?g.material:d,g=g.group;h.modelViewMatrix.multiplyMatrices(c.matrixWorldInverse,h.matrixWorld);h.normalMatrix.getNormalMatrix(h.modelViewMatrix);h.onBeforeRender(T,b,c,k,m,g);if(h.isImmediateRenderObject){r(m);var n=l(c,b.fog,m,h);U="";h.render(function(a){T.renderBufferImmediate(a,n,m)})}else T.renderBufferDirect(c,b.fog,k,m,h,g);h.onAfterRender(T,b,c,k,m,g)}}function r(a){2===a.side?Y.disable(B.CULL_FACE):Y.enable(B.CULL_FACE);
-Y.setFlipSided(1===a.side);!0===a.transparent?Y.setBlending(a.blending,a.blendEquation,a.blendSrc,a.blendDst,a.blendEquationAlpha,a.blendSrcAlpha,a.blendDstAlpha,a.premultipliedAlpha):Y.setBlending(0);Y.setDepthFunc(a.depthFunc);Y.setDepthTest(a.depthTest);Y.setDepthWrite(a.depthWrite);Y.setColorWrite(a.colorWrite);Y.setPolygonOffset(a.polygonOffset,a.polygonOffsetFactor,a.polygonOffsetUnits)}function l(a,b,c,d){ea=0;var g=ha.get(c);pa&&(ua||a!==W)&&da.setState(c.clippingPlanes,c.clipIntersection,
-c.clipShadows,a,g,a===W&&c.id===L);!1===c.needsUpdate&&(void 0===g.program?c.needsUpdate=!0:c.fog&&g.fog!==b?c.needsUpdate=!0:c.lights&&g.lightsHash!==aa.hash?c.needsUpdate=!0:void 0===g.numClippingPlanes||g.numClippingPlanes===da.numPlanes&&g.numIntersection===da.numIntersection||(c.needsUpdate=!0));if(c.needsUpdate){a:{var h=ha.get(c),k=za.getParameters(c,aa,b,da.numPlanes,da.numIntersection,d),m=za.getProgramCode(c,k),n=h.program,p=!0;if(void 0===n)c.addEventListener("dispose",e);else if(n.code!==
-m)f(c);else if(void 0!==k.shaderID)break a;else p=!1;p&&(k.shaderID?(n=Gb[k.shaderID],h.__webglShader={name:c.type,uniforms:Ja.clone(n.uniforms),vertexShader:n.vertexShader,fragmentShader:n.fragmentShader}):h.__webglShader={name:c.type,uniforms:c.uniforms,vertexShader:c.vertexShader,fragmentShader:c.fragmentShader},c.__webglShader=h.__webglShader,n=za.acquireProgram(c,k,m),h.program=n,c.program=n);k=n.getAttributes();if(c.morphTargets)for(m=c.numSupportedMorphTargets=0;m<T.maxMorphTargets;m++)0<=
-k["morphTarget"+m]&&c.numSupportedMorphTargets++;if(c.morphNormals)for(m=c.numSupportedMorphNormals=0;m<T.maxMorphNormals;m++)0<=k["morphNormal"+m]&&c.numSupportedMorphNormals++;k=h.__webglShader.uniforms;if(!c.isShaderMaterial&&!c.isRawShaderMaterial||!0===c.clipping)h.numClippingPlanes=da.numPlanes,h.numIntersection=da.numIntersection,k.clippingPlanes=da.uniform;h.fog=b;h.lightsHash=aa.hash;c.lights&&(k.ambientLightColor.value=aa.ambient,k.directionalLights.value=aa.directional,k.spotLights.value=
-aa.spot,k.rectAreaLights.value=aa.rectArea,k.pointLights.value=aa.point,k.hemisphereLights.value=aa.hemi,k.directionalShadowMap.value=aa.directionalShadowMap,k.directionalShadowMatrix.value=aa.directionalShadowMatrix,k.spotShadowMap.value=aa.spotShadowMap,k.spotShadowMatrix.value=aa.spotShadowMatrix,k.pointShadowMap.value=aa.pointShadowMap,k.pointShadowMatrix.value=aa.pointShadowMatrix);m=h.program.getUniforms();k=$a.seqWithValue(m.seq,k);h.uniformsList=k}c.needsUpdate=!1}var x=!1,p=n=!1,h=g.program,
-k=h.getUniforms(),m=g.__webglShader.uniforms;h.id!==Q&&(B.useProgram(h.program),Q=h.id,p=n=x=!0);c.id!==L&&(L=c.id,n=!0);if(x||a!==W){k.set(B,a,"projectionMatrix");ma.logarithmicDepthBuffer&&k.setValue(B,"logDepthBufFC",2/(Math.log(a.far+1)/Math.LN2));a!==W&&(W=a,p=n=!0);if(c.isShaderMaterial||c.isMeshPhongMaterial||c.isMeshStandardMaterial||c.envMap)x=k.map.cameraPosition,void 0!==x&&x.setValue(B,ba.setFromMatrixPosition(a.matrixWorld));(c.isMeshPhongMaterial||c.isMeshLambertMaterial||c.isMeshBasicMaterial||
-c.isMeshStandardMaterial||c.isShaderMaterial||c.skinning)&&k.setValue(B,"viewMatrix",a.matrixWorldInverse);k.set(B,T,"toneMappingExposure");k.set(B,T,"toneMappingWhitePoint")}c.skinning&&(k.setOptional(B,d,"bindMatrix"),k.setOptional(B,d,"bindMatrixInverse"),a=d.skeleton)&&(ma.floatVertexTextures&&a.useVertexTexture?(k.set(B,a,"boneTexture"),k.set(B,a,"boneTextureWidth"),k.set(B,a,"boneTextureHeight")):k.setOptional(B,a,"boneMatrices"));if(n){c.lights&&(a=p,m.ambientLightColor.needsUpdate=a,m.directionalLights.needsUpdate=
-a,m.pointLights.needsUpdate=a,m.spotLights.needsUpdate=a,m.rectAreaLights.needsUpdate=a,m.hemisphereLights.needsUpdate=a);b&&c.fog&&(m.fogColor.value=b.color,b.isFog?(m.fogNear.value=b.near,m.fogFar.value=b.far):b.isFogExp2&&(m.fogDensity.value=b.density));if(c.isMeshBasicMaterial||c.isMeshLambertMaterial||c.isMeshPhongMaterial||c.isMeshStandardMaterial||c.isMeshNormalMaterial||c.isMeshDepthMaterial){m.opacity.value=c.opacity;m.diffuse.value=c.color;c.emissive&&m.emissive.value.copy(c.emissive).multiplyScalar(c.emissiveIntensity);
-m.map.value=c.map;m.specularMap.value=c.specularMap;m.alphaMap.value=c.alphaMap;c.lightMap&&(m.lightMap.value=c.lightMap,m.lightMapIntensity.value=c.lightMapIntensity);c.aoMap&&(m.aoMap.value=c.aoMap,m.aoMapIntensity.value=c.aoMapIntensity);var r;c.map?r=c.map:c.specularMap?r=c.specularMap:c.displacementMap?r=c.displacementMap:c.normalMap?r=c.normalMap:c.bumpMap?r=c.bumpMap:c.roughnessMap?r=c.roughnessMap:c.metalnessMap?r=c.metalnessMap:c.alphaMap?r=c.alphaMap:c.emissiveMap&&(r=c.emissiveMap);void 0!==
-r&&(r.isWebGLRenderTarget&&(r=r.texture),b=r.offset,r=r.repeat,m.offsetRepeat.value.set(b.x,b.y,r.x,r.y));m.envMap.value=c.envMap;m.flipEnvMap.value=c.envMap&&c.envMap.isCubeTexture?-1:1;m.reflectivity.value=c.reflectivity;m.refractionRatio.value=c.refractionRatio}c.isLineBasicMaterial?(m.diffuse.value=c.color,m.opacity.value=c.opacity):c.isLineDashedMaterial?(m.diffuse.value=c.color,m.opacity.value=c.opacity,m.dashSize.value=c.dashSize,m.totalSize.value=c.dashSize+c.gapSize,m.scale.value=c.scale):
-c.isPointsMaterial?(m.diffuse.value=c.color,m.opacity.value=c.opacity,m.size.value=c.size*Sa,m.scale.value=.5*yc,m.map.value=c.map,null!==c.map&&(r=c.map.offset,c=c.map.repeat,m.offsetRepeat.value.set(r.x,r.y,c.x,c.y))):c.isMeshLambertMaterial?c.emissiveMap&&(m.emissiveMap.value=c.emissiveMap):c.isMeshToonMaterial?(u(m,c),c.gradientMap&&(m.gradientMap.value=c.gradientMap)):c.isMeshPhongMaterial?u(m,c):c.isMeshPhysicalMaterial?(m.clearCoat.value=c.clearCoat,m.clearCoatRoughness.value=c.clearCoatRoughness,
-F(m,c)):c.isMeshStandardMaterial?F(m,c):c.isMeshDepthMaterial?c.displacementMap&&(m.displacementMap.value=c.displacementMap,m.displacementScale.value=c.displacementScale,m.displacementBias.value=c.displacementBias):c.isMeshNormalMaterial&&(c.bumpMap&&(m.bumpMap.value=c.bumpMap,m.bumpScale.value=c.bumpScale),c.normalMap&&(m.normalMap.value=c.normalMap,m.normalScale.value.copy(c.normalScale)),c.displacementMap&&(m.displacementMap.value=c.displacementMap,m.displacementScale.value=c.displacementScale,
-m.displacementBias.value=c.displacementBias));void 0!==m.ltcMat&&(m.ltcMat.value=THREE.UniformsLib.LTC_MAT_TEXTURE);void 0!==m.ltcMag&&(m.ltcMag.value=THREE.UniformsLib.LTC_MAG_TEXTURE);$a.upload(B,g.uniformsList,m,T)}k.set(B,d,"modelViewMatrix");k.set(B,d,"normalMatrix");k.setValue(B,"modelMatrix",d.matrixWorld);return h}function u(a,b){a.specular.value=b.specular;a.shininess.value=Math.max(b.shininess,1E-4);b.emissiveMap&&(a.emissiveMap.value=b.emissiveMap);b.bumpMap&&(a.bumpMap.value=b.bumpMap,
-a.bumpScale.value=b.bumpScale);b.normalMap&&(a.normalMap.value=b.normalMap,a.normalScale.value.copy(b.normalScale));b.displacementMap&&(a.displacementMap.value=b.displacementMap,a.displacementScale.value=b.displacementScale,a.displacementBias.value=b.displacementBias)}function F(a,b){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);b.normalMap&&(a.normalMap.value=b.normalMap,a.normalScale.value.copy(b.normalScale));b.displacementMap&&(a.displacementMap.value=b.displacementMap,a.displacementScale.value=b.displacementScale,a.displacementBias.value=b.displacementBias);b.envMap&&(a.envMapIntensity.value=b.envMapIntensity)}function t(a){var b;if(1E3===a)return B.REPEAT;if(1001===a)return B.CLAMP_TO_EDGE;if(1002===a)return B.MIRRORED_REPEAT;if(1003===a)return B.NEAREST;
-if(1004===a)return B.NEAREST_MIPMAP_NEAREST;if(1005===a)return B.NEAREST_MIPMAP_LINEAR;if(1006===a)return B.LINEAR;if(1007===a)return B.LINEAR_MIPMAP_NEAREST;if(1008===a)return B.LINEAR_MIPMAP_LINEAR;if(1009===a)return B.UNSIGNED_BYTE;if(1017===a)return B.UNSIGNED_SHORT_4_4_4_4;if(1018===a)return B.UNSIGNED_SHORT_5_5_5_1;if(1019===a)return B.UNSIGNED_SHORT_5_6_5;if(1010===a)return B.BYTE;if(1011===a)return B.SHORT;if(1012===a)return B.UNSIGNED_SHORT;if(1013===a)return B.INT;if(1014===a)return B.UNSIGNED_INT;
-if(1015===a)return B.FLOAT;if(1016===a&&(b=ja.get("OES_texture_half_float"),null!==b))return b.HALF_FLOAT_OES;if(1021===a)return B.ALPHA;if(1022===a)return B.RGB;if(1023===a)return B.RGBA;if(1024===a)return B.LUMINANCE;if(1025===a)return B.LUMINANCE_ALPHA;if(1026===a)return B.DEPTH_COMPONENT;if(1027===a)return B.DEPTH_STENCIL;if(100===a)return B.FUNC_ADD;if(101===a)return B.FUNC_SUBTRACT;if(102===a)return B.FUNC_REVERSE_SUBTRACT;if(200===a)return B.ZERO;if(201===a)return B.ONE;if(202===a)return B.SRC_COLOR;
-if(203===a)return B.ONE_MINUS_SRC_COLOR;if(204===a)return B.SRC_ALPHA;if(205===a)return B.ONE_MINUS_SRC_ALPHA;if(206===a)return B.DST_ALPHA;if(207===a)return B.ONE_MINUS_DST_ALPHA;if(208===a)return B.DST_COLOR;if(209===a)return B.ONE_MINUS_DST_COLOR;if(210===a)return B.SRC_ALPHA_SATURATE;if(2001===a||2002===a||2003===a||2004===a)if(b=ja.get("WEBGL_compressed_texture_s3tc"),null!==b){if(2001===a)return b.COMPRESSED_RGB_S3TC_DXT1_EXT;if(2002===a)return b.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(2003===a)return b.COMPRESSED_RGBA_S3TC_DXT3_EXT;
-if(2004===a)return b.COMPRESSED_RGBA_S3TC_DXT5_EXT}if(2100===a||2101===a||2102===a||2103===a)if(b=ja.get("WEBGL_compressed_texture_pvrtc"),null!==b){if(2100===a)return b.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;if(2101===a)return b.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;if(2102===a)return b.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;if(2103===a)return b.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG}if(2151===a&&(b=ja.get("WEBGL_compressed_texture_etc1"),null!==b))return b.COMPRESSED_RGB_ETC1_WEBGL;if(103===a||104===a)if(b=ja.get("EXT_blend_minmax"),
-null!==b){if(103===a)return b.MIN_EXT;if(104===a)return b.MAX_EXT}return 1020===a&&(b=ja.get("WEBGL_depth_texture"),null!==b)?b.UNSIGNED_INT_24_8_WEBGL:0}console.log("THREE.WebGLRenderer","83");a=a||{};var v=void 0!==a.canvas?a.canvas:document.createElementNS("http://www.w3.org/1999/xhtml","canvas"),M=void 0!==a.context?a.context:null,z=void 0!==a.alpha?a.alpha:!1,A=void 0!==a.depth?a.depth:!0,I=void 0!==a.stencil?a.stencil:!0,E=void 0!==a.antialias?a.antialias:!1,K=void 0!==a.premultipliedAlpha?
-a.premultipliedAlpha:!0,y=void 0!==a.preserveDrawingBuffer?a.preserveDrawingBuffer:!1,J=[],ca=[],C=-1,G=[],Na=-1,O=new Float32Array(8),P=[],R=[];this.domElement=v;this.context=null;this.sortObjects=this.autoClearStencil=this.autoClearDepth=this.autoClearColor=this.autoClear=!0;this.clippingPlanes=[];this.localClippingEnabled=!1;this.gammaFactor=2;this.physicallyCorrectLights=this.gammaOutput=this.gammaInput=!1;this.toneMappingWhitePoint=this.toneMappingExposure=this.toneMapping=1;this.maxMorphTargets=
-8;this.maxMorphNormals=4;var T=this,Q=null,V=null,S=null,L=-1,U="",W=null,X=new ga,Ta=null,Z=new ga,ea=0,Ga=new N(0),fb=0,fd=v.width,yc=v.height,Sa=1,fa=new ga(0,0,fd,yc),ka=!1,ia=new ga(0,0,fd,yc),na=new qc,da=new Jf,pa=!1,ua=!1,oa=new Fa,sa=new H,ba=new q,wa=new H,xa=new H,aa={hash:"",ambient:[0,0,0],directional:[],directionalShadowMap:[],directionalShadowMatrix:[],spot:[],spotShadowMap:[],spotShadowMatrix:[],rectArea:[],point:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[],shadows:[]},qa={calls:0,
-vertices:0,faces:0,points:0};this.info={render:qa,memory:{geometries:0,textures:0},programs:null};var B;try{z={alpha:z,depth:A,stencil:I,antialias:E,premultipliedAlpha:K,preserveDrawingBuffer:y};B=M||v.getContext("webgl",z)||v.getContext("experimental-webgl",z);if(null===B){if(null!==v.getContext("webgl"))throw"Error creating WebGL context with your selected attributes.";throw"Error creating WebGL context.";}void 0===B.getShaderPrecisionFormat&&(B.getShaderPrecisionFormat=function(){return{rangeMin:1,
-rangeMax:1,precision:1}});v.addEventListener("webglcontextlost",d,!1)}catch(Kf){console.error("THREE.WebGLRenderer: "+Kf)}var ja=new If(B);ja.get("WEBGL_depth_texture");ja.get("OES_texture_float");ja.get("OES_texture_float_linear");ja.get("OES_texture_half_float");ja.get("OES_texture_half_float_linear");ja.get("OES_standard_derivatives");ja.get("ANGLE_instanced_arrays");ja.get("OES_element_index_uint")&&(D.MaxIndex=4294967296);var ma=new Hf(B,ja,a),Y=new Gf(B,ja,t),ha=new Ff,va=new Ef(B,ja,Y,ha,ma,
-t,this.info),ta=new Df(B,ha,this.info),za=new Bf(this,ma),Aa=new tf;this.info.programs=za.programs;var La=new sf(B,ja,qa),Ma=new rf(B,ja,qa),Oa=new Hb(-1,1,1,-1,0,1),Ca=new Ha,Ea=new Ba(new ib(2,2),new Ka({depthTest:!1,depthWrite:!1,fog:!1}));a=Gb.cube;var ya=new Ba(new hb(5,5,5),new Ia({uniforms:a.uniforms,vertexShader:a.vertexShader,fragmentShader:a.fragmentShader,side:1,depthTest:!1,depthWrite:!1,fog:!1}));b();this.context=B;this.capabilities=ma;this.extensions=ja;this.properties=ha;this.state=
-Y;var Pa=new ye(this,aa,ta,ma);this.shadowMap=Pa;var Qa=new of(this,P),Ra=new nf(this,R);this.getContext=function(){return B};this.getContextAttributes=function(){return B.getContextAttributes()};this.forceContextLoss=function(){ja.get("WEBGL_lose_context").loseContext()};this.getMaxAnisotropy=function(){return ma.getMaxAnisotropy()};this.getPrecision=function(){return ma.precision};this.getPixelRatio=function(){return Sa};this.setPixelRatio=function(a){void 0!==a&&(Sa=a,this.setSize(ia.z,ia.w,!1))};
-this.getSize=function(){return{width:fd,height:yc}};this.setSize=function(a,b,c){fd=a;yc=b;v.width=a*Sa;v.height=b*Sa;!1!==c&&(v.style.width=a+"px",v.style.height=b+"px");this.setViewport(0,0,a,b)};this.setViewport=function(a,b,c,d){Y.viewport(ia.set(a,b,c,d))};this.setScissor=function(a,b,c,d){Y.scissor(fa.set(a,b,c,d))};this.setScissorTest=function(a){Y.setScissorTest(ka=a)};this.getClearColor=function(){return Ga};this.setClearColor=function(a,b){Ga.set(a);fb=void 0!==b?b:1;Y.buffers.color.setClear(Ga.r,
-Ga.g,Ga.b,fb,K)};this.getClearAlpha=function(){return fb};this.setClearAlpha=function(a){fb=a;Y.buffers.color.setClear(Ga.r,Ga.g,Ga.b,fb,K)};this.clear=function(a,b,c){var d=0;if(void 0===a||a)d|=B.COLOR_BUFFER_BIT;if(void 0===b||b)d|=B.DEPTH_BUFFER_BIT;if(void 0===c||c)d|=B.STENCIL_BUFFER_BIT;B.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.clearTarget=function(a,b,c,d){this.setRenderTarget(a);
-this.clear(b,c,d)};this.resetGLState=c;this.dispose=function(){G=[];Na=-1;ca=[];C=-1;v.removeEventListener("webglcontextlost",d,!1)};this.renderBufferImmediate=function(a,b,c){Y.initAttributes();var d=ha.get(a);a.hasPositions&&!d.position&&(d.position=B.createBuffer());a.hasNormals&&!d.normal&&(d.normal=B.createBuffer());a.hasUvs&&!d.uv&&(d.uv=B.createBuffer());a.hasColors&&!d.color&&(d.color=B.createBuffer());b=b.getAttributes();a.hasPositions&&(B.bindBuffer(B.ARRAY_BUFFER,d.position),B.bufferData(B.ARRAY_BUFFER,
-a.positionArray,B.DYNAMIC_DRAW),Y.enableAttribute(b.position),B.vertexAttribPointer(b.position,3,B.FLOAT,!1,0,0));if(a.hasNormals){B.bindBuffer(B.ARRAY_BUFFER,d.normal);if(!c.isMeshPhongMaterial&&!c.isMeshStandardMaterial&&!c.isMeshNormalMaterial&&1===c.shading)for(var e=0,f=3*a.count;e<f;e+=9){var g=a.normalArray,h=(g[e+0]+g[e+3]+g[e+6])/3,k=(g[e+1]+g[e+4]+g[e+7])/3,m=(g[e+2]+g[e+5]+g[e+8])/3;g[e+0]=h;g[e+1]=k;g[e+2]=m;g[e+3]=h;g[e+4]=k;g[e+5]=m;g[e+6]=h;g[e+7]=k;g[e+8]=m}B.bufferData(B.ARRAY_BUFFER,
-a.normalArray,B.DYNAMIC_DRAW);Y.enableAttribute(b.normal);B.vertexAttribPointer(b.normal,3,B.FLOAT,!1,0,0)}a.hasUvs&&c.map&&(B.bindBuffer(B.ARRAY_BUFFER,d.uv),B.bufferData(B.ARRAY_BUFFER,a.uvArray,B.DYNAMIC_DRAW),Y.enableAttribute(b.uv),B.vertexAttribPointer(b.uv,2,B.FLOAT,!1,0,0));a.hasColors&&0!==c.vertexColors&&(B.bindBuffer(B.ARRAY_BUFFER,d.color),B.bufferData(B.ARRAY_BUFFER,a.colorArray,B.DYNAMIC_DRAW),Y.enableAttribute(b.color),B.vertexAttribPointer(b.color,3,B.FLOAT,!1,0,0));Y.disableUnusedAttributes();
-B.drawArrays(B.TRIANGLES,0,a.count);a.count=0};this.renderBufferDirect=function(a,b,c,d,e,f){r(d);var h=l(a,b,d,e),k=!1;a=c.id+"_"+h.id+"_"+d.wireframe;a!==U&&(U=a,k=!0);b=e.morphTargetInfluences;if(void 0!==b){var m=[];a=0;for(var n=b.length;a<n;a++)k=b[a],m.push([k,a]);m.sort(g);8<m.length&&(m.length=8);var p=c.morphAttributes;a=0;for(n=m.length;a<n;a++)k=m[a],O[a]=k[0],0!==k[0]?(b=k[1],!0===d.morphTargets&&p.position&&c.addAttribute("morphTarget"+a,p.position[b]),!0===d.morphNormals&&p.normal&&
-c.addAttribute("morphNormal"+a,p.normal[b])):(!0===d.morphTargets&&c.removeAttribute("morphTarget"+a),!0===d.morphNormals&&c.removeAttribute("morphNormal"+a));a=m.length;for(b=O.length;a<b;a++)O[a]=0;h.getUniforms().setValue(B,"morphTargetInfluences",O);k=!0}b=c.index;n=c.attributes.position;m=1;!0===d.wireframe&&(b=ta.getWireframeAttribute(c),m=2);null!==b?(a=Ma,a.setIndex(b)):a=La;if(k){a:{var k=void 0,x;if(c&&c.isInstancedBufferGeometry&&(x=ja.get("ANGLE_instanced_arrays"),null===x)){console.error("THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");
-break a}void 0===k&&(k=0);Y.initAttributes();var p=c.attributes,h=h.getAttributes(),u=d.defaultAttributeValues,q;for(q in h){var v=h[q];if(0<=v){var t=p[q];if(void 0!==t){var z=t.normalized,F=t.itemSize,I=ta.getAttributeProperties(t),E=I.__webglBuffer,M=I.type,I=I.bytesPerElement;if(t.isInterleavedBufferAttribute){var A=t.data,K=A.stride,t=t.offset;A&&A.isInstancedInterleavedBuffer?(Y.enableAttributeAndDivisor(v,A.meshPerAttribute,x),void 0===c.maxInstancedCount&&(c.maxInstancedCount=A.meshPerAttribute*
-A.count)):Y.enableAttribute(v);B.bindBuffer(B.ARRAY_BUFFER,E);B.vertexAttribPointer(v,F,M,z,K*I,(k*K+t)*I)}else t.isInstancedBufferAttribute?(Y.enableAttributeAndDivisor(v,t.meshPerAttribute,x),void 0===c.maxInstancedCount&&(c.maxInstancedCount=t.meshPerAttribute*t.count)):Y.enableAttribute(v),B.bindBuffer(B.ARRAY_BUFFER,E),B.vertexAttribPointer(v,F,M,z,0,k*F*I)}else if(void 0!==u&&(z=u[q],void 0!==z))switch(z.length){case 2:B.vertexAttrib2fv(v,z);break;case 3:B.vertexAttrib3fv(v,z);break;case 4:B.vertexAttrib4fv(v,
-z);break;default:B.vertexAttrib1fv(v,z)}}}Y.disableUnusedAttributes()}null!==b&&B.bindBuffer(B.ELEMENT_ARRAY_BUFFER,ta.getAttributeBuffer(b))}x=0;null!==b?x=b.count:void 0!==n&&(x=n.count);b=c.drawRange.start*m;n=null!==f?f.start*m:0;q=Math.max(b,n);f=Math.max(0,Math.min(x,b+c.drawRange.count*m,n+(null!==f?f.count*m:Infinity))-1-q+1);if(0!==f){if(e.isMesh)if(!0===d.wireframe)Y.setLineWidth(d.wireframeLinewidth*(null===V?Sa:1)),a.setMode(B.LINES);else switch(e.drawMode){case 0:a.setMode(B.TRIANGLES);
-break;case 1:a.setMode(B.TRIANGLE_STRIP);break;case 2:a.setMode(B.TRIANGLE_FAN)}else e.isLine?(d=d.linewidth,void 0===d&&(d=1),Y.setLineWidth(d*(null===V?Sa:1)),e.isLineSegments?a.setMode(B.LINES):a.setMode(B.LINE_STRIP)):e.isPoints&&a.setMode(B.POINTS);c&&c.isInstancedBufferGeometry?0<c.maxInstancedCount&&a.renderInstances(c,q,f):a.render(q,f)}};this.render=function(a,b,c,d){if(void 0!==b&&!0!==b.isCamera)console.error("THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.");else{U=
-"";L=-1;W=null;!0===a.autoUpdate&&a.updateMatrixWorld();null===b.parent&&b.updateMatrixWorld();b.matrixWorldInverse.getInverse(b.matrixWorld);sa.multiplyMatrices(b.projectionMatrix,b.matrixWorldInverse);na.setFromMatrix(sa);J.length=0;Na=C=-1;P.length=0;R.length=0;ua=this.localClippingEnabled;pa=da.init(this.clippingPlanes,ua,b);p(a,b);ca.length=C+1;G.length=Na+1;!0===T.sortObjects&&(ca.sort(h),G.sort(k));pa&&da.beginShadows();for(var e=J,f=0,g=0,m=e.length;g<m;g++){var x=e[g];x.castShadow&&(aa.shadows[f++]=
-x)}aa.shadows.length=f;Pa.render(a,b);for(var e=J,r=x=0,l=0,w,u,v,q,t=b.matrixWorldInverse,z=0,F=0,I=0,E=0,M=0,f=0,g=e.length;f<g;f++)if(m=e[f],w=m.color,u=m.intensity,v=m.distance,q=m.shadow&&m.shadow.map?m.shadow.map.texture:null,m.isAmbientLight)x+=w.r*u,r+=w.g*u,l+=w.b*u;else if(m.isDirectionalLight){var A=Aa.get(m);A.color.copy(m.color).multiplyScalar(m.intensity);A.direction.setFromMatrixPosition(m.matrixWorld);ba.setFromMatrixPosition(m.target.matrixWorld);A.direction.sub(ba);A.direction.transformDirection(t);
-if(A.shadow=m.castShadow)A.shadowBias=m.shadow.bias,A.shadowRadius=m.shadow.radius,A.shadowMapSize=m.shadow.mapSize;aa.directionalShadowMap[z]=q;aa.directionalShadowMatrix[z]=m.shadow.matrix;aa.directional[z++]=A}else if(m.isSpotLight){A=Aa.get(m);A.position.setFromMatrixPosition(m.matrixWorld);A.position.applyMatrix4(t);A.color.copy(w).multiplyScalar(u);A.distance=v;A.direction.setFromMatrixPosition(m.matrixWorld);ba.setFromMatrixPosition(m.target.matrixWorld);A.direction.sub(ba);A.direction.transformDirection(t);
-A.coneCos=Math.cos(m.angle);A.penumbraCos=Math.cos(m.angle*(1-m.penumbra));A.decay=0===m.distance?0:m.decay;if(A.shadow=m.castShadow)A.shadowBias=m.shadow.bias,A.shadowRadius=m.shadow.radius,A.shadowMapSize=m.shadow.mapSize;aa.spotShadowMap[I]=q;aa.spotShadowMatrix[I]=m.shadow.matrix;aa.spot[I++]=A}else if(m.isRectAreaLight)A=Aa.get(m),A.color.copy(w).multiplyScalar(u/(m.width*m.height)),A.position.setFromMatrixPosition(m.matrixWorld),A.position.applyMatrix4(t),xa.identity(),wa.copy(m.matrixWorld),
-wa.premultiply(t),xa.extractRotation(wa),A.halfWidth.set(.5*m.width,0,0),A.halfHeight.set(0,.5*m.height,0),A.halfWidth.applyMatrix4(xa),A.halfHeight.applyMatrix4(xa),aa.rectArea[E++]=A;else if(m.isPointLight){A=Aa.get(m);A.position.setFromMatrixPosition(m.matrixWorld);A.position.applyMatrix4(t);A.color.copy(m.color).multiplyScalar(m.intensity);A.distance=m.distance;A.decay=0===m.distance?0:m.decay;if(A.shadow=m.castShadow)A.shadowBias=m.shadow.bias,A.shadowRadius=m.shadow.radius,A.shadowMapSize=m.shadow.mapSize;
-aa.pointShadowMap[F]=q;void 0===aa.pointShadowMatrix[F]&&(aa.pointShadowMatrix[F]=new H);ba.setFromMatrixPosition(m.matrixWorld).negate();aa.pointShadowMatrix[F].identity().setPosition(ba);aa.point[F++]=A}else m.isHemisphereLight&&(A=Aa.get(m),A.direction.setFromMatrixPosition(m.matrixWorld),A.direction.transformDirection(t),A.direction.normalize(),A.skyColor.copy(m.color).multiplyScalar(u),A.groundColor.copy(m.groundColor).multiplyScalar(u),aa.hemi[M++]=A);aa.ambient[0]=x;aa.ambient[1]=r;aa.ambient[2]=
-l;aa.directional.length=z;aa.spot.length=I;aa.rectArea.length=E;aa.point.length=F;aa.hemi.length=M;aa.hash=z+","+F+","+I+","+E+","+M+","+aa.shadows.length;pa&&da.endShadows();qa.calls=0;qa.vertices=0;qa.faces=0;qa.points=0;void 0===c&&(c=null);this.setRenderTarget(c);e=a.background;null===e?Y.buffers.color.setClear(Ga.r,Ga.g,Ga.b,fb,K):e&&e.isColor&&(Y.buffers.color.setClear(e.r,e.g,e.b,1,K),d=!0);(this.autoClear||d)&&this.clear(this.autoClearColor,this.autoClearDepth,this.autoClearStencil);e&&e.isCubeTexture?
-(Ca.projectionMatrix.copy(b.projectionMatrix),Ca.matrixWorld.extractRotation(b.matrixWorld),Ca.matrixWorldInverse.getInverse(Ca.matrixWorld),ya.material.uniforms.tCube.value=e,ya.modelViewMatrix.multiplyMatrices(Ca.matrixWorldInverse,ya.matrixWorld),ta.update(ya),T.renderBufferDirect(Ca,null,ya.geometry,ya.material,ya,null)):e&&e.isTexture&&(Ea.material.map=e,ta.update(Ea),T.renderBufferDirect(Oa,null,Ea.geometry,Ea.material,Ea,null));a.overrideMaterial?(d=a.overrideMaterial,n(ca,a,b,d),n(G,a,b,d)):
-(Y.setBlending(0),n(ca,a,b),n(G,a,b));Qa.render(a,b);Ra.render(a,b,Z);c&&va.updateRenderTargetMipmap(c);Y.setDepthTest(!0);Y.setDepthWrite(!0);Y.setColorWrite(!0)}};this.setFaceCulling=function(a,b){Y.setCullFace(a);Y.setFlipSided(0===b)};this.allocTextureUnit=function(){var a=ea;a>=ma.maxTextures&&console.warn("WebGLRenderer: trying to use "+a+" texture units while this GPU supports only "+ma.maxTextures);ea+=1;return a};this.setTexture2D=function(){var a=!1;return function(b,c){b&&b.isWebGLRenderTarget&&
-(a||(console.warn("THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead."),a=!0),b=b.texture);va.setTexture2D(b,c)}}();this.setTexture=function(){var a=!1;return function(b,c){a||(console.warn("THREE.WebGLRenderer: .setTexture is deprecated, use setTexture2D instead."),a=!0);va.setTexture2D(b,c)}}();this.setTextureCube=function(){var a=!1;return function(b,c){b&&b.isWebGLRenderTargetCube&&(a||(console.warn("THREE.WebGLRenderer.setTextureCube: don't use cube render targets as textures. Use their .texture property instead."),
-a=!0),b=b.texture);b&&b.isCubeTexture||Array.isArray(b.image)&&6===b.image.length?va.setTextureCube(b,c):va.setTextureCubeDynamic(b,c)}}();this.getCurrentRenderTarget=function(){return V};this.setRenderTarget=function(a){(V=a)&&void 0===ha.get(a).__webglFramebuffer&&va.setupRenderTarget(a);var b=a&&a.isWebGLRenderTargetCube,c;a?(c=ha.get(a),c=b?c.__webglFramebuffer[a.activeCubeFace]:c.__webglFramebuffer,X.copy(a.scissor),Ta=a.scissorTest,Z.copy(a.viewport)):(c=null,X.copy(fa).multiplyScalar(Sa),Ta=
-ka,Z.copy(ia).multiplyScalar(Sa));S!==c&&(B.bindFramebuffer(B.FRAMEBUFFER,c),S=c);Y.scissor(X);Y.setScissorTest(Ta);Y.viewport(Z);b&&(b=ha.get(a.texture),B.framebufferTexture2D(B.FRAMEBUFFER,B.COLOR_ATTACHMENT0,B.TEXTURE_CUBE_MAP_POSITIVE_X+a.activeCubeFace,b.__webglTexture,a.activeMipMapLevel))};this.readRenderTargetPixels=function(a,b,c,d,e,f){if(!1===(a&&a.isWebGLRenderTarget))console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");else{var g=ha.get(a).__webglFramebuffer;
-if(g){var h=!1;g!==S&&(B.bindFramebuffer(B.FRAMEBUFFER,g),h=!0);try{var k=a.texture,m=k.format,n=k.type;1023!==m&&t(m)!==B.getParameter(B.IMPLEMENTATION_COLOR_READ_FORMAT)?console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format."):1009===n||t(n)===B.getParameter(B.IMPLEMENTATION_COLOR_READ_TYPE)||1015===n&&(ja.get("OES_texture_float")||ja.get("WEBGL_color_buffer_float"))||1016===n&&ja.get("EXT_color_buffer_half_float")?B.checkFramebufferStatus(B.FRAMEBUFFER)===
-B.FRAMEBUFFER_COMPLETE?0<=b&&b<=a.width-d&&0<=c&&c<=a.height-e&&B.readPixels(b,c,d,e,t(m),t(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{h&&B.bindFramebuffer(B.FRAMEBUFFER,S)}}}}}function Ib(a,b){this.name="";this.color=new N(a);this.density=void 0!==b?b:2.5E-4}function Jb(a,
-b,c){this.name="";this.color=new N(a);this.near=void 0!==b?b:1;this.far=void 0!==c?c:1E3}function jb(){G.call(this);this.type="Scene";this.overrideMaterial=this.fog=this.background=null;this.autoUpdate=!0}function Od(a,b,c,d,e){G.call(this);this.lensFlares=[];this.positionScreen=new q;this.customUpdateCallback=void 0;void 0!==a&&this.add(a,b,c,d,e)}function kb(a){W.call(this);this.type="SpriteMaterial";this.color=new N(16777215);this.map=null;this.rotation=0;this.lights=this.fog=!1;this.setValues(a)}
-function zc(a){G.call(this);this.type="Sprite";this.material=void 0!==a?a:new kb}function Ac(){G.call(this);this.type="LOD";Object.defineProperties(this,{levels:{enumerable:!0,value:[]}})}function hd(a,b,c){this.useVertexTexture=void 0!==c?c:!0;this.identityMatrix=new H;a=a||[];this.bones=a.slice(0);this.useVertexTexture?(a=Math.sqrt(4*this.bones.length),a=Q.nextPowerOfTwo(Math.ceil(a)),this.boneTextureHeight=this.boneTextureWidth=a=Math.max(a,4),this.boneMatrices=new Float32Array(this.boneTextureWidth*
-this.boneTextureHeight*4),this.boneTexture=new db(this.boneMatrices,this.boneTextureWidth,this.boneTextureHeight,1023,1015)):this.boneMatrices=new Float32Array(16*this.bones.length);if(void 0===b)this.calculateInverses();else if(this.bones.length===b.length)this.boneInverses=b.slice(0);else for(console.warn("THREE.Skeleton bonInverses is the wrong length."),this.boneInverses=[],b=0,a=this.bones.length;b<a;b++)this.boneInverses.push(new H)}function id(){G.call(this);this.type="Bone"}function jd(a,
-b,c){Ba.call(this,a,b);this.type="SkinnedMesh";this.bindMode="attached";this.bindMatrix=new H;this.bindMatrixInverse=new H;a=[];if(this.geometry&&void 0!==this.geometry.bones){for(var d,e=0,f=this.geometry.bones.length;e<f;++e)d=this.geometry.bones[e],b=new id,a.push(b),b.name=d.name,b.position.fromArray(d.pos),b.quaternion.fromArray(d.rotq),void 0!==d.scl&&b.scale.fromArray(d.scl);e=0;for(f=this.geometry.bones.length;e<f;++e)d=this.geometry.bones[e],-1!==d.parent&&null!==d.parent&&void 0!==a[d.parent]?
-a[d.parent].add(a[e]):this.add(a[e])}this.normalizeSkinWeights();this.updateMatrixWorld(!0);this.bind(new hd(a,void 0,c),this.matrixWorld)}function ia(a){W.call(this);this.type="LineBasicMaterial";this.color=new N(16777215);this.linewidth=1;this.linejoin=this.linecap="round";this.lights=!1;this.setValues(a)}function Va(a,b,c){if(1===c)return console.warn("THREE.Line: parameter THREE.LinePieces no longer supported. Created THREE.LineSegments instead."),new fa(a,b);G.call(this);this.type="Line";this.geometry=
-void 0!==a?a:new D;this.material=void 0!==b?b:new ia({color:16777215*Math.random()})}function fa(a,b){Va.call(this,a,b);this.type="LineSegments"}function Oa(a){W.call(this);this.type="PointsMaterial";this.color=new N(16777215);this.map=null;this.size=1;this.sizeAttenuation=!0;this.lights=!1;this.setValues(a)}function Kb(a,b){G.call(this);this.type="Points";this.geometry=void 0!==a?a:new D;this.material=void 0!==b?b:new Oa({color:16777215*Math.random()})}function Bc(){G.call(this);this.type="Group"}
-function kd(a,b,c,d,e,f,g,h,k){function m(){requestAnimationFrame(m);a.readyState>=a.HAVE_CURRENT_DATA&&(x.needsUpdate=!0)}ea.call(this,a,b,c,d,e,f,g,h,k);this.generateMipmaps=!1;var x=this;m()}function Lb(a,b,c,d,e,f,g,h,k,m,x,p){ea.call(this,null,f,g,h,k,m,d,e,x,p);this.image={width:b,height:c};this.mipmaps=a;this.generateMipmaps=this.flipY=!1}function ld(a,b,c,d,e,f,g,h,k){ea.call(this,a,b,c,d,e,f,g,h,k);this.needsUpdate=!0}function Cc(a,b,c,d,e,f,g,h,k,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);ea.call(this,null,d,e,f,g,h,m,c,k);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 Mb(a){function b(a,b){return a-b}D.call(this);var c=[0,0],d={},e=["a","b","c"];if(a&&a.isGeometry){var f=a.vertices,g=a.faces,h=0,k=new Uint32Array(6*g.length);a=0;for(var m=
-g.length;a<m;a++)for(var x=g[a],p=0;3>p;p++){c[0]=x[e[p]];c[1]=x[e[(p+1)%3]];c.sort(b);var n=c.toString();void 0===d[n]&&(k[2*h]=c[0],k[2*h+1]=c[1],d[n]=!0,h++)}c=new Float32Array(6*h);a=0;for(m=h;a<m;a++)for(p=0;2>p;p++)d=f[k[2*a+p]],h=6*a+3*p,c[h+0]=d.x,c[h+1]=d.y,c[h+2]=d.z;this.addAttribute("position",new y(c,3))}else if(a&&a.isBufferGeometry){if(null!==a.index){m=a.index.array;f=a.attributes.position;e=a.groups;h=0;0===e.length&&a.addGroup(0,m.length);k=new Uint32Array(2*m.length);g=0;for(x=
-e.length;g<x;++g){a=e[g];p=a.start;n=a.count;a=p;for(var r=p+n;a<r;a+=3)for(p=0;3>p;p++)c[0]=m[a+p],c[1]=m[a+(p+1)%3],c.sort(b),n=c.toString(),void 0===d[n]&&(k[2*h]=c[0],k[2*h+1]=c[1],d[n]=!0,h++)}c=new Float32Array(6*h);a=0;for(m=h;a<m;a++)for(p=0;2>p;p++)h=6*a+3*p,d=k[2*a+p],c[h+0]=f.getX(d),c[h+1]=f.getY(d),c[h+2]=f.getZ(d)}else for(f=a.attributes.position.array,h=f.length/3,k=h/3,c=new Float32Array(6*h),a=0,m=k;a<m;a++)for(p=0;3>p;p++)h=18*a+6*p,k=9*a+3*p,c[h+0]=f[k],c[h+1]=f[k+1],c[h+2]=f[k+
-2],d=9*a+(p+1)%3*3,c[h+3]=f[d],c[h+4]=f[d+1],c[h+5]=f[d+2];this.addAttribute("position",new y(c,3))}}function Nb(a,b,c){D.call(this);this.type="ParametricBufferGeometry";this.parameters={func:a,slices:b,stacks:c};var d=[],e=[],f,g,h,k,m,x=b+1;for(f=0;f<=c;f++)for(m=f/c,g=0;g<=b;g++)k=g/b,h=a(k,m),d.push(h.x,h.y,h.z),e.push(k,m);a=[];var p;for(f=0;f<c;f++)for(g=0;g<b;g++)h=f*x+g,k=f*x+g+1,m=(f+1)*x+g+1,p=(f+1)*x+g,a.push(h,k,p),a.push(k,m,p);this.setIndex(new (65535<a.length?Ua:Ra)(a,1));this.addAttribute("position",
-new X(d,3));this.addAttribute("uv",new X(e,2));this.computeVertexNormals()}function Dc(a,b,c){S.call(this);this.type="ParametricGeometry";this.parameters={func:a,slices:b,stacks:c};this.fromBufferGeometry(new Nb(a,b,c));this.mergeVertices()}function xa(a,b,c,d){function e(a){h.push(a.x,a.y,a.z)}function f(b,c){var d=3*b;c.x=a[d+0];c.y=a[d+1];c.z=a[d+2]}function g(a,b,c,d){0>d&&1===a.x&&(k[b]=a.x-1);0===c.x&&0===c.z&&(k[b]=d/2/Math.PI+.5)}D.call(this);this.type="PolyhedronBufferGeometry";this.parameters=
-{vertices:a,indices:b,radius:c,detail:d};c=c||1;var h=[],k=[];(function(a){for(var c=new q,d=new q,g=new q,h=0;h<b.length;h+=3){f(b[h+0],c);f(b[h+1],d);f(b[h+2],g);var k=c,l=d,F=g,t=Math.pow(2,a),v=[],M,z;for(M=0;M<=t;M++){v[M]=[];var A=k.clone().lerp(F,M/t),I=l.clone().lerp(F,M/t),E=t-M;for(z=0;z<=E;z++)v[M][z]=0===z&&M===t?A:A.clone().lerp(I,z/E)}for(M=0;M<t;M++)for(z=0;z<2*(t-M)-1;z++)k=Math.floor(z/2),0===z%2?(e(v[M][k+1]),e(v[M+1][k]),e(v[M][k])):(e(v[M][k+1]),e(v[M+1][k+1]),e(v[M+1][k]))}})(d||
-0);(function(a){for(var b=new q,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 q,b=0;b<h.length;b+=3)a.x=h[b+0],a.y=h[b+1],a.z=h[b+2],k.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));for(var a=new q,b=new q,c=new q,d=new q,e=new C,f=new C,l=new C,F=0,t=0;F<h.length;F+=9,t+=6){a.set(h[F+0],h[F+1],h[F+2]);b.set(h[F+3],h[F+4],h[F+5]);c.set(h[F+6],h[F+
-7],h[F+8]);e.set(k[t+0],k[t+1]);f.set(k[t+2],k[t+3]);l.set(k[t+4],k[t+5]);d.copy(a).add(b).add(c).divideScalar(3);var v=Math.atan2(d.z,-d.x);g(e,t+0,a,v);g(f,t+2,b,v);g(l,t+4,c,v)}for(a=0;a<k.length;a+=6)b=k[a+0],c=k[a+2],d=k[a+4],e=Math.min(b,c,d),.9<Math.max(b,c,d)&&.1>e&&(.2>b&&(k[a+0]+=1),.2>c&&(k[a+2]+=1),.2>d&&(k[a+4]+=1))})();this.addAttribute("position",new X(h,3));this.addAttribute("normal",new X(h.slice(),3));this.addAttribute("uv",new X(k,2));this.normalizeNormals();this.boundingSphere=
-new Fa(new q,c)}function Ob(a,b){xa.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 Ec(a,b){S.call(this);this.type="TetrahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Ob(a,b));this.mergeVertices()}function lb(a,b){xa.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 Fc(a,b){S.call(this);this.type="OctahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new lb(a,b));this.mergeVertices()}function Pb(a,b){var c=(1+Math.sqrt(5))/2;xa.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 Gc(a,b){S.call(this);this.type="IcosahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Pb(a,b));this.mergeVertices()}function Qb(a,b){var c=(1+Math.sqrt(5))/2,d=1/c;xa.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 Hc(a,b){S.call(this);this.type="DodecahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Qb(a,b));this.mergeVertices()}function Ic(a,b,c,d){S.call(this);this.type="PolyhedronGeometry";this.parameters={vertices:a,indices:b,
-radius:c,detail:d};this.fromBufferGeometry(new xa(a,b,c,d));this.mergeVertices()}function Rb(a,b,c,d,e){function f(e){var f=a.getPointAt(e/b),m=g.normals[e];e=g.binormals[e];for(p=0;p<=d;p++){var x=p/d*Math.PI*2,l=Math.sin(x),x=-Math.cos(x);k.x=x*m.x+l*e.x;k.y=x*m.y+l*e.y;k.z=x*m.z+l*e.z;k.normalize();r.push(k.x,k.y,k.z);h.x=f.x+c*k.x;h.y=f.y+c*k.y;h.z=f.z+c*k.z;n.push(h.x,h.y,h.z)}}D.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 q,k=new q,m=new C,x,p,n=[],r=[],l=[],u=[];for(x=0;x<b;x++)f(x);f(!1===e?b:0);for(x=0;x<=b;x++)for(p=0;p<=d;p++)m.x=x/b,m.y=p/d,l.push(m.x,m.y);(function(){for(p=1;p<=b;p++)for(x=1;x<=d;x++){var a=(d+1)*p+(x-1),c=(d+1)*p+x,e=(d+1)*(p-1)+x;u.push((d+1)*(p-1)+(x-1),a,e);u.push(a,c,e)}})();this.setIndex(new (65535<u.length?Ua:Ra)(u,1));this.addAttribute("position",
-new X(n,3));this.addAttribute("normal",new X(r,3));this.addAttribute("uv",new X(l,2))}function Jc(a,b,c,d,e,f){S.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 Rb(a,b,c,d,e);this.tangents=a.tangents;this.normals=a.normals;this.binormals=a.binormals;this.fromBufferGeometry(a);this.mergeVertices()}function Sb(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}D.call(this);this.type="TorusKnotBufferGeometry";this.parameters={radius:a,tube:b,tubularSegments:c,radialSegments:d,p:e,q:f};a=a||100;b=b||40;c=Math.floor(c)||64;d=Math.floor(d)||8;e=e||2;f=f||3;var h=(d+1)*(c+1),k=d*c*6,k=new y(new (65535<k?Uint32Array:Uint16Array)(k),1),m=new y(new Float32Array(3*h),3),x=new y(new Float32Array(3*h),3),h=new y(new Float32Array(2*h),2),p,n,r=0,l=0,u=new q,F=new q,t=new C,v=new q,
-M=new q,z=new q,A=new q,I=new q;for(p=0;p<=c;++p)for(n=p/c*e*Math.PI*2,g(n,e,f,a,v),g(n+.01,e,f,a,M),A.subVectors(M,v),I.addVectors(M,v),z.crossVectors(A,I),I.crossVectors(z,A),z.normalize(),I.normalize(),n=0;n<=d;++n){var E=n/d*Math.PI*2,K=-b*Math.cos(E),E=b*Math.sin(E);u.x=v.x+(K*I.x+E*z.x);u.y=v.y+(K*I.y+E*z.y);u.z=v.z+(K*I.z+E*z.z);m.setXYZ(r,u.x,u.y,u.z);F.subVectors(u,v).normalize();x.setXYZ(r,F.x,F.y,F.z);t.x=p/c;t.y=n/d;h.setXY(r,t.x,t.y);r++}for(n=1;n<=c;n++)for(p=1;p<=d;p++)a=(d+1)*n+(p-
-1),b=(d+1)*n+p,e=(d+1)*(n-1)+p,k.setX(l,(d+1)*(n-1)+(p-1)),l++,k.setX(l,a),l++,k.setX(l,e),l++,k.setX(l,a),l++,k.setX(l,b),l++,k.setX(l,e),l++;this.setIndex(k);this.addAttribute("position",m);this.addAttribute("normal",x);this.addAttribute("uv",h)}function Kc(a,b,c,d,e,f,g){S.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 Sb(a,b,c,d,e,f));this.mergeVertices()}function Tb(a,b,c,d,e){D.call(this);this.type="TorusBufferGeometry";this.parameters={radius:a,tube:b,radialSegments:c,tubularSegments:d,arc:e};a=a||100;b=b||40;c=Math.floor(c)||8;d=Math.floor(d)||6;e=e||2*Math.PI;var f=(c+1)*(d+1),g=c*d*6,g=new (65535<g?Uint32Array:Uint16Array)(g),h=new Float32Array(3*f),k=new Float32Array(3*f),f=new Float32Array(2*f),m=0,x=0,p=0,n=new q,l=new q,w=new q,u,F;for(u=0;u<=c;u++)for(F=0;F<=d;F++){var t=
-F/d*e,v=u/c*Math.PI*2;l.x=(a+b*Math.cos(v))*Math.cos(t);l.y=(a+b*Math.cos(v))*Math.sin(t);l.z=b*Math.sin(v);h[m]=l.x;h[m+1]=l.y;h[m+2]=l.z;n.x=a*Math.cos(t);n.y=a*Math.sin(t);w.subVectors(l,n).normalize();k[m]=w.x;k[m+1]=w.y;k[m+2]=w.z;f[x]=F/d;f[x+1]=u/c;m+=3;x+=2}for(u=1;u<=c;u++)for(F=1;F<=d;F++)a=(d+1)*(u-1)+F-1,b=(d+1)*(u-1)+F,e=(d+1)*u+F,g[p]=(d+1)*u+F-1,g[p+1]=a,g[p+2]=e,g[p+3]=a,g[p+4]=b,g[p+5]=e,p+=6;this.setIndex(new y(g,1));this.addAttribute("position",new y(h,3));this.addAttribute("normal",
-new y(k,3));this.addAttribute("uv",new y(f,2))}function Lc(a,b,c,d,e){S.call(this);this.type="TorusGeometry";this.parameters={radius:a,tube:b,radialSegments:c,tubularSegments:d,arc:e};this.fromBufferGeometry(new Tb(a,b,c,d,e))}function La(a,b){"undefined"!==typeof a&&(S.call(this),this.type="ExtrudeGeometry",a=Array.isArray(a)?a:[a],this.addShapeList(a,b),this.computeFaceNormals())}function Mc(a,b){b=b||{};var c=b.font;if(!1===(c&&c.isFont))return console.error("THREE.TextGeometry: font parameter is not an instance of THREE.Font."),
-new S;c=c.generateShapes(a,b.size,b.curveSegments);b.amount=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);La.call(this,c,b);this.type="TextGeometry"}function mb(a,b,c,d,e,f,g){D.call(this);this.type="SphereBufferGeometry";this.parameters={radius:a,widthSegments:b,heightSegments:c,phiStart:d,phiLength:e,thetaStart:f,thetaLength:g};a=a||50;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;for(var h=f+g,k=(b+1)*(c+1),m=new y(new Float32Array(3*k),3),x=new y(new Float32Array(3*k),3),k=new y(new Float32Array(2*k),2),p=0,n=[],l=new q,w=0;w<=c;w++){for(var u=[],F=w/c,t=0;t<=b;t++){var v=t/b,M=-a*Math.cos(d+v*e)*Math.sin(f+F*g),z=a*Math.cos(f+F*g),A=a*Math.sin(d+v*e)*Math.sin(f+F*g);l.set(M,z,A).normalize();m.setXYZ(p,M,z,A);x.setXYZ(p,l.x,l.y,l.z);k.setXY(p,v,1-F);u.push(p);p++}n.push(u)}d=[];for(w=0;w<
-c;w++)for(t=0;t<b;t++)e=n[w][t+1],g=n[w][t],p=n[w+1][t],l=n[w+1][t+1],(0!==w||0<f)&&d.push(e,g,l),(w!==c-1||h<Math.PI)&&d.push(g,p,l);this.setIndex(new (65535<m.count?Ua:Ra)(d,1));this.addAttribute("position",m);this.addAttribute("normal",x);this.addAttribute("uv",k);this.boundingSphere=new Fa(new q,a)}function Nc(a,b,c,d,e,f,g){S.call(this);this.type="SphereGeometry";this.parameters={radius:a,widthSegments:b,heightSegments:c,phiStart:d,phiLength:e,thetaStart:f,thetaLength:g};this.fromBufferGeometry(new mb(a,
-b,c,d,e,f,g))}function Ub(a,b,c,d,e,f){D.call(this);this.type="RingBufferGeometry";this.parameters={innerRadius:a,outerRadius:b,thetaSegments:c,phiSegments:d,thetaStart:e,thetaLength:f};a=a||20;b=b||50;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=(c+1)*(d+1),h=c*d*6,h=new y(new (65535<h?Uint32Array:Uint16Array)(h),1),k=new y(new Float32Array(3*g),3),m=new y(new Float32Array(3*g),3),g=new y(new Float32Array(2*g),2),x=0,p=0,n,l=a,w=(b-a)/
-d,u=new q,F=new C,t;for(a=0;a<=d;a++){for(t=0;t<=c;t++)n=e+t/c*f,u.x=l*Math.cos(n),u.y=l*Math.sin(n),k.setXYZ(x,u.x,u.y,u.z),m.setXYZ(x,0,0,1),F.x=(u.x/b+1)/2,F.y=(u.y/b+1)/2,g.setXY(x,F.x,F.y),x++;l+=w}for(a=0;a<d;a++)for(b=a*(c+1),t=0;t<c;t++)e=n=t+b,f=n+c+1,x=n+c+2,n+=1,h.setX(p,e),p++,h.setX(p,f),p++,h.setX(p,x),p++,h.setX(p,e),p++,h.setX(p,x),p++,h.setX(p,n),p++;this.setIndex(h);this.addAttribute("position",k);this.addAttribute("normal",m);this.addAttribute("uv",g)}function Oc(a,b,c,d,e,f){S.call(this);
-this.type="RingGeometry";this.parameters={innerRadius:a,outerRadius:b,thetaSegments:c,phiSegments:d,thetaStart:e,thetaLength:f};this.fromBufferGeometry(new Ub(a,b,c,d,e,f))}function Pc(a,b,c,d){S.call(this);this.type="PlaneGeometry";this.parameters={width:a,height:b,widthSegments:c,heightSegments:d};this.fromBufferGeometry(new ib(a,b,c,d))}function Vb(a,b,c,d){D.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=Q.clamp(d,0,2*Math.PI);for(var e=(b+1)*a.length,f=b*a.length*6,g=new y(new (65535<f?Uint32Array:Uint16Array)(f),1),h=new y(new Float32Array(3*e),3),k=new y(new Float32Array(2*e),2),m=0,x=0,p=1/b,n=new q,l=new C,e=0;e<=b;e++)for(var f=c+e*p*d,w=Math.sin(f),u=Math.cos(f),f=0;f<=a.length-1;f++)n.x=a[f].x*w,n.y=a[f].y,n.z=a[f].x*u,h.setXYZ(m,n.x,n.y,n.z),l.x=e/b,l.y=f/(a.length-1),k.setXY(m,l.x,l.y),m++;for(e=0;e<b;e++)for(f=0;f<a.length-1;f++)c=f+e*a.length,m=c+a.length,p=c+a.length+1,n=
-c+1,g.setX(x,c),x++,g.setX(x,m),x++,g.setX(x,n),x++,g.setX(x,m),x++,g.setX(x,p),x++,g.setX(x,n),x++;this.setIndex(g);this.addAttribute("position",h);this.addAttribute("uv",k);this.computeVertexNormals();if(d===2*Math.PI)for(d=this.attributes.normal.array,g=new q,h=new q,k=new q,c=b*a.length*3,f=e=0;e<a.length;e++,f+=3)g.x=d[f+0],g.y=d[f+1],g.z=d[f+2],h.x=d[c+f+0],h.y=d[c+f+1],h.z=d[c+f+2],k.addVectors(g,h).normalize(),d[f+0]=d[c+f+0]=k.x,d[f+1]=d[c+f+1]=k.y,d[f+2]=d[c+f+2]=k.z}function Qc(a,b,c,d){S.call(this);
-this.type="LatheGeometry";this.parameters={points:a,segments:b,phiStart:c,phiLength:d};this.fromBufferGeometry(new Vb(a,b,c,d));this.mergeVertices()}function Wb(a,b){function c(a){var c,h,m=d.length/3;a=a.extractPoints(b);var l=a.shape,u=a.holes;if(!1===pa.isClockWise(l))for(l=l.reverse(),a=0,c=u.length;a<c;a++)h=u[a],!0===pa.isClockWise(h)&&(u[a]=h.reverse());var q=pa.triangulateShape(l,u);a=0;for(c=u.length;a<c;a++)h=u[a],l=l.concat(h);a=0;for(c=l.length;a<c;a++)h=l[a],d.push(h.x,h.y,0),e.push(0,
-0,1),f.push(h.x,h.y);a=0;for(c=q.length;a<c;a++)l=q[a],g.push(l[0]+m,l[1]+m,l[2]+m),k+=3}D.call(this);this.type="ShapeBufferGeometry";this.parameters={shapes:a,curveSegments:b};b=b||12;var d=[],e=[],f=[],g=[],h=0,k=0;if(!1===Array.isArray(a))c(a);else for(var m=0;m<a.length;m++)c(a[m]),this.addGroup(h,k,m),h+=k,k=0;this.setIndex(new (65535<g.length?Ua:Ra)(g,1));this.addAttribute("position",new X(d,3));this.addAttribute("normal",new X(e,3));this.addAttribute("uv",new X(f,2))}function Xb(a,b){S.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 Wb(a,b));this.mergeVertices()}function Yb(a,b){function c(a,b){return a-b}D.call(this);var d=Math.cos(Q.DEG2RAD*(void 0!==b?b:1)),e=[0,0],f={},g=["a","b","c"],h;a.isBufferGeometry?(h=new S,h.fromBufferGeometry(a)):h=a.clone();h.mergeVertices();h.computeFaceNormals();var k=h.vertices;h=h.faces;
-for(var m=0,l=h.length;m<l;m++)for(var p=h[m],n=0;3>n;n++){e[0]=p[g[n]];e[1]=p[g[(n+1)%3]];e.sort(c);var r=e.toString();void 0===f[r]?f[r]={vert1:e[0],vert2:e[1],face1:m,face2:void 0}:f[r].face2=m}e=[];for(r in f)if(g=f[r],void 0===g.face2||h[g.face1].normal.dot(h[g.face2].normal)<=d)m=k[g.vert1],e.push(m.x),e.push(m.y),e.push(m.z),m=k[g.vert2],e.push(m.x),e.push(m.y),e.push(m.z);this.addAttribute("position",new X(e,3))}function Wa(a,b,c,d,e,f,g,h){function k(c){var e,f,k,n=new C,p=new q,l=0,x=!0===
-c?a:b,M=!0===c?1:-1;f=t;for(e=1;e<=d;e++)w.setXYZ(t,0,z*M,0),u.setXYZ(t,0,M,0),n.x=.5,n.y=.5,F.setXY(t,n.x,n.y),t++;k=t;for(e=0;e<=d;e++){var y=e/d*h+g,D=Math.cos(y),y=Math.sin(y);p.x=x*y;p.y=z*M;p.z=x*D;w.setXYZ(t,p.x,p.y,p.z);u.setXYZ(t,0,M,0);n.x=.5*D+.5;n.y=.5*y*M+.5;F.setXY(t,n.x,n.y);t++}for(e=0;e<d;e++)n=f+e,p=k+e,!0===c?(r.setX(v,p),v++,r.setX(v,p+1)):(r.setX(v,p+1),v++,r.setX(v,p)),v++,r.setX(v,n),v++,l+=3;m.addGroup(A,l,!0===c?1:2);A+=l}D.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:20;b=void 0!==b?b:20;c=void 0!==c?c:100;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 l=0;!1===f&&(0<a&&l++,0<b&&l++);var p=function(){var a=(d+1)*(e+1);!1===f&&(a+=(d+1)*l+d*l);return a}(),n=function(){var a=d*e*6;!1===f&&(a+=d*l*3);return a}(),r=new y(new (65535<n?Uint32Array:Uint16Array)(n),1),w=new y(new Float32Array(3*
-p),3),u=new y(new Float32Array(3*p),3),F=new y(new Float32Array(2*p),2),t=0,v=0,M=[],z=c/2,A=0;(function(){var f,k,n=new q,p=new q,l=0,x=(b-a)/c;for(k=0;k<=e;k++){var y=[],C=k/e,D=C*(b-a)+a;for(f=0;f<=d;f++){var G=f/d,P=G*h+g,R=Math.sin(P),P=Math.cos(P);p.x=D*R;p.y=-C*c+z;p.z=D*P;w.setXYZ(t,p.x,p.y,p.z);n.set(R,x,P).normalize();u.setXYZ(t,n.x,n.y,n.z);F.setXY(t,G,1-C);y.push(t);t++}M.push(y)}for(f=0;f<d;f++)for(k=0;k<e;k++)n=M[k+1][f],p=M[k+1][f+1],x=M[k][f+1],r.setX(v,M[k][f]),v++,r.setX(v,n),v++,
-r.setX(v,x),v++,r.setX(v,n),v++,r.setX(v,p),v++,r.setX(v,x),v++,l+=6;m.addGroup(A,l,0);A+=l})();!1===f&&(0<a&&k(!0),0<b&&k(!1));this.setIndex(r);this.addAttribute("position",w);this.addAttribute("normal",u);this.addAttribute("uv",F)}function nb(a,b,c,d,e,f,g,h){S.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 Wa(a,b,c,d,e,f,g,h));this.mergeVertices()}
-function Rc(a,b,c,d,e,f,g){nb.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 Sc(a,b,c,d,e,f,g){Wa.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 Zb(a,b,c,d){D.call(this);this.type="CircleBufferGeometry";this.parameters={radius:a,segments:b,thetaStart:c,
-thetaLength:d};a=a||50;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=b+2,f=new Float32Array(3*e),g=new Float32Array(3*e),e=new Float32Array(2*e);g[2]=1;e[0]=.5;e[1]=.5;for(var h=0,k=3,m=2;h<=b;h++,k+=3,m+=2){var l=c+h/b*d;f[k]=a*Math.cos(l);f[k+1]=a*Math.sin(l);g[k+2]=1;e[m]=(f[k]/a+1)/2;e[m+1]=(f[k+1]/a+1)/2}c=[];for(k=1;k<=b;k++)c.push(k,k+1,0);this.setIndex(new y(new Uint16Array(c),1));this.addAttribute("position",new y(f,3));this.addAttribute("normal",new y(g,3));
-this.addAttribute("uv",new y(e,2));this.boundingSphere=new Fa(new q,a)}function Tc(a,b,c,d){S.call(this);this.type="CircleGeometry";this.parameters={radius:a,segments:b,thetaStart:c,thetaLength:d};this.fromBufferGeometry(new Zb(a,b,c,d))}function $b(a,b,c,d,e,f){S.call(this);this.type="BoxGeometry";this.parameters={width:a,height:b,depth:c,widthSegments:d,heightSegments:e,depthSegments:f};this.fromBufferGeometry(new hb(a,b,c,d,e,f));this.mergeVertices()}function ac(){Ia.call(this,{uniforms:Ja.merge([U.lights,
-{opacity:{value:1}}]),vertexShader:Z.shadow_vert,fragmentShader:Z.shadow_frag});this.transparent=this.lights=!0;Object.defineProperties(this,{opacity:{enumerable:!0,get:function(){return this.uniforms.opacity.value},set:function(a){this.uniforms.opacity.value=a}}})}function bc(a){Ia.call(this,a);this.type="RawShaderMaterial"}function Uc(a){this.uuid=Q.generateUUID();this.type="MultiMaterial";this.materials=Array.isArray(a)?a:[];this.visible=!0}function Pa(a){W.call(this);this.defines={STANDARD:""};
-this.type="MeshStandardMaterial";this.color=new N(16777215);this.metalness=this.roughness=.5;this.lightMap=this.map=null;this.lightMapIntensity=1;this.aoMap=null;this.aoMapIntensity=1;this.emissive=new N(0);this.emissiveIntensity=1;this.bumpMap=this.emissiveMap=null;this.bumpScale=1;this.normalMap=null;this.normalScale=new C(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.morphNormals=this.morphTargets=this.skinning=!1;this.setValues(a)}function ob(a){Pa.call(this);this.defines={PHYSICAL:""};this.type="MeshPhysicalMaterial";this.reflectivity=.5;this.clearCoatRoughness=this.clearCoat=0;this.setValues(a)}function Ca(a){W.call(this);this.type="MeshPhongMaterial";this.color=new N(16777215);this.specular=new N(1118481);this.shininess=30;this.lightMap=this.map=null;
-this.lightMapIntensity=1;this.aoMap=null;this.aoMapIntensity=1;this.emissive=new N(0);this.emissiveIntensity=1;this.bumpMap=this.emissiveMap=null;this.bumpScale=1;this.normalMap=null;this.normalScale=new C(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 pb(a){Ca.call(this);this.defines={TOON:""};this.type="MeshToonMaterial";this.gradientMap=null;this.setValues(a)}function qb(a){W.call(this,a);this.type="MeshNormalMaterial";this.bumpMap=null;this.bumpScale=1;this.normalMap=null;this.normalScale=new C(1,1);this.displacementMap=null;this.displacementScale=1;this.displacementBias=0;this.wireframe=!1;this.wireframeLinewidth=1;this.morphNormals=this.morphTargets=this.skinning=this.lights=this.fog=
-!1;this.setValues(a)}function rb(a){W.call(this);this.type="MeshLambertMaterial";this.color=new N(16777215);this.lightMap=this.map=null;this.lightMapIntensity=1;this.aoMap=null;this.aoMapIntensity=1;this.emissive=new N(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 sb(a){W.call(this);this.type="LineDashedMaterial";this.color=new N(16777215);this.scale=this.linewidth=1;this.dashSize=3;this.gapSize=1;this.lights=!1;this.setValues(a)}function Pd(a,b,c){var d=this,e=!1,f=0,g=0;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)}}function Ma(a){this.manager=void 0!==a?a:va}function Ee(a){this.manager=void 0!==a?a:va;this._parser=null}function Qd(a){this.manager=void 0!==a?a:va;this._parser=null}function Vc(a){this.manager=void 0!==a?a:va}function Rd(a){this.manager=void 0!==a?a:va}function md(a){this.manager=void 0!==a?a:va}function na(a,b){G.call(this);this.type="Light";this.color=new N(a);this.intensity=void 0!==b?b:1;this.receiveShadow=
-void 0}function nd(a,b,c){na.call(this,a,c);this.type="HemisphereLight";this.castShadow=void 0;this.position.copy(G.DefaultUp);this.updateMatrix();this.groundColor=new N(b)}function tb(a){this.camera=a;this.bias=0;this.radius=1;this.mapSize=new C(512,512);this.map=null;this.matrix=new H}function od(){tb.call(this,new Ha(50,1,.5,500))}function pd(a,b,c,d,e,f){na.call(this,a,b);this.type="SpotLight";this.position.copy(G.DefaultUp);this.updateMatrix();this.target=new G;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 od}function qd(a,b,c,d){na.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 tb(new Ha(90,
-1,.5,500))}function rd(a){tb.call(this,new Hb(-5,5,5,-5,.5,500))}function sd(a,b){na.call(this,a,b);this.type="DirectionalLight";this.position.copy(G.DefaultUp);this.updateMatrix();this.target=new G;this.shadow=new rd}function td(a,b){na.call(this,a,b);this.type="AmbientLight";this.castShadow=void 0}function qa(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 ud(a,b,c,d){qa.call(this,a,b,c,d);this._offsetNext=
-this._weightNext=this._offsetPrev=this._weightPrev=-0}function Wc(a,b,c,d){qa.call(this,a,b,c,d)}function vd(a,b,c,d){qa.call(this,a,b,c,d)}function ub(a,b,c,d){if(void 0===a)throw Error("track name is undefined");if(void 0===b||0===b.length)throw Error("no keyframes in track named "+a);this.name=a;this.times=ba.convertArray(b,this.TimeBufferType);this.values=ba.convertArray(c,this.ValueBufferType);this.setInterpolation(d||this.DefaultInterpolation);this.validate();this.optimize()}function cc(a,b,
-c,d){ub.call(this,a,b,c,d)}function wd(a,b,c,d){qa.call(this,a,b,c,d)}function Xc(a,b,c,d){ub.call(this,a,b,c,d)}function dc(a,b,c,d){ub.call(this,a,b,c,d)}function xd(a,b,c,d){ub.call(this,a,b,c,d)}function yd(a,b,c){ub.call(this,a,b,c)}function zd(a,b,c,d){ub.call(this,a,b,c,d)}function vb(a,b,c,d){ub.apply(this,arguments)}function ta(a,b,c){this.name=a;this.tracks=c;this.duration=void 0!==b?b:-1;this.uuid=Q.generateUUID();0>this.duration&&this.resetDuration();this.optimize()}function Ad(a){this.manager=
-void 0!==a?a:va;this.textures={}}function Sd(a){this.manager=void 0!==a?a:va}function wb(){this.onLoadStart=function(){};this.onLoadProgress=function(){};this.onLoadComplete=function(){}}function Td(a){"boolean"===typeof a&&(console.warn("THREE.JSONLoader: showStatus parameter has been removed from constructor."),a=void 0);this.manager=void 0!==a?a:va;this.withCredentials=!1}function Fe(a){this.manager=void 0!==a?a:va;this.texturePath=""}function wa(){}function Qa(a,b){this.v1=a;this.v2=b}function Yc(){this.curves=
-[];this.autoClose=!1}function Xa(a,b,c,d,e,f,g,h){this.aX=a;this.aY=b;this.xRadius=c;this.yRadius=d;this.aStartAngle=e;this.aEndAngle=f;this.aClockwise=g;this.aRotation=h||0}function xb(a){this.points=void 0===a?[]:a}function yb(a,b,c,d){this.v0=a;this.v1=b;this.v2=c;this.v3=d}function zb(a,b,c){this.v0=a;this.v1=b;this.v2=c}function Ab(){Zc.apply(this,arguments);this.holes=[]}function Zc(a){Yc.call(this);this.currentPoint=new C;a&&this.fromPoints(a)}function Ud(){this.subPaths=[];this.currentPath=
-null}function Vd(a){this.data=a}function Ge(a){this.manager=void 0!==a?a:va}function Wd(a){this.manager=void 0!==a?a:va}function Xd(a,b,c,d){na.call(this,a,b);this.type="RectAreaLight";this.position.set(0,1,0);this.updateMatrix();this.width=void 0!==c?c:10;this.height=void 0!==d?d:10}function He(){this.type="StereoCamera";this.aspect=1;this.eyeSep=.064;this.cameraL=new Ha;this.cameraL.layers.enable(1);this.cameraL.matrixAutoUpdate=!1;this.cameraR=new Ha;this.cameraR.layers.enable(2);this.cameraR.matrixAutoUpdate=
-!1}function Bd(a,b,c){G.call(this);this.type="CubeCamera";var d=new Ha(90,1,a,b);d.up.set(0,-1,0);d.lookAt(new q(1,0,0));this.add(d);var e=new Ha(90,1,a,b);e.up.set(0,-1,0);e.lookAt(new q(-1,0,0));this.add(e);var f=new Ha(90,1,a,b);f.up.set(0,0,1);f.lookAt(new q(0,1,0));this.add(f);var g=new Ha(90,1,a,b);g.up.set(0,0,-1);g.lookAt(new q(0,-1,0));this.add(g);var h=new Ha(90,1,a,b);h.up.set(0,-1,0);h.lookAt(new q(0,0,1));this.add(h);var k=new Ha(90,1,a,b);k.up.set(0,-1,0);k.lookAt(new q(0,0,-1));this.add(k);
-this.renderTarget=new Eb(c,c,{format:1022,magFilter:1006,minFilter:1006});this.updateCubeMap=function(a,b){null===this.parent&&this.updateMatrixWorld();var c=this.renderTarget,n=c.texture.generateMipmaps;c.texture.generateMipmaps=!1;c.activeCubeFace=0;a.render(b,d,c);c.activeCubeFace=1;a.render(b,e,c);c.activeCubeFace=2;a.render(b,f,c);c.activeCubeFace=3;a.render(b,g,c);c.activeCubeFace=4;a.render(b,h,c);c.texture.generateMipmaps=n;c.activeCubeFace=5;a.render(b,k,c);a.setRenderTarget(null)}}function Yd(){G.call(this);
-this.type="AudioListener";this.context=Zd.getContext();this.gain=this.context.createGain();this.gain.connect(this.context.destination);this.filter=null}function ec(a){G.call(this);this.type="Audio";this.context=a.context;this.gain=this.context.createGain();this.gain.connect(a.getInput());this.autoplay=!1;this.buffer=null;this.loop=!1;this.startTime=0;this.playbackRate=1;this.isPlaying=!1;this.hasPlaybackControl=!0;this.sourceType="empty";this.filters=[]}function $d(a){ec.call(this,a);this.panner=
-this.context.createPanner();this.panner.connect(this.gain)}function ae(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 Cd(a,b,c){this.binding=a;this.valueSize=c;a=Float64Array;switch(b){case "quaternion":b=this._slerp;break;case "string":case "bool":a=Array;b=this._select;break;default:b=this._lerp}this.buffer=new a(4*c);this._mixBufferRegion=b;this.referenceCount=
-this.useCount=this.cumulativeWeight=0}function ka(a,b,c){this.path=b;this.parsedPath=c||ka.parseTrackName(b);this.node=ka.findNode(a,this.parsedPath.nodeName)||a;this.rootNode=a}function be(a){this.uuid=Q.generateUUID();this._objects=Array.prototype.slice.call(arguments);this.nCachedObjects_=0;var b={};this._indicesByUUID=b;for(var c=0,d=arguments.length;c!==d;++c)b[arguments[c].uuid]=c;this._paths=[];this._parsedPaths=[];this._bindings=[];this._bindingsIndicesByPath={};var e=this;this.stats={objects:{get total(){return e._objects.length},
-get inUse(){return this.total-e.nCachedObjects_}},get bindingsPerObject(){return e._bindings.length}}}function ce(a,b,c){this._mixer=a;this._clip=b;this._localRoot=c||null;a=b.tracks;b=a.length;c=Array(b);for(var d={endingStart:2400,endingEnd:2400},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 de(a){this._root=a;this._initMemoryManager();this.time=this._accuIndex=0;this.timeScale=1}function Dd(a,b){"string"===typeof a&&(console.warn("THREE.Uniform: Type parameter is no longer needed."),a=b);this.value=a}function Bb(){D.call(this);
-this.type="InstancedBufferGeometry";this.maxInstancedCount=void 0}function ee(a,b,c,d){this.uuid=Q.generateUUID();this.data=a;this.itemSize=b;this.offset=c;this.normalized=!0===d}function fc(a,b){this.uuid=Q.generateUUID();this.array=a;this.stride=b;this.count=void 0!==a?a.length/b:0;this.dynamic=!1;this.updateRange={offset:0,count:-1};this.onUploadCallback=function(){};this.version=0}function gc(a,b,c){fc.call(this,a,b);this.meshPerAttribute=c||1}function hc(a,b,c){y.call(this,a,b);this.meshPerAttribute=
-c||1}function fe(a,b,c,d){this.ray=new bb(a,b);this.near=c||0;this.far=d||Infinity;this.params={Mesh:{},Line:{},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 Ie(a,b){return a.distance-b.distance}function ge(a,b,c,d){if(!1!==a.visible&&(a.raycast(b,c),!0===d)){a=a.children;d=0;for(var e=a.length;d<e;d++)ge(a[d],b,c,!0)}}function he(a){this.autoStart=
-void 0!==a?a:!0;this.elapsedTime=this.oldTime=this.startTime=0;this.running=!1}function ie(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 je(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 ua(a,b){Ba.call(this,a,b);this.animationsMap={};this.animationsList=[];var c=this.geometry.morphTargets.length;this.createAnimation("__default",0,c-1,c/1);this.setAnimationWeight("__default",1)}function $c(a){G.call(this);
-this.material=a;this.render=function(a){}}function ad(a,b,c,d){this.object=a;this.size=void 0!==b?b:1;a=void 0!==c?c:16711680;d=void 0!==d?d:1;b=0;(c=this.object.geometry)&&c.isGeometry?b=3*c.faces.length:c&&c.isBufferGeometry&&(b=c.attributes.normal.count);c=new D;b=new X(6*b,3);c.addAttribute("position",b);fa.call(this,c,new ia({color:a,linewidth:d}));this.matrixAutoUpdate=!1;this.update()}function ic(a){G.call(this);this.light=a;this.light.updateMatrixWorld();this.matrix=a.matrixWorld;this.matrixAutoUpdate=
-!1;a=new D;for(var 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],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.addAttribute("position",new X(b,3));b=new ia({fog:!1});this.cone=new fa(a,b);this.add(this.cone);this.update()}function jc(a){this.bones=this.getBoneList(a);for(var b=new D,c=[],d=[],e=new N(0,0,1),f=new N(0,1,0),g=0;g<this.bones.length;g++){var h=this.bones[g];h.parent&&h.parent.isBone&&(c.push(0,
-0,0),c.push(0,0,0),d.push(e.r,e.g,e.b),d.push(f.r,f.g,f.b))}b.addAttribute("position",new X(c,3));b.addAttribute("color",new X(d,3));c=new ia({vertexColors:2,depthTest:!1,depthWrite:!1,transparent:!0});fa.call(this,b,c);this.root=a;this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;this.update()}function kc(a,b){this.light=a;this.light.updateMatrixWorld();var c=new mb(b,4,2),d=new Ka({wireframe:!0,fog:!1});d.color.copy(this.light.color).multiplyScalar(this.light.intensity);Ba.call(this,c,d);this.matrix=
-this.light.matrixWorld;this.matrixAutoUpdate=!1}function lc(a){G.call(this);this.light=a;this.light.updateMatrixWorld();var b=new Ka({color:a.color,fog:!1});a=new Ka({color:a.color,fog:!1,wireframe:!0});var c=new D;c.addAttribute("position",new y(new Float32Array(18),3));this.add(new Ba(c,b));this.add(new Ba(c,a));this.update()}function mc(a,b){G.call(this);this.light=a;this.light.updateMatrixWorld();this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;var c=new lb(b);c.rotateY(.5*Math.PI);var d=new Ka({vertexColors:2,
-wireframe:!0}),e=c.getAttribute("position"),e=new Float32Array(3*e.count);c.addAttribute("color",new y(e,3));this.add(new Ba(c,d));this.update()}function bd(a,b,c,d){a=a||10;b=b||10;c=new N(void 0!==c?c:4473924);d=new N(void 0!==d?d:8947848);for(var e=b/2,f=2*a/b,g=[],h=[],k=0,m=0,l=-a;k<=b;k++,l+=f){g.push(-a,0,l,a,0,l);g.push(l,0,-a,l,0,a);var p=k===e?c:d;p.toArray(h,m);m+=3;p.toArray(h,m);m+=3;p.toArray(h,m);m+=3;p.toArray(h,m);m+=3}a=new D;a.addAttribute("position",new X(g,3));a.addAttribute("color",
-new X(h,3));g=new ia({vertexColors:2});fa.call(this,a,g)}function Ed(a,b,c,d,e,f){a=a||10;b=b||16;c=c||8;d=d||64;e=new N(void 0!==e?e:4473924);f=new N(void 0!==f?f:8947848);var g=[],h=[],k,m,l,p,n;for(l=0;l<=b;l++)m=l/b*2*Math.PI,k=Math.sin(m)*a,m=Math.cos(m)*a,g.push(0,0,0),g.push(k,0,m),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++)for(n=l&1?e:f,p=a-a/c*l,b=0;b<d;b++)m=b/d*2*Math.PI,k=Math.sin(m)*p,m=Math.cos(m)*p,g.push(k,0,m),h.push(n.r,n.g,n.b),m=(b+1)/d*2*Math.PI,k=Math.sin(m)*
-p,m=Math.cos(m)*p,g.push(k,0,m),h.push(n.r,n.g,n.b);a=new D;a.addAttribute("position",new X(g,3));a.addAttribute("color",new X(h,3));g=new ia({vertexColors:2});fa.call(this,a,g)}function cd(a,b,c,d){this.object=a;this.size=void 0!==b?b:1;a=void 0!==c?c:16776960;d=void 0!==d?d:1;b=0;(c=this.object.geometry)&&c.isGeometry?b=c.faces.length:console.warn("THREE.FaceNormalsHelper: only THREE.Geometry is supported. Use THREE.VertexNormalsHelper, instead.");c=new D;b=new X(6*b,3);c.addAttribute("position",
-b);fa.call(this,c,new ia({color:a,linewidth:d}));this.matrixAutoUpdate=!1;this.update()}function nc(a,b){G.call(this);this.light=a;this.light.updateMatrixWorld();this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;void 0===b&&(b=1);var c=new D;c.addAttribute("position",new X([-b,b,0,b,b,0,b,-b,0,-b,-b,0,-b,b,0],3));var d=new ia({fog:!1});this.add(new Va(c,d));c=new D;c.addAttribute("position",new X([0,0,0,0,0,1],3));this.add(new Va(c,d));this.update()}function dd(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 D,e=new ia({color:16777215,vertexColors:1}),f=[],g=[],h={},k=new N(16755200),m=new N(16711680),l=new N(43775),p=new N(16777215),n=new N(3355443);b("n1","n2",k);b("n2","n4",k);b("n4","n3",k);b("n3","n1",k);b("f1","f2",k);b("f2","f4",k);b("f4","f3",k);b("f3","f1",k);b("n1","f1",k);b("n2","f2",k);b("n3","f3",k);b("n4","f4",k);b("p","n1",m);b("p","n2",m);b("p","n3",m);b("p","n4",m);b("u1","u2",
-l);b("u2","u3",l);b("u3","u1",l);b("c","t",p);b("p","c",n);b("cn1","cn2",n);b("cn3","cn4",n);b("cf1","cf2",n);b("cf3","cf4",n);d.addAttribute("position",new X(f,3));d.addAttribute("color",new X(g,3));fa.call(this,d,e);this.camera=a;this.camera.updateProjectionMatrix&&this.camera.updateProjectionMatrix();this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;this.pointMap=h;this.update()}function oc(a,b){void 0===b&&(b=16776960);var c=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]),
-d=new Float32Array(24),e=new D;e.setIndex(new y(c,1));e.addAttribute("position",new y(d,3));fa.call(this,e,new ia({color:b}));void 0!==a&&this.update(a)}function Cb(a,b,c,d,e,f){G.call(this);void 0===d&&(d=16776960);void 0===c&&(c=1);void 0===e&&(e=.2*c);void 0===f&&(f=.2*e);this.position.copy(b);this.line=new Va(Je,new ia({color:d}));this.line.matrixAutoUpdate=!1;this.add(this.line);this.cone=new Ba(Ke,new Ka({color:d}));this.cone.matrixAutoUpdate=!1;this.add(this.cone);this.setDirection(a);this.setLength(c,
-e,f)}function Fd(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 D;a.addAttribute("position",new X(b,3));a.addAttribute("color",new X([1,0,0,1,.6,0,0,1,0,.6,1,0,0,0,1,0,.6,1],3));b=new ia({vertexColors:2});fa.call(this,a,b)}function Gd(a,b,c,d,e,f){Xa.call(this,a,b,c,c,d,e,f)}function Le(a){console.warn("THREE.ClosedSplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.");ke.call(this,a);this.type="catmullrom";this.closed=!0}void 0===Number.EPSILON&&(Number.EPSILON=Math.pow(2,
--52));void 0===Math.sign&&(Math.sign=function(a){return 0>a?-1:0<a?1:+a});void 0===Function.prototype.name&&Object.defineProperty(Function.prototype,"name",{get:function(){return this.toString().match(/^\s*function\s*([^\(\s]*)/)[1]}});void 0===Object.assign&&function(){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(oa.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){if(void 0!==this._listeners){var c=this._listeners[a];if(void 0!==c){var d=c.indexOf(b);-1!==d&&c.splice(d,1)}}},dispatchEvent:function(a){if(void 0!==
-this._listeners){var b=this._listeners[a.type];if(void 0!==b){a.target=this;var c=[],d,e=b.length;for(d=0;d<e;d++)c[d]=b[d];for(d=0;d<e;d++)c[d].call(this,a)}}}});var Me={NoBlending:0,NormalBlending:1,AdditiveBlending:2,SubtractiveBlending:3,MultiplyBlending:4,CustomBlending:5},Ne={UVMapping:300,CubeReflectionMapping:301,CubeRefractionMapping:302,EquirectangularReflectionMapping:303,EquirectangularRefractionMapping:304,SphericalReflectionMapping:305,CubeUVReflectionMapping:306,CubeUVRefractionMapping:307},
-le={RepeatWrapping:1E3,ClampToEdgeWrapping:1001,MirroredRepeatWrapping:1002},me={NearestFilter:1003,NearestMipMapNearestFilter:1004,NearestMipMapLinearFilter:1005,LinearFilter:1006,LinearMipMapNearestFilter:1007,LinearMipMapLinearFilter:1008},Q={DEG2RAD:Math.PI/180,RAD2DEG:180/Math.PI,generateUUID:function(){var a="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),b=Array(36),c=0,d;return function(){for(var e=0;36>e;e++)8===e||13===e||18===e||23===e?b[e]="-":14===e?b[e]="4":
-(2>=c&&(c=33554432+16777216*Math.random()|0),d=c&15,c>>=4,b[e]=a[19===e?d&3|8:d]);return b.join("")}}(),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*Q.DEG2RAD},radToDeg:function(a){return a*Q.RAD2DEG},isPowerOfTwo:function(a){return 0===(a&a-1)&&0!==a},nearestPowerOfTwo:function(a){return Math.pow(2,Math.round(Math.log(a)/Math.LN2))},nextPowerOfTwo:function(a){a--;a|=a>>1;a|=a>>2;a|=a>>4;a|=a>>8;a|=a>>16;a++;return a}};C.prototype={constructor:C,
-isVector2:!0,get width(){return this.x},set width(a){this.x=a},get height(){return this.y},set height(a){this.y=a},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){isFinite(a)?(this.x*=a,this.y*=a):this.y=this.x=0;
-return this},divide:function(a){this.x/=a.x;this.y/=a.y;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);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(){var a,b;return function(c,d){void 0===a&&(a=new C,b=new C);a.set(c,
-c);b.set(d,d);return this.clamp(a,b)}}(),clampLength:function(a,b){var c=this.length();return this.multiplyScalar(Math.max(a,Math.min(b,c))/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},lengthSq:function(){return this.x*this.x+this.y*this.y},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},lengthManhattan:function(){return Math.abs(this.x)+Math.abs(this.y)},normalize:function(){return this.divideScalar(this.length())},angle:function(){var a=Math.atan2(this.y,this.x);0>a&&(a+=2*Math.PI);return a},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},distanceToManhattan:function(a){return Math.abs(this.x-a.x)+Math.abs(this.y-a.y)},setLength:function(a){return this.multiplyScalar(a/this.length())},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){return this.subVectors(b,a).multiplyScalar(c).add(a)},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},fromAttribute:function(a,b,c){void 0!==c&&console.warn("THREE.Vector2: offset has been removed from .fromAttribute().");this.x=a.getX(b);this.y=a.getY(b);return this},rotateAround:function(a,b){var c=Math.cos(b),d=Math.sin(b),e=this.x-a.x,f=this.y-a.y;this.x=e*c-f*d+a.x;this.y=e*d+f*c+a.y;return this}};var Oe=0;ea.DEFAULT_IMAGE=void 0;ea.DEFAULT_MAPPING=300;ea.prototype={constructor:ea,isTexture:!0,
-set needsUpdate(a){!0===a&&this.version++},clone:function(){return(new this.constructor).copy(this)},copy:function(a){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.type=a.type;this.offset.copy(a.offset);this.repeat.copy(a.repeat);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){if(void 0!==a.textures[this.uuid])return a.textures[this.uuid];var b={metadata:{version:4.4,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],wrap:[this.wrapS,this.wrapT],minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY};if(void 0!==this.image){var c=
-this.image;void 0===c.uuid&&(c.uuid=Q.generateUUID());if(void 0===a.images[c.uuid]){var d=a.images,e=c.uuid,f=c.uuid,g;void 0!==c.toDataURL?g=c:(g=document.createElementNS("http://www.w3.org/1999/xhtml","canvas"),g.width=c.width,g.height=c.height,g.getContext("2d").drawImage(c,0,0,c.width,c.height));g=2048<g.width||2048<g.height?g.toDataURL("image/jpeg",.6):g.toDataURL("image/png");d[e]={uuid:f,url:g}}b.image=c.uuid}return a.textures[this.uuid]=b},dispose:function(){this.dispatchEvent({type:"dispose"})},
-transformUv:function(a){if(300===this.mapping){a.multiply(this.repeat);a.add(this.offset);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)}}};Object.assign(ea.prototype,
-oa.prototype);ga.prototype={constructor:ga,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){isFinite(a)?(this.x*=a,this.y*=a,this.z*=a,this.w*=a):this.w=this.z=this.y=this.x=0;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){var b,c,d;a=a.elements;var e=a[0];d=a[4];var f=a[8],g=a[1],h=a[5],k=a[9];c=a[2];b=a[6];var m=a[10];if(.01>Math.abs(d-g)&&.01>Math.abs(f-c)&&.01>
-Math.abs(k-b)){if(.1>Math.abs(d+g)&&.1>Math.abs(f+c)&&.1>Math.abs(k+b)&&.1>Math.abs(e+h+m-3))return this.set(1,0,0,0),this;a=Math.PI;e=(e+1)/2;h=(h+1)/2;m=(m+1)/2;d=(d+g)/4;f=(f+c)/4;k=(k+b)/4;e>h&&e>m?.01>e?(b=0,d=c=.707106781):(b=Math.sqrt(e),c=d/b,d=f/b):h>m?.01>h?(b=.707106781,c=0,d=.707106781):(c=Math.sqrt(h),b=d/c,d=k/c):.01>m?(c=b=.707106781,d=0):(d=Math.sqrt(m),b=f/d,c=k/d);this.set(b,c,d,a);return this}a=Math.sqrt((b-k)*(b-k)+(f-c)*(f-c)+(g-d)*(g-d));.001>Math.abs(a)&&(a=1);this.x=(b-k)/
-a;this.y=(f-c)/a;this.z=(g-d)/a;this.w=Math.acos((e+h+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(){var a,b;return function(c,d){void 0===a&&(a=new ga,b=new ga);a.set(c,c,c,c);b.set(d,d,d,d);return this.clamp(a,b)}}(),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)},lengthManhattan: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())},setLength:function(a){return this.multiplyScalar(a/this.length())},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){return this.subVectors(b,a).multiplyScalar(c).add(a)},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},fromAttribute:function(a,b,c){void 0!==c&&console.warn("THREE.Vector4: offset has been removed from .fromAttribute().");this.x=a.getX(b);
-this.y=a.getY(b);this.z=a.getZ(b);this.w=a.getW(b);return this}};Object.assign(Db.prototype,oa.prototype,{isWebGLRenderTarget:!0,setSize:function(a,b){if(this.width!==a||this.height!==b)this.width=a,this.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"})}});Eb.prototype=Object.create(Db.prototype);Eb.prototype.constructor=Eb;Eb.prototype.isWebGLRenderTargetCube=!0;da.prototype={constructor:da,get x(){return this._x},set x(a){this._x=a;this.onChangeCallback()},get y(){return this._y},set y(a){this._y=a;this.onChangeCallback()},get z(){return this._z},set z(a){this._z=a;this.onChangeCallback()},get w(){return this._w},set w(a){this._w=
-a;this.onChangeCallback()},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(!1===(a&&a.isEuler))throw Error("THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.");var c=Math.cos(a._x/2),d=Math.cos(a._y/
-2),e=Math.cos(a._z/2),f=Math.sin(a._x/2),g=Math.sin(a._y/2),h=Math.sin(a._z/2),k=a.order;"XYZ"===k?(this._x=f*d*e+c*g*h,this._y=c*g*e-f*d*h,this._z=c*d*h+f*g*e,this._w=c*d*e-f*g*h):"YXZ"===k?(this._x=f*d*e+c*g*h,this._y=c*g*e-f*d*h,this._z=c*d*h-f*g*e,this._w=c*d*e+f*g*h):"ZXY"===k?(this._x=f*d*e-c*g*h,this._y=c*g*e+f*d*h,this._z=c*d*h+f*g*e,this._w=c*d*e-f*g*h):"ZYX"===k?(this._x=f*d*e-c*g*h,this._y=c*g*e+f*d*h,this._z=c*d*h-f*g*e,this._w=c*d*e+f*g*h):"YZX"===k?(this._x=f*d*e+c*g*h,this._y=c*g*e+
-f*d*h,this._z=c*d*h-f*g*e,this._w=c*d*e-f*g*h):"XZY"===k&&(this._x=f*d*e-c*g*h,this._y=c*g*e-f*d*h,this._z=c*d*h+f*g*e,this._w=c*d*e+f*g*h);if(!1!==b)this.onChangeCallback();return this},setFromAxisAngle:function(a,b){var c=b/2,d=Math.sin(c);this._x=a.x*d;this._y=a.y*d;this._z=a.z*d;this._w=Math.cos(c);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],k=b[6],b=b[10],m=c+f+b;0<m?(c=.5/Math.sqrt(m+1),this._w=
-.25/c,this._x=(k-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=(k-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+k)/c):(c=2*Math.sqrt(1+b-c-f),this._w=(e-a)/c,this._x=(d+h)/c,this._y=(g+k)/c,this._z=.25*c);this.onChangeCallback();return this},setFromUnitVectors:function(){var a,b;return function(c,d){void 0===a&&(a=new q);b=c.dot(d)+1;1E-6>b?(b=0,Math.abs(c.x)>Math.abs(c.z)?a.set(-c.y,
-c.x,0):a.set(0,-c.z,c.y)):a.crossVectors(c,d);this._x=a.x;this._y=a.y;this._z=a.z;this._w=b;return this.normalize()}}(),inverse:function(){return this.conjugate().normalize()},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,f=a._w,g=b._x,h=b._y,k=b._z,m=b._w;this._x=c*m+f*g+d*k-e*h;this._y=d*m+f*h+e*g-c*k;this._z=e*m+f*k+c*h-d*g;this._w=f*m-c*g-d*h-e*k;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;var h=Math.sqrt(1-g*g);
-if(.001>Math.abs(h))return this._w=.5*(f+this._w),this._x=.5*(c+this._x),this._y=.5*(d+this._y),this._z=.5*(e+this._z),this;var k=Math.atan2(h,g),g=Math.sin((1-b)*k)/h,h=Math.sin(b*k)/h;this._w=f*g+this._w*h;this._x=c*g+this._x*h;this._y=d*g+this._y*h;this._z=e*g+this._z*h;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},onChange:function(a){this.onChangeCallback=a;return this},onChangeCallback:function(){}};Object.assign(da,{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],k=c[d+1],m=c[d+2];c=c[d+3];d=e[f+0];var l=e[f+1],p=e[f+2];e=e[f+3];if(c!==e||h!==d||k!==l||m!==p){f=1-g;var n=h*d+k*l+m*p+c*e,r=0<=
-n?1:-1,w=1-n*n;w>Number.EPSILON&&(w=Math.sqrt(w),n=Math.atan2(w,n*r),f=Math.sin(f*n)/w,g=Math.sin(g*n)/w);r*=g;h=h*f+d*r;k=k*f+l*r;m=m*f+p*r;c=c*f+e*r;f===1-g&&(g=1/Math.sqrt(h*h+k*k+m*m+c*c),h*=g,k*=g,m*=g,c*=g)}a[b]=h;a[b+1]=k;a[b+2]=m;a[b+3]=c}});q.prototype={constructor:q,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){isFinite(a)?(this.x*=a,this.y*=a,this.z*=a):this.z=this.y=this.x=0;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(){var a;return function(b){!1===(b&&b.isEuler)&&console.error("THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.");void 0===a&&(a=new da);return this.applyQuaternion(a.setFromEuler(b))}}(),applyAxisAngle:function(){var a;return function(b,c){void 0===a&&(a=new da);return this.applyQuaternion(a.setFromAxisAngle(b,c))}}(),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},applyMatrix4: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+a[12];this.y=a[1]*b+a[5]*c+a[9]*d+a[13];this.z=a[2]*b+a[6]*c+a[10]*d+a[14];return this},applyProjection: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,k=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+k*-g-m*-f;this.y=k*a+b*-f+m*-e-h*-g;this.z=m*a+b*-g+h*-f-k*-e;return this},project:function(){var a;return function(b){void 0===a&&(a=new H);a.multiplyMatrices(b.projectionMatrix,a.getInverse(b.matrixWorld));return this.applyProjection(a)}}(),unproject:function(){var a;return function(b){void 0===a&&(a=new H);
-a.multiplyMatrices(b.matrixWorld,a.getInverse(b.projectionMatrix));return this.applyProjection(a)}}(),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(){var a,b;return function(c,d){void 0===a&&(a=new q,b=new q);a.set(c,c,c);b.set(d,d,d);return this.clamp(a,b)}}(),clampLength:function(a,b){var c=this.length();return this.multiplyScalar(Math.max(a,
-Math.min(b,c))/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)},lengthManhattan:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)},normalize:function(){return this.divideScalar(this.length())},setLength:function(a){return this.multiplyScalar(a/
-this.length())},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){return this.subVectors(b,a).multiplyScalar(c).add(a)},cross:function(a,b){if(void 0!==b)return console.warn("THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead."),this.crossVectors(a,b);var c=this.x,d=this.y,e=this.z;this.x=d*a.z-e*a.y;this.y=e*a.x-c*a.z;this.z=c*a.y-d*a.x;return this},crossVectors:function(a,b){var c=
-a.x,d=a.y,e=a.z,f=b.x,g=b.y,h=b.z;this.x=d*h-e*g;this.y=e*f-c*h;this.z=c*g-d*f;return this},projectOnVector:function(a){var b=a.dot(this)/a.lengthSq();return this.copy(a).multiplyScalar(b)},projectOnPlane:function(){var a;return function(b){void 0===a&&(a=new q);a.copy(this).projectOnVector(b);return this.sub(a)}}(),reflect:function(){var a;return function(b){void 0===a&&(a=new q);return this.sub(a.copy(b).multiplyScalar(2*this.dot(b)))}}(),angleTo:function(a){a=this.dot(a)/Math.sqrt(this.lengthSq()*
-a.lengthSq());return Math.acos(Q.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},distanceToManhattan:function(a){return Math.abs(this.x-a.x)+Math.abs(this.y-a.y)+Math.abs(this.z-a.z)},setFromSpherical:function(a){var b=Math.sin(a.phi)*a.radius;this.x=b*Math.sin(a.theta);this.y=Math.cos(a.phi)*a.radius;this.z=b*Math.cos(a.theta);return this},setFromCylindrical:function(a){this.x=
-a.radius*Math.sin(a.theta);this.y=a.y;this.z=a.radius*Math.cos(a.theta);return this},setFromMatrixPosition:function(a){return this.setFromMatrixColumn(a,3)},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){if("number"===typeof a){console.warn("THREE.Vector3: setFromMatrixColumn now expects ( matrix, index ).");var c=
-a;a=b;b=c}return this.fromArray(a.elements,4*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},fromAttribute:function(a,b,c){void 0!==c&&console.warn("THREE.Vector3: offset has been removed from .fromAttribute().");this.x=a.getX(b);this.y=a.getY(b);this.z=a.getZ(b);return this}};
-H.prototype={constructor:H,isMatrix4:!0,set:function(a,b,c,d,e,f,g,h,k,m,l,p,n,r,w,u){var q=this.elements;q[0]=a;q[4]=b;q[8]=c;q[12]=d;q[1]=e;q[5]=f;q[9]=g;q[13]=h;q[2]=k;q[6]=m;q[10]=l;q[14]=p;q[3]=n;q[7]=r;q[11]=w;q[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 H).fromArray(this.elements)},copy:function(a){this.elements.set(a.elements);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(){var a;return function(b){void 0===a&&(a=new q);var c=this.elements,d=b.elements,e=1/a.setFromMatrixColumn(b,0).length(),f=1/a.setFromMatrixColumn(b,1).length();b=1/a.setFromMatrixColumn(b,2).length();c[0]=d[0]*e;
-c[1]=d[1]*e;c[2]=d[2]*e;c[4]=d[4]*f;c[5]=d[5]*f;c[6]=d[6]*f;c[8]=d[8]*b;c[9]=d[9]*b;c[10]=d[10]*b;return this}}(),makeRotationFromEuler:function(a){!1===(a&&a.isEuler)&&console.error("THREE.Matrix: .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),g=Math.cos(d),d=Math.sin(d),h=Math.cos(e),e=Math.sin(e);if("XYZ"===a.order){a=f*h;var k=f*e,m=c*h,l=c*e;b[0]=g*h;b[4]=-g*e;b[8]=d;b[1]=k+m*d;b[5]=a-
-l*d;b[9]=-c*g;b[2]=l-a*d;b[6]=m+k*d;b[10]=f*g}else"YXZ"===a.order?(a=g*h,k=g*e,m=d*h,l=d*e,b[0]=a+l*c,b[4]=m*c-k,b[8]=f*d,b[1]=f*e,b[5]=f*h,b[9]=-c,b[2]=k*c-m,b[6]=l+a*c,b[10]=f*g):"ZXY"===a.order?(a=g*h,k=g*e,m=d*h,l=d*e,b[0]=a-l*c,b[4]=-f*e,b[8]=m+k*c,b[1]=k+m*c,b[5]=f*h,b[9]=l-a*c,b[2]=-f*d,b[6]=c,b[10]=f*g):"ZYX"===a.order?(a=f*h,k=f*e,m=c*h,l=c*e,b[0]=g*h,b[4]=m*d-k,b[8]=a*d+l,b[1]=g*e,b[5]=l*d+a,b[9]=k*d-m,b[2]=-d,b[6]=c*g,b[10]=f*g):"YZX"===a.order?(a=f*g,k=f*d,m=c*g,l=c*d,b[0]=g*h,b[4]=l-
-a*e,b[8]=m*e+k,b[1]=e,b[5]=f*h,b[9]=-c*h,b[2]=-d*h,b[6]=k*e+m,b[10]=a-l*e):"XZY"===a.order&&(a=f*g,k=f*d,m=c*g,l=c*d,b[0]=g*h,b[4]=-e,b[8]=d*h,b[1]=a*e+l,b[5]=f*h,b[9]=k*e-m,b[2]=m*e-k,b[6]=c*h,b[10]=l*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){var b=this.elements,c=a.x,d=a.y,e=a.z,f=a.w,g=c+c,h=d+d,k=e+e;a=c*g;var m=c*h,c=c*k,l=d*h,d=d*k,e=e*k,g=f*g,h=f*h,f=f*k;b[0]=1-(l+e);b[4]=m-f;b[8]=c+h;b[1]=m+f;b[5]=1-(a+e);b[9]=d-g;b[2]=c-
-h;b[6]=d+g;b[10]=1-(a+l);b[3]=0;b[7]=0;b[11]=0;b[12]=0;b[13]=0;b[14]=0;b[15]=1;return this},lookAt:function(){var a,b,c;return function(d,e,f){void 0===a&&(a=new q,b=new q,c=new q);var g=this.elements;c.subVectors(d,e).normalize();0===c.lengthSq()&&(c.z=1);a.crossVectors(f,c).normalize();0===a.lengthSq()&&(c.z+=1E-4,a.crossVectors(f,c).normalize());b.crossVectors(c,a);g[0]=a.x;g[4]=b.x;g[8]=c.x;g[1]=a.y;g[5]=b.y;g[9]=c.y;g[2]=a.z;g[6]=b.z;g[10]=c.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,e=this.elements,f=c[0],g=c[4],h=c[8],k=c[12],m=c[1],l=c[5],p=c[9],n=c[13],r=c[2],w=c[6],u=c[10],q=c[14],t=c[3],v=c[7],M=c[11],c=c[15],z=d[0],A=d[4],I=d[8],E=d[12],K=d[1],y=d[5],J=d[9],C=d[13],D=d[2],G=d[6],
-H=d[10],O=d[14],P=d[3],R=d[7],T=d[11],d=d[15];e[0]=f*z+g*K+h*D+k*P;e[4]=f*A+g*y+h*G+k*R;e[8]=f*I+g*J+h*H+k*T;e[12]=f*E+g*C+h*O+k*d;e[1]=m*z+l*K+p*D+n*P;e[5]=m*A+l*y+p*G+n*R;e[9]=m*I+l*J+p*H+n*T;e[13]=m*E+l*C+p*O+n*d;e[2]=r*z+w*K+u*D+q*P;e[6]=r*A+w*y+u*G+q*R;e[10]=r*I+w*J+u*H+q*T;e[14]=r*E+w*C+u*O+q*d;e[3]=t*z+v*K+M*D+c*P;e[7]=t*A+v*y+M*G+c*R;e[11]=t*I+v*J+M*H+c*T;e[15]=t*E+v*C+M*O+c*d;return this},multiplyToArray:function(a,b,c){var d=this.elements;this.multiplyMatrices(a,b);c[0]=d[0];c[1]=d[1];c[2]=
-d[2];c[3]=d[3];c[4]=d[4];c[5]=d[5];c[6]=d[6];c[7]=d[7];c[8]=d[8];c[9]=d[9];c[10]=d[10];c[11]=d[11];c[12]=d[12];c[13]=d[13];c[14]=d[14];c[15]=d[15];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},applyToVector3Array:function(){var a;return function(b,c,d){void 0===a&&(a=new q);void 0===c&&(c=0);void 0===d&&(d=b.length);for(var e=0;e<d;e+=3,c+=
-3)a.fromArray(b,c),a.applyMatrix4(this),a.toArray(b,c);return b}}(),applyToBufferAttribute:function(){var a;return function(b){void 0===a&&(a=new q);for(var c=0,d=b.count;c<d;c++)a.x=b.getX(c),a.y=b.getY(c),a.z=b.getZ(c),a.applyMatrix4(this),b.setXYZ(c,a.x,a.y,a.z);return b}}(),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],k=a[13],m=a[2],l=a[6],p=a[10],n=a[14];return a[3]*(+e*h*l-d*k*l-e*g*p+c*k*p+d*g*n-c*h*n)+a[7]*(+b*h*n-b*k*p+e*f*p-d*f*n+d*k*m-e*h*
-m)+a[11]*(+b*k*l-b*g*n-e*f*l+c*f*n+e*g*m-c*k*m)+a[15]*(-d*g*m-b*h*l+b*g*p+d*f*l-c*f*p+c*h*m)},transpose:function(){var a=this.elements,b;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){var b=this.elements;b[12]=a.x;b[13]=a.y;b[14]=a.z;return this},getInverse:function(a,b){var c=this.elements,d=a.elements,e=d[0],f=d[1],g=d[2],h=d[3],k=d[4],m=d[5],l=d[6],p=d[7],
-n=d[8],r=d[9],w=d[10],u=d[11],q=d[12],t=d[13],v=d[14],d=d[15],M=r*v*p-t*w*p+t*l*u-m*v*u-r*l*d+m*w*d,z=q*w*p-n*v*p-q*l*u+k*v*u+n*l*d-k*w*d,A=n*t*p-q*r*p+q*m*u-k*t*u-n*m*d+k*r*d,I=q*r*l-n*t*l-q*m*w+k*t*w+n*m*v-k*r*v,E=e*M+f*z+g*A+h*I;if(0===E){if(!0===b)throw Error("THREE.Matrix4.getInverse(): can't invert matrix, determinant is 0");console.warn("THREE.Matrix4.getInverse(): can't invert matrix, determinant is 0");return this.identity()}E=1/E;c[0]=M*E;c[1]=(t*w*h-r*v*h-t*g*u+f*v*u+r*g*d-f*w*d)*E;c[2]=
-(m*v*h-t*l*h+t*g*p-f*v*p-m*g*d+f*l*d)*E;c[3]=(r*l*h-m*w*h-r*g*p+f*w*p+m*g*u-f*l*u)*E;c[4]=z*E;c[5]=(n*v*h-q*w*h+q*g*u-e*v*u-n*g*d+e*w*d)*E;c[6]=(q*l*h-k*v*h-q*g*p+e*v*p+k*g*d-e*l*d)*E;c[7]=(k*w*h-n*l*h+n*g*p-e*w*p-k*g*u+e*l*u)*E;c[8]=A*E;c[9]=(q*r*h-n*t*h-q*f*u+e*t*u+n*f*d-e*r*d)*E;c[10]=(k*t*h-q*m*h+q*f*p-e*t*p-k*f*d+e*m*d)*E;c[11]=(n*m*h-k*r*h-n*f*p+e*r*p+k*f*u-e*m*u)*E;c[12]=I*E;c[13]=(n*t*g-q*r*g+q*f*w-e*t*w-n*f*v+e*r*v)*E;c[14]=(q*m*g-k*t*g-q*f*l+e*t*l+k*f*v-e*m*v)*E;c[15]=(k*r*g-n*m*g+n*f*l-
-e*r*l-k*f*w+e*m*w)*E;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),d=Math.sin(b),e=1-c,f=a.x,g=a.y,h=a.z,k=e*f,m=e*g;this.set(k*f+c,k*g-d*h,k*h+d*g,0,k*g+d*h,m*g+c,m*h-d*f,0,k*h-d*g,m*h+d*f,e*h*h+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){this.makeRotationFromQuaternion(b);this.scale(c);this.setPosition(a);return this},decompose:function(){var a,b;return function(c,d,e){void 0===a&&(a=new q,b=new H);var f=this.elements,g=a.set(f[0],f[1],f[2]).length(),h=a.set(f[4],f[5],f[6]).length(),k=a.set(f[8],f[9],f[10]).length();0>this.determinant()&&(g=-g);c.x=
-f[12];c.y=f[13];c.z=f[14];b.elements.set(this.elements);c=1/g;var f=1/h,m=1/k;b.elements[0]*=c;b.elements[1]*=c;b.elements[2]*=c;b.elements[4]*=f;b.elements[5]*=f;b.elements[6]*=f;b.elements[8]*=m;b.elements[9]*=m;b.elements[10]*=m;d.setFromRotationMatrix(b);e.x=g;e.y=h;e.z=k;return this}}(),makeFrustum:function(a,b,c,d,e,f){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/(d-c);g[9]=(d+c)/(d-c);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},makePerspective:function(a,b,c,d){a=c*Math.tan(Q.DEG2RAD*a*.5);var e=-a;return this.makeFrustum(e*b,a*b,e,a,c,d)},makeOrthographic:function(a,b,c,d,e,f){var g=this.elements,h=1/(b-a),k=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*k;g[9]=0;g[13]=-((c+d)*k);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}};Za.prototype=Object.create(ea.prototype);Za.prototype.constructor=Za;Za.prototype.isCubeTexture=!0;Object.defineProperty(Za.prototype,
-"images",{get:function(){return this.image},set:function(a){this.image=a}});var se=new ea,te=new Za,pe=[],re=[];xe.prototype.setValue=function(a,b){for(var c=this.seq,d=0,e=c.length;d!==e;++d){var f=c[d];f.setValue(a,b[f.id])}};var Id=/([\w\d_]+)(\])?(\[|\.)?/g;$a.prototype.setValue=function(a,b,c){b=this.map[b];void 0!==b&&b.setValue(a,c,this.renderer)};$a.prototype.set=function(a,b,c){var d=this.map[c];void 0!==d&&d.setValue(a,b[c],this.renderer)};$a.prototype.setOptional=function(a,b,c){b=b[c];
-void 0!==b&&this.setValue(a,c,b)};$a.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)}};$a.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 Ja={merge:function(a){for(var b={},c=0;c<a.length;c++){var d=this.clone(a[c]),e;for(e in d)b[e]=d[e]}return b},clone:function(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}},Z={alphamap_fragment:"#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\n#endif\n",alphamap_pars_fragment:"#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif\n",alphatest_fragment:"#ifdef ALPHATEST\n\tif ( diffuseColor.a < ALPHATEST ) discard;\n#endif\n",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( PHYSICAL )\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.specularRoughness );\n\t#endif\n#endif\n",
-aomap_pars_fragment:"#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n#endif",begin_vertex:"\nvec3 transformed = vec3( position );\n",beginnormal_vertex:"\nvec3 objectNormal = vec3( normal );\n",bsdfs:"float punctualLightIntensityToIrradianceFactor( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n\t\tif( decayExponent > 0.0 ) {\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\t\t\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\t\t\tfloat maxDistanceCutoffFactor = pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t\t\treturn distanceFalloff * maxDistanceCutoffFactor;\n#else\n\t\t\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\n#endif\n\t\t}\n\t\treturn 1.0;\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}\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 GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNL = saturate( dot( geometry.normal, incidentLight.direction ) );\n\tfloat dotNV = saturate( dot( geometry.normal, 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_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\tfloat D = D_GGX( alpha, dotNH );\n\treturn F * ( G * D );\n}\nvec2 ltcTextureCoords( const in GeometricContext geometry, 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\tvec3 N = geometry.normal;\n\tvec3 V = geometry.viewDir;\n\tvec3 P = geometry.position;\n\tfloat theta = acos( dot( N, V ) );\n\tvec2 uv = vec2(\n\t\tsqrt( saturate( roughness ) ),\n\t\tsaturate( theta / ( 0.5 * PI ) ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nvoid clipQuadToHorizon( inout vec3 L[5], out int n ) {\n\tint config = 0;\n\tif ( L[0].z > 0.0 ) config += 1;\n\tif ( L[1].z > 0.0 ) config += 2;\n\tif ( L[2].z > 0.0 ) config += 4;\n\tif ( L[3].z > 0.0 ) config += 8;\n\tn = 0;\n\tif ( config == 0 ) {\n\t} else if ( config == 1 ) {\n\t\tn = 3;\n\t\tL[1] = -L[1].z * L[0] + L[0].z * L[1];\n\t\tL[2] = -L[3].z * L[0] + L[0].z * L[3];\n\t} else if ( config == 2 ) {\n\t\tn = 3;\n\t\tL[0] = -L[0].z * L[1] + L[1].z * L[0];\n\t\tL[2] = -L[2].z * L[1] + L[1].z * L[2];\n\t} else if ( config == 3 ) {\n\t\tn = 4;\n\t\tL[2] = -L[2].z * L[1] + L[1].z * L[2];\n\t\tL[3] = -L[3].z * L[0] + L[0].z * L[3];\n\t} else if ( config == 4 ) {\n\t\tn = 3;\n\t\tL[0] = -L[3].z * L[2] + L[2].z * L[3];\n\t\tL[1] = -L[1].z * L[2] + L[2].z * L[1];\n\t} else if ( config == 5 ) {\n\t\tn = 0;\n\t} else if ( config == 6 ) {\n\t\tn = 4;\n\t\tL[0] = -L[0].z * L[1] + L[1].z * L[0];\n\t\tL[3] = -L[3].z * L[2] + L[2].z * L[3];\n\t} else if ( config == 7 ) {\n\t\tn = 5;\n\t\tL[4] = -L[3].z * L[0] + L[0].z * L[3];\n\t\tL[3] = -L[3].z * L[2] + L[2].z * L[3];\n\t} else if ( config == 8 ) {\n\t\tn = 3;\n\t\tL[0] = -L[0].z * L[3] + L[3].z * L[0];\n\t\tL[1] = -L[2].z * L[3] + L[3].z * L[2];\n\t\tL[2] =  L[3];\n\t} else if ( config == 9 ) {\n\t\tn = 4;\n\t\tL[1] = -L[1].z * L[0] + L[0].z * L[1];\n\t\tL[2] = -L[2].z * L[3] + L[3].z * L[2];\n\t} else if ( config == 10 ) {\n\t\tn = 0;\n\t} else if ( config == 11 ) {\n\t\tn = 5;\n\t\tL[4] = L[3];\n\t\tL[3] = -L[2].z * L[3] + L[3].z * L[2];\n\t\tL[2] = -L[2].z * L[1] + L[1].z * L[2];\n\t} else if ( config == 12 ) {\n\t\tn = 4;\n\t\tL[1] = -L[1].z * L[2] + L[2].z * L[1];\n\t\tL[0] = -L[0].z * L[3] + L[3].z * L[0];\n\t} else if ( config == 13 ) {\n\t\tn = 5;\n\t\tL[4] = L[3];\n\t\tL[3] = L[2];\n\t\tL[2] = -L[1].z * L[2] + L[2].z * L[1];\n\t\tL[1] = -L[1].z * L[0] + L[0].z * L[1];\n\t} else if ( config == 14 ) {\n\t\tn = 5;\n\t\tL[4] = -L[0].z * L[3] + L[3].z * L[0];\n\t\tL[0] = -L[0].z * L[1] + L[1].z * L[0];\n\t} else if ( config == 15 ) {\n\t\tn = 4;\n\t}\n\tif ( n == 3 )\n\t\tL[3] = L[0];\n\tif ( n == 4 )\n\t\tL[4] = L[0];\n}\nfloat integrateLtcBrdfOverRectEdge( vec3 v1, vec3 v2 ) {\n\tfloat cosTheta = dot( v1, v2 );\n\tfloat theta = acos( cosTheta );\n\tfloat res = cross( v1, v2 ).z * ( ( theta > 0.001 ) ? theta / sin( theta ) : 1.0 );\n\treturn res;\n}\nvoid initRectPoints( const in vec3 pos, const in vec3 halfWidth, const in vec3 halfHeight, out vec3 rectPoints[4] ) {\n\trectPoints[0] = pos - halfWidth - halfHeight;\n\trectPoints[1] = pos + halfWidth - halfHeight;\n\trectPoints[2] = pos + halfWidth + halfHeight;\n\trectPoints[3] = pos - halfWidth + halfHeight;\n}\nvec3 integrateLtcBrdfOverRect( const in GeometricContext geometry, const in mat3 brdfMat, const in vec3 rectPoints[4] ) {\n\tvec3 N = geometry.normal;\n\tvec3 V = geometry.viewDir;\n\tvec3 P = geometry.position;\n\tvec3 T1, T2;\n\tT1 = normalize(V - N * dot( V, N ));\n\tT2 = - cross( N, T1 );\n\tmat3 brdfWrtSurface = brdfMat * transpose( mat3( T1, T2, N ) );\n\tvec3 clippedRect[5];\n\tclippedRect[0] = brdfWrtSurface * ( rectPoints[0] - P );\n\tclippedRect[1] = brdfWrtSurface * ( rectPoints[1] - P );\n\tclippedRect[2] = brdfWrtSurface * ( rectPoints[2] - P );\n\tclippedRect[3] = brdfWrtSurface * ( rectPoints[3] - P );\n\tint n;\n\tclipQuadToHorizon(clippedRect, n);\n\tif ( n == 0 )\n\t\treturn vec3( 0, 0, 0 );\n\tclippedRect[0] = normalize( clippedRect[0] );\n\tclippedRect[1] = normalize( clippedRect[1] );\n\tclippedRect[2] = normalize( clippedRect[2] );\n\tclippedRect[3] = normalize( clippedRect[3] );\n\tclippedRect[4] = normalize( clippedRect[4] );\n\tfloat sum = 0.0;\n\tsum += integrateLtcBrdfOverRectEdge( clippedRect[0], clippedRect[1] );\n\tsum += integrateLtcBrdfOverRectEdge( clippedRect[1], clippedRect[2] );\n\tsum += integrateLtcBrdfOverRectEdge( clippedRect[2], clippedRect[3] );\n\tif (n >= 4)\n\t\tsum += integrateLtcBrdfOverRectEdge( clippedRect[3], clippedRect[4] );\n\tif (n == 5)\n\t\tsum += integrateLtcBrdfOverRectEdge( clippedRect[4], clippedRect[0] );\n\tsum = max( 0.0, sum );\n\tvec3 Lo_i = vec3( sum, sum, sum );\n\treturn Lo_i;\n}\nvec3 Rect_Area_Light_Specular_Reflectance(\n\t\tconst in GeometricContext geometry,\n\t\tconst in vec3 lightPos, const in vec3 lightHalfWidth, const in vec3 lightHalfHeight,\n\t\tconst in float roughness,\n\t\tconst in sampler2D ltcMat, const in sampler2D ltcMag ) {\n\tvec3 rectPoints[4];\n\tinitRectPoints( lightPos, lightHalfWidth, lightHalfHeight, rectPoints );\n\tvec2 uv = ltcTextureCoords( geometry, roughness );\n\tvec4 brdfLtcApproxParams, t;\n\tbrdfLtcApproxParams = texture2D( ltcMat, uv );\n\tt = texture2D( ltcMat, uv );\n\tfloat brdfLtcScalar = texture2D( ltcMag, uv ).a;\n\tmat3 brdfLtcApproxMat = mat3(\n\t\tvec3(   1,   0, t.y ),\n\t\tvec3(   0, t.z,   0 ),\n\t\tvec3( t.w,   0, t.x )\n\t);\n\tvec3 specularReflectance = integrateLtcBrdfOverRect( geometry, brdfLtcApproxMat, rectPoints );\n\tspecularReflectance *= brdfLtcScalar;\n\treturn specularReflectance;\n}\nvec3 Rect_Area_Light_Diffuse_Reflectance(\n\t\tconst in GeometricContext geometry,\n\t\tconst in vec3 lightPos, const in vec3 lightHalfWidth, const in vec3 lightHalfHeight ) {\n\tvec3 rectPoints[4];\n\tinitRectPoints( lightPos, lightHalfWidth, lightHalfHeight, rectPoints );\n\tmat3 diffuseBrdfMat = mat3(1);\n\tvec3 diffuseReflectance = integrateLtcBrdfOverRect( geometry, diffuseBrdfMat, rectPoints );\n\treturn diffuseReflectance;\n}\nvec3 BRDF_Specular_GGX_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\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\tvec2 AB = vec2( -1.04, 1.04 ) * a004 + r.zw;\n\treturn specularColor * AB.x + AB.y;\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",
-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 = dFdx( surf_pos );\n\t\tvec3 vSigmaY = dFdy( surf_pos );\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\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\t}\n#endif\n",
-clipping_planes_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; ++ i ) {\n\t\tvec4 plane = clippingPlanes[ i ];\n\t\tif ( dot( vViewPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t\t\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; ++ i ) {\n\t\t\tvec4 plane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vViewPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\tif ( clipped ) discard;\n\t\n\t#endif\n#endif\n",
-clipping_planes_pars_fragment:"#if NUM_CLIPPING_PLANES > 0\n\t#if ! defined( PHYSICAL ) && ! defined( PHONG )\n\t\tvarying vec3 vViewPosition;\n\t#endif\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif\n",clipping_planes_pars_vertex:"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\n\tvarying vec3 vViewPosition;\n#endif\n",clipping_planes_vertex:"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n",
-color_fragment:"#ifdef USE_COLOR\n\tdiffuseColor.rgb *= vColor;\n#endif",color_pars_fragment:"#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif\n",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#define saturate(a) clamp( a, 0.0, 1.0 )\n#define whiteCompliment(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}\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};\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 transpose( const in mat3 v ) {\n\tmat3 tmp;\n\ttmp[0] = vec3(v[0].x, v[1].x, v[2].x);\n\ttmp[1] = vec3(v[0].y, v[1].y, v[2].y);\n\ttmp[2] = vec3(v[0].z, v[1].z, v[2].z);\n\treturn tmp;\n}\n",
-cube_uv_reflection_fragment:"#ifdef ENVMAP_TYPE_CUBE_UV\n#define cubeUV_textureSize (1024.0)\nint getFaceFromDirection(vec3 direction) {\n\tvec3 absDirection = abs(direction);\n\tint face = -1;\n\tif( absDirection.x > absDirection.z ) {\n\t\tif(absDirection.x > absDirection.y )\n\t\t\tface = direction.x > 0.0 ? 0 : 3;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\telse {\n\t\tif(absDirection.z > absDirection.y )\n\t\t\tface = direction.z > 0.0 ? 2 : 5;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\treturn face;\n}\n#define cubeUV_maxLods1  (log2(cubeUV_textureSize*0.25) - 1.0)\n#define cubeUV_rangeClamp (exp2((6.0 - 1.0) * 2.0))\nvec2 MipLevelInfo( vec3 vec, float roughnessLevel, float roughness ) {\n\tfloat scale = exp2(cubeUV_maxLods1 - roughnessLevel);\n\tfloat dxRoughness = dFdx(roughness);\n\tfloat dyRoughness = dFdy(roughness);\n\tvec3 dx = dFdx( vec * scale * dxRoughness );\n\tvec3 dy = dFdy( vec * scale * dyRoughness );\n\tfloat d = max( dot( dx, dx ), dot( dy, dy ) );\n\td = clamp(d, 1.0, cubeUV_rangeClamp);\n\tfloat mipLevel = 0.5 * log2(d);\n\treturn vec2(floor(mipLevel), fract(mipLevel));\n}\n#define cubeUV_maxLods2 (log2(cubeUV_textureSize*0.25) - 2.0)\n#define cubeUV_rcpTextureSize (1.0 / cubeUV_textureSize)\nvec2 getCubeUV(vec3 direction, float roughnessLevel, float mipLevel) {\n\tmipLevel = roughnessLevel > cubeUV_maxLods2 - 3.0 ? 0.0 : mipLevel;\n\tfloat a = 16.0 * cubeUV_rcpTextureSize;\n\tvec2 exp2_packed = exp2( vec2( roughnessLevel, mipLevel ) );\n\tvec2 rcp_exp2_packed = vec2( 1.0 ) / exp2_packed;\n\tfloat powScale = exp2_packed.x * exp2_packed.y;\n\tfloat scale = rcp_exp2_packed.x * rcp_exp2_packed.y * 0.25;\n\tfloat mipOffset = 0.75*(1.0 - rcp_exp2_packed.y) * rcp_exp2_packed.x;\n\tbool bRes = mipLevel == 0.0;\n\tscale =  bRes && (scale < a) ? a : scale;\n\tvec3 r;\n\tvec2 offset;\n\tint face = getFaceFromDirection(direction);\n\tfloat rcpPowScale = 1.0 / powScale;\n\tif( face == 0) {\n\t\tr = vec3(direction.x, -direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ?  a : offset.y;\n\t}\n\telse if( face == 1) {\n\t\tr = vec3(direction.y, direction.x, direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ?  a : offset.y;\n\t}\n\telse if( face == 2) {\n\t\tr = vec3(direction.z, direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ?  a : offset.y;\n\t}\n\telse if( face == 3) {\n\t\tr = vec3(direction.x, direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ?  0.0 : offset.y;\n\t}\n\telse if( face == 4) {\n\t\tr = vec3(direction.y, direction.x, -direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ?  0.0 : offset.y;\n\t}\n\telse {\n\t\tr = vec3(direction.z, -direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ?  0.0 : offset.y;\n\t}\n\tr = normalize(r);\n\tfloat texelOffset = 0.5 * cubeUV_rcpTextureSize;\n\tvec2 s = ( r.yz / abs( r.x ) + vec2( 1.0 ) ) * 0.5;\n\tvec2 base = offset + vec2( texelOffset );\n\treturn base + s * ( scale - 2.0 * texelOffset );\n}\n#define cubeUV_maxLods3 (log2(cubeUV_textureSize*0.25) - 3.0)\nvec4 textureCubeUV(vec3 reflectedDirection, float roughness ) {\n\tfloat roughnessVal = roughness* cubeUV_maxLods3;\n\tfloat r1 = floor(roughnessVal);\n\tfloat r2 = r1 + 1.0;\n\tfloat t = fract(roughnessVal);\n\tvec2 mipInfo = MipLevelInfo(reflectedDirection, r1, roughness);\n\tfloat s = mipInfo.y;\n\tfloat level0 = mipInfo.x;\n\tfloat level1 = level0 + 1.0;\n\tlevel1 = level1 > 5.0 ? 5.0 : level1;\n\tlevel0 += min( floor( s + 0.5 ), 5.0 );\n\tvec2 uv_10 = getCubeUV(reflectedDirection, r1, level0);\n\tvec4 color10 = envMapTexelToLinear(texture2D(envMap, uv_10));\n\tvec2 uv_20 = getCubeUV(reflectedDirection, r2, level0);\n\tvec4 color20 = envMapTexelToLinear(texture2D(envMap, uv_20));\n\tvec4 result = mix(color10, color20, t);\n\treturn vec4(result.rgb, 1.0);\n}\n#endif\n",
-defaultnormal_vertex:"#ifdef FLIP_SIDED\n\tobjectNormal = -objectNormal;\n#endif\nvec3 transformedNormal = normalMatrix * objectNormal;\n",displacementmap_pars_vertex:"#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif\n",displacementmap_vertex:"#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normal * ( texture2D( displacementMap, uv ).x * displacementScale + displacementBias );\n#endif\n",emissivemap_fragment:"#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif\n",
-emissivemap_pars_fragment:"#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif\n",encodings_fragment:"  gl_FragColor = linearToOutputTexel( gl_FragColor );\n",encodings_pars_fragment:"\nvec4 LinearToLinear( in vec4 value ) {\n  return value;\n}\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\n  return vec4( pow( value.xyz, vec3( gammaFactor ) ), value.w );\n}\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\n  return vec4( pow( value.xyz, vec3( 1.0 / gammaFactor ) ), value.w );\n}\nvec4 sRGBToLinear( in vec4 value ) {\n  return 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.w );\n}\nvec4 LinearTosRGB( in vec4 value ) {\n  return 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.w );\n}\nvec4 RGBEToLinear( in vec4 value ) {\n  return vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\n}\nvec4 LinearToRGBE( in vec4 value ) {\n  float maxComponent = max( max( value.r, value.g ), value.b );\n  float fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\n  return vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\n}\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\n  return vec4( value.xyz * value.w * maxRange, 1.0 );\n}\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\n  float maxRGB = max( value.x, max( value.g, value.b ) );\n  float M      = clamp( maxRGB / maxRange, 0.0, 1.0 );\n  M            = ceil( M * 255.0 ) / 255.0;\n  return vec4( value.rgb / ( M * maxRange ), M );\n}\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\n    return vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\n}\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\n    float maxRGB = max( value.x, max( value.g, value.b ) );\n    float D      = max( maxRange / maxRGB, 1.0 );\n    D            = min( floor( D ) / 255.0, 1.0 );\n    return 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  vec3 Xp_Y_XYZp = value.rgb * cLogLuvM;\n  Xp_Y_XYZp = max(Xp_Y_XYZp, vec3(1e-6, 1e-6, 1e-6));\n  vec4 vResult;\n  vResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\n  float Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\n  vResult.w = fract(Le);\n  vResult.z = (Le - (floor(vResult.w*255.0))/255.0)/255.0;\n  return 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  float Le = value.z * 255.0 + value.w;\n  vec3 Xp_Y_XYZp;\n  Xp_Y_XYZp.y = exp2((Le - 127.0) / 2.0);\n  Xp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\n  Xp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\n  vec3 vRGB = Xp_Y_XYZp.rgb * cLogLuvInverseM;\n  return vec4( max(vRGB, 0.0), 1.0 );\n}\n",
-envmap_fragment:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToVertex, 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, flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\tvec2 sampleUV;\n\t\tsampleUV.y = saturate( flipNormal * reflectVec.y * 0.5 + 0.5 );\n\t\tsampleUV.x = atan( flipNormal * reflectVec.z, flipNormal * reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\tvec4 envColor = texture2D( envMap, sampleUV );\n\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\tvec3 reflectView = flipNormal * 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\tenvColor = envMapTexelToLinear( envColor );\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\n",
-envmap_pars_fragment:"#if defined( USE_ENVMAP ) || defined( PHYSICAL )\n\tuniform float reflectivity;\n\tuniform float envMapIntensity;\n#endif\n#ifdef USE_ENVMAP\n\t#if ! defined( PHYSICAL ) && ( defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) )\n\t\tvarying vec3 vWorldPosition;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\tuniform float flipEnvMap;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( PHYSICAL )\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif\n",
-envmap_pars_vertex:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif\n",envmap_vertex:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex = normalize( worldPosition.xyz - cameraPosition );\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\n",
-fog_fragment:"#ifdef USE_FOG\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tfloat depth = gl_FragDepthEXT / gl_FragCoord.w;\n\t#else\n\t\tfloat depth = gl_FragCoord.z / gl_FragCoord.w;\n\t#endif\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * depth * depth * LOG2 ) );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, depth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif\n",fog_pars_fragment:"#ifdef USE_FOG\n\tuniform vec3 fogColor;\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 TOON\n\tuniform sampler2D gradientMap;\n\tvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\t\tfloat dotNL = dot( normal, lightDirection );\n\t\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t\t#ifdef USE_GRADIENTMAP\n\t\t\treturn texture2D( gradientMap, coord ).rgb;\n\t\t#else\n\t\t\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\n\t\t#endif\n\t}\n#endif\n",lightmap_fragment:"#ifdef USE_LIGHTMAP\n\treflectedLight.indirectDiffuse += PI * texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n#endif\n",
-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 = normalize( -mvPosition.xyz );\nGeometricContext backGeometry;\nbackGeometry.position = geometry.position;\nbackGeometry.normal = -geometry.normal;\nbackGeometry.viewDir = geometry.viewDir;\nvLightFront = vec3( 0.0 );\n#ifdef DOUBLE_SIDED\n\tvLightBack = vec3( 0.0 );\n#endif\nIncidentLight directLight;\nfloat dotNL;\nvec3 directLightColor_Diffuse;\n#if NUM_POINT_LIGHTS > 0\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#endif\n#if NUM_SPOT_LIGHTS > 0\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#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t}\n#endif\n#if NUM_DIR_LIGHTS > 0\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#endif\n#if NUM_HEMI_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\tvLightFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\n\t\t#endif\n\t}\n#endif\n",
-lights_pars:"uniform vec3 ambientLightColor;\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\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\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\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\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\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\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 ltcMat;\tuniform sampler2D ltcMag;\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\n#if defined( USE_ENVMAP ) && defined( PHYSICAL )\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\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\tvec4 envMapColor = textureCubeUV( queryVec, 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 blinnShininessExponent, const in int maxMIPLevel ) {\n\t\tfloat maxMIPLevelScalar = float( maxMIPLevel );\n\t\tfloat desiredMIPLevel = maxMIPLevelScalar - 0.79248 - 0.5 * log2( pow2( blinnShininessExponent ) + 1.0 );\n\t\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\n\t}\n\tvec3 getLightProbeIndirectRadiance( const in GeometricContext geometry, const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( -geometry.viewDir, geometry.normal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( -geometry.viewDir, geometry.normal, refractionRatio );\n\t\t#endif\n\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\tfloat specularMIPLevel = getSpecularMIPLevel( blinnShininessExponent, 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\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\tvec4 envMapColor = textureCubeUV(queryReflectVec, BlinnExponentToGGXRoughness(blinnShininessExponent));\n\t\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\t\tvec2 sampleUV;\n\t\t\tsampleUV.y = saturate( reflectVec.y * 0.5 + 0.5 );\n\t\t\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\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\n",
-lights_phong_fragment:"BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;\n",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};\n#if NUM_RECT_AREA_LIGHTS > 0\n    void RE_Direct_RectArea_BlinnPhong( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n        vec3 matDiffColor = material.diffuseColor;\n        vec3 matSpecColor = material.specularColor;\n        vec3 lightColor   = rectAreaLight.color;\n        float roughness = BlinnExponentToGGXRoughness( material.specularShininess );\n        vec3 spec = Rect_Area_Light_Specular_Reflectance(\n                geometry,\n                rectAreaLight.position, rectAreaLight.halfWidth, rectAreaLight.halfHeight,\n                roughness,\n                ltcMat, ltcMag );\n        vec3 diff = Rect_Area_Light_Diffuse_Reflectance(\n                geometry,\n                rectAreaLight.position, rectAreaLight.halfWidth, rectAreaLight.halfHeight );\n        reflectedLight.directSpecular += lightColor * matSpecColor * spec / PI2;\n        reflectedLight.directDiffuse  += lightColor * matDiffColor * diff / PI2;\n    }\n#endif\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\t#ifdef TOON\n\t\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\n\t#else\n\t\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\t\tvec3 irradiance = dotNL * directLight.color;\n\t#endif\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_Direct_RectArea\t\tRE_Direct_RectArea_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong\n#define Material_LightProbeLOD( material )\t(0)\n",
-lights_physical_fragment:"PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nmaterial.specularRoughness = clamp( roughnessFactor, 0.04, 1.0 );\n#ifdef STANDARD\n\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\n\tmaterial.clearCoat = saturate( clearCoat );\tmaterial.clearCoatRoughness = clamp( clearCoatRoughness, 0.04, 1.0 );\n#endif\n",
-lights_physical_pars_fragment:"struct PhysicalMaterial {\n\tvec3\tdiffuseColor;\n\tfloat\tspecularRoughness;\n\tvec3\tspecularColor;\n\t#ifndef STANDARD\n\t\tfloat clearCoat;\n\t\tfloat clearCoatRoughness;\n\t#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    void RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n        vec3 matDiffColor = material.diffuseColor;\n        vec3 matSpecColor = material.specularColor;\n        vec3 lightColor   = rectAreaLight.color;\n        float roughness = material.specularRoughness;\n        vec3 spec = Rect_Area_Light_Specular_Reflectance(\n                geometry,\n                rectAreaLight.position, rectAreaLight.halfWidth, rectAreaLight.halfHeight,\n                roughness,\n                ltcMat, ltcMag );\n        vec3 diff = Rect_Area_Light_Diffuse_Reflectance(\n                geometry,\n                rectAreaLight.position, rectAreaLight.halfWidth, rectAreaLight.halfHeight );\n        reflectedLight.directSpecular += lightColor * matSpecColor * spec;\n        reflectedLight.directDiffuse  += lightColor * matDiffColor * diff;\n    }\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#ifndef STANDARD\n\t\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\n\t#else\n\t\tfloat clearCoatDHR = 0.0;\n\t#endif\n\treflectedLight.directSpecular += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry, material.specularColor, material.specularRoughness );\n\treflectedLight.directDiffuse += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\t#ifndef STANDARD\n\t\treflectedLight.directSpecular += irradiance * material.clearCoat * BRDF_Specular_GGX( directLight, geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\n\t#endif\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 clearCoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t#ifndef STANDARD\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\tfloat dotNL = dotNV;\n\t\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\n\t#else\n\t\tfloat clearCoatDHR = 0.0;\n\t#endif\n\treflectedLight.indirectSpecular += ( 1.0 - clearCoatDHR ) * radiance * BRDF_Specular_GGX_Environment( geometry, material.specularColor, material.specularRoughness );\n\t#ifndef STANDARD\n\t\treflectedLight.indirectSpecular += clearCoatRadiance * material.clearCoat * BRDF_Specular_GGX_Environment( geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\n\t#endif\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\n#define Material_BlinnShininessExponent( material )   GGXRoughnessToBlinnExponent( material.specularRoughness )\n#define Material_ClearCoat_BlinnShininessExponent( material )   GGXRoughnessToBlinnExponent( material.clearCoatRoughness )\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}\n",
-lights_template:"\nGeometricContext geometry;\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = normalize( vViewPosition );\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointDirectLightIrradiance( pointLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( pointLight.shadow, directLight.visible ) ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotDirectLightIrradiance( spotLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( spotLight.shadow, directLight.visible ) ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( directionalLight.shadow, directLight.visible ) ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\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#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\t#ifdef USE_LIGHTMAP\n\t\tvec3 lightMapIrradiance = texture2D( lightMap, vUv2 ).xyz * 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 ( NUM_HEMI_LIGHTS > 0 )\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t}\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( PHYSICAL ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t \tirradiance += getLightProbeIndirectIrradiance( geometry, 8 );\n\t#endif\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tvec3 radiance = getLightProbeIndirectRadiance( geometry, Material_BlinnShininessExponent( material ), 8 );\n\t#ifndef STANDARD\n\t\tvec3 clearCoatRadiance = getLightProbeIndirectRadiance( geometry, Material_ClearCoat_BlinnShininessExponent( material ), 8 );\n\t#else\n\t\tvec3 clearCoatRadiance = vec3( 0.0 );\n\t#endif\n\t\t\n\tRE_IndirectSpecular( radiance, clearCoatRadiance, geometry, material, reflectedLight );\n#endif\n",
-logdepthbuf_fragment:"#if defined(USE_LOGDEPTHBUF) && defined(USE_LOGDEPTHBUF_EXT)\n\tgl_FragDepthEXT = log2(vFragDepth) * logDepthBufFC * 0.5;\n#endif",logdepthbuf_pars_fragment:"#ifdef USE_LOGDEPTHBUF\n\tuniform float logDepthBufFC;\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#endif\n#endif\n",logdepthbuf_pars_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#endif\n\tuniform float logDepthBufFC;\n#endif",logdepthbuf_vertex:"#ifdef USE_LOGDEPTHBUF\n\tgl_Position.z = log2(max( EPSILON, gl_Position.w + 1.0 )) * logDepthBufFC;\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t#else\n\t\tgl_Position.z = (gl_Position.z - 1.0) * gl_Position.w;\n\t#endif\n#endif\n",
-map_fragment:"#ifdef USE_MAP\n\tvec4 texelColor = texture2D( map, vUv );\n\ttexelColor = mapTexelToLinear( texelColor );\n\tdiffuseColor *= texelColor;\n#endif\n",map_pars_fragment:"#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n",map_particle_fragment:"#ifdef USE_MAP\n\tvec4 mapTexel = texture2D( map, vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y ) * offsetRepeat.zw + offsetRepeat.xy );\n\tdiffuseColor *= mapTexelToLinear( mapTexel );\n#endif\n",map_particle_pars_fragment:"#ifdef USE_MAP\n\tuniform vec4 offsetRepeat;\n\tuniform sampler2D map;\n#endif\n",
-metalnessmap_fragment:"float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\tmetalnessFactor *= texelMetalness.r;\n#endif\n",metalnessmap_pars_fragment:"#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif",morphnormal_vertex:"#ifdef USE_MORPHNORMALS\n\tobjectNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\n\tobjectNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\n\tobjectNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\n\tobjectNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\n#endif\n",
-morphtarget_pars_vertex:"#ifdef USE_MORPHTARGETS\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 += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\n\ttransformed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\n\ttransformed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\n\ttransformed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\n\t#ifndef USE_MORPHNORMALS\n\ttransformed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\n\ttransformed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\n\ttransformed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\n\ttransformed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\n\t#endif\n#endif\n",
-normal_flip:"#ifdef DOUBLE_SIDED\n\tfloat flipNormal = ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n#else\n\tfloat flipNormal = 1.0;\n#endif\n",normal_fragment:"#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 ) * flipNormal;\n#endif\n#ifdef USE_NORMALMAP\n\tnormal = perturbNormal2Arb( -vViewPosition, normal );\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\n#endif\n",
-normalmap_pars_fragment:"#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {\n\t\tvec3 q0 = dFdx( eye_pos.xyz );\n\t\tvec3 q1 = dFdy( eye_pos.xyz );\n\t\tvec2 st0 = dFdx( vUv.st );\n\t\tvec2 st1 = dFdy( vUv.st );\n\t\tvec3 S = normalize( q0 * st1.t - q1 * st0.t );\n\t\tvec3 T = normalize( -q0 * st1.s + q1 * st0.s );\n\t\tvec3 N = normalize( surf_norm );\n\t\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t\tmapN.xy = normalScale * mapN.xy;\n\t\tmat3 tsn = mat3( S, T, N );\n\t\treturn normalize( tsn * mapN );\n\t}\n#endif\n",
-packing:"vec3 packNormalToRGB( const in vec3 normal ) {\n  return normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n  return 1.0 - 2.0 * rgb.xyz;\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}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n  return ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\n  return linearClipZ * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n  return (( near + viewZ ) * far ) / (( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\n  return ( near * far ) / ( ( far - near ) * invClipZ - far );\n}\n",
-premultiplied_alpha_fragment:"#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif\n",project_vertex:"#ifdef USE_SKINNING\n\tvec4 mvPosition = modelViewMatrix * skinned;\n#else\n\tvec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\n#endif\ngl_Position = projectionMatrix * mvPosition;\n",roughnessmap_fragment:"float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.r;\n#endif\n",
-roughnessmap_pars_fragment:"#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif",shadowmap_pars_fragment:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n    #if NUM_RECT_AREA_LIGHTS > 0\n    #endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tfloat texture2DShadowLerp( sampler2D depths, vec2 size, vec2 uv, float compare ) {\n\t\tconst vec2 offset = vec2( 0.0, 1.0 );\n\t\tvec2 texelSize = vec2( 1.0 ) / size;\n\t\tvec2 centroidUV = floor( uv * size + 0.5 ) / size;\n\t\tfloat lb = texture2DCompare( depths, centroidUV + texelSize * offset.xx, compare );\n\t\tfloat lt = texture2DCompare( depths, centroidUV + texelSize * offset.xy, compare );\n\t\tfloat rb = texture2DCompare( depths, centroidUV + texelSize * offset.yx, compare );\n\t\tfloat rt = texture2DCompare( depths, centroidUV + texelSize * offset.yy, compare );\n\t\tvec2 f = fract( uv * size + 0.5 );\n\t\tfloat a = mix( lb, lt, f.y );\n\t\tfloat b = mix( rb, rt, f.y );\n\t\tfloat c = mix( a, b, f.x );\n\t\treturn c;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\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\treturn (\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( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, 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( 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 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\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\treturn (\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn 1.0;\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 ) {\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\tfloat dp = ( length( lightToPosition ) - shadowBias ) / 1000.0;\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT )\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\n",
-shadowmap_pars_vertex:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n    #if NUM_RECT_AREA_LIGHTS > 0\n    #endif\n#endif\n",
-shadowmap_vertex:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n    #if NUM_RECT_AREA_LIGHTS > 0\n    #endif\n#endif\n",
-shadowmask_pars_fragment:"float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\tDirectionalLight directionalLight;\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tshadow *= bool( directionalLight.shadow ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\tSpotLight spotLight;\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tshadow *= bool( spotLight.shadow ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\tPointLight pointLight;\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tshadow *= bool( pointLight.shadow ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_RECT_AREA_LIGHTS > 0\n\t#endif\n\t#endif\n\treturn shadow;\n}\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 sampler2D boneTexture;\n\t\tuniform int boneTextureWidth;\n\t\tuniform int boneTextureHeight;\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tfloat j = i * 4.0;\n\t\t\tfloat x = mod( j, float( boneTextureWidth ) );\n\t\t\tfloat y = floor( j / float( boneTextureWidth ) );\n\t\t\tfloat dx = 1.0 / float( boneTextureWidth );\n\t\t\tfloat dy = 1.0 / float( boneTextureHeight );\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\n",
-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\tskinned  = bindMatrixInverse * skinned;\n#endif\n",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#endif\n",
-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  gl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif\n",tonemapping_pars_fragment:"#define saturate(a) clamp( a, 0.0, 1.0 )\nuniform float toneMappingExposure;\nuniform float toneMappingWhitePoint;\nvec3 LinearToneMapping( vec3 color ) {\n  return toneMappingExposure * color;\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n  color *= toneMappingExposure;\n  return 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  color *= toneMappingExposure;\n  return saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n  color *= toneMappingExposure;\n  color = max( vec3( 0.0 ), color - 0.004 );\n  return pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\n",
-uv_pars_fragment:"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n#endif",uv_pars_vertex:"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n\tuniform vec4 offsetRepeat;\n#endif\n",
-uv_vertex:"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvUv = uv * offsetRepeat.zw + offsetRepeat.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#endif",
-uv2_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = uv2;\n#endif",worldpos_vertex:"#if defined( USE_ENVMAP ) || defined( PHONG ) || defined( PHYSICAL ) || defined( LAMBERT ) || defined ( USE_SHADOWMAP )\n\t#ifdef USE_SKINNING\n\t\tvec4 worldPosition = modelMatrix * skinned;\n\t#else\n\t\tvec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\n\t#endif\n#endif\n",cube_frag:"uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tgl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );\n\tgl_FragColor.a *= opacity;\n}\n",
-cube_vert:"varying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n}\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>\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\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( gl_FragCoord.z ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( gl_FragCoord.z );\n\t#endif\n}\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>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <skinbase_vertex>\n\t#include <begin_vertex>\n\t#include <displacementmap_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}\n",
-distanceRGBA_frag:"uniform vec3 lightPos;\nvarying vec4 vWorldPosition;\n#include <common>\n#include <packing>\n#include <clipping_planes_pars_fragment>\nvoid main () {\n\t#include <clipping_planes_fragment>\n\tgl_FragColor = packDepthToRGBA( length( vWorldPosition.xyz - lightPos.xyz ) / 1000.0 );\n}\n",distanceRGBA_vert:"varying vec4 vWorldPosition;\n#include <common>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <skinbase_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\tvWorldPosition = worldPosition;\n}\n",
-equirect_frag:"uniform sampler2D tEquirect;\nuniform float tFlip;\nvarying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvec3 direction = normalize( vWorldPosition );\n\tvec2 sampleUV;\n\tsampleUV.y = saturate( tFlip * direction.y * -0.5 + 0.5 );\n\tsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n}\n",equirect_vert:"varying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n}\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 <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n",
-linedashed_vert:"uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <color_vertex>\n\tvLineDistance = scale * lineDistance;\n\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n}\n",meshbasic_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\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_pars_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\treflectedLight.indirectDiffuse += texture2D( lightMap, vUv2 ).xyz * 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 <normal_flip>\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\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 <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}\n",
-meshlambert_frag:"uniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include <common>\n#include <packing>\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_pars_fragment>\n#include <bsdfs>\n#include <lights_pars>\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\treflectedLight.indirectDiffuse = getAmbientLightIrradiance( ambientLightColor );\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 <normal_flip>\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n",
-meshlambert_vert:"#define LAMBERT\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\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>\n#include <color_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}\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 <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_pars_fragment>\n#include <gradientmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars>\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_flip>\n\t#include <normal_fragment>\n\t#include <emissivemap_fragment>\n\t#include <lights_phong_fragment>\n\t#include <lights_template>\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 <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\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 <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 <displacementmap_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\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <shadowmap_vertex>\n}\n",
-meshphysical_frag:"#define PHYSICAL\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifndef STANDARD\n\tuniform float clearCoat;\n\tuniform float clearCoatRoughness;\n#endif\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <packing>\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_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <cube_uv_reflection_fragment>\n#include <lights_pars>\n#include <lights_physical_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_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 <specularmap_fragment>\n\t#include <roughnessmap_fragment>\n\t#include <metalnessmap_fragment>\n\t#include <normal_flip>\n\t#include <normal_fragment>\n\t#include <emissivemap_fragment>\n\t#include <lights_physical_fragment>\n\t#include <lights_template>\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 <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n",
-meshphysical_vert:"#define PHYSICAL\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 <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <specularmap_pars_fragment>\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 <displacementmap_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\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n}\n",
-normal_frag:"#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED  ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\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>\nvoid main() {\n\t#include <logdepthbuf_fragment>\n\t#include <normal_flip>\n\t#include <normal_fragment>\n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n\t#include <premultiplied_alpha_fragment>\n\t#include <encodings_fragment>\n}\n",
-normal_vert:"#define NORMAL\n#if defined( FLAT_SHADED  ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\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>\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#endif\n\t#include <begin_vertex>\n\t#include <displacementmap_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n#if defined( FLAT_SHADED  ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}\n",
-points_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <color_pars_fragment>\n#include <map_particle_pars_fragment>\n#include <fog_pars_fragment>\n#include <shadowmap_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 <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n",
-points_vert:"uniform float size;\nuniform float scale;\n#include <common>\n#include <color_pars_vertex>\n#include <shadowmap_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 <project_vertex>\n\t#ifdef USE_SIZEATTENUATION\n\t\tgl_PointSize = size * ( scale / - mvPosition.z );\n\t#else\n\t\tgl_PointSize = size;\n\t#endif\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n}\n",
-shadow_frag:"uniform float opacity;\n#include <common>\n#include <packing>\n#include <bsdfs>\n#include <lights_pars>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\nvoid main() {\n\tgl_FragColor = vec4( 0.0, 0.0, 0.0, opacity * ( 1.0  - getShadowMask() ) );\n}\n",shadow_vert:"#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}\n"};N.prototype={constructor:N,
-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(){function a(a,c,d){0>d&&(d+=1);1<d&&--d;return d<1/6?a+6*(c-a)*d:.5>d?c:d<2/3?a+6*(c-a)*(2/3-d):a}return function(b,
-c,d){b=Q.euclideanModulo(b,1);c=Q.clamp(c,0,1);d=Q.clamp(d,0,1);0===c?this.r=this.g=this.b=d:(c=.5>=d?d*(1+c):d+c-d*c,d=2*d-c,this.r=a(d,c,b+1/3),this.g=a(d,c,b),this.b=a(d,c,b-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)){var d=parseFloat(c[1])/
-360,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}a&&0<a.length&&(c=Lf[a],void 0!==
-c?this.setHex(c):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);var c=0<b?1/b:1;this.r=Math.pow(a.r,c);this.g=Math.pow(a.g,c);this.b=Math.pow(a.b,c);return this},convertGammaToLinear:function(){var a=
-this.r,b=this.g,c=this.b;this.r=a*a;this.g=b*b;this.b=c*c;return this},convertLinearToGamma:function(){this.r=Math.sqrt(this.r);this.g=Math.sqrt(this.g);this.b=Math.sqrt(this.b);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){a=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 k=e-f,f=.5>=h?k/(e+f):
-k/(2-e-f);switch(e){case b:g=(c-d)/k+(c<d?6:0);break;case c:g=(d-b)/k+2;break;case d:g=(b-c)/k+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){var d=this.getHSL();d.h+=a;d.s+=b;d.l+=c;this.setHSL(d.h,d.s,d.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},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()}};var Lf={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,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};db.prototype=Object.create(ea.prototype);db.prototype.constructor=db;db.prototype.isDataTexture=!0;var U={common:{diffuse:{value:new N(15658734)},opacity:{value:1},map:{value:null},offsetRepeat:{value:new ga(0,
-0,1,1)},specularMap:{value:null},alphaMap:{value:null},envMap:{value:null},flipEnvMap:{value:-1},reflectivity:{value:1},refractionRatio:{value:.98}},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 C(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 N(16777215)}},lights:{ambientLightColor:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{},shadow:{},shadowBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMap:{value:[]},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},
-direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{},shadow:{},shadowBias:{},shadowRadius:{},shadowMapSize:{}}},spotShadowMap:{value:[]},spotShadowMatrix:{value:[]},pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{},shadow:{},shadowBias:{},shadowRadius:{},shadowMapSize:{}}},pointShadowMap:{value:[]},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}},rectAreaLights:{value:[],properties:{color:{},position:{},
-width:{},height:{}}}},points:{diffuse:{value:new N(15658734)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},offsetRepeat:{value:new ga(0,0,1,1)}}},Gb={basic:{uniforms:Ja.merge([U.common,U.aomap,U.lightmap,U.fog]),vertexShader:Z.meshbasic_vert,fragmentShader:Z.meshbasic_frag},lambert:{uniforms:Ja.merge([U.common,U.aomap,U.lightmap,U.emissivemap,U.fog,U.lights,{emissive:{value:new N(0)}}]),vertexShader:Z.meshlambert_vert,fragmentShader:Z.meshlambert_frag},phong:{uniforms:Ja.merge([U.common,
-U.aomap,U.lightmap,U.emissivemap,U.bumpmap,U.normalmap,U.displacementmap,U.gradientmap,U.fog,U.lights,{emissive:{value:new N(0)},specular:{value:new N(1118481)},shininess:{value:30}}]),vertexShader:Z.meshphong_vert,fragmentShader:Z.meshphong_frag},standard:{uniforms:Ja.merge([U.common,U.aomap,U.lightmap,U.emissivemap,U.bumpmap,U.normalmap,U.displacementmap,U.roughnessmap,U.metalnessmap,U.fog,U.lights,{emissive:{value:new N(0)},roughness:{value:.5},metalness:{value:0},envMapIntensity:{value:1}}]),
-vertexShader:Z.meshphysical_vert,fragmentShader:Z.meshphysical_frag},points:{uniforms:Ja.merge([U.points,U.fog]),vertexShader:Z.points_vert,fragmentShader:Z.points_frag},dashed:{uniforms:Ja.merge([U.common,U.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:Z.linedashed_vert,fragmentShader:Z.linedashed_frag},depth:{uniforms:Ja.merge([U.common,U.displacementmap]),vertexShader:Z.depth_vert,fragmentShader:Z.depth_frag},normal:{uniforms:Ja.merge([U.common,U.bumpmap,U.normalmap,
-U.displacementmap,{opacity:{value:1}}]),vertexShader:Z.normal_vert,fragmentShader:Z.normal_frag},cube:{uniforms:{tCube:{value:null},tFlip:{value:-1},opacity:{value:1}},vertexShader:Z.cube_vert,fragmentShader:Z.cube_frag},equirect:{uniforms:{tEquirect:{value:null},tFlip:{value:-1}},vertexShader:Z.equirect_vert,fragmentShader:Z.equirect_frag},distanceRGBA:{uniforms:{lightPos:{value:new q}},vertexShader:Z.distanceRGBA_vert,fragmentShader:Z.distanceRGBA_frag}};Gb.physical={uniforms:Ja.merge([Gb.standard.uniforms,
-{clearCoat:{value:0},clearCoatRoughness:{value:0}}]),vertexShader:Z.meshphysical_vert,fragmentShader:Z.meshphysical_frag};pc.prototype={constructor:pc,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(){var a=new C;return function(b,c){var d=a.copy(c).multiplyScalar(.5);this.min.copy(b).sub(d);this.max.copy(b).add(d);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){a=a||new C;return this.isEmpty()?a.set(0,0):a.addVectors(this.min,this.max).multiplyScalar(.5)},getSize:function(a){a=a||new C;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){return(b||new C).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){return(b||new C).copy(a).clamp(this.min,this.max)},distanceToPoint:function(){var a=new C;return function(b){return a.copy(b).clamp(this.min,this.max).sub(b).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 pf=0;W.prototype={constructor:W,isMaterial:!0,get needsUpdate(){return this._needsUpdate},set needsUpdate(a){!0===a&&this.update();this._needsUpdate=a},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{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]="overdraw"===b?Number(c):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;c&&(a={textures:{},images:{}});var d={metadata:{version:4.4,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.emissive&&this.emissive.isColor&&(d.emissive=this.emissive.getHex());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.map&&this.map.isTexture&&(d.map=this.map.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.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.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);
-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);2!==this.shading&&(d.shading=this.shading);0!==this.side&&(d.side=this.side);0!==this.vertexColors&&(d.vertexColors=this.vertexColors);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;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);d.skinning=this.skinning;d.morphTargets=this.morphTargets;
-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.lights=a.lights;this.blending=a.blending;this.side=a.side;this.shading=a.shading;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.colorWrite=a.colorWrite;this.precision=a.precision;this.polygonOffset=a.polygonOffset;this.polygonOffsetFactor=a.polygonOffsetFactor;this.polygonOffsetUnits=a.polygonOffsetUnits;this.alphaTest=a.alphaTest;this.premultipliedAlpha=a.premultipliedAlpha;this.overdraw=a.overdraw;this.visible=a.visible;this.clipShadows=a.clipShadows;this.clipIntersection=a.clipIntersection;
-a=a.clippingPlanes;var b=null;if(null!==a)for(var c=a.length,b=Array(c),d=0;d!==c;++d)b[d]=a[d].clone();this.clippingPlanes=b;return this},update:function(){this.dispatchEvent({type:"update"})},dispose:function(){this.dispatchEvent({type:"dispose"})}};Object.assign(W.prototype,oa.prototype);Ia.prototype=Object.create(W.prototype);Ia.prototype.constructor=Ia;Ia.prototype.isShaderMaterial=!0;Ia.prototype.copy=function(a){W.prototype.copy.call(this,a);this.fragmentShader=a.fragmentShader;this.vertexShader=
-a.vertexShader;this.uniforms=Ja.clone(a.uniforms);this.defines=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=a.extensions;return this};Ia.prototype.toJSON=function(a){a=W.prototype.toJSON.call(this,a);a.uniforms=this.uniforms;a.vertexShader=this.vertexShader;a.fragmentShader=this.fragmentShader;return a};ab.prototype=
-Object.create(W.prototype);ab.prototype.constructor=ab;ab.prototype.isMeshDepthMaterial=!0;ab.prototype.copy=function(a){W.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};ya.prototype=
-{constructor:ya,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,k=a.length;h<k;h+=3){var m=a[h],l=a[h+1],p=a[h+2];m<b&&(b=m);l<c&&(c=l);p<d&&(d=p);m>e&&(e=m);l>f&&(f=l);p>g&&(g=p)}this.min.set(b,c,d);this.max.set(e,f,g)},setFromBufferAttribute:function(a){for(var b=Infinity,c=Infinity,d=Infinity,e=-Infinity,f=-Infinity,g=-Infinity,h=0,k=a.count;h<k;h++){var m=a.getX(h),
-l=a.getY(h),p=a.getZ(h);m<b&&(b=m);l<c&&(c=l);p<d&&(d=p);m>e&&(e=m);l>f&&(f=l);p>g&&(g=p)}this.min.set(b,c,d);this.max.set(e,f,g)},setFromPoints:function(a){this.makeEmpty();for(var b=0,c=a.length;b<c;b++)this.expandByPoint(a[b]);return this},setFromCenterAndSize:function(){var a=new q;return function(b,c){var d=a.copy(c).multiplyScalar(.5);this.min.copy(b).sub(d);this.max.copy(b).add(d);return this}}(),setFromObject:function(){var a=new q;return function(b){var c=this;b.updateMatrixWorld(!0);this.makeEmpty();
-b.traverse(function(b){var e,f;e=b.geometry;if(void 0!==e)if(e.isGeometry){var g=e.vertices;e=0;for(f=g.length;e<f;e++)a.copy(g[e]),a.applyMatrix4(b.matrixWorld),c.expandByPoint(a)}else if(e.isBufferGeometry&&(g=e.attributes.position,void 0!==g))for(e=0,f=g.count;e<f;e++)a.fromAttribute(g,e).applyMatrix4(b.matrixWorld),c.expandByPoint(a)});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=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){a=a||new q;return this.isEmpty()?a.set(0,0,0):a.addVectors(this.min,this.max).multiplyScalar(.5)},getSize:function(a){a=a||new q;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},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){return(b||new q).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(){var a;return function(b){void 0===a&&(a=new q);this.clampPoint(b.center,a);return a.distanceToSquared(b.center)<=b.radius*b.radius}}(),intersectsPlane:function(a){var b,c;0<a.normal.x?(b=a.normal.x*this.min.x,c=a.normal.x*this.max.x):(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},clampPoint:function(a,b){return(b||new q).copy(a).clamp(this.min,this.max)},distanceToPoint:function(){var a=new q;return function(b){return a.copy(b).clamp(this.min,this.max).sub(b).length()}}(),
-getBoundingSphere:function(){var a=new q;return function(b){b=b||new Fa;this.getCenter(b.center);b.radius=.5*this.getSize(a).length();return b}}(),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(){var a=[new q,new q,new q,new q,new q,new q,new q,new q];return function(b){if(this.isEmpty())return this;a[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(b);
-a[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(b);a[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(b);a[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(b);a[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(b);a[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(b);a[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(b);a[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(b);this.setFromPoints(a);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)}};Fa.prototype={constructor:Fa,set:function(a,b){this.center.copy(a);this.radius=b;return this},setFromPoints:function(){var a=new ya;return function(b,c){var d=this.center;void 0!==c?d.copy(c):a.setFromPoints(b).getCenter(d);for(var e=0,f=0,g=b.length;f<g;f++)e=Math.max(e,d.distanceToSquared(b[f]));this.radius=Math.sqrt(e);return this}}(),clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.center.copy(a.center);
-this.radius=a.radius;return this},empty:function(){return 0>=this.radius},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(this.center.dot(a.normal)-a.constant)<=this.radius},
-clampPoint:function(a,b){var c=this.center.distanceToSquared(a),d=b||new q;d.copy(a);c>this.radius*this.radius&&(d.sub(this.center).normalize(),d.multiplyScalar(this.radius).add(this.center));return d},getBoundingBox:function(a){a=a||new ya;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}};za.prototype={constructor:za,isMatrix3:!0,set:function(a,b,c,d,e,f,g,h,k){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]=k;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){a=a.elements;this.set(a[0],a[3],a[6],a[1],a[4],a[7],a[2],a[5],a[8]);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},applyToVector3Array:function(){var a;return function(b,c,d){void 0===a&&(a=new q);void 0===c&&(c=0);void 0===d&&(d=b.length);for(var e=0;e<d;e+=3,c+=3)a.fromArray(b,c),a.applyMatrix3(this),a.toArray(b,c);return b}}(),applyToBufferAttribute:function(){var a;return function(b){void 0===a&&(a=new q);for(var c=0,d=b.count;c<d;c++)a.x=b.getX(c),a.y=b.getY(c),a.z=b.getZ(c),a.applyMatrix3(this),b.setXYZ(c,a.x,a.y,a.z);return b}}(),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],k=a[7],a=a[8];return b*f*a-b*g*k-c*e*a+c*g*h+d*e*k-d*f*h},getInverse:function(a,b){a&&a.isMatrix4&&console.error("THREE.Matrix3.getInverse no longer takes a Matrix4 argument.");var c=a.elements,d=this.elements,e=c[0],f=c[1],g=c[2],h=c[3],k=c[4],m=c[5],l=c[6],p=c[7],c=c[8],n=c*k-m*p,r=m*l-c*h,w=p*h-k*l,q=e*n+f*r+g*w;if(0===
-q){if(!0===b)throw Error("THREE.Matrix3.getInverse(): can't invert matrix, determinant is 0");console.warn("THREE.Matrix3.getInverse(): can't invert matrix, determinant is 0");return this.identity()}q=1/q;d[0]=n*q;d[1]=(g*p-c*f)*q;d[2]=(m*f-g*k)*q;d[3]=r*q;d[4]=(c*e-g*l)*q;d[5]=(g*h-m*e)*q;d[6]=w*q;d[7]=(f*l-p*e)*q;d[8]=(k*e-f*h)*q;return this},transpose:function(){var a,b=this.elements;a=b[1];b[1]=b[3];b[3]=a;a=b[2];b[2]=b[6];b[6]=a;a=b[5];b[5]=b[7];b[7]=a;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},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}};ma.prototype={constructor:ma,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(){var a=new q,b=new q;return function(c,d,e){d=a.subVectors(e,d).cross(b.subVectors(c,d)).normalize();this.setFromNormalAndCoplanarPoint(d,c);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){return this.orthoPoint(a,b).sub(a).negate()},orthoPoint:function(a,b){var c=this.distanceToPoint(a);return(b||
-new q).copy(this.normal).multiplyScalar(c)},intersectLine:function(){var a=new q;return function(b,c){var d=c||new q,e=b.delta(a),f=this.normal.dot(e);if(0===f){if(0===this.distanceToPoint(b.start))return d.copy(b.start)}else return f=-(b.start.dot(this.normal)+this.constant)/f,0>f||1<f?void 0:d.copy(e).multiplyScalar(f).add(b.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){return(a||new q).copy(this.normal).multiplyScalar(-this.constant)},applyMatrix4:function(){var a=new q,b=new za;return function(c,d){var e=this.coplanarPoint(a).applyMatrix4(c),f=d||b.getNormalMatrix(c),f=this.normal.applyMatrix3(f).normalize();this.constant=-e.dot(f);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}};qc.prototype={constructor:qc,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},setFromMatrix: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],k=c[6],m=c[7],l=c[8],p=c[9],n=c[10],r=c[11],q=c[12],u=c[13],F=c[14],c=c[15];
-b[0].setComponents(f-a,m-g,r-l,c-q).normalize();b[1].setComponents(f+a,m+g,r+l,c+q).normalize();b[2].setComponents(f+d,m+h,r+p,c+u).normalize();b[3].setComponents(f-d,m-h,r-p,c-u).normalize();b[4].setComponents(f-e,m-k,r-n,c-F).normalize();b[5].setComponents(f+e,m+k,r+n,c+F).normalize();return this},intersectsObject:function(){var a=new Fa;return function(b){var c=b.geometry;null===c.boundingSphere&&c.computeBoundingSphere();a.copy(c.boundingSphere).applyMatrix4(b.matrixWorld);return this.intersectsSphere(a)}}(),
-intersectsSprite:function(){var a=new Fa;return function(b){a.center.set(0,0,0);a.radius=.7071067811865476;a.applyMatrix4(b.matrixWorld);return this.intersectsSphere(a)}}(),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(){var a=new q,b=new q;return function(c){for(var d=this.planes,e=0;6>e;e++){var f=d[e];a.x=0<f.normal.x?c.min.x:c.max.x;b.x=0<f.normal.x?c.max.x:c.min.x;a.y=0<f.normal.y?
-c.min.y:c.max.y;b.y=0<f.normal.y?c.max.y:c.min.y;a.z=0<f.normal.z?c.min.z:c.max.z;b.z=0<f.normal.z?c.max.z:c.min.z;var g=f.distanceToPoint(a),f=f.distanceToPoint(b);if(0>g&&0>f)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}};bb.prototype={constructor:bb,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){return(b||new q).copy(this.direction).multiplyScalar(a).add(this.origin)},lookAt:function(a){this.direction.copy(a).sub(this.origin).normalize();return this},recast:function(){var a=new q;return function(b){this.origin.copy(this.at(b,a));return this}}(),closestPointToPoint:function(a,b){var c=b||new q;c.subVectors(a,this.origin);var d=c.dot(this.direction);return 0>d?c.copy(this.origin):c.copy(this.direction).multiplyScalar(d).add(this.origin)},
-distanceToPoint:function(a){return Math.sqrt(this.distanceSqToPoint(a))},distanceSqToPoint:function(){var a=new q;return function(b){var c=a.subVectors(b,this.origin).dot(this.direction);if(0>c)return this.origin.distanceToSquared(b);a.copy(this.direction).multiplyScalar(c).add(this.origin);return a.distanceToSquared(b)}}(),distanceSqToSegment:function(){var a=new q,b=new q,c=new q;return function(d,e,f,g){a.copy(d).add(e).multiplyScalar(.5);b.copy(e).sub(d).normalize();c.copy(this.origin).sub(a);
-var h=.5*d.distanceTo(e),k=-this.direction.dot(b),m=c.dot(this.direction),l=-c.dot(b),p=c.lengthSq(),n=Math.abs(1-k*k),r;0<n?(d=k*l-m,e=k*m-l,r=h*n,0<=d?e>=-r?e<=r?(h=1/n,d*=h,e*=h,k=d*(d+k*e+2*m)+e*(k*d+e+2*l)+p):(e=h,d=Math.max(0,-(k*e+m)),k=-d*d+e*(e+2*l)+p):(e=-h,d=Math.max(0,-(k*e+m)),k=-d*d+e*(e+2*l)+p):e<=-r?(d=Math.max(0,-(-k*h+m)),e=0<d?-h:Math.min(Math.max(-h,-l),h),k=-d*d+e*(e+2*l)+p):e<=r?(d=0,e=Math.min(Math.max(-h,-l),h),k=e*(e+2*l)+p):(d=Math.max(0,-(k*h+m)),e=0<d?h:Math.min(Math.max(-h,
--l),h),k=-d*d+e*(e+2*l)+p)):(e=0<k?-h:h,d=Math.max(0,-(k*e+m)),k=-d*d+e*(e+2*l)+p);f&&f.copy(this.direction).multiplyScalar(d).add(this.origin);g&&g.copy(b).multiplyScalar(e).add(a);return k}}(),intersectSphere:function(){var a=new q;return function(b,c){a.subVectors(b.center,this.origin);var d=a.dot(this.direction),e=a.dot(a)-d*d,f=b.radius*b.radius;if(e>f)return null;f=Math.sqrt(f-e);e=d-f;d+=f;return 0>e&&0>d?null:0>e?this.at(d,c):this.at(e,c)}}(),intersectsSphere:function(a){return this.distanceToPoint(a.center)<=
-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){var c=this.distanceToPlane(a);return null===c?null:this.at(c,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,d,e,f,g;d=1/this.direction.x;f=1/this.direction.y;g=1/this.direction.z;
-var h=this.origin;0<=d?(c=(a.min.x-h.x)*d,d*=a.max.x-h.x):(c=(a.max.x-h.x)*d,d*=a.min.x-h.x);0<=f?(e=(a.min.y-h.y)*f,f*=a.max.y-h.y):(e=(a.max.y-h.y)*f,f*=a.min.y-h.y);if(c>f||e>d)return null;if(e>c||c!==c)c=e;if(f<d||d!==d)d=f;0<=g?(e=(a.min.z-h.z)*g,g*=a.max.z-h.z):(e=(a.max.z-h.z)*g,g*=a.min.z-h.z);if(c>g||e>d)return null;if(e>c||c!==c)c=e;if(g<d||d!==d)d=g;return 0>d?null:this.at(0<=c?c:d,b)},intersectsBox:function(){var a=new q;return function(b){return null!==this.intersectBox(b,a)}}(),intersectTriangle:function(){var a=
-new q,b=new q,c=new q,d=new q;return function(e,f,g,h,k){b.subVectors(f,e);c.subVectors(g,e);d.crossVectors(b,c);f=this.direction.dot(d);if(0<f){if(h)return null;h=1}else if(0>f)h=-1,f=-f;else return null;a.subVectors(this.origin,e);e=h*this.direction.dot(c.crossVectors(a,c));if(0>e)return null;g=h*this.direction.dot(b.cross(a));if(0>g||e+g>f)return null;e=-h*a.dot(d);return 0>e?null:this.at(e/f,k)}}(),applyMatrix4:function(a){this.direction.add(this.origin).applyMatrix4(a);this.origin.applyMatrix4(a);
-this.direction.sub(this.origin);this.direction.normalize();return this},equals:function(a){return a.origin.equals(this.origin)&&a.direction.equals(this.direction)}};cb.RotationOrders="XYZ YZX ZXY XZY YXZ ZYX".split(" ");cb.DefaultOrder="XYZ";cb.prototype={constructor:cb,isEuler:!0,get x(){return this._x},set x(a){this._x=a;this.onChangeCallback()},get y(){return this._y},set y(a){this._y=a;this.onChangeCallback()},get z(){return this._z},set z(a){this._z=a;this.onChangeCallback()},get order(){return this._order},
-set order(a){this._order=a;this.onChangeCallback()},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=Q.clamp,e=a.elements;a=e[0];var f=e[4],g=e[8],h=e[1],k=e[5],m=e[9],l=e[2],p=e[6],e=e[10];b=b||
-this._order;"XYZ"===b?(this._y=Math.asin(d(g,-1,1)),.99999>Math.abs(g)?(this._x=Math.atan2(-m,e),this._z=Math.atan2(-f,a)):(this._x=Math.atan2(p,k),this._z=0)):"YXZ"===b?(this._x=Math.asin(-d(m,-1,1)),.99999>Math.abs(m)?(this._y=Math.atan2(g,e),this._z=Math.atan2(h,k)):(this._y=Math.atan2(-l,a),this._z=0)):"ZXY"===b?(this._x=Math.asin(d(p,-1,1)),.99999>Math.abs(p)?(this._y=Math.atan2(-l,e),this._z=Math.atan2(-f,k)):(this._y=0,this._z=Math.atan2(h,a))):"ZYX"===b?(this._y=Math.asin(-d(l,-1,1)),.99999>
-Math.abs(l)?(this._x=Math.atan2(p,e),this._z=Math.atan2(h,a)):(this._x=0,this._z=Math.atan2(-f,k))):"YZX"===b?(this._z=Math.asin(d(h,-1,1)),.99999>Math.abs(h)?(this._x=Math.atan2(-m,k),this._y=Math.atan2(-l,a)):(this._x=0,this._y=Math.atan2(g,e))):"XZY"===b?(this._z=Math.asin(-d(f,-1,1)),.99999>Math.abs(f)?(this._x=Math.atan2(p,k),this._y=Math.atan2(g,a)):(this._x=Math.atan2(-m,e),this._y=0)):console.warn("THREE.Euler: .setFromRotationMatrix() given unsupported order: "+b);this._order=b;if(!1!==c)this.onChangeCallback();
-return this},setFromQuaternion:function(){var a;return function(b,c,d){void 0===a&&(a=new H);a.makeRotationFromQuaternion(b);return this.setFromRotationMatrix(a,c,d)}}(),setFromVector3:function(a,b){return this.set(a.x,a.y,a.z,b||this._order)},reorder:function(){var a=new da;return function(b){a.setFromEuler(this);return this.setFromQuaternion(a,b)}}(),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 q(this._x,this._y,this._z)},onChange:function(a){this.onChangeCallback=a;return this},onChangeCallback:function(){}};gd.prototype={constructor:gd,set:function(a){this.mask=1<<a},enable:function(a){this.mask|=1<<a},toggle:function(a){this.mask^=
-1<<a},disable:function(a){this.mask&=~(1<<a)},test:function(a){return 0!==(this.mask&a.mask)}};var qf=0;G.DefaultUp=new q(0,1,0);G.DefaultMatrixAutoUpdate=!0;Object.assign(G.prototype,oa.prototype,{isObject3D:!0,applyMatrix:function(a){this.matrix.multiplyMatrices(a,this.matrix);this.matrix.decompose(this.position,this.quaternion,this.scale)},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(){var a=new da;return function(b,c){a.setFromAxisAngle(b,c);this.quaternion.multiply(a);return this}}(),rotateX:function(){var a=new q(1,0,0);return function(b){return this.rotateOnAxis(a,b)}}(),rotateY:function(){var a=new q(0,1,0);return function(b){return this.rotateOnAxis(a,b)}}(),rotateZ:function(){var a=new q(0,0,1);return function(b){return this.rotateOnAxis(a,b)}}(),translateOnAxis:function(){var a=new q;
-return function(b,c){a.copy(b).applyQuaternion(this.quaternion);this.position.add(a.multiplyScalar(c));return this}}(),translateX:function(){var a=new q(1,0,0);return function(b){return this.translateOnAxis(a,b)}}(),translateY:function(){var a=new q(0,1,0);return function(b){return this.translateOnAxis(a,b)}}(),translateZ:function(){var a=new q(0,0,1);return function(b){return this.translateOnAxis(a,b)}}(),localToWorld:function(a){return a.applyMatrix4(this.matrixWorld)},worldToLocal:function(){var a=
-new H;return function(b){return b.applyMatrix4(a.getInverse(this.matrixWorld))}}(),lookAt:function(){var a=new H;return function(b){a.lookAt(b,this.position,this.up);this.quaternion.setFromRotationMatrix(a)}}(),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,a.dispatchEvent({type:"added"}),
-this.children.push(a)):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]);b=this.children.indexOf(a);-1!==b&&(a.parent=null,a.dispatchEvent({type:"removed"}),this.children.splice(b,1))},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){a=a||new q;this.updateMatrixWorld(!0);return a.setFromMatrixPosition(this.matrixWorld)},getWorldQuaternion:function(){var a=new q,b=new q;return function(c){c=c||new da;this.updateMatrixWorld(!0);this.matrixWorld.decompose(a,c,b);return c}}(),getWorldRotation:function(){var a=new da;return function(b){b=b||new cb;this.getWorldQuaternion(a);
-return b.setFromQuaternion(a,this.rotation.order,!1)}}(),getWorldScale:function(){var a=new q,b=new da;return function(c){c=c||new q;this.updateMatrixWorld(!0);this.matrixWorld.decompose(a,b,c);return c}}(),getWorldDirection:function(){var a=new da;return function(b){b=b||new q;this.getWorldQuaternion(a);return b.set(0,0,1).applyQuaternion(a)}}(),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){!0===this.matrixAutoUpdate&&this.updateMatrix();if(!0===this.matrixWorldNeedsUpdate||!0===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)},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||""===a,d={};c&&(a={geometries:{},materials:{},textures:{},images:{}},d.metadata={version:4.4,type:"Object",generator:"Object3D.toJSON"});var e={};e.uuid=this.uuid;e.type=this.type;""!==this.name&&(e.name=this.name);"{}"!==JSON.stringify(this.userData)&&(e.userData=
-this.userData);!0===this.castShadow&&(e.castShadow=!0);!0===this.receiveShadow&&(e.receiveShadow=!0);!1===this.visible&&(e.visible=!1);e.matrix=this.matrix.toArray();void 0!==this.geometry&&(void 0===a.geometries[this.geometry.uuid]&&(a.geometries[this.geometry.uuid]=this.geometry.toJSON(a)),e.geometry=this.geometry.uuid);void 0!==this.material&&(void 0===a.materials[this.material.uuid]&&(a.materials[this.material.uuid]=this.material.toJSON(a)),e.material=this.material.uuid);if(0<this.children.length){e.children=
-[];for(var f=0;f<this.children.length;f++)e.children.push(this.children[f].toJSON(a).object)}if(c){var c=b(a.geometries),f=b(a.materials),g=b(a.textures);a=b(a.images);0<c.length&&(d.geometries=c);0<f.length&&(d.materials=f);0<g.length&&(d.textures=g);0<a.length&&(d.images=a)}d.object=e;return d},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(var c=0;c<a.children.length;c++)this.add(a.children[c].clone());return this}});gb.prototype=
-{constructor:gb,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){return(a||new q).addVectors(this.start,this.end).multiplyScalar(.5)},delta:function(a){return(a||new q).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){var c=b||new q;return this.delta(c).multiplyScalar(a).add(this.start)},closestPointToPointParameter:function(){var a=new q,b=new q;return function(c,d){a.subVectors(c,this.start);b.subVectors(this.end,this.start);var e=b.dot(b),e=b.dot(a)/e;d&&(e=Q.clamp(e,0,1));return e}}(),closestPointToPoint:function(a,b,c){a=this.closestPointToPointParameter(a,b);c=c||new q;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)}};Aa.normal=function(){var a=new q;return function(b,c,d,e){e=e||new q;e.subVectors(d,c);a.subVectors(b,c);e.cross(a);b=e.lengthSq();return 0<b?e.multiplyScalar(1/Math.sqrt(b)):e.set(0,0,0)}}();Aa.barycoordFromPoint=function(){var a=new q,b=new q,c=new q;return function(d,e,f,g,h){a.subVectors(g,e);b.subVectors(f,e);c.subVectors(d,e);d=a.dot(a);e=a.dot(b);f=a.dot(c);var k=b.dot(b);g=b.dot(c);var m=d*k-e*e;h=
-h||new q;if(0===m)return h.set(-2,-1,-1);m=1/m;k=(k*f-e*g)*m;d=(d*g-e*f)*m;return h.set(1-k-d,d,k)}}();Aa.containsPoint=function(){var a=new q;return function(b,c,d,e){b=Aa.barycoordFromPoint(b,c,d,e,a);return 0<=b.x&&0<=b.y&&1>=b.x+b.y}}();Aa.prototype={constructor:Aa,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},area:function(){var a=new q,b=new q;return function(){a.subVectors(this.c,this.b);b.subVectors(this.a,this.b);return.5*a.cross(b).length()}}(),midpoint:function(a){return(a||new q).addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)},normal:function(a){return Aa.normal(this.a,this.b,this.c,a)},plane:function(a){return(a||new ma).setFromCoplanarPoints(this.a,this.b,this.c)},barycoordFromPoint:function(a,b){return Aa.barycoordFromPoint(a,
-this.a,this.b,this.c,b)},containsPoint:function(a){return Aa.containsPoint(a,this.a,this.b,this.c)},closestPointToPoint:function(){var a,b,c,d;return function(e,f){void 0===a&&(a=new ma,b=[new gb,new gb,new gb],c=new q,d=new q);var g=f||new q,h=Infinity;a.setFromCoplanarPoints(this.a,this.b,this.c);a.projectPoint(e,c);if(!0===this.containsPoint(c))g.copy(c);else{b[0].set(this.a,this.b);b[1].set(this.b,this.c);b[2].set(this.c,this.a);for(var k=0;k<b.length;k++){b[k].closestPointToPoint(c,!0,d);var m=
-c.distanceToSquared(d);m<h&&(h=m,g.copy(d))}}return g}}(),equals:function(a){return a.a.equals(this.a)&&a.b.equals(this.b)&&a.c.equals(this.c)}};ha.prototype={constructor:ha,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}};Ka.prototype=Object.create(W.prototype);Ka.prototype.constructor=Ka;Ka.prototype.isMeshBasicMaterial=!0;Ka.prototype.copy=function(a){W.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};y.prototype={constructor:y,isBufferAttribute:!0,set needsUpdate(a){!0===a&&this.version++},setArray:function(a){if(Array.isArray(a))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.count=void 0!==a?a.length/
-this.itemSize:0;this.array=a},setDynamic:function(a){this.dynamic=a;return this},copy:function(a){this.array=new a.array.constructor(a.array);this.itemSize=a.itemSize;this.count=a.count;this.normalized=a.normalized;this.dynamic=a.dynamic;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 N);b[c++]=f.r;b[c++]=f.g;b[c++]=f.b}return this},copyIndicesArray:function(a){for(var b=this.array,c=0,d=0,e=a.length;d<e;d++){var f=a[d];b[c++]=f.a;b[c++]=f.b;b[c++]=f.c}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 C);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 q);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 ga);b[c++]=f.x;b[c++]=f.y;b[c++]=f.z;b[c++]=f.w}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).copy(this)}};rc.prototype=Object.create(y.prototype);
-rc.prototype.constructor=rc;sc.prototype=Object.create(y.prototype);sc.prototype.constructor=sc;tc.prototype=Object.create(y.prototype);tc.prototype.constructor=tc;uc.prototype=Object.create(y.prototype);uc.prototype.constructor=uc;Ra.prototype=Object.create(y.prototype);Ra.prototype.constructor=Ra;vc.prototype=Object.create(y.prototype);vc.prototype.constructor=vc;Ua.prototype=Object.create(y.prototype);Ua.prototype.constructor=Ua;X.prototype=Object.create(y.prototype);X.prototype.constructor=X;
-wc.prototype=Object.create(y.prototype);wc.prototype.constructor=wc;Object.assign(ze.prototype,{computeGroups:function(a){var b,c=[],d=void 0;a=a.faces;for(var e=0;e<a.length;e++){var f=a[e];f.materialIndex!==d&&(d=f.materialIndex,void 0!==b&&(b.count=3*e-b.start,c.push(b)),b={start:3*e,materialIndex:d})}void 0!==b&&(b.count=3*e-b.start,c.push(b));this.groups=c},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,
-k;if(0<h){k=[];for(var m=0;m<h;m++)k[m]=[];this.morphTargets.position=k}var l=a.morphNormals,p=l.length,n;if(0<p){n=[];for(m=0;m<p;m++)n[m]=[];this.morphTargets.normal=n}for(var r=a.skinIndices,q=a.skinWeights,u=r.length===c.length,F=q.length===c.length,m=0;m<b.length;m++){var t=b[m];this.vertices.push(c[t.a],c[t.b],c[t.c]);var v=t.vertexNormals;3===v.length?this.normals.push(v[0],v[1],v[2]):(v=t.normal,this.normals.push(v,v,v));v=t.vertexColors;3===v.length?this.colors.push(v[0],v[1],v[2]):(v=t.color,
-this.colors.push(v,v,v));!0===e&&(v=d[0][m],void 0!==v?this.uvs.push(v[0],v[1],v[2]):(console.warn("THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ",m),this.uvs.push(new C,new C,new C)));!0===f&&(v=d[1][m],void 0!==v?this.uvs2.push(v[0],v[1],v[2]):(console.warn("THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ",m),this.uvs2.push(new C,new C,new C)));for(v=0;v<h;v++){var M=g[v].vertices;k[v].push(M[t.a],M[t.b],M[t.c])}for(v=0;v<p;v++)M=l[v].vertexNormals[m],n[v].push(M.a,M.b,M.c);
-u&&this.skinIndices.push(r[t.a],r[t.b],r[t.c]);F&&this.skinWeights.push(q[t.a],q[t.b],q[t.c])}this.computeGroups(a);this.verticesNeedUpdate=a.verticesNeedUpdate;this.normalsNeedUpdate=a.normalsNeedUpdate;this.colorsNeedUpdate=a.colorsNeedUpdate;this.uvsNeedUpdate=a.uvsNeedUpdate;this.groupsNeedUpdate=a.groupsNeedUpdate;return this}});Object.assign(S.prototype,oa.prototype,{isGeometry:!0,applyMatrix:function(a){for(var b=(new za).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(){var a;return function(b){void 0===a&&(a=new H);a.makeRotationX(b);this.applyMatrix(a);return this}}(),rotateY:function(){var a;return function(b){void 0===
-a&&(a=new H);a.makeRotationY(b);this.applyMatrix(a);return this}}(),rotateZ:function(){var a;return function(b){void 0===a&&(a=new H);a.makeRotationZ(b);this.applyMatrix(a);return this}}(),translate:function(){var a;return function(b,c,d){void 0===a&&(a=new H);a.makeTranslation(b,c,d);this.applyMatrix(a);return this}}(),scale:function(){var a;return function(b,c,d){void 0===a&&(a=new H);a.makeScale(b,c,d);this.applyMatrix(a);return this}}(),lookAt:function(){var a;return function(b){void 0===a&&(a=
-new G);a.lookAt(b);a.updateMatrix();this.applyMatrix(a.matrix)}}(),fromBufferGeometry:function(a){function b(a,b,d,e){var f=void 0!==g?[l[a].clone(),l[b].clone(),l[d].clone()]:[],r=void 0!==h?[c.colors[a].clone(),c.colors[b].clone(),c.colors[d].clone()]:[];e=new ha(a,b,d,f,r,e);c.faces.push(e);void 0!==k&&c.faceVertexUvs[0].push([p[a].clone(),p[b].clone(),p[d].clone()]);void 0!==m&&c.faceVertexUvs[1].push([n[a].clone(),n[b].clone(),n[d].clone()])}var c=this,d=null!==a.index?a.index.array:void 0,e=
-a.attributes,f=e.position.array,g=void 0!==e.normal?e.normal.array:void 0,h=void 0!==e.color?e.color.array:void 0,k=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(var l=[],p=[],n=[],r=e=0;e<f.length;e+=3,r+=2)c.vertices.push(new q(f[e],f[e+1],f[e+2])),void 0!==g&&l.push(new q(g[e],g[e+1],g[e+2])),void 0!==h&&c.colors.push(new N(h[e],h[e+1],h[e+2])),void 0!==k&&p.push(new C(k[r],k[r+1])),void 0!==m&&n.push(new C(m[r],m[r+1]));if(void 0!==
-d)if(f=a.groups,0<f.length)for(e=0;e<f.length;e++)for(var w=f[e],u=w.start,F=w.count,r=u,u=u+F;r<u;r+=3)b(d[r],d[r+1],d[r+2],w.materialIndex);else 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();var a=this.boundingBox.getCenter().negate();this.translate(a.x,
-a.y,a.z);return a},normalize:function(){this.computeBoundingSphere();var a=this.boundingSphere.center,b=this.boundingSphere.radius,b=0===b?1:1/b,c=new H;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.applyMatrix(c);return this},computeFaceNormals:function(){for(var a=new q,b=new q,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,c,d;d=Array(this.vertices.length);b=0;for(c=this.vertices.length;b<c;b++)d[b]=new q;if(a){var e,f,g,h=new q,k=new q;a=0;for(b=this.faces.length;a<b;a++)c=this.faces[a],e=this.vertices[c.a],f=this.vertices[c.b],g=this.vertices[c.c],h.subVectors(g,f),k.subVectors(e,f),h.cross(k),d[c.a].add(h),d[c.b].add(h),d[c.c].add(h)}else for(this.computeFaceNormals(),a=0,b=this.faces.length;a<b;a++)c=this.faces[a],d[c.a].add(c.normal),d[c.b].add(c.normal),d[c.c].add(c.normal);b=0;for(c=this.vertices.length;b<
-c;b++)d[b].normalize();a=0;for(b=this.faces.length;a<b;a++)c=this.faces[a],e=c.vertexNormals,3===e.length?(e[0].copy(d[c.a]),e[1].copy(d[c.b]),e[2].copy(d[c.c])):(e[0]=d[c.a].clone(),e[1]=d[c.b].clone(),e[2]=d[c.c].clone());0<this.faces.length&&(this.normalsNeedUpdate=!0)},computeFlatVertexNormals:function(){var a,b,c;this.computeFaceNormals();a=0;for(b=this.faces.length;a<b;a++){c=this.faces[a];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,c,d,e;c=0;for(d=this.faces.length;c<d;c++)for(e=this.faces[c],e.__originalFaceNormal?e.__originalFaceNormal.copy(e.normal):e.__originalFaceNormal=e.normal.clone(),e.__originalVertexNormals||(e.__originalVertexNormals=[]),a=0,b=e.vertexNormals.length;a<b;a++)e.__originalVertexNormals[a]?e.__originalVertexNormals[a].copy(e.vertexNormals[a]):e.__originalVertexNormals[a]=
-e.vertexNormals[a].clone();var f=new S;f.faces=this.faces;a=0;for(b=this.morphTargets.length;a<b;a++){if(!this.morphNormals[a]){this.morphNormals[a]={};this.morphNormals[a].faceNormals=[];this.morphNormals[a].vertexNormals=[];e=this.morphNormals[a].faceNormals;var g=this.morphNormals[a].vertexNormals,h,k;c=0;for(d=this.faces.length;c<d;c++)h=new q,k={a:new q,b:new q,c:new q},e.push(h),g.push(k)}g=this.morphNormals[a];f.vertices=this.morphTargets[a].vertices;f.computeFaceNormals();f.computeVertexNormals();
-c=0;for(d=this.faces.length;c<d;c++)e=this.faces[c],h=g.faceNormals[c],k=g.vertexNormals[c],h.copy(e.normal),k.a.copy(e.vertexNormals[0]),k.b.copy(e.vertexNormals[1]),k.c.copy(e.vertexNormals[2])}c=0;for(d=this.faces.length;c<d;c++)e=this.faces[c],e.normal=e.__originalFaceNormal,e.vertexNormals=e.__originalVertexNormals},computeLineDistances:function(){for(var a=0,b=this.vertices,c=0,d=b.length;c<d;c++)0<c&&(a+=b[c].distanceTo(b[c-1])),this.lineDistances[c]=a},computeBoundingBox:function(){null===
-this.boundingBox&&(this.boundingBox=new ya);this.boundingBox.setFromPoints(this.vertices)},computeBoundingSphere:function(){null===this.boundingSphere&&(this.boundingSphere=new Fa);this.boundingSphere.setFromPoints(this.vertices)},merge:function(a,b,c){if(!1===(a&&a.isGeometry))console.error("THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.",a);else{var d,e=this.vertices.length,f=this.vertices,g=a.vertices,h=this.faces,k=a.faces,m=this.faceVertexUvs[0],l=a.faceVertexUvs[0],p=this.colors,
-n=a.colors;void 0===c&&(c=0);void 0!==b&&(d=(new za).getNormalMatrix(b));a=0;for(var r=g.length;a<r;a++){var q=g[a].clone();void 0!==b&&q.applyMatrix4(b);f.push(q)}a=0;for(r=n.length;a<r;a++)p.push(n[a].clone());a=0;for(r=k.length;a<r;a++){var g=k[a],u=g.vertexNormals,n=g.vertexColors,p=new ha(g.a+e,g.b+e,g.c+e);p.normal.copy(g.normal);void 0!==d&&p.normal.applyMatrix3(d).normalize();b=0;for(f=u.length;b<f;b++)q=u[b].clone(),void 0!==d&&q.applyMatrix3(d).normalize(),p.vertexNormals.push(q);p.color.copy(g.color);
-b=0;for(f=n.length;b<f;b++)q=n[b],p.vertexColors.push(q.clone());p.materialIndex=g.materialIndex+c;h.push(p)}a=0;for(r=l.length;a<r;a++)if(c=l[a],d=[],void 0!==c){b=0;for(f=c.length;b<f;b++)d.push(c[b].clone());m.push(d)}}},mergeMesh:function(a){!1===(a&&a.isMesh)?console.error("THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.",a):(a.matrixAutoUpdate&&a.updateMatrix(),this.merge(a.geometry,a.matrix))},mergeVertices:function(){var a={},b=[],c=[],d,e=Math.pow(10,4),f,g;f=0;for(g=this.vertices.length;f<
-g;f++)d=this.vertices[f],d=Math.round(d.x*e)+"_"+Math.round(d.y*e)+"_"+Math.round(d.z*e),void 0===a[d]?(a[d]=f,b.push(this.vertices[f]),c[f]=b.length-1):c[f]=c[a[d]];a=[];f=0;for(g=this.faces.length;f<g;f++)for(e=this.faces[f],e.a=c[e.a],e.b=c[e.b],e.c=c[e.c],e=[e.a,e.b,e.c],d=0;3>d;d++)if(e[d]===e[(d+1)%3]){a.push(f);break}for(f=a.length-1;0<=f;f--)for(e=a[f],this.faces.splice(e,1),c=0,g=this.faceVertexUvs.length;c<g;c++)this.faceVertexUvs[c].splice(e,1);f=this.vertices.length-b.length;this.vertices=
-b;return f},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]=k.length/3;k.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!==p[b])return p[b];p[b]=l.length;l.push(a.getHex());return p[b]}function d(a){var b=a.x.toString()+a.y.toString();if(void 0!==r[b])return r[b];r[b]=n.length/2;n.push(a.x,a.y);return r[b]}var e={metadata:{version:4.4,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)}var h=[],k=[],m={},l=[],p={},n=[],r={};for(g=0;g<this.faces.length;g++){var q=this.faces[g],u=void 0!==this.faceVertexUvs[0][g],F=0<q.normal.length(),t=0<q.vertexNormals.length,v=1!==q.color.r||1!==q.color.g||1!==q.color.b,M=0<q.vertexColors.length,z=0,z=a(z,0,0),z=a(z,1,!0),z=a(z,2,!1),z=a(z,3,u),z=a(z,4,F),z=a(z,5,t),z=a(z,6,
-v),z=a(z,7,M);h.push(z);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])));F&&h.push(b(q.normal));t&&(F=q.vertexNormals,h.push(b(F[0]),b(F[1]),b(F[2])));v&&h.push(c(q.color));M&&(q=q.vertexColors,h.push(c(q[0]),c(q[1]),c(q[2])))}e.data={};e.data.vertices=f;e.data.normals=k;0<l.length&&(e.data.colors=l);0<n.length&&(e.data.uvs=[n]);e.data.faces=h;return e},clone:function(){return(new S).copy(this)},copy:function(a){this.vertices=[];this.faces=
-[];this.faceVertexUvs=[[]];this.colors=[];for(var b=a.vertices,c=0,d=b.length;c<d;c++)this.vertices.push(b[c].clone());b=a.colors;c=0;for(d=b.length;c<d;c++)this.colors.push(b[c].clone());b=a.faces;c=0;for(d=b.length;c<d;c++)this.faces.push(b[c].clone());c=0;for(d=a.faceVertexUvs.length;c<d;c++){b=a.faceVertexUvs[c];void 0===this.faceVertexUvs[c]&&(this.faceVertexUvs[c]=[]);for(var e=0,f=b.length;e<f;e++){for(var g=b[e],h=[],k=0,m=g.length;k<m;k++)h.push(g[k].clone());this.faceVertexUvs[c].push(h)}}return this},
-dispose:function(){this.dispatchEvent({type:"dispose"})}});var Kd=0;Object.assign(D.prototype,oa.prototype,{isBufferGeometry:!0,getIndex:function(){return this.index},setIndex:function(a){this.index=a},addAttribute:function(a,b,c){if(!1===(b&&b.isBufferAttribute)&&!1===(b&&b.isInterleavedBufferAttribute))console.warn("THREE.BufferGeometry: .addAttribute() now expects ( name, attribute )."),this.addAttribute(a,new y(b,c));else if("index"===a)console.warn("THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute."),
-this.setIndex(b);else return this.attributes[a]=b,this},getAttribute:function(a){return this.attributes[a]},removeAttribute: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},applyMatrix:function(a){var b=this.attributes.position;void 0!==b&&(a.applyToVector3Array(b.array),b.needsUpdate=!0);b=this.attributes.normal;
-void 0!==b&&((new za).getNormalMatrix(a).applyToVector3Array(b.array),b.needsUpdate=!0);null!==this.boundingBox&&this.computeBoundingBox();null!==this.boundingSphere&&this.computeBoundingSphere();return this},rotateX:function(){var a;return function(b){void 0===a&&(a=new H);a.makeRotationX(b);this.applyMatrix(a);return this}}(),rotateY:function(){var a;return function(b){void 0===a&&(a=new H);a.makeRotationY(b);this.applyMatrix(a);return this}}(),rotateZ:function(){var a;return function(b){void 0===
-a&&(a=new H);a.makeRotationZ(b);this.applyMatrix(a);return this}}(),translate:function(){var a;return function(b,c,d){void 0===a&&(a=new H);a.makeTranslation(b,c,d);this.applyMatrix(a);return this}}(),scale:function(){var a;return function(b,c,d){void 0===a&&(a=new H);a.makeScale(b,c,d);this.applyMatrix(a);return this}}(),lookAt:function(){var a;return function(b){void 0===a&&(a=new G);a.lookAt(b);a.updateMatrix();this.applyMatrix(a.matrix)}}(),center:function(){this.computeBoundingBox();var a=this.boundingBox.getCenter().negate();
-this.translate(a.x,a.y,a.z);return a},setFromObject:function(a){var b=a.geometry;if(a.isPoints||a.isLine){a=new X(3*b.vertices.length,3);var c=new X(3*b.colors.length,3);this.addAttribute("position",a.copyVector3sArray(b.vertices));this.addAttribute("color",c.copyColorsArray(b.colors));b.lineDistances&&b.lineDistances.length===b.vertices.length&&(a=new X(b.lineDistances.length,1),this.addAttribute("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},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 ze).fromGeometry(a);return this.fromDirectGeometry(a.__directGeometry)},
-fromDirectGeometry:function(a){var b=new Float32Array(3*a.vertices.length);this.addAttribute("position",(new y(b,3)).copyVector3sArray(a.vertices));0<a.normals.length&&(b=new Float32Array(3*a.normals.length),this.addAttribute("normal",(new y(b,3)).copyVector3sArray(a.normals)));0<a.colors.length&&(b=new Float32Array(3*a.colors.length),this.addAttribute("color",(new y(b,3)).copyColorsArray(a.colors)));0<a.uvs.length&&(b=new Float32Array(2*a.uvs.length),this.addAttribute("uv",(new y(b,2)).copyVector2sArray(a.uvs)));
-0<a.uvs2.length&&(b=new Float32Array(2*a.uvs2.length),this.addAttribute("uv2",(new y(b,2)).copyVector2sArray(a.uvs2)));0<a.indices.length&&(b=new (65535<a.vertices.length?Uint32Array:Uint16Array)(3*a.indices.length),this.setIndex((new y(b,1)).copyIndicesArray(a.indices)));this.groups=a.groups;for(var c in a.morphTargets){for(var b=[],d=a.morphTargets[c],e=0,f=d.length;e<f;e++){var g=d[e],h=new X(3*g.length,3);b.push(h.copyVector3sArray(g))}this.morphAttributes[c]=b}0<a.skinIndices.length&&(c=new X(4*
-a.skinIndices.length,4),this.addAttribute("skinIndex",c.copyVector4sArray(a.skinIndices)));0<a.skinWeights.length&&(c=new X(4*a.skinWeights.length,4),this.addAttribute("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 ya);var a=this.attributes.position;void 0!==a?this.boundingBox.setFromBufferAttribute(a):
-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(){var a=new ya,b=new q;return function(){null===this.boundingSphere&&(this.boundingSphere=new Fa);var c=this.attributes.position;if(c){var d=this.boundingSphere.center;a.setFromBufferAttribute(c);
-a.getCenter(d);for(var e=0,f=0,g=c.count;f<g;f++)b.x=c.getX(f),b.y=c.getY(f),b.z=c.getZ(f),e=Math.max(e,d.distanceToSquared(b));this.boundingSphere.radius=Math.sqrt(e);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,c=this.groups;if(b.position){var d=b.position.array;
-if(void 0===b.normal)this.addAttribute("normal",new y(new Float32Array(d.length),3));else for(var e=b.normal.array,f=0,g=e.length;f<g;f++)e[f]=0;var e=b.normal.array,h,k,m,l=new q,p=new q,n=new q,r=new q,w=new q;if(a){a=a.array;0===c.length&&this.addGroup(0,a.length);for(var u=0,F=c.length;u<F;++u)for(f=c[u],g=f.start,h=f.count,f=g,g+=h;f<g;f+=3)h=3*a[f+0],k=3*a[f+1],m=3*a[f+2],l.fromArray(d,h),p.fromArray(d,k),n.fromArray(d,m),r.subVectors(n,p),w.subVectors(l,p),r.cross(w),e[h]+=r.x,e[h+1]+=r.y,
-e[h+2]+=r.z,e[k]+=r.x,e[k+1]+=r.y,e[k+2]+=r.z,e[m]+=r.x,e[m+1]+=r.y,e[m+2]+=r.z}else for(f=0,g=d.length;f<g;f+=9)l.fromArray(d,f),p.fromArray(d,f+3),n.fromArray(d,f+6),r.subVectors(n,p),w.subVectors(l,p),r.cross(w),e[f]=r.x,e[f+1]=r.y,e[f+2]=r.z,e[f+3]=r.x,e[f+4]=r.y,e[f+5]=r.z,e[f+6]=r.x,e[f+7]=r.y,e[f+8]=r.z;this.normalizeNormals();b.normal.needsUpdate=!0}},merge:function(a,b){if(!1===(a&&a.isBufferGeometry))console.error("THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.",
-a);else{void 0===b&&(b=0);var c=this.attributes,d;for(d in c)if(void 0!==a.attributes[d])for(var e=c[d].array,f=a.attributes[d],g=f.array,h=0,f=f.itemSize*b;h<g.length;h++,f++)e[f]=g[h];return this}},normalizeNormals:function(){for(var a=this.attributes.normal.array,b,c,d,e=0,f=a.length;e<f;e+=3)b=a[e],c=a[e+1],d=a[e+2],b=1/Math.sqrt(b*b+c*c+d*d),a[e]*=b,a[e+1]*=b,a[e+2]*=b},toNonIndexed:function(){if(null===this.index)return console.warn("THREE.BufferGeometry.toNonIndexed(): Geometry is already non-indexed."),
-this;var a=new D,b=this.index.array,c=this.attributes,d;for(d in c){for(var e=c[d],f=e.array,e=e.itemSize,g=new f.constructor(b.length*e),h,k=0,m=0,l=b.length;m<l;m++){h=b[m]*e;for(var p=0;p<e;p++)g[k++]=f[h++]}a.addAttribute(d,new y(g,e))}return a},toJSON:function(){var a={metadata:{version:4.4,type:"BufferGeometry",generator:"BufferGeometry.toJSON"}};a.uuid=this.uuid;a.type=this.type;""!==this.name&&(a.name=this.name);if(void 0!==this.parameters){var b=this.parameters,c;for(c in b)void 0!==b[c]&&
-(a[c]=b[c]);return a}a.data={attributes:{}};var d=this.index;null!==d&&(b=Array.prototype.slice.call(d.array),a.data.index={type:d.array.constructor.name,array:b});d=this.attributes;for(c in d){var e=d[c],b=Array.prototype.slice.call(e.array);a.data.attributes[c]={itemSize:e.itemSize,type:e.array.constructor.name,array:b,normalized:e.normalized}}c=this.groups;0<c.length&&(a.data.groups=JSON.parse(JSON.stringify(c)));c=this.boundingSphere;null!==c&&(a.data.boundingSphere={center:c.center.toArray(),
-radius:c.radius});return a},clone:function(){return(new D).copy(this)},copy:function(a){var b=a.index;null!==b&&this.setIndex(b.clone());var b=a.attributes,c;for(c in b)this.addAttribute(c,b[c].clone());a=a.groups;c=0;for(b=a.length;c<b;c++){var d=a[c];this.addGroup(d.start,d.count,d.materialIndex)}return this},dispose:function(){this.dispatchEvent({type:"dispose"})}});D.MaxIndex=65535;Ba.prototype=Object.assign(Object.create(G.prototype),{constructor:Ba,isMesh:!0,setDrawMode:function(a){this.drawMode=
-a},copy:function(a){G.prototype.copy.call(this,a);this.drawMode=a.drawMode;return this},updateMorphTargets:function(){var a=this.geometry.morphTargets;if(void 0!==a&&0<a.length){this.morphTargetInfluences=[];this.morphTargetDictionary={};for(var b=0,c=a.length;b<c;b++)this.morphTargetInfluences.push(0),this.morphTargetDictionary[a[b].name]=b}},raycast:function(){function a(a,b,c,d,e,f,g){Aa.barycoordFromPoint(a,b,c,d,u);e.multiplyScalar(u.x);f.multiplyScalar(u.y);g.multiplyScalar(u.z);e.add(f).add(g);
-return e.clone()}function b(a,b,c,d,e,f,g){var h=a.material;if(null===(1===h.side?c.intersectTriangle(f,e,d,!0,g):c.intersectTriangle(d,e,f,2!==h.side,g)))return null;t.copy(g);t.applyMatrix4(a.matrixWorld);c=b.ray.origin.distanceTo(t);return c<b.near||c>b.far?null:{distance:c,point:t.clone(),object:a}}function c(c,d,e,f,m,l,p,q){g.fromArray(f,3*l);h.fromArray(f,3*p);k.fromArray(f,3*q);if(c=b(c,d,e,g,h,k,F))m&&(n.fromArray(m,2*l),r.fromArray(m,2*p),w.fromArray(m,2*q),c.uv=a(F,g,h,k,n,r,w)),c.face=
-new ha(l,p,q,Aa.normal(g,h,k)),c.faceIndex=l;return c}var d=new H,e=new bb,f=new Fa,g=new q,h=new q,k=new q,m=new q,l=new q,p=new q,n=new C,r=new C,w=new C,u=new q,F=new q,t=new q;return function(q,u){var t=this.geometry,A=this.material,I=this.matrixWorld;if(void 0!==A&&(null===t.boundingSphere&&t.computeBoundingSphere(),f.copy(t.boundingSphere),f.applyMatrix4(I),!1!==q.ray.intersectsSphere(f)&&(d.getInverse(I),e.copy(q.ray).applyMatrix4(d),null===t.boundingBox||!1!==e.intersectsBox(t.boundingBox)))){var E,
-K;if(t.isBufferGeometry){var y,J,A=t.index,I=t.attributes,t=I.position.array;void 0!==I.uv&&(E=I.uv.array);if(null!==A)for(var I=A.array,C=0,D=I.length;C<D;C+=3){if(A=I[C],y=I[C+1],J=I[C+2],K=c(this,q,e,t,E,A,y,J))K.faceIndex=Math.floor(C/3),u.push(K)}else for(C=0,D=t.length;C<D;C+=9)if(A=C/3,y=A+1,J=A+2,K=c(this,q,e,t,E,A,y,J))K.index=A,u.push(K)}else if(t.isGeometry){var G,H,I=A&&A.isMultiMaterial,C=!0===I?A.materials:null,D=t.vertices;y=t.faces;J=t.faceVertexUvs[0];0<J.length&&(E=J);for(var O=
-0,P=y.length;O<P;O++){var R=y[O];K=!0===I?C[R.materialIndex]:A;if(void 0!==K){J=D[R.a];G=D[R.b];H=D[R.c];if(!0===K.morphTargets){K=t.morphTargets;var T=this.morphTargetInfluences;g.set(0,0,0);h.set(0,0,0);k.set(0,0,0);for(var N=0,V=K.length;N<V;N++){var S=T[N];if(0!==S){var L=K[N].vertices;g.addScaledVector(m.subVectors(L[R.a],J),S);h.addScaledVector(l.subVectors(L[R.b],G),S);k.addScaledVector(p.subVectors(L[R.c],H),S)}}g.add(J);h.add(G);k.add(H);J=g;G=h;H=k}if(K=b(this,q,e,J,G,H,F))E&&(T=E[O],n.copy(T[0]),
-r.copy(T[1]),w.copy(T[2]),K.uv=a(F,J,G,H,n,r,w)),K.face=R,K.faceIndex=O,u.push(K)}}}}}}(),clone:function(){return(new this.constructor(this.geometry,this.material)).copy(this)}});hb.prototype=Object.create(D.prototype);hb.prototype.constructor=hb;ib.prototype=Object.create(D.prototype);ib.prototype.constructor=ib;sa.prototype=Object.create(G.prototype);sa.prototype.constructor=sa;sa.prototype.isCamera=!0;sa.prototype.getWorldDirection=function(){var a=new da;return function(b){b=b||new q;this.getWorldQuaternion(a);
-return b.set(0,0,-1).applyQuaternion(a)}}();sa.prototype.lookAt=function(){var a=new H;return function(b){a.lookAt(this.position,b,this.up);this.quaternion.setFromRotationMatrix(a)}}();sa.prototype.clone=function(){return(new this.constructor).copy(this)};sa.prototype.copy=function(a){G.prototype.copy.call(this,a);this.matrixWorldInverse.copy(a.matrixWorldInverse);this.projectionMatrix.copy(a.projectionMatrix);return this};Ha.prototype=Object.assign(Object.create(sa.prototype),{constructor:Ha,isPerspectiveCamera:!0,
-copy:function(a){sa.prototype.copy.call(this,a);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*Q.RAD2DEG*Math.atan(a);this.updateProjectionMatrix()},getFocalLength:function(){var a=Math.tan(.5*Q.DEG2RAD*this.fov);return.5*this.getFilmHeight()/a},getEffectiveFOV:function(){return 2*
-Q.RAD2DEG*Math.atan(Math.tan(.5*Q.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;this.view={fullWidth:a,fullHeight:b,offsetX:c,offsetY:d,width:e,height:f};this.updateProjectionMatrix()},clearViewOffset:function(){this.view=null;this.updateProjectionMatrix()},updateProjectionMatrix:function(){var a=this.near,b=a*Math.tan(.5*
-Q.DEG2RAD*this.fov)/this.zoom,c=2*b,d=this.aspect*c,e=-.5*d,f=this.view;if(null!==f)var g=f.fullWidth,h=f.fullHeight,e=e+f.offsetX*d/g,b=b-f.offsetY*c/h,d=f.width/g*d,c=f.height/h*c;f=this.filmOffset;0!==f&&(e+=a*f/this.getFilmWidth());this.projectionMatrix.makeFrustum(e,e+d,b-c,b,a,this.far)},toJSON:function(a){a=G.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}});Hb.prototype=Object.assign(Object.create(sa.prototype),{constructor:Hb,isOrthographicCamera:!0,copy:function(a){sa.prototype.copy.call(this,a);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){this.view={fullWidth:a,fullHeight:b,offsetX:c,offsetY:d,width:e,height:f};this.updateProjectionMatrix()},clearViewOffset:function(){this.view=null;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=c+a,a=d+b,b=d-b;if(null!==this.view)var c=this.zoom/(this.view.width/this.view.fullWidth),b=this.zoom/(this.view.height/this.view.fullHeight),
-f=(this.right-this.left)/this.view.width,d=(this.top-this.bottom)/this.view.height,e=e+this.view.offsetX/c*f,c=e+this.view.width/c*f,a=a-this.view.offsetY/b*d,b=a-this.view.height/b*d;this.projectionMatrix.makeOrthographic(e,c,a,b,this.near,this.far)},toJSON:function(a){a=G.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}});var Af=0;Ib.prototype.isFogExp2=!0;Ib.prototype.clone=function(){return new Ib(this.color.getHex(),this.density)};Ib.prototype.toJSON=function(a){return{type:"FogExp2",color:this.color.getHex(),density:this.density}};Jb.prototype.isFog=!0;Jb.prototype.clone=function(){return new Jb(this.color.getHex(),this.near,this.far)};Jb.prototype.toJSON=function(a){return{type:"Fog",color:this.color.getHex(),near:this.near,far:this.far}};jb.prototype=Object.create(G.prototype);
-jb.prototype.constructor=jb;jb.prototype.copy=function(a,b){G.prototype.copy.call(this,a,b);null!==a.background&&(this.background=a.background.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};jb.prototype.toJSON=function(a){var b=G.prototype.toJSON.call(this,a);null!==this.background&&(b.object.background=this.background.toJSON(a));null!==
-this.fog&&(b.object.fog=this.fog.toJSON());return b};Od.prototype=Object.assign(Object.create(G.prototype),{constructor:Od,isLensFlare:!0,copy:function(a){G.prototype.copy.call(this,a);this.positionScreen.copy(a.positionScreen);this.customUpdateCallback=a.customUpdateCallback;for(var b=0,c=a.lensFlares.length;b<c;b++)this.lensFlares.push(a.lensFlares[b]);return this},add:function(a,b,c,d,e,f){void 0===b&&(b=-1);void 0===c&&(c=0);void 0===f&&(f=1);void 0===e&&(e=new N(16777215));void 0===d&&(d=1);
-c=Math.min(c,Math.max(0,c));this.lensFlares.push({texture:a,size:b,distance:c,x:0,y:0,z:0,scale:1,rotation:0,opacity:f,color:e,blending:d})},updateLensFlares:function(){var a,b=this.lensFlares.length,c,d=2*-this.positionScreen.x,e=2*-this.positionScreen.y;for(a=0;a<b;a++)c=this.lensFlares[a],c.x=this.positionScreen.x+d*c.distance,c.y=this.positionScreen.y+e*c.distance,c.wantedRotation=c.x*Math.PI*.25,c.rotation+=.25*(c.wantedRotation-c.rotation)}});kb.prototype=Object.create(W.prototype);kb.prototype.constructor=
-kb;kb.prototype.copy=function(a){W.prototype.copy.call(this,a);this.color.copy(a.color);this.map=a.map;this.rotation=a.rotation;return this};zc.prototype=Object.assign(Object.create(G.prototype),{constructor:zc,isSprite:!0,raycast:function(){var a=new q;return function(b,c){a.setFromMatrixPosition(this.matrixWorld);var d=b.ray.distanceSqToPoint(a);d>this.scale.x*this.scale.y/4||c.push({distance:Math.sqrt(d),point:this.position,face:null,object:this})}}(),clone:function(){return(new this.constructor(this.material)).copy(this)}});
-Ac.prototype=Object.assign(Object.create(G.prototype),{constructor:Ac,copy:function(a){G.prototype.copy.call(this,a,!1);a=a.levels;for(var b=0,c=a.length;b<c;b++){var d=a[b];this.addLevel(d.object.clone(),d.distance)}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)},getObjectForDistance:function(a){for(var b=this.levels,c=1,d=b.length;c<d&&!(a<b[c].distance);c++);return b[c-
-1].object},raycast:function(){var a=new q;return function(b,c){a.setFromMatrixPosition(this.matrixWorld);var d=b.ray.origin.distanceTo(a);this.getObjectForDistance(d).raycast(b,c)}}(),update:function(){var a=new q,b=new q;return function(c){var d=this.levels;if(1<d.length){a.setFromMatrixPosition(c.matrixWorld);b.setFromMatrixPosition(this.matrixWorld);c=a.distanceTo(b);d[0].object.visible=!0;for(var e=1,f=d.length;e<f;e++)if(c>=d[e].distance)d[e-1].object.visible=!1,d[e].object.visible=!0;else break;
-for(;e<f;e++)d[e].object.visible=!1}}}(),toJSON:function(a){a=G.prototype.toJSON.call(this,a);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}});Object.assign(hd.prototype,{calculateInverses:function(){this.boneInverses=[];for(var a=0,b=this.bones.length;a<b;a++){var c=new H;this.bones[a]&&c.getInverse(this.bones[a].matrixWorld);this.boneInverses.push(c)}},pose:function(){for(var a,b=0,c=this.bones.length;b<
-c;b++)(a=this.bones[b])&&a.matrixWorld.getInverse(this.boneInverses[b]);b=0;for(c=this.bones.length;b<c;b++)if(a=this.bones[b])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(){var a=new H;return function(){for(var b=0,c=this.bones.length;b<c;b++)a.multiplyMatrices(this.bones[b]?this.bones[b].matrixWorld:this.identityMatrix,this.boneInverses[b]),
-a.toArray(this.boneMatrices,16*b);this.useVertexTexture&&(this.boneTexture.needsUpdate=!0)}}(),clone:function(){return new hd(this.bones,this.boneInverses,this.useVertexTexture)}});id.prototype=Object.assign(Object.create(G.prototype),{constructor:id,isBone:!0});jd.prototype=Object.assign(Object.create(Ba.prototype),{constructor:jd,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(){if(this.geometry&&this.geometry.isGeometry)for(var a=0;a<this.geometry.skinWeights.length;a++){var b=this.geometry.skinWeights[a],c=1/b.lengthManhattan();Infinity!==c?b.multiplyScalar(c):b.set(1,0,0,0)}else if(this.geometry&&this.geometry.isBufferGeometry)for(var b=new ga,d=this.geometry.attributes.skinWeight,a=0;a<d.count;a++)b.x=d.getX(a),b.y=d.getY(a),b.z=d.getZ(a),b.w=d.getW(a),c=1/b.lengthManhattan(),
-Infinity!==c?b.multiplyScalar(c):b.set(1,0,0,0),d.setXYZW(a,b.x,b.y,b.z,b.w)},updateMatrixWorld:function(a){Ba.prototype.updateMatrixWorld.call(this,!0);"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,this.skeleton.useVertexTexture)).copy(this)}});
-ia.prototype=Object.create(W.prototype);ia.prototype.constructor=ia;ia.prototype.isLineBasicMaterial=!0;ia.prototype.copy=function(a){W.prototype.copy.call(this,a);this.color.copy(a.color);this.linewidth=a.linewidth;this.linecap=a.linecap;this.linejoin=a.linejoin;return this};Va.prototype=Object.assign(Object.create(G.prototype),{constructor:Va,isLine:!0,raycast:function(){var a=new H,b=new bb,c=new Fa;return function(d,e){var f=d.linePrecision,f=f*f,g=this.geometry,h=this.matrixWorld;null===g.boundingSphere&&
-g.computeBoundingSphere();c.copy(g.boundingSphere);c.applyMatrix4(h);if(!1!==d.ray.intersectsSphere(c)){a.getInverse(h);b.copy(d.ray).applyMatrix4(a);var k=new q,m=new q,h=new q,l=new q,p=this&&this.isLineSegments?2:1;if(g.isBufferGeometry){var n=g.index,r=g.attributes.position.array;if(null!==n)for(var n=n.array,g=0,w=n.length-1;g<w;g+=p){var u=n[g+1];k.fromArray(r,3*n[g]);m.fromArray(r,3*u);u=b.distanceSqToSegment(k,m,l,h);u>f||(l.applyMatrix4(this.matrixWorld),u=d.ray.origin.distanceTo(l),u<d.near||
-u>d.far||e.push({distance:u,point:h.clone().applyMatrix4(this.matrixWorld),index:g,face:null,faceIndex:null,object:this}))}else for(g=0,w=r.length/3-1;g<w;g+=p)k.fromArray(r,3*g),m.fromArray(r,3*g+3),u=b.distanceSqToSegment(k,m,l,h),u>f||(l.applyMatrix4(this.matrixWorld),u=d.ray.origin.distanceTo(l),u<d.near||u>d.far||e.push({distance:u,point:h.clone().applyMatrix4(this.matrixWorld),index:g,face:null,faceIndex:null,object:this}))}else if(g.isGeometry)for(k=g.vertices,m=k.length,g=0;g<m-1;g+=p)u=b.distanceSqToSegment(k[g],
-k[g+1],l,h),u>f||(l.applyMatrix4(this.matrixWorld),u=d.ray.origin.distanceTo(l),u<d.near||u>d.far||e.push({distance:u,point:h.clone().applyMatrix4(this.matrixWorld),index:g,face:null,faceIndex:null,object:this}))}}}(),clone:function(){return(new this.constructor(this.geometry,this.material)).copy(this)}});fa.prototype=Object.assign(Object.create(Va.prototype),{constructor:fa,isLineSegments:!0});Oa.prototype=Object.create(W.prototype);Oa.prototype.constructor=Oa;Oa.prototype.isPointsMaterial=!0;Oa.prototype.copy=
-function(a){W.prototype.copy.call(this,a);this.color.copy(a.color);this.map=a.map;this.size=a.size;this.sizeAttenuation=a.sizeAttenuation;return this};Kb.prototype=Object.assign(Object.create(G.prototype),{constructor:Kb,isPoints:!0,raycast:function(){var a=new H,b=new bb,c=new Fa;return function(d,e){function f(a,c){var f=b.distanceSqToPoint(a);if(f<l){var h=b.closestPointToPoint(a);h.applyMatrix4(k);var m=d.ray.origin.distanceTo(h);m<d.near||m>d.far||e.push({distance:m,distanceToRay:Math.sqrt(f),
-point:h.clone(),index:c,face:null,object:g})}}var g=this,h=this.geometry,k=this.matrixWorld,m=d.params.Points.threshold;null===h.boundingSphere&&h.computeBoundingSphere();c.copy(h.boundingSphere);c.applyMatrix4(k);if(!1!==d.ray.intersectsSphere(c)){a.getInverse(k);b.copy(d.ray).applyMatrix4(a);var m=m/((this.scale.x+this.scale.y+this.scale.z)/3),l=m*m,m=new q;if(h.isBufferGeometry){var p=h.index,h=h.attributes.position.array;if(null!==p)for(var n=p.array,p=0,r=n.length;p<r;p++){var w=n[p];m.fromArray(h,
-3*w);f(m,w)}else for(p=0,n=h.length/3;p<n;p++)m.fromArray(h,3*p),f(m,p)}else for(m=h.vertices,p=0,n=m.length;p<n;p++)f(m[p],p)}}}(),clone:function(){return(new this.constructor(this.geometry,this.material)).copy(this)}});Bc.prototype=Object.assign(Object.create(G.prototype),{constructor:Bc});kd.prototype=Object.create(ea.prototype);kd.prototype.constructor=kd;Lb.prototype=Object.create(ea.prototype);Lb.prototype.constructor=Lb;Lb.prototype.isCompressedTexture=!0;ld.prototype=Object.create(ea.prototype);
-ld.prototype.constructor=ld;Cc.prototype=Object.create(ea.prototype);Cc.prototype.constructor=Cc;Cc.prototype.isDepthTexture=!0;Mb.prototype=Object.create(D.prototype);Mb.prototype.constructor=Mb;Nb.prototype=Object.create(D.prototype);Nb.prototype.constructor=Nb;Dc.prototype=Object.create(S.prototype);Dc.prototype.constructor=Dc;xa.prototype=Object.create(D.prototype);xa.prototype.constructor=xa;Ob.prototype=Object.create(xa.prototype);Ob.prototype.constructor=Ob;Ec.prototype=Object.create(S.prototype);
-Ec.prototype.constructor=Ec;lb.prototype=Object.create(xa.prototype);lb.prototype.constructor=lb;Fc.prototype=Object.create(S.prototype);Fc.prototype.constructor=Fc;Pb.prototype=Object.create(xa.prototype);Pb.prototype.constructor=Pb;Gc.prototype=Object.create(S.prototype);Gc.prototype.constructor=Gc;Qb.prototype=Object.create(xa.prototype);Qb.prototype.constructor=Qb;Hc.prototype=Object.create(S.prototype);Hc.prototype.constructor=Hc;Ic.prototype=Object.create(S.prototype);Ic.prototype.constructor=
-Ic;Rb.prototype=Object.create(D.prototype);Rb.prototype.constructor=Rb;Jc.prototype=Object.create(S.prototype);Jc.prototype.constructor=Jc;Sb.prototype=Object.create(D.prototype);Sb.prototype.constructor=Sb;Kc.prototype=Object.create(S.prototype);Kc.prototype.constructor=Kc;Tb.prototype=Object.create(D.prototype);Tb.prototype.constructor=Tb;Lc.prototype=Object.create(S.prototype);Lc.prototype.constructor=Lc;var pa={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},triangulate:function(){return function(a,b){var c=a.length;if(3>c)return null;var d=[],e=[],f=[],g,h,k;if(0<pa.area(a))for(h=0;h<c;h++)e[h]=h;else for(h=0;h<c;h++)e[h]=c-1-h;var m=2*c;for(h=c-1;2<c;){if(0>=m--){console.warn("THREE.ShapeUtils: Unable to triangulate polygon! in triangulate()");break}g=h;c<=g&&(g=0);h=g+1;c<=h&&(h=0);k=h+1;c<=k&&(k=0);var l;a:{var p,n,r,q,u,F,t,v;p=a[e[g]].x;n=a[e[g]].y;r=a[e[h]].x;q=a[e[h]].y;u=a[e[k]].x;F=a[e[k]].y;if(0>=(r-p)*(F-n)-(q-n)*(u-p))l=
-!1;else{var M,z,A,I,E,K,y,C,D,G;M=u-r;z=F-q;A=p-u;I=n-F;E=r-p;K=q-n;for(l=0;l<c;l++)if(t=a[e[l]].x,v=a[e[l]].y,!(t===p&&v===n||t===r&&v===q||t===u&&v===F)&&(y=t-p,C=v-n,D=t-r,G=v-q,t-=u,v-=F,D=M*G-z*D,y=E*C-K*y,C=A*v-I*t,D>=-Number.EPSILON&&C>=-Number.EPSILON&&y>=-Number.EPSILON)){l=!1;break a}l=!0}}if(l){d.push([a[e[g]],a[e[h]],a[e[k]]]);f.push([e[g],e[h],e[k]]);g=h;for(k=h+1;k<c;g++,k++)e[g]=e[k];c--;m=2*c}}return b?f:d}}(),triangulateShape:function(a,b){function c(a){var b=a.length;2<b&&a[b-1].equals(a[0])&&
-a.pop()}function d(a,b,c){return a.x!==b.x?a.x<b.x?a.x<=c.x&&c.x<=b.x:b.x<=c.x&&c.x<=a.x:a.y<b.y?a.y<=c.y&&c.y<=b.y:b.y<=c.y&&c.y<=a.y}function e(a,b,c,e,f){var g=b.x-a.x,h=b.y-a.y,k=e.x-c.x,m=e.y-c.y,l=a.x-c.x,n=a.y-c.y,p=h*k-g*m,q=h*l-g*n;if(Math.abs(p)>Number.EPSILON){if(0<p){if(0>q||q>p)return[];k=m*l-k*n;if(0>k||k>p)return[]}else{if(0<q||q<p)return[];k=m*l-k*n;if(0<k||k<p)return[]}if(0===k)return!f||0!==q&&q!==p?[a]:[];if(k===p)return!f||0!==q&&q!==p?[b]:[];if(0===q)return[c];if(q===p)return[e];
-f=k/p;return[{x:a.x+f*g,y:a.y+f*h}]}if(0!==q||m*l!==k*n)return[];h=0===g&&0===h;k=0===k&&0===m;if(h&&k)return a.x!==c.x||a.y!==c.y?[]:[a];if(h)return d(c,e,a)?[a]:[];if(k)return d(a,b,c)?[c]:[];0!==g?(a.x<b.x?(g=a,k=a.x,h=b,a=b.x):(g=b,k=b.x,h=a,a=a.x),c.x<e.x?(b=c,p=c.x,m=e,c=e.x):(b=e,p=e.x,m=c,c=c.x)):(a.y<b.y?(g=a,k=a.y,h=b,a=b.y):(g=b,k=b.y,h=a,a=a.y),c.y<e.y?(b=c,p=c.y,m=e,c=e.y):(b=e,p=e.y,m=c,c=c.y));return k<=p?a<p?[]:a===p?f?[]:[b]:a<=c?[b,h]:[b,m]:k>c?[]:k===c?f?[]:[g]:a<=c?[g,h]:[g,m]}
-function f(a,b,c,d){var e=b.x-a.x,f=b.y-a.y;b=c.x-a.x;c=c.y-a.y;var g=d.x-a.x;d=d.y-a.y;a=e*c-f*b;e=e*d-f*g;return Math.abs(a)>Number.EPSILON?(b=g*c-d*b,0<a?0<=e&&0<=b:0<=e||0<=b):0<e}c(a);b.forEach(c);var g,h,k,m,l,p={};k=a.concat();g=0;for(h=b.length;g<h;g++)Array.prototype.push.apply(k,b[g]);g=0;for(h=k.length;g<h;g++)l=k[g].x+":"+k[g].y,void 0!==p[l]&&console.warn("THREE.ShapeUtils: Duplicate point",l,g),p[l]=g;g=function(a,b){function c(a,b){var d=h.length-1,e=a-1;0>e&&(e=d);var g=a+1;g>d&&(g=
-0);d=f(h[a],h[e],h[g],k[b]);if(!d)return!1;d=k.length-1;e=b-1;0>e&&(e=d);g=b+1;g>d&&(g=0);return(d=f(k[b],k[e],k[g],h[a]))?!0:!1}function d(a,b){var c,f;for(c=0;c<h.length;c++)if(f=c+1,f%=h.length,f=e(a,b,h[c],h[f],!0),0<f.length)return!0;return!1}function g(a,c){var d,f,h,k;for(d=0;d<m.length;d++)for(f=b[m[d]],h=0;h<f.length;h++)if(k=h+1,k%=f.length,k=e(a,c,f[h],f[k],!0),0<k.length)return!0;return!1}var h=a.concat(),k,m=[],l,n,p,q,x,y=[],C,D,G,H=0;for(l=b.length;H<l;H++)m.push(H);C=0;for(var O=2*
-m.length;0<m.length;){O--;if(0>O){console.log("Infinite Loop! Holes left:"+m.length+", Probably Hole outside Shape!");break}for(n=C;n<h.length;n++){p=h[n];l=-1;for(H=0;H<m.length;H++)if(q=m[H],x=p.x+":"+p.y+":"+q,void 0===y[x]){k=b[q];for(D=0;D<k.length;D++)if(q=k[D],c(n,D)&&!d(p,q)&&!g(p,q)){l=D;m.splice(H,1);C=h.slice(0,n+1);q=h.slice(n);D=k.slice(l);G=k.slice(0,l+1);h=C.concat(D).concat(G).concat(q);C=n;break}if(0<=l)break;y[x]=!0}if(0<=l)break}}return h}(a,b);var n=pa.triangulate(g,!1);g=0;for(h=
-n.length;g<h;g++)for(m=n[g],k=0;3>k;k++)l=m[k].x+":"+m[k].y,l=p[l],void 0!==l&&(m[k]=l);return n.concat()},isClockWise:function(a){return 0>pa.area(a)},b2:function(){return function(a,b,c,d){var e=1-a;return e*e*b+2*(1-a)*a*c+a*a*d}}(),b3:function(){return function(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}}()};La.prototype=Object.create(S.prototype);La.prototype.constructor=La;La.prototype.addShapeList=function(a,b){for(var c=a.length,d=0;d<c;d++)this.addShape(a[d],
-b)};La.prototype.addShape=function(a,b){function c(a,b,c){b||console.error("THREE.ExtrudeGeometry: vec does not exist");return b.clone().multiplyScalar(c).add(a)}function d(a,b,c){var d,e,f;e=a.x-b.x;f=a.y-b.y;d=c.x-a.x;var g=c.y-a.y,h=e*e+f*f;if(Math.abs(e*g-f*d)>Number.EPSILON){var k=Math.sqrt(h),m=Math.sqrt(d*d+g*g),h=b.x-f/k;b=b.y+e/k;g=((c.x-g/m-h)*g-(c.y+d/m-b)*d)/(e*g-f*d);d=h+e*g-a.x;e=b+f*g-a.y;f=d*d+e*e;if(2>=f)return new C(d,e);f=Math.sqrt(f/2)}else a=!1,e>Number.EPSILON?d>Number.EPSILON&&
-(a=!0):e<-Number.EPSILON?d<-Number.EPSILON&&(a=!0):Math.sign(f)===Math.sign(g)&&(a=!0),a?(d=-f,f=Math.sqrt(h)):(d=e,e=f,f=Math.sqrt(h/2));return new C(d/f,e/f)}function e(a,b){var c,d;for(L=a.length;0<=--L;){c=L;d=L-1;0>d&&(d=a.length-1);var e,f=r+2*l;for(e=0;e<f;e++){var g=U*e,h=U*(e+1),k=b+c+g,g=b+d+g,m=b+d+h,h=b+c+h,k=k+J,g=g+J,m=m+J,h=h+J;G.faces.push(new ha(k,g,h,null,null,1));G.faces.push(new ha(g,m,h,null,null,1));k=t.generateSideWallUV(G,k,g,m,h);G.faceVertexUvs[0].push([k[0],k[1],k[3]]);
-G.faceVertexUvs[0].push([k[1],k[2],k[3]])}}}function f(a,b,c){G.vertices.push(new q(a,b,c))}function g(a,b,c){a+=J;b+=J;c+=J;G.faces.push(new ha(a,b,c,null,null,0));a=t.generateTopUV(G,a,b,c);G.faceVertexUvs[0].push(a)}var h=void 0!==b.amount?b.amount:100,k=void 0!==b.bevelThickness?b.bevelThickness:6,m=void 0!==b.bevelSize?b.bevelSize:k-2,l=void 0!==b.bevelSegments?b.bevelSegments:3,p=void 0!==b.bevelEnabled?b.bevelEnabled:!0,n=void 0!==b.curveSegments?b.curveSegments:12,r=void 0!==b.steps?b.steps:
-1,w=b.extrudePath,u,F=!1,t=void 0!==b.UVGenerator?b.UVGenerator:La.WorldUVGenerator,v,y,z,A;w&&(u=w.getSpacedPoints(r),F=!0,p=!1,v=void 0!==b.frames?b.frames:w.computeFrenetFrames(r,!1),y=new q,z=new q,A=new q);p||(m=k=l=0);var I,E,D,G=this,J=this.vertices.length,w=a.extractPoints(n),n=w.shape,H=w.holes;if(w=!pa.isClockWise(n)){n=n.reverse();E=0;for(D=H.length;E<D;E++)I=H[E],pa.isClockWise(I)&&(H[E]=I.reverse());w=!1}var N=pa.triangulateShape(n,H),S=n;E=0;for(D=H.length;E<D;E++)I=H[E],n=n.concat(I);
-var Q,O,P,R,T,U=n.length,V,W=N.length,w=[],L=0;P=S.length;Q=P-1;for(O=L+1;L<P;L++,Q++,O++)Q===P&&(Q=0),O===P&&(O=0),w[L]=d(S[L],S[Q],S[O]);var X=[],Z,ba=w.concat();E=0;for(D=H.length;E<D;E++){I=H[E];Z=[];L=0;P=I.length;Q=P-1;for(O=L+1;L<P;L++,Q++,O++)Q===P&&(Q=0),O===P&&(O=0),Z[L]=d(I[L],I[Q],I[O]);X.push(Z);ba=ba.concat(Z)}for(Q=0;Q<l;Q++){P=Q/l;R=k*Math.cos(P*Math.PI/2);O=m*Math.sin(P*Math.PI/2);L=0;for(P=S.length;L<P;L++)T=c(S[L],w[L],O),f(T.x,T.y,-R);E=0;for(D=H.length;E<D;E++)for(I=H[E],Z=X[E],
-L=0,P=I.length;L<P;L++)T=c(I[L],Z[L],O),f(T.x,T.y,-R)}O=m;for(L=0;L<U;L++)T=p?c(n[L],ba[L],O):n[L],F?(z.copy(v.normals[0]).multiplyScalar(T.x),y.copy(v.binormals[0]).multiplyScalar(T.y),A.copy(u[0]).add(z).add(y),f(A.x,A.y,A.z)):f(T.x,T.y,0);for(P=1;P<=r;P++)for(L=0;L<U;L++)T=p?c(n[L],ba[L],O):n[L],F?(z.copy(v.normals[P]).multiplyScalar(T.x),y.copy(v.binormals[P]).multiplyScalar(T.y),A.copy(u[P]).add(z).add(y),f(A.x,A.y,A.z)):f(T.x,T.y,h/r*P);for(Q=l-1;0<=Q;Q--){P=Q/l;R=k*Math.cos(P*Math.PI/2);O=
-m*Math.sin(P*Math.PI/2);L=0;for(P=S.length;L<P;L++)T=c(S[L],w[L],O),f(T.x,T.y,h+R);E=0;for(D=H.length;E<D;E++)for(I=H[E],Z=X[E],L=0,P=I.length;L<P;L++)T=c(I[L],Z[L],O),F?f(T.x,T.y+u[r-1].y,u[r-1].x+R):f(T.x,T.y,h+R)}(function(){if(p){var a=0*U;for(L=0;L<W;L++)V=N[L],g(V[2]+a,V[1]+a,V[0]+a);a=U*(r+2*l);for(L=0;L<W;L++)V=N[L],g(V[0]+a,V[1]+a,V[2]+a)}else{for(L=0;L<W;L++)V=N[L],g(V[2],V[1],V[0]);for(L=0;L<W;L++)V=N[L],g(V[0]+U*r,V[1]+U*r,V[2]+U*r)}})();(function(){var a=0;e(S,a);a+=S.length;E=0;for(D=
-H.length;E<D;E++)I=H[E],e(I,a),a+=I.length})()};La.WorldUVGenerator={generateTopUV:function(a,b,c,d){a=a.vertices;b=a[b];c=a[c];d=a[d];return[new C(b.x,b.y),new C(c.x,c.y),new C(d.x,d.y)]},generateSideWallUV:function(a,b,c,d,e){a=a.vertices;b=a[b];c=a[c];d=a[d];e=a[e];return.01>Math.abs(b.y-c.y)?[new C(b.x,1-b.z),new C(c.x,1-c.z),new C(d.x,1-d.z),new C(e.x,1-e.z)]:[new C(b.y,1-b.z),new C(c.y,1-c.z),new C(d.y,1-d.z),new C(e.y,1-e.z)]}};Mc.prototype=Object.create(La.prototype);Mc.prototype.constructor=
-Mc;mb.prototype=Object.create(D.prototype);mb.prototype.constructor=mb;Nc.prototype=Object.create(S.prototype);Nc.prototype.constructor=Nc;Ub.prototype=Object.create(D.prototype);Ub.prototype.constructor=Ub;Oc.prototype=Object.create(S.prototype);Oc.prototype.constructor=Oc;Pc.prototype=Object.create(S.prototype);Pc.prototype.constructor=Pc;Vb.prototype=Object.create(D.prototype);Vb.prototype.constructor=Vb;Qc.prototype=Object.create(S.prototype);Qc.prototype.constructor=Qc;Wb.prototype=Object.create(D.prototype);
-Wb.prototype.constructor=Wb;Xb.prototype=Object.create(S.prototype);Xb.prototype.constructor=Xb;Yb.prototype=Object.create(D.prototype);Yb.prototype.constructor=Yb;Wa.prototype=Object.create(D.prototype);Wa.prototype.constructor=Wa;nb.prototype=Object.create(S.prototype);nb.prototype.constructor=nb;Rc.prototype=Object.create(nb.prototype);Rc.prototype.constructor=Rc;Sc.prototype=Object.create(Wa.prototype);Sc.prototype.constructor=Sc;Zb.prototype=Object.create(D.prototype);Zb.prototype.constructor=
-Zb;Tc.prototype=Object.create(S.prototype);Tc.prototype.constructor=Tc;$b.prototype=Object.create(S.prototype);$b.prototype.constructor=$b;var Ea=Object.freeze({WireframeGeometry:Mb,ParametricGeometry:Dc,ParametricBufferGeometry:Nb,TetrahedronGeometry:Ec,TetrahedronBufferGeometry:Ob,OctahedronGeometry:Fc,OctahedronBufferGeometry:lb,IcosahedronGeometry:Gc,IcosahedronBufferGeometry:Pb,DodecahedronGeometry:Hc,DodecahedronBufferGeometry:Qb,PolyhedronGeometry:Ic,PolyhedronBufferGeometry:xa,TubeGeometry:Jc,
-TubeBufferGeometry:Rb,TorusKnotGeometry:Kc,TorusKnotBufferGeometry:Sb,TorusGeometry:Lc,TorusBufferGeometry:Tb,TextGeometry:Mc,SphereBufferGeometry:mb,SphereGeometry:Nc,RingGeometry:Oc,RingBufferGeometry:Ub,PlaneBufferGeometry:ib,PlaneGeometry:Pc,LatheGeometry:Qc,LatheBufferGeometry:Vb,ShapeGeometry:Xb,ShapeBufferGeometry:Wb,ExtrudeGeometry:La,EdgesGeometry:Yb,ConeGeometry:Rc,ConeBufferGeometry:Sc,CylinderGeometry:nb,CylinderBufferGeometry:Wa,CircleBufferGeometry:Zb,CircleGeometry:Tc,BoxBufferGeometry:hb,
-BoxGeometry:$b});ac.prototype=Object.create(Ia.prototype);ac.prototype.constructor=ac;ac.prototype.isShadowMaterial=!0;bc.prototype=Object.create(Ia.prototype);bc.prototype.constructor=bc;bc.prototype.isRawShaderMaterial=!0;Uc.prototype={constructor:Uc,isMultiMaterial:!0,toJSON:function(a){for(var b={metadata:{version:4.2,type:"material",generator:"MaterialExporter"},uuid:this.uuid,type:this.type,materials:[]},c=this.materials,d=0,e=c.length;d<e;d++){var f=c[d].toJSON(a);delete f.metadata;b.materials.push(f)}b.visible=
-this.visible;return b},clone:function(){for(var a=new this.constructor,b=0;b<this.materials.length;b++)a.materials.push(this.materials[b].clone());a.visible=this.visible;return a}};Pa.prototype=Object.create(W.prototype);Pa.prototype.constructor=Pa;Pa.prototype.isMeshStandardMaterial=!0;Pa.prototype.copy=function(a){W.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.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;return this};ob.prototype=Object.create(Pa.prototype);ob.prototype.constructor=ob;ob.prototype.isMeshPhysicalMaterial=!0;ob.prototype.copy=function(a){Pa.prototype.copy.call(this,
-a);this.defines={PHYSICAL:""};this.reflectivity=a.reflectivity;this.clearCoat=a.clearCoat;this.clearCoatRoughness=a.clearCoatRoughness;return this};Ca.prototype=Object.create(W.prototype);Ca.prototype.constructor=Ca;Ca.prototype.isMeshPhongMaterial=!0;Ca.prototype.copy=function(a){W.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.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};pb.prototype=Object.create(Ca.prototype);pb.prototype.constructor=pb;pb.prototype.isMeshToonMaterial=!0;pb.prototype.copy=function(a){Ca.prototype.copy.call(this,a);this.gradientMap=a.gradientMap;return this};qb.prototype=Object.create(W.prototype);
-qb.prototype.constructor=qb;qb.prototype.isMeshNormalMaterial=!0;qb.prototype.copy=function(a){W.prototype.copy.call(this,a);this.bumpMap=a.bumpMap;this.bumpScale=a.bumpScale;this.normalMap=a.normalMap;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};rb.prototype=Object.create(W.prototype);rb.prototype.constructor=rb;rb.prototype.isMeshLambertMaterial=!0;rb.prototype.copy=function(a){W.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};sb.prototype=Object.create(W.prototype);sb.prototype.constructor=sb;sb.prototype.isLineDashedMaterial=!0;sb.prototype.copy=
-function(a){W.prototype.copy.call(this,a);this.color.copy(a.color);this.linewidth=a.linewidth;this.scale=a.scale;this.dashSize=a.dashSize;this.gapSize=a.gapSize;return this};var Mf=Object.freeze({ShadowMaterial:ac,SpriteMaterial:kb,RawShaderMaterial:bc,ShaderMaterial:Ia,PointsMaterial:Oa,MultiMaterial:Uc,MeshPhysicalMaterial:ob,MeshStandardMaterial:Pa,MeshPhongMaterial:Ca,MeshToonMaterial:pb,MeshNormalMaterial:qb,MeshLambertMaterial:rb,MeshDepthMaterial:ab,MeshBasicMaterial:Ka,LineDashedMaterial:sb,
-LineBasicMaterial:ia,Material:W}),ne={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={}}},va=new Pd;Object.assign(Ma.prototype,{load:function(a,b,c,d){void 0===a&&(a="");void 0!==this.path&&(a=this.path+a);var e=this,f=ne.get(a);if(void 0!==f)return e.manager.itemStart(a),setTimeout(function(){b&&b(f);e.manager.itemEnd(a)},0),f;var g=a.match(/^data:(.*?)(;base64)?,(.*)$/);
-if(g){var h=g[1],k=!!g[2],g=g[3],g=window.decodeURIComponent(g);k&&(g=window.atob(g));try{var m,l=(this.responseType||"").toLowerCase();switch(l){case "arraybuffer":case "blob":m=new ArrayBuffer(g.length);for(var p=new Uint8Array(m),k=0;k<g.length;k++)p[k]=g.charCodeAt(k);"blob"===l&&(m=new Blob([m],{type:h}));break;case "document":m=(new DOMParser).parseFromString(g,h);break;case "json":m=JSON.parse(g);break;default:m=g}window.setTimeout(function(){b&&b(m);e.manager.itemEnd(a)},0)}catch(q){window.setTimeout(function(){d&&
-d(q);e.manager.itemError(a)},0)}}else{var n=new XMLHttpRequest;n.open("GET",a,!0);n.addEventListener("load",function(c){var f=c.target.response;ne.add(a,f);200===this.status?(b&&b(f),e.manager.itemEnd(a)):0===this.status?(console.warn("THREE.FileLoader: HTTP Status 0 received."),b&&b(f),e.manager.itemEnd(a)):(d&&d(c),e.manager.itemError(a))},!1);void 0!==c&&n.addEventListener("progress",function(a){c(a)},!1);n.addEventListener("error",function(b){d&&d(b);e.manager.itemError(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");n.send(null)}e.manager.itemStart(a);return n},setPath:function(a){this.path=a;return this},setResponseType:function(a){this.responseType=a;return this},setWithCredentials:function(a){this.withCredentials=a;return this},setMimeType:function(a){this.mimeType=a;return this}});Object.assign(Ee.prototype,{load:function(a,
-b,c,d){function e(e){k.load(a[e],function(a){a=f._parser(a,!0);g[e]={width:a.width,height:a.height,format:a.format,mipmaps:a.mipmaps};m+=1;6===m&&(1===a.mipmapCount&&(h.minFilter=1006),h.format=a.format,h.needsUpdate=!0,b&&b(h))},c,d)}var f=this,g=[],h=new Lb;h.image=g;var k=new Ma(this.manager);k.setPath(this.path);k.setResponseType("arraybuffer");if(Array.isArray(a))for(var m=0,l=0,p=a.length;l<p;++l)e(l);else k.load(a,function(a){a=f._parser(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},setPath:function(a){this.path=a;return this}});Object.assign(Qd.prototype,{load:function(a,b,c,d){var e=this,f=new db,g=new Ma(this.manager);g.setResponseType("arraybuffer");
-g.load(a,function(a){if(a=e._parser(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:1008,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),1===
-a.mipmapCount&&(f.minFilter=1006),f.needsUpdate=!0,b&&b(f,a)},c,d);return f}});Object.assign(Vc.prototype,{load:function(a,b,c,d){var e=this,f=document.createElementNS("http://www.w3.org/1999/xhtml","img");f.onload=function(){f.onload=null;URL.revokeObjectURL(f.src);b&&b(f);e.manager.itemEnd(a)};f.onerror=d;if(0===a.indexOf("data:"))f.src=a;else if(void 0!==this.crossOrigin)f.crossOrigin=this.crossOrigin,f.src=a;else{var g=new Ma;g.setPath(this.path);g.setResponseType("blob");g.setWithCredentials(this.withCredentials);
-g.load(a,function(a){f.src=URL.createObjectURL(a)},c,d)}e.manager.itemStart(a);return f},setCrossOrigin:function(a){this.crossOrigin=a;return this},setWithCredentials:function(a){this.withCredentials=a;return this},setPath:function(a){this.path=a;return this}});Object.assign(Rd.prototype,{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 Za,g=new Vc(this.manager);g.setCrossOrigin(this.crossOrigin);g.setPath(this.path);
-var h=0;for(c=0;c<a.length;++c)e(c);return f},setCrossOrigin:function(a){this.crossOrigin=a;return this},setPath:function(a){this.path=a;return this}});Object.assign(md.prototype,{load:function(a,b,c,d){var e=new ea,f=new Vc(this.manager);f.setCrossOrigin(this.crossOrigin);f.setWithCredentials(this.withCredentials);f.setPath(this.path);f.load(a,function(c){var d=0<a.search(/\.(jpg|jpeg)$/)||0===a.search(/^data\:image\/jpeg/);e.format=d?1022:1023;e.image=c;e.needsUpdate=!0;void 0!==b&&b(e)},c,d);return e},
-setCrossOrigin:function(a){this.crossOrigin=a;return this},setWithCredentials:function(a){this.withCredentials=a;return this},setPath:function(a){this.path=a;return this}});na.prototype=Object.assign(Object.create(G.prototype),{constructor:na,isLight:!0,copy:function(a){G.prototype.copy.call(this,a);this.color.copy(a.color);this.intensity=a.intensity;return this},toJSON:function(a){a=G.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}});nd.prototype=Object.assign(Object.create(na.prototype),{constructor:nd,isHemisphereLight:!0,copy:function(a){na.prototype.copy.call(this,a);this.groundColor.copy(a.groundColor);
-return this}});Object.assign(tb.prototype,{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}});od.prototype=Object.assign(Object.create(tb.prototype),
-{constructor:od,isSpotLightShadow:!0,update:function(a){var b=2*Q.RAD2DEG*a.angle,c=this.mapSize.width/this.mapSize.height;a=a.distance||500;var d=this.camera;if(b!==d.fov||c!==d.aspect||a!==d.far)d.fov=b,d.aspect=c,d.far=a,d.updateProjectionMatrix()}});pd.prototype=Object.assign(Object.create(na.prototype),{constructor:pd,isSpotLight:!0,copy:function(a){na.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}});qd.prototype=Object.assign(Object.create(na.prototype),{constructor:qd,isPointLight:!0,copy:function(a){na.prototype.copy.call(this,a);this.distance=a.distance;this.decay=a.decay;this.shadow=a.shadow.clone();return this}});rd.prototype=Object.assign(Object.create(tb.prototype),{constructor:rd});sd.prototype=Object.assign(Object.create(na.prototype),{constructor:sd,isDirectionalLight:!0,copy:function(a){na.prototype.copy.call(this,a);this.target=a.target.clone();
-this.shadow=a.shadow.clone();return this}});td.prototype=Object.assign(Object.create(na.prototype),{constructor:td,isAmbientLight:!0});var ba={arraySlice:function(a,b,c){return ba.isTypedArray(a)?new a.constructor(a.subarray(b,c)):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,k=0;k!==b;++k)e[g++]=a[h+k];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)}}}};qa.prototype={constructor:qa,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(a,b,c,d){throw Error("call to abstract method");},intervalChanged_:function(a,b,c){}};Object.assign(qa.prototype,{beforeStart_:qa.prototype.copySampleValue_,afterEnd_:qa.prototype.copySampleValue_});ud.prototype=Object.assign(Object.create(qa.prototype),{constructor:ud,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,k=this._offsetPrev,m=this._offsetNext,l=this._weightPrev,p=this._weightNext,n=(c-b)/(d-b);c=n*n;d=c*n;b=-l*d+2*l*c-l*n;l=(1+l)*d+(-1.5-2*l)*c+(-.5+l)*n+1;n=(-1-p)*d+(1.5+p)*c+.5*n;p=p*d-p*c;for(c=0;c!==g;++c)e[c]=b*f[k+c]+l*f[h+c]+n*f[a+c]+p*f[m+c];return e}});Wc.prototype=Object.assign(Object.create(qa.prototype),{constructor:Wc,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}});vd.prototype=Object.assign(Object.create(qa.prototype),{constructor:vd,interpolate_:function(a,b,c,d){return this.copySampleValue_(a-1)}});var Ya;Ya={TimeBufferType:Float32Array,ValueBufferType:Float32Array,DefaultInterpolation:2301,InterpolantFactoryMethodDiscrete:function(a){return new vd(this.times,this.values,this.getValueSize(),a)},InterpolantFactoryMethodLinear:function(a){return new Wc(this.times,this.values,
-this.getValueSize(),a)},InterpolantFactoryMethodSmooth:function(a){return new ud(this.times,this.values,this.getValueSize(),a)},setInterpolation:function(a){var b;switch(a){case 2300: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(b)}else this.createInterpolant=b},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),d=this.getValueSize(),this.times=ba.arraySlice(c,e,f),this.values=ba.arraySlice(this.values,e*d,f*d);return this},validate:function(){var a=!0,b=this.getValueSize();0!==b-Math.floor(b)&&(console.error("invalid value size in track",this),a=!1);var c=this.times,b=this.values,d=c.length;0===d&&(console.error("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("time is not a valid number",this,f,g);a=!1;break}if(null!==e&&e>g){console.error("out of order keys",this,f,g,e);a=!1;break}e=g}if(void 0!==b&&ba.isTypedArray(b))for(f=0,c=b.length;f!==c;++f)if(d=b[f],isNaN(d)){console.error("value is not a valid number",this,f,d);a=!1;break}return a},optimize:function(){for(var a=this.times,b=this.values,c=this.getValueSize(),d=2302===this.getInterpolation(),e=1,
-f=a.length-1,g=1;g<f;++g){var h=!1,k=a[g];if(k!==a[g+1]&&(1!==g||k!==k[0]))if(d)h=!0;else for(var m=g*c,l=m-c,p=m+c,k=0;k!==c;++k){var n=b[m+k];if(n!==b[l+k]||n!==b[p+k]){h=!0;break}}if(h){if(g!==e)for(a[e]=a[g],h=g*c,m=e*c,k=0;k!==c;++k)b[m+k]=b[h+k];++e}}if(0<f){a[e]=a[f];h=f*c;m=e*c;for(k=0;k!==c;++k)b[m+k]=b[h+k];++e}e!==a.length&&(this.times=ba.arraySlice(a,0,e),this.values=ba.arraySlice(b,0,e*c));return this}};cc.prototype=Object.assign(Object.create(Ya),{constructor:cc,ValueTypeName:"vector"});
-wd.prototype=Object.assign(Object.create(qa.prototype),{constructor:wd,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)da.slerpFlat(e,0,f,a-g,f,a,b);return e}});Xc.prototype=Object.assign(Object.create(Ya),{constructor:Xc,ValueTypeName:"quaternion",DefaultInterpolation:2301,InterpolantFactoryMethodLinear:function(a){return new wd(this.times,this.values,this.getValueSize(),a)},InterpolantFactoryMethodSmooth:void 0});
-dc.prototype=Object.assign(Object.create(Ya),{constructor:dc,ValueTypeName:"number"});xd.prototype=Object.assign(Object.create(Ya),{constructor:xd,ValueTypeName:"string",ValueBufferType:Array,DefaultInterpolation:2300,InterpolantFactoryMethodLinear:void 0,InterpolantFactoryMethodSmooth:void 0});yd.prototype=Object.assign(Object.create(Ya),{constructor:yd,ValueTypeName:"bool",ValueBufferType:Array,DefaultInterpolation:2300,InterpolantFactoryMethodLinear:void 0,InterpolantFactoryMethodSmooth:void 0});
-zd.prototype=Object.assign(Object.create(Ya),{constructor:zd,ValueTypeName:"color"});vb.prototype=Ya;Ya.constructor=vb;Object.assign(vb,{parse:function(a){if(void 0===a.type)throw Error("track type undefined, can not parse");var b=vb._getTrackTypeForValueTypeName(a.type);if(void 0===a.times){var c=[],d=[];ba.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)},toJSON:function(a){var b=a.constructor;if(void 0!==b.toJSON)b=
-b.toJSON(a);else{var b={name:a.name,times:ba.convertArray(a.times,Array),values:ba.convertArray(a.values,Array)},c=a.getInterpolation();c!==a.DefaultInterpolation&&(b.interpolation=c)}b.type=a.ValueTypeName;return b},_getTrackTypeForValueTypeName:function(a){switch(a.toLowerCase()){case "scalar":case "double":case "float":case "number":case "integer":return dc;case "vector":case "vector2":case "vector3":case "vector4":return cc;case "color":return zd;case "quaternion":return Xc;case "bool":case "boolean":return yd;
-case "string":return xd}throw Error("Unsupported typeName: "+a);}});ta.prototype={constructor:ta,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},trim:function(){for(var a=0;a<this.tracks.length;a++)this.tracks[a].trim(0,this.duration);return this},optimize:function(){for(var a=0;a<this.tracks.length;a++)this.tracks[a].optimize();return this}};Object.assign(ta,{parse:function(a){for(var b=[],c=a.tracks,
-d=1/(a.fps||1),e=0,f=c.length;e!==f;++e)b.push(vb.parse(c[e]).scale(d));return new ta(a.name,a.duration,b)},toJSON:function(a){var b=[],c=a.tracks;a={name:a.name,duration:a.duration,tracks:b};for(var d=0,e=c.length;d!==e;++d)b.push(vb.toJSON(c[d]));return a},CreateFromMorphTargetSequence:function(a,b,c,d){for(var e=b.length,f=[],g=0;g<e;g++){var h=[],k=[];h.push((g+e-1)%e,g,(g+1)%e);k.push(0,1,0);var m=ba.getKeyframeOrder(h),h=ba.sortedArray(h,1,m),k=ba.sortedArray(k,1,m);d||0!==h[0]||(h.push(e),
-k.push(k[0]));f.push((new dc(".morphTargetInfluences["+b[g].name+"]",h,k)).scale(1/c))}return new ta(a,-1,f)},findByName:function(a,b){var c=a;Array.isArray(a)||(c=a.geometry&&a.geometry.animations||a.animations);for(var d=0;d<c.length;d++)if(c[d].name===b)return c[d];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],k=h.name.match(e);if(k&&1<k.length){var m=k[1];(k=d[m])||(d[m]=k=[]);k.push(h)}}a=[];for(m in d)a.push(ta.CreateFromMorphTargetSequence(m,
-d[m],b,c));return a},parseAnimation:function(a,b){if(!a)return console.error("  no animation in JSONLoader data"),null;for(var c=function(a,b,c,d,e){if(0!==c.length){var f=[],g=[];ba.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.hierarchy||[],k=0;k<h.length;k++){var m=h[k].keys;if(m&&0!==m.length)if(m[0].morphTargets){for(var f={},l=0;l<m.length;l++)if(m[l].morphTargets)for(var p=0;p<m[l].morphTargets.length;p++)f[m[l].morphTargets[p]]=
--1;for(var n in f){for(var q=[],w=[],p=0;p!==m[l].morphTargets.length;++p){var u=m[l];q.push(u.time);w.push(u.morphTarget===n?1:0)}d.push(new dc(".morphTargetInfluence["+n+"]",q,w))}f=f.length*(g||1)}else l=".bones["+b[k].name+"]",c(cc,l+".position",m,"pos",d),c(Xc,l+".quaternion",m,"rot",d),c(cc,l+".scale",m,"scl",d)}return 0===d.length?null:new ta(e,f,d)}});Object.assign(Ad.prototype,{load:function(a,b,c,d){var e=this;(new Ma(e.manager)).load(a,function(a){b(e.parse(JSON.parse(a)))},c,d)},setTextures:function(a){this.textures=
-a},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 Mf[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.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.uniforms&&(d.uniforms=a.uniforms);void 0!==a.vertexShader&&(d.vertexShader=a.vertexShader);void 0!==a.fragmentShader&&(d.fragmentShader=a.fragmentShader);void 0!==a.vertexColors&&(d.vertexColors=a.vertexColors);void 0!==a.fog&&(d.fog=a.fog);void 0!==a.shading&&(d.shading=a.shading);void 0!==a.blending&&(d.blending=a.blending);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.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.skinning&&(d.skinning=a.skinning);void 0!==a.morphTargets&&(d.morphTargets=a.morphTargets);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.alphaMap&&(d.alphaMap=b(a.alphaMap),d.transparent=!0);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));if(void 0!==a.normalScale){var e=
-a.normalScale;!1===Array.isArray(e)&&(e=[e,e]);d.normalScale=(new C).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.reflectivity&&(d.reflectivity=a.reflectivity);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));if(void 0!==a.materials)for(var e=0,f=a.materials.length;e<
-f;e++)d.materials.push(this.parse(a.materials[e]));return d}});Object.assign(Sd.prototype,{load:function(a,b,c,d){var e=this;(new Ma(e.manager)).load(a,function(a){b(e.parse(JSON.parse(a)))},c,d)},parse:function(a){var b=new D,c=a.data.index,d={Int8Array:Int8Array,Uint8Array:Uint8Array,Uint8ClampedArray:Uint8ClampedArray,Int16Array:Int16Array,Uint16Array:Uint16Array,Int32Array:Int32Array,Uint32Array:Uint32Array,Float32Array:Float32Array,Float64Array:Float64Array};void 0!==c&&(c=new d[c.type](c.array),
-b.setIndex(new y(c,1)));var e=a.data.attributes,f;for(f in e){var g=e[f],c=new d[g.type](g.array);b.addAttribute(f,new y(c,g.itemSize,g.normalized))}d=a.data.groups||a.data.drawcalls||a.data.offsets;if(void 0!==d)for(f=0,c=d.length;f!==c;++f)e=d[f],b.addGroup(e.start,e.count,e.materialIndex);a=a.data.boundingSphere;void 0!==a&&(d=new q,void 0!==a.center&&d.fromArray(a.center),b.boundingSphere=new Fa(d,a.radius));return b}});wb.prototype={constructor:wb,crossOrigin:void 0,extractUrlBase:function(a){a=
-a.split("/");if(1===a.length)return"./";a.pop();return a.join("/")+"/"},initMaterials:function(a,b,c){for(var d=[],e=0;e<a.length;++e)d[e]=this.createMaterial(a[e],b,c);return d},createMaterial:function(){var a,b,c;return function(d,e,f){function g(a,c,d,g,k){a=e+a;var m=wb.Handlers.get(a);null!==m?a=m.load(a):(b.setCrossOrigin(f),a=b.load(a));void 0!==c&&(a.repeat.fromArray(c),1!==c[0]&&(a.wrapS=1E3),1!==c[1]&&(a.wrapT=1E3));void 0!==d&&a.offset.fromArray(d);void 0!==g&&("repeat"===g[0]&&(a.wrapS=
-1E3),"mirror"===g[0]&&(a.wrapS=1002),"repeat"===g[1]&&(a.wrapT=1E3),"mirror"===g[1]&&(a.wrapT=1002));void 0!==k&&(a.anisotropy=k);c=Q.generateUUID();h[c]=a;return c}void 0===a&&(a=new N);void 0===b&&(b=new md);void 0===c&&(c=new Ad);var h={},k={uuid:Q.generateUUID(),type:"MeshLambertMaterial"},m;for(m in d){var l=d[m];switch(m){case "DbgColor":case "DbgIndex":case "opticalDensity":case "illumination":break;case "DbgName":k.name=l;break;case "blending":k.blending=Me[l];break;case "colorAmbient":case "mapAmbient":console.warn("THREE.Loader.createMaterial:",
-m,"is no longer supported.");break;case "colorDiffuse":k.color=a.fromArray(l).getHex();break;case "colorSpecular":k.specular=a.fromArray(l).getHex();break;case "colorEmissive":k.emissive=a.fromArray(l).getHex();break;case "specularCoef":k.shininess=l;break;case "shading":"basic"===l.toLowerCase()&&(k.type="MeshBasicMaterial");"phong"===l.toLowerCase()&&(k.type="MeshPhongMaterial");"standard"===l.toLowerCase()&&(k.type="MeshStandardMaterial");break;case "mapDiffuse":k.map=g(l,d.mapDiffuseRepeat,d.mapDiffuseOffset,
-d.mapDiffuseWrap,d.mapDiffuseAnisotropy);break;case "mapDiffuseRepeat":case "mapDiffuseOffset":case "mapDiffuseWrap":case "mapDiffuseAnisotropy":break;case "mapEmissive":k.emissiveMap=g(l,d.mapEmissiveRepeat,d.mapEmissiveOffset,d.mapEmissiveWrap,d.mapEmissiveAnisotropy);break;case "mapEmissiveRepeat":case "mapEmissiveOffset":case "mapEmissiveWrap":case "mapEmissiveAnisotropy":break;case "mapLight":k.lightMap=g(l,d.mapLightRepeat,d.mapLightOffset,d.mapLightWrap,d.mapLightAnisotropy);break;case "mapLightRepeat":case "mapLightOffset":case "mapLightWrap":case "mapLightAnisotropy":break;
-case "mapAO":k.aoMap=g(l,d.mapAORepeat,d.mapAOOffset,d.mapAOWrap,d.mapAOAnisotropy);break;case "mapAORepeat":case "mapAOOffset":case "mapAOWrap":case "mapAOAnisotropy":break;case "mapBump":k.bumpMap=g(l,d.mapBumpRepeat,d.mapBumpOffset,d.mapBumpWrap,d.mapBumpAnisotropy);break;case "mapBumpScale":k.bumpScale=l;break;case "mapBumpRepeat":case "mapBumpOffset":case "mapBumpWrap":case "mapBumpAnisotropy":break;case "mapNormal":k.normalMap=g(l,d.mapNormalRepeat,d.mapNormalOffset,d.mapNormalWrap,d.mapNormalAnisotropy);
-break;case "mapNormalFactor":k.normalScale=[l,l];break;case "mapNormalRepeat":case "mapNormalOffset":case "mapNormalWrap":case "mapNormalAnisotropy":break;case "mapSpecular":k.specularMap=g(l,d.mapSpecularRepeat,d.mapSpecularOffset,d.mapSpecularWrap,d.mapSpecularAnisotropy);break;case "mapSpecularRepeat":case "mapSpecularOffset":case "mapSpecularWrap":case "mapSpecularAnisotropy":break;case "mapMetalness":k.metalnessMap=g(l,d.mapMetalnessRepeat,d.mapMetalnessOffset,d.mapMetalnessWrap,d.mapMetalnessAnisotropy);
-break;case "mapMetalnessRepeat":case "mapMetalnessOffset":case "mapMetalnessWrap":case "mapMetalnessAnisotropy":break;case "mapRoughness":k.roughnessMap=g(l,d.mapRoughnessRepeat,d.mapRoughnessOffset,d.mapRoughnessWrap,d.mapRoughnessAnisotropy);break;case "mapRoughnessRepeat":case "mapRoughnessOffset":case "mapRoughnessWrap":case "mapRoughnessAnisotropy":break;case "mapAlpha":k.alphaMap=g(l,d.mapAlphaRepeat,d.mapAlphaOffset,d.mapAlphaWrap,d.mapAlphaAnisotropy);break;case "mapAlphaRepeat":case "mapAlphaOffset":case "mapAlphaWrap":case "mapAlphaAnisotropy":break;
-case "flipSided":k.side=1;break;case "doubleSided":k.side=2;break;case "transparency":console.warn("THREE.Loader.createMaterial: transparency has been renamed to opacity");k.opacity=l;break;case "depthTest":case "depthWrite":case "colorWrite":case "opacity":case "reflectivity":case "transparent":case "visible":case "wireframe":k[m]=l;break;case "vertexColors":!0===l&&(k.vertexColors=2);"face"===l&&(k.vertexColors=1);break;default:console.error("THREE.Loader.createMaterial: Unsupported",m,l)}}"MeshBasicMaterial"===
-k.type&&delete k.emissive;"MeshPhongMaterial"!==k.type&&delete k.specular;1>k.opacity&&(k.transparent=!0);c.setTextures(h);return c.parse(k)}}()};wb.Handlers={handlers:[],add:function(a,b){this.handlers.push(a,b)},get:function(a){for(var b=this.handlers,c=0,d=b.length;c<d;c+=2){var e=b[c+1];if(b[c].test(a))return e}return null}};Object.assign(Td.prototype,{load:function(a,b,c,d){var e=this,f=this.texturePath&&"string"===typeof this.texturePath?this.texturePath:wb.prototype.extractUrlBase(a),g=new Ma(this.manager);
-g.setWithCredentials(this.withCredentials);g.load(a,function(c){c=JSON.parse(c);var d=c.metadata;if(void 0!==d&&(d=d.type,void 0!==d)){if("object"===d.toLowerCase()){console.error("THREE.JSONLoader: "+a+" should be loaded with THREE.ObjectLoader instead.");return}if("scene"===d.toLowerCase()){console.error("THREE.JSONLoader: "+a+" should be loaded with THREE.SceneLoader instead.");return}}c=e.parse(c,f);b(c.geometry,c.materials)},c,d)},setTexturePath:function(a){this.texturePath=a},parse:function(a,
-b){var c=new S,d=void 0!==a.scale?1/a.scale:1;(function(b){var d,g,h,k,m,l,p,n,r,w,u,F,t,v=a.faces;l=a.vertices;var y=a.normals,z=a.colors,A=0;if(void 0!==a.uvs){for(d=0;d<a.uvs.length;d++)a.uvs[d].length&&A++;for(d=0;d<A;d++)c.faceVertexUvs[d]=[]}k=0;for(m=l.length;k<m;)d=new q,d.x=l[k++]*b,d.y=l[k++]*b,d.z=l[k++]*b,c.vertices.push(d);k=0;for(m=v.length;k<m;)if(b=v[k++],r=b&1,h=b&2,d=b&8,p=b&16,w=b&32,l=b&64,b&=128,r){r=new ha;r.a=v[k];r.b=v[k+1];r.c=v[k+3];u=new ha;u.a=v[k+1];u.b=v[k+2];u.c=v[k+
-3];k+=4;h&&(h=v[k++],r.materialIndex=h,u.materialIndex=h);h=c.faces.length;if(d)for(d=0;d<A;d++)for(F=a.uvs[d],c.faceVertexUvs[d][h]=[],c.faceVertexUvs[d][h+1]=[],g=0;4>g;g++)n=v[k++],t=F[2*n],n=F[2*n+1],t=new C(t,n),2!==g&&c.faceVertexUvs[d][h].push(t),0!==g&&c.faceVertexUvs[d][h+1].push(t);p&&(p=3*v[k++],r.normal.set(y[p++],y[p++],y[p]),u.normal.copy(r.normal));if(w)for(d=0;4>d;d++)p=3*v[k++],w=new q(y[p++],y[p++],y[p]),2!==d&&r.vertexNormals.push(w),0!==d&&u.vertexNormals.push(w);l&&(l=v[k++],
-l=z[l],r.color.setHex(l),u.color.setHex(l));if(b)for(d=0;4>d;d++)l=v[k++],l=z[l],2!==d&&r.vertexColors.push(new N(l)),0!==d&&u.vertexColors.push(new N(l));c.faces.push(r);c.faces.push(u)}else{r=new ha;r.a=v[k++];r.b=v[k++];r.c=v[k++];h&&(h=v[k++],r.materialIndex=h);h=c.faces.length;if(d)for(d=0;d<A;d++)for(F=a.uvs[d],c.faceVertexUvs[d][h]=[],g=0;3>g;g++)n=v[k++],t=F[2*n],n=F[2*n+1],t=new C(t,n),c.faceVertexUvs[d][h].push(t);p&&(p=3*v[k++],r.normal.set(y[p++],y[p++],y[p]));if(w)for(d=0;3>d;d++)p=3*
-v[k++],w=new q(y[p++],y[p++],y[p]),r.vertexNormals.push(w);l&&(l=v[k++],r.color.setHex(z[l]));if(b)for(d=0;3>d;d++)l=v[k++],r.vertexColors.push(new N(z[l]));c.faces.push(r)}})(d);(function(){var b=void 0!==a.influencesPerVertex?a.influencesPerVertex:2;if(a.skinWeights)for(var d=0,g=a.skinWeights.length;d<g;d+=b)c.skinWeights.push(new ga(a.skinWeights[d],1<b?a.skinWeights[d+1]:0,2<b?a.skinWeights[d+2]:0,3<b?a.skinWeights[d+3]:0));if(a.skinIndices)for(d=0,g=a.skinIndices.length;d<g;d+=b)c.skinIndices.push(new ga(a.skinIndices[d],
-1<b?a.skinIndices[d+1]:0,2<b?a.skinIndices[d+2]:0,3<b?a.skinIndices[d+3]:0));c.bones=a.bones;c.bones&&0<c.bones.length&&(c.skinWeights.length!==c.skinIndices.length||c.skinIndices.length!==c.vertices.length)&&console.warn("When skinning, number of vertices ("+c.vertices.length+"), skinIndices ("+c.skinIndices.length+"), and skinWeights ("+c.skinWeights.length+") should match.")})();(function(b){if(void 0!==a.morphTargets)for(var d=0,g=a.morphTargets.length;d<g;d++){c.morphTargets[d]={};c.morphTargets[d].name=
-a.morphTargets[d].name;c.morphTargets[d].vertices=[];for(var h=c.morphTargets[d].vertices,k=a.morphTargets[d].vertices,m=0,l=k.length;m<l;m+=3){var p=new q;p.x=k[m]*b;p.y=k[m+1]*b;p.z=k[m+2]*b;h.push(p)}}if(void 0!==a.morphColors&&0<a.morphColors.length)for(console.warn('THREE.JSONLoader: "morphColors" no longer supported. Using them as face colors.'),b=c.faces,h=a.morphColors[0].colors,d=0,g=b.length;d<g;d++)b[d].color.fromArray(h,3*d)})(d);(function(){var b=[],d=[];void 0!==a.animation&&d.push(a.animation);
-void 0!==a.animations&&(a.animations.length?d=d.concat(a.animations):d.push(a.animations));for(var g=0;g<d.length;g++){var h=ta.parseAnimation(d[g],c.bones);h&&b.push(h)}c.morphTargets&&(d=ta.CreateClipsFromMorphTargetSequences(c.morphTargets,10),b=b.concat(d));0<b.length&&(c.animations=b)})();c.computeFaceNormals();c.computeBoundingSphere();if(void 0===a.materials||0===a.materials.length)return{geometry:c};d=wb.prototype.initMaterials(a.materials,b,this.crossOrigin);return{geometry:c,materials:d}}});
-Object.assign(Fe.prototype,{load:function(a,b,c,d){""===this.texturePath&&(this.texturePath=a.substring(0,a.lastIndexOf("/")+1));var e=this;(new Ma(e.manager)).load(a,function(c){var d=null;try{d=JSON.parse(c)}catch(h){console.error("THREE:ObjectLoader: Can't parse "+a+".",h.message);return}c=d.metadata;void 0===c||void 0===c.type||"geometry"===c.type.toLowerCase()?console.error("THREE.ObjectLoader: Can't load "+a+". Use THREE.JSONLoader instead."):e.parse(d,b)},c,d)},setTexturePath:function(a){this.texturePath=
-a},setCrossOrigin:function(a){this.crossOrigin=a},parse:function(a,b){var c=this.parseGeometries(a.geometries),d=this.parseImages(a.images,function(){void 0!==b&&b(e)}),d=this.parseTextures(a.textures,d),d=this.parseMaterials(a.materials,d),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},parseGeometries:function(a){var b={};if(void 0!==a)for(var c=new Td,d=new Sd,e=0,f=a.length;e<f;e++){var g,
-h=a[e];switch(h.type){case "PlaneGeometry":case "PlaneBufferGeometry":g=new Ea[h.type](h.width,h.height,h.widthSegments,h.heightSegments);break;case "BoxGeometry":case "BoxBufferGeometry":case "CubeGeometry":g=new Ea[h.type](h.width,h.height,h.depth,h.widthSegments,h.heightSegments,h.depthSegments);break;case "CircleGeometry":case "CircleBufferGeometry":g=new Ea[h.type](h.radius,h.segments,h.thetaStart,h.thetaLength);break;case "CylinderGeometry":case "CylinderBufferGeometry":g=new Ea[h.type](h.radiusTop,
-h.radiusBottom,h.height,h.radialSegments,h.heightSegments,h.openEnded,h.thetaStart,h.thetaLength);break;case "ConeGeometry":case "ConeBufferGeometry":g=new Ea[h.type](h.radius,h.height,h.radialSegments,h.heightSegments,h.openEnded,h.thetaStart,h.thetaLength);break;case "SphereGeometry":case "SphereBufferGeometry":g=new Ea[h.type](h.radius,h.widthSegments,h.heightSegments,h.phiStart,h.phiLength,h.thetaStart,h.thetaLength);break;case "DodecahedronGeometry":case "IcosahedronGeometry":case "OctahedronGeometry":case "TetrahedronGeometry":g=
-new Ea[h.type](h.radius,h.detail);break;case "RingGeometry":case "RingBufferGeometry":g=new Ea[h.type](h.innerRadius,h.outerRadius,h.thetaSegments,h.phiSegments,h.thetaStart,h.thetaLength);break;case "TorusGeometry":case "TorusBufferGeometry":g=new Ea[h.type](h.radius,h.tube,h.radialSegments,h.tubularSegments,h.arc);break;case "TorusKnotGeometry":case "TorusKnotBufferGeometry":g=new Ea[h.type](h.radius,h.tube,h.tubularSegments,h.radialSegments,h.p,h.q);break;case "LatheGeometry":case "LatheBufferGeometry":g=
-new Ea[h.type](h.points,h.segments,h.phiStart,h.phiLength);break;case "BufferGeometry":g=d.parse(h);break;case "Geometry":g=c.parse(h.data,this.texturePath).geometry;break;default:console.warn('THREE.ObjectLoader: Unsupported geometry type "'+h.type+'"');continue}g.uuid=h.uuid;void 0!==h.name&&(g.name=h.name);b[h.uuid]=g}return b},parseMaterials:function(a,b){var c={};if(void 0!==a){var d=new Ad;d.setTextures(b);for(var e=0,f=a.length;e<f;e++){var g=d.parse(a[e]);c[g.uuid]=g}}return c},parseAnimations:function(a){for(var b=
-[],c=0;c<a.length;c++){var d=ta.parse(a[c]);b.push(d)}return b},parseImages:function(a,b){function c(a){d.manager.itemStart(a);return g.load(a,function(){d.manager.itemEnd(a)},void 0,function(){d.manager.itemError(a)})}var d=this,e={};if(void 0!==a&&0<a.length){var f=new Pd(b),g=new Vc(f);g.setCrossOrigin(this.crossOrigin);for(var f=0,h=a.length;f<h;f++){var k=a[f],m=/^(\/\/)|([a-z]+:(\/\/)?)/i.test(k.url)?k.url:d.texturePath+k.url;e[k.uuid]=c(m)}}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=new ea(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,Ne));
-void 0!==g.offset&&h.offset.fromArray(g.offset);void 0!==g.repeat&&h.repeat.fromArray(g.repeat);void 0!==g.wrap&&(h.wrapS=c(g.wrap[0],le),h.wrapT=c(g.wrap[1],le));void 0!==g.minFilter&&(h.minFilter=c(g.minFilter,me));void 0!==g.magFilter&&(h.magFilter=c(g.magFilter,me));void 0!==g.anisotropy&&(h.anisotropy=g.anisotropy);void 0!==g.flipY&&(h.flipY=g.flipY);d[g.uuid]=h}return d},parseObject:function(){var a=new H;return function(b,c,d){function e(a){void 0===c[a]&&console.warn("THREE.ObjectLoader: Undefined geometry",
-a);return c[a]}function f(a){if(void 0!==a)return void 0===d[a]&&console.warn("THREE.ObjectLoader: Undefined material",a),d[a]}var g;switch(b.type){case "Scene":g=new jb;void 0!==b.background&&Number.isInteger(b.background)&&(g.background=new N(b.background));void 0!==b.fog&&("Fog"===b.fog.type?g.fog=new Jb(b.fog.color,b.fog.near,b.fog.far):"FogExp2"===b.fog.type&&(g.fog=new Ib(b.fog.color,b.fog.density)));break;case "PerspectiveCamera":g=new Ha(b.fov,b.aspect,b.near,b.far);void 0!==b.focus&&(g.focus=
-b.focus);void 0!==b.zoom&&(g.zoom=b.zoom);void 0!==b.filmGauge&&(g.filmGauge=b.filmGauge);void 0!==b.filmOffset&&(g.filmOffset=b.filmOffset);void 0!==b.view&&(g.view=Object.assign({},b.view));break;case "OrthographicCamera":g=new Hb(b.left,b.right,b.top,b.bottom,b.near,b.far);break;case "AmbientLight":g=new td(b.color,b.intensity);break;case "DirectionalLight":g=new sd(b.color,b.intensity);break;case "PointLight":g=new qd(b.color,b.intensity,b.distance,b.decay);break;case "SpotLight":g=new pd(b.color,
-b.intensity,b.distance,b.angle,b.penumbra,b.decay);break;case "HemisphereLight":g=new nd(b.color,b.groundColor,b.intensity);break;case "Mesh":g=e(b.geometry);var h=f(b.material);g=g.bones&&0<g.bones.length?new jd(g,h):new Ba(g,h);break;case "LOD":g=new Ac;break;case "Line":g=new Va(e(b.geometry),f(b.material),b.mode);break;case "LineSegments":g=new fa(e(b.geometry),f(b.material));break;case "PointCloud":case "Points":g=new Kb(e(b.geometry),f(b.material));break;case "Sprite":g=new zc(f(b.material));
-break;case "Group":g=new Bc;break;case "SkinnedMesh":console.warn("THREE.ObjectLoader.parseObject() does not support SkinnedMesh type. Instantiates Object3D instead.");default:g=new G}g.uuid=b.uuid;void 0!==b.name&&(g.name=b.name);void 0!==b.matrix?(a.fromArray(b.matrix),a.decompose(g.position,g.quaternion,g.scale)):(void 0!==b.position&&g.position.fromArray(b.position),void 0!==b.rotation&&g.rotation.fromArray(b.rotation),void 0!==b.quaternion&&g.quaternion.fromArray(b.quaternion),void 0!==b.scale&&
-g.scale.fromArray(b.scale));void 0!==b.castShadow&&(g.castShadow=b.castShadow);void 0!==b.receiveShadow&&(g.receiveShadow=b.receiveShadow);b.shadow&&(void 0!==b.shadow.bias&&(g.shadow.bias=b.shadow.bias),void 0!==b.shadow.radius&&(g.shadow.radius=b.shadow.radius),void 0!==b.shadow.mapSize&&g.shadow.mapSize.fromArray(b.shadow.mapSize),void 0!==b.shadow.camera&&(g.shadow.camera=this.parseObject(b.shadow.camera)));void 0!==b.visible&&(g.visible=b.visible);void 0!==b.userData&&(g.userData=b.userData);
-if(void 0!==b.children)for(var k in b.children)g.add(this.parseObject(b.children[k],c,d));if("LOD"===b.type)for(b=b.levels,h=0;h<b.length;h++){var m=b[h];k=g.getObjectByProperty("uuid",m.object);void 0!==k&&g.addLevel(k,m.distance)}return g}}()});wa.prototype={constructor:wa,getPoint:function(a){console.warn("THREE.Curve: Warning, getPoint() not implemented!");return null},getPointAt:function(a){a=this.getUtoTmapping(a);return this.getPoint(a)},getPoints:function(a){a||(a=5);for(var b=[],c=0;c<=a;c++)b.push(this.getPoint(c/
-a));return b},getSpacedPoints:function(a){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){a||(a=this.__arcLengthDivisions?this.__arcLengthDivisions:200);if(this.cacheArcLengths&&this.cacheArcLengths.length===a+1&&!this.needsUpdate)return this.cacheArcLengths;this.needsUpdate=!1;var b=[],c,d=this.getPoint(0),e,f=0;b.push(0);for(e=1;e<=a;e++)c=this.getPoint(e/a),f+=c.distanceTo(d),b.push(f),
-d=c;return this.cacheArcLengths=b},updateArcLengths:function(){this.needsUpdate=!0;this.getLengths()},getUtoTmapping:function(a,b){var c=this.getLengths(),d,e=c.length,f;f=b?b:a*c[e-1];for(var g=0,h=e-1,k;g<=h;)if(d=Math.floor(g+(h-g)/2),k=c[d]-f,0>k)g=d+1;else if(0<k)h=d-1;else{h=d;break}d=h;if(c[d]===f)return d/(e-1);g=c[d];return(d+(f-g)/(c[d+1]-g))/(e-1)},getTangent:function(a){var b=a-1E-4;a+=1E-4;0>b&&(b=0);1<a&&(a=1);b=this.getPoint(b);return this.getPoint(a).clone().sub(b).normalize()},getTangentAt:function(a){a=
-this.getUtoTmapping(a);return this.getTangent(a)},computeFrenetFrames:function(a,b){var c=new q,d=[],e=[],f=[],g=new q,h=new H,k,m;for(k=0;k<=a;k++)m=k/a,d[k]=this.getTangentAt(m),d[k].normalize();e[0]=new q;f[0]=new q;k=Number.MAX_VALUE;m=Math.abs(d[0].x);var l=Math.abs(d[0].y),p=Math.abs(d[0].z);m<=k&&(k=m,c.set(1,0,0));l<=k&&(k=l,c.set(0,1,0));p<=k&&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(k=1;k<=a;k++)e[k]=e[k-1].clone(),f[k]=f[k-
-1].clone(),g.crossVectors(d[k-1],d[k]),g.length()>Number.EPSILON&&(g.normalize(),c=Math.acos(Q.clamp(d[k-1].dot(d[k]),-1,1)),e[k].applyMatrix4(h.makeRotationAxis(g,c))),f[k].crossVectors(d[k],e[k]);if(!0===b)for(c=Math.acos(Q.clamp(e[0].dot(e[a]),-1,1)),c/=a,0<d[0].dot(g.crossVectors(e[0],e[a]))&&(c=-c),k=1;k<=a;k++)e[k].applyMatrix4(h.makeRotationAxis(d[k],c*k)),f[k].crossVectors(d[k],e[k]);return{tangents:d,normals:e,binormals:f}}};wa.create=function(a,b){a.prototype=Object.create(wa.prototype);
-a.prototype.constructor=a;a.prototype.getPoint=b;return a};Qa.prototype=Object.create(wa.prototype);Qa.prototype.constructor=Qa;Qa.prototype.isLineCurve=!0;Qa.prototype.getPoint=function(a){if(1===a)return this.v2.clone();var b=this.v2.clone().sub(this.v1);b.multiplyScalar(a).add(this.v1);return b};Qa.prototype.getPointAt=function(a){return this.getPoint(a)};Qa.prototype.getTangent=function(a){return this.v2.clone().sub(this.v1).normalize()};Yc.prototype=Object.assign(Object.create(wa.prototype),
-{constructor:Yc,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 Qa(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.getLengths()},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){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++)for(var f=
-e[d],f=f.getPoints(f&&f.isEllipseCurve?2*a:f&&f.isLineCurve?1:f&&f.isSplineCurve?a*f.points.length:a),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},createPointsGeometry:function(a){a=this.getPoints(a);return this.createGeometry(a)},createSpacedPointsGeometry:function(a){a=this.getSpacedPoints(a);return this.createGeometry(a)},createGeometry:function(a){for(var b=new S,c=0,d=a.length;c<d;c++){var e=a[c];
-b.vertices.push(new q(e.x,e.y,e.z||0))}return b}});Xa.prototype=Object.create(wa.prototype);Xa.prototype.constructor=Xa;Xa.prototype.isEllipseCurve=!0;Xa.prototype.getPoint=function(a){for(var b=2*Math.PI,c=this.aEndAngle-this.aStartAngle,d=Math.abs(c)<Number.EPSILON;0>c;)c+=b;for(;c>b;)c-=b;c<Number.EPSILON&&(c=d?0:b);!0!==this.aClockwise||d||(c=c===b?-b:c-b);b=this.aStartAngle+a*c;a=this.aX+this.xRadius*Math.cos(b);var e=this.aY+this.yRadius*Math.sin(b);0!==this.aRotation&&(b=Math.cos(this.aRotation),
-c=Math.sin(this.aRotation),d=a-this.aX,e-=this.aY,a=d*b-e*c+this.aX,e=d*c+e*b+this.aY);return new C(a,e)};var ed={tangentQuadraticBezier:function(a,b,c,d){return 2*(1-a)*(c-b)+2*a*(d-c)},tangentCubicBezier:function(a,b,c,d,e){return-3*b*(1-a)*(1-a)+3*c*(1-a)*(1-a)-6*a*c*(1-a)+6*a*d*(1-a)-3*a*a*d+3*a*a*e},tangentSpline:function(a,b,c,d,e){return 6*a*a-6*a+(3*a*a-4*a+1)+(-6*a*a+6*a)+(3*a*a-2*a)},interpolate:function(a,b,c,d,e){a=.5*(c-a);d=.5*(d-b);var f=e*e;return(2*b-2*c+a+d)*e*f+(-3*b+3*c-2*a-d)*
-f+a*e+b}};xb.prototype=Object.create(wa.prototype);xb.prototype.constructor=xb;xb.prototype.isSplineCurve=!0;xb.prototype.getPoint=function(a){var b=this.points;a*=b.length-1;var c=Math.floor(a);a-=c;var d=b[0===c?c:c-1],e=b[c],f=b[c>b.length-2?b.length-1:c+1],b=b[c>b.length-3?b.length-1:c+2],c=ed.interpolate;return new C(c(d.x,e.x,f.x,b.x,a),c(d.y,e.y,f.y,b.y,a))};yb.prototype=Object.create(wa.prototype);yb.prototype.constructor=yb;yb.prototype.getPoint=function(a){var b=pa.b3;return new C(b(a,this.v0.x,
-this.v1.x,this.v2.x,this.v3.x),b(a,this.v0.y,this.v1.y,this.v2.y,this.v3.y))};yb.prototype.getTangent=function(a){var b=ed.tangentCubicBezier;return(new C(b(a,this.v0.x,this.v1.x,this.v2.x,this.v3.x),b(a,this.v0.y,this.v1.y,this.v2.y,this.v3.y))).normalize()};zb.prototype=Object.create(wa.prototype);zb.prototype.constructor=zb;zb.prototype.getPoint=function(a){var b=pa.b2;return new C(b(a,this.v0.x,this.v1.x,this.v2.x),b(a,this.v0.y,this.v1.y,this.v2.y))};zb.prototype.getTangent=function(a){var b=
-ed.tangentQuadraticBezier;return(new C(b(a,this.v0.x,this.v1.x,this.v2.x),b(a,this.v0.y,this.v1.y,this.v2.y))).normalize()};var oe=Object.assign(Object.create(Yc.prototype),{fromPoints: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)},moveTo:function(a,b){this.currentPoint.set(a,b)},lineTo:function(a,b){var c=new Qa(this.currentPoint.clone(),new C(a,b));this.curves.push(c);this.currentPoint.set(a,b)},quadraticCurveTo:function(a,b,c,d){a=new zb(this.currentPoint.clone(),
-new C(a,b),new C(c,d));this.curves.push(a);this.currentPoint.set(c,d)},bezierCurveTo:function(a,b,c,d,e,f){a=new yb(this.currentPoint.clone(),new C(a,b),new C(c,d),new C(e,f));this.curves.push(a);this.currentPoint.set(e,f)},splineThru:function(a){var b=[this.currentPoint.clone()].concat(a),b=new xb(b);this.curves.push(b);this.currentPoint.copy(a[a.length-1])},arc:function(a,b,c,d,e,f){this.absarc(a+this.currentPoint.x,b+this.currentPoint.y,c,d,e,f)},absarc:function(a,b,c,d,e,f){this.absellipse(a,
-b,c,c,d,e,f)},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)},absellipse:function(a,b,c,d,e,f,g,h){a=new Xa(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)}});Ab.prototype=Object.assign(Object.create(oe),{constructor:Ab,getPointsHoles:function(a){for(var b=[],c=0,d=this.holes.length;c<d;c++)b[c]=this.holes[c].getPoints(a);
-return b},extractAllPoints:function(a){return{shape:this.getPoints(a),holes:this.getPointsHoles(a)}},extractPoints:function(a){return this.extractAllPoints(a)}});Zc.prototype=oe;oe.constructor=Zc;Ud.prototype={moveTo:function(a,b){this.currentPath=new Zc;this.subPaths.push(this.currentPath);this.currentPath.moveTo(a,b)},lineTo:function(a,b){this.currentPath.lineTo(a,b)},quadraticCurveTo:function(a,b,c,d){this.currentPath.quadraticCurveTo(a,b,c,d)},bezierCurveTo:function(a,b,c,d,e,f){this.currentPath.bezierCurveTo(a,
-b,c,d,e,f)},splineThru:function(a){this.currentPath.splineThru(a)},toShapes:function(a,b){function c(a){for(var b=[],c=0,d=a.length;c<d;c++){var e=a[c],f=new Ab;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],k=h.x-g.x,m=h.y-g.y;if(Math.abs(m)>Number.EPSILON){if(0>m&&(g=b[f],k=-k,h=b[e],m=-m),!(a.y<g.y||a.y>h.y))if(a.y===g.y){if(a.x===g.x)return!0}else{e=m*(a.x-g.x)-k*(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=pa.isClockWise,f=this.subPaths;if(0===f.length)return[];if(!0===b)return c(f);var g,h,k,m=[];if(1===f.length)return h=f[0],k=new Ab,k.curves=h.curves,m.push(k),m;var l=!e(f[0].getPoints()),l=a?!l:l;k=[];var p=[],n=[],q=0,w;p[q]=void 0;n[q]=[];for(var u=0,y=f.length;u<y;u++)h=f[u],w=h.getPoints(),g=e(w),(g=a?!g:g)?(!l&&p[q]&&q++,p[q]={s:new Ab,p:w},p[q].s.curves=h.curves,l&&q++,n[q]=[]):n[q].push({h:h,p:w[0]});if(!p[0])return c(f);if(1<p.length){u=
-!1;h=[];e=0;for(f=p.length;e<f;e++)k[e]=[];e=0;for(f=p.length;e<f;e++)for(g=n[e],l=0;l<g.length;l++){q=g[l];w=!0;for(y=0;y<p.length;y++)d(q.p,p[y].p)&&(e!==y&&h.push({froms:e,tos:y,hole:l}),w?(w=!1,k[y].push(q)):u=!0);w&&k[e].push(q)}0<h.length&&(u||(n=k))}u=0;for(e=p.length;u<e;u++)for(k=p[u].s,m.push(k),h=n[u],f=0,g=h.length;f<g;f++)k.holes.push(h[f].h);return m}};Object.assign(Vd.prototype,{isFont:!0,generateShapes:function(a,b,c){void 0===b&&(b=100);void 0===c&&(c=4);var d=this.data;a=String(a).split("");
-var e=b/d.resolution,f=0;b=[];for(var g=0;g<a.length;g++){var h;h=e;var k=f,m=d.glyphs[a[g]]||d.glyphs["?"];if(m){var l=new Ud,p=[],n=pa.b2,q=pa.b3,w,u,y,t,v,D,z,A;if(m.o)for(var C=m._cachedOutline||(m._cachedOutline=m.o.split(" ")),E=0,G=C.length;E<G;)switch(C[E++]){case "m":w=C[E++]*h+k;u=C[E++]*h;l.moveTo(w,u);break;case "l":w=C[E++]*h+k;u=C[E++]*h;l.lineTo(w,u);break;case "q":w=C[E++]*h+k;u=C[E++]*h;v=C[E++]*h+k;D=C[E++]*h;l.quadraticCurveTo(v,D,w,u);if(t=p[p.length-1]){y=t.x;t=t.y;for(var H=
-1;H<=c;H++){var J=H/c;n(J,y,v,w);n(J,t,D,u)}}break;case "b":if(w=C[E++]*h+k,u=C[E++]*h,v=C[E++]*h+k,D=C[E++]*h,z=C[E++]*h+k,A=C[E++]*h,l.bezierCurveTo(v,D,z,A,w,u),t=p[p.length-1])for(y=t.x,t=t.y,H=1;H<=c;H++)J=H/c,q(J,y,v,z,w),q(J,t,D,A,u)}h={offset:m.ha*h,path:l}}else h=void 0;f+=h.offset;b.push(h.path)}c=[];d=0;for(a=b.length;d<a;d++)Array.prototype.push.apply(c,b[d].toShapes());return c}});Object.assign(Ge.prototype,{load:function(a,b,c,d){var e=this;(new Ma(this.manager)).load(a,function(a){var c;
-try{c=JSON.parse(a)}catch(d){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 Vd(a)}});var Hd,Zd={getContext:function(){void 0===Hd&&(Hd=new (window.AudioContext||window.webkitAudioContext));return Hd},setContext:function(a){Hd=a}};Object.assign(Wd.prototype,{load:function(a,b,c,d){var e=new Ma(this.manager);e.setResponseType("arraybuffer");e.load(a,
-function(a){Zd.getContext().decodeAudioData(a,function(a){b(a)})},c,d)}});Xd.prototype=Object.assign(Object.create(na.prototype),{constructor:Xd,isRectAreaLight:!0,copy:function(a){na.prototype.copy.call(this,a);this.width=a.width;this.height=a.height;return this}});Object.assign(He.prototype,{update:function(){var a,b,c,d,e,f,g,h=new H,k=new H;return function(m){if(a!==this||b!==m.focus||c!==m.fov||d!==m.aspect*this.aspect||e!==m.near||f!==m.far||g!==m.zoom){a=this;b=m.focus;c=m.fov;d=m.aspect*this.aspect;
-e=m.near;f=m.far;g=m.zoom;var l=m.projectionMatrix.clone(),p=this.eyeSep/2,n=p*e/b,q=e*Math.tan(Q.DEG2RAD*c*.5)/g,w;k.elements[12]=-p;h.elements[12]=p;p=-q*d+n;w=q*d+n;l.elements[0]=2*e/(w-p);l.elements[8]=(w+p)/(w-p);this.cameraL.projectionMatrix.copy(l);p=-q*d-n;w=q*d-n;l.elements[0]=2*e/(w-p);l.elements[8]=(w+p)/(w-p);this.cameraR.projectionMatrix.copy(l)}this.cameraL.matrixWorld.copy(m.matrixWorld).multiply(k);this.cameraR.matrixWorld.copy(m.matrixWorld).multiply(h)}}()});Bd.prototype=Object.create(G.prototype);
-Bd.prototype.constructor=Bd;Yd.prototype=Object.assign(Object.create(G.prototype),{constructor:Yd,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)},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)},getMasterVolume:function(){return this.gain.gain.value},setMasterVolume:function(a){this.gain.gain.value=a},updateMatrixWorld:function(){var a=new q,b=new da,c=new q,d=new q;return function(e){G.prototype.updateMatrixWorld.call(this,e);e=this.context.listener;var f=this.up;this.matrixWorld.decompose(a,b,c);d.set(0,0,-1).applyQuaternion(b);e.positionX?(e.positionX.setValueAtTime(a.x,this.context.currentTime),
-e.positionY.setValueAtTime(a.y,this.context.currentTime),e.positionZ.setValueAtTime(a.z,this.context.currentTime),e.forwardX.setValueAtTime(d.x,this.context.currentTime),e.forwardY.setValueAtTime(d.y,this.context.currentTime),e.forwardZ.setValueAtTime(d.z,this.context.currentTime),e.upX.setValueAtTime(f.x,this.context.currentTime),e.upY.setValueAtTime(f.y,this.context.currentTime),e.upZ.setValueAtTime(f.z,this.context.currentTime)):(e.setPosition(a.x,a.y,a.z),e.setOrientation(d.x,d.y,d.z,f.x,f.y,
-f.z))}}()});ec.prototype=Object.assign(Object.create(G.prototype),{constructor:ec,getOutput:function(){return this.gain},setNodeSource:function(a){this.hasPlaybackControl=!1;this.sourceType="audioNode";this.source=a;this.connect();return this},setBuffer:function(a){this.buffer=a;this.sourceType="buffer";this.autoplay&&this.play();return this},play:function(){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{var a=this.context.createBufferSource();a.buffer=this.buffer;a.loop=this.loop;a.onended=this.onEnded.bind(this);a.playbackRate.setValueAtTime(this.playbackRate,this.startTime);a.start(0,this.startTime);this.isPlaying=!0;this.source=a;return this.connect()}},pause:function(){if(!1===this.hasPlaybackControl)console.warn("THREE.Audio: this Audio has no playback control.");else return this.source.stop(),this.startTime=this.context.currentTime,this.isPlaying=!1,this},stop:function(){if(!1===this.hasPlaybackControl)console.warn("THREE.Audio: this Audio has no playback control.");
-else return this.source.stop(),this.startTime=0,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},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.setValueAtTime(this.playbackRate,this.context.currentTime),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},getVolume:function(){return this.gain.gain.value},setVolume:function(a){this.gain.gain.value=a;return this}});$d.prototype=Object.assign(Object.create(ec.prototype),{constructor:$d,getOutput:function(){return this.panner},getRefDistance:function(){return this.panner.refDistance},setRefDistance:function(a){this.panner.refDistance=a},getRolloffFactor:function(){return this.panner.rolloffFactor},setRolloffFactor:function(a){this.panner.rolloffFactor=
-a},getDistanceModel:function(){return this.panner.distanceModel},setDistanceModel:function(a){this.panner.distanceModel=a},getMaxDistance:function(){return this.panner.maxDistance},setMaxDistance:function(a){this.panner.maxDistance=a},updateMatrixWorld:function(){var a=new q;return function(b){G.prototype.updateMatrixWorld.call(this,b);a.setFromMatrixPosition(this.matrixWorld);this.panner.setPosition(a.x,a.y,a.z)}}()});Object.assign(ae.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}});Cd.prototype={constructor:Cd,accumulate:function(a,b){var c=this.buffer,d=this.valueSize,e=a*d+d,f=this.cumulativeWeight;if(0===f){for(f=0;f!==d;++f)c[e+f]=c[f];f=b}else f+=b,this._mixBufferRegion(c,e,0,b/f,d);this.cumulativeWeight=f},apply:function(a){var b=this.valueSize,c=this.buffer;a=a*b+b;var d=this.cumulativeWeight,e=this.binding;this.cumulativeWeight=0;1>d&&
-this._mixBufferRegion(c,a,3*b,1-d,b);for(var d=b,f=b+b;d!==f;++d)if(c[d]!==c[d+b]){e.setValue(c,a);break}},saveOriginalState:function(){var a=this.buffer,b=this.valueSize,c=3*b;this.binding.getValue(a,c);for(var d=b;d!==c;++d)a[d]=a[c+d%b];this.cumulativeWeight=0},restoreOriginalState:function(){this.binding.setValue(this.buffer,3*this.valueSize)},_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,e){da.slerpFlat(a,b,a,b,a,c,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}}};ka.prototype={constructor:ka,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=ka.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("  can not bind to material as node does not have a material",
-this);return}if(!a.material.materials){console.error("  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("  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("  can not bind to objectName of node, undefined",this);return}a=a[c]}if(void 0!==f){if(void 0===
-a[f]){console.error("  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("  trying to update property for track: "+b.nodeName+"."+d+" but it wasn't found.",a);else{b=this.Versioning.None;void 0!==a.needsUpdate?(b=this.Versioning.NeedsUpdate,this.targetObject=a):void 0!==a.matrixWorldNeedsUpdate&&(b=this.Versioning.MatrixWorldNeedsUpdate,this.targetObject=a);c=this.BindingType.Direct;if(void 0!==e){if("morphTargetInfluences"===
-d){if(!a.geometry){console.error("  can not bind to morphTargetInfluences becasuse node does not have a geometry",this);return}if(!a.geometry.morphTargets){console.error("  can not bind to morphTargetInfluences becasuse node does not have a geometry.morphTargets",this);return}for(c=0;c<this.node.geometry.morphTargets.length;c++)if(a.geometry.morphTargets[c].name===e){e=c;break}}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):void 0!==f.length?(c=this.BindingType.EntireArray,this.resolvedProperty=f):this.propertyName=d;this.getValue=this.GetterByBindingType[c];this.setValue=this.SetterByBindingTypeAndVersioning[c][b]}}else console.error("  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(ka.prototype,{_getValue_unavailable:function(){},
-_setValue_unavailable:function(){},_getValue_unbound:ka.prototype.getValue,_setValue_unbound:ka.prototype.setValue,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.node[this.propertyName]=a[b]},function(a,b){this.node[this.propertyName]=a[b];this.targetObject.needsUpdate=!0},function(a,b){this.node[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}]]});ka.Composite=function(a,b,c){c=c||ka.parseTrackName(b);this._targetGroup=a;this._bindings=a.subscribe_(b,c)};ka.Composite.prototype={constructor:ka.Composite,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()}};ka.create=function(a,b,c){return a&&a.isAnimationObjectGroup?new ka.Composite(a,b,c):new ka(a,b,c)};ka.parseTrackName=function(a){var b=/^((?:[\w-]+[\/:])*)([\w-]+)?(?:\.([\w-]+)(?:\[(.+)\])?)?\.([\w-]+)(?:\[(.+)\])?$/.exec(a);if(!b)throw Error("cannot parse trackName at all: "+a);b={nodeName:b[2],objectName:b[3],objectIndex:b[4],propertyName:b[5],propertyIndex:b[6]};
-if(null===b.propertyName||0===b.propertyName.length)throw Error("can not parse propertyName from trackName: "+a);return b};ka.findNode=function(a,b){if(!b||""===b||"root"===b||"."===b||-1===b||b===a.name||b===a.uuid)return a;if(a.skeleton){var c=function(a){for(var c=0;c<a.bones.length;c++){var d=a.bones[c];if(d.name===b)return d}return null}(a.skeleton);if(c)return c}if(a.children){var d=function(a){for(var c=0;c<a.length;c++){var g=a[c];if(g.name===b||g.uuid===b||(g=d(g.children)))return g}return null};
-if(c=d(a.children))return c}return null};be.prototype={constructor:be,isAnimationObjectGroup:!0,add:function(a){for(var b=this._objects,c=b.length,d=this.nCachedObjects_,e=this._indicesByUUID,f=this._paths,g=this._parsedPaths,h=this._bindings,k=h.length,l=0,q=arguments.length;l!==q;++l){var p=arguments[l],n=p.uuid,r=e[n];if(void 0===r){r=c++;e[n]=r;b.push(p);for(var n=0,w=k;n!==w;++n)h[n].push(new ka(p,f[n],g[n]))}else if(r<d){var u=--d,w=b[u];e[w.uuid]=r;b[r]=w;e[n]=u;b[u]=p;n=0;for(w=k;n!==w;++n){var y=
-h[n],t=y[r];y[r]=y[u];void 0===t&&(t=new ka(p,f[n],g[n]));y[u]=t}}else void 0!==b[r]&&console.error("Different objects with the same UUID detected. Clean the caches or recreate your infrastructure when reloading scenes...")}this.nCachedObjects_=d},remove:function(a){for(var b=this._objects,c=this.nCachedObjects_,d=this._indicesByUUID,e=this._bindings,f=e.length,g=0,h=arguments.length;g!==h;++g){var k=arguments[g],l=k.uuid,q=d[l];if(void 0!==q&&q>=c){var p=c++,n=b[p];d[n.uuid]=q;b[q]=n;d[l]=p;b[p]=
-k;k=0;for(l=f;k!==l;++k){var n=e[k],r=n[q];n[q]=n[p];n[p]=r}}}this.nCachedObjects_=c},uncache:function(a){for(var b=this._objects,c=b.length,d=this.nCachedObjects_,e=this._indicesByUUID,f=this._bindings,g=f.length,h=0,k=arguments.length;h!==k;++h){var l=arguments[h].uuid,q=e[l];if(void 0!==q)if(delete e[l],q<d){var l=--d,p=b[l],n=--c,r=b[n];e[p.uuid]=q;b[q]=p;e[r.uuid]=l;b[l]=r;b.pop();p=0;for(r=g;p!==r;++p){var w=f[p],u=w[n];w[q]=w[l];w[l]=u;w.pop()}}else for(n=--c,r=b[n],e[r.uuid]=q,b[q]=r,b.pop(),
-p=0,r=g;p!==r;++p)w=f[p],w[q]=w[n],w.pop()}this.nCachedObjects_=d},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_,l=Array(h.length),d=e.length;c[a]=d;f.push(a);g.push(b);e.push(l);c=k;for(d=h.length;c!==d;++c)l[c]=new ka(h[c],a,b);return l},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()}}};ce.prototype={constructor:ce,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){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){b=this._interpolants;for(var e=this._propertyBindings,
-f=0,g=b.length;f!==g;++f)b[f].evaluate(c),e[f].accumulate(d,a)}},_updateWeight:function(a){var b=0;if(this.enabled){var b=this.weight,c=this._weightInterpolant;if(null!==c){var d=c.evaluate(a)[0],b=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){var b=this.timeScale,c=this._timeScaleInterpolant;if(null!==c){var d=c.evaluate(a)[0],b=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;if(0===a)return b;var c=this._clip.duration,d=this.loop,e=this._loopCount;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 break a;this.clampWhenFinished?this.paused=!0:this.enabled=!1;this._mixer.dispatchEvent({type:"finished",action:this,direction:0>a?-1:1})}else{d=2202===d;-1===e&&(0<=a?(e=0,this._setEndings(!0,0===this.repetitions,
-d)):this._setEndings(0===this.repetitions,!0,d));if(b>=c||0>b){var f=Math.floor(b/c),b=b-c*f,e=e+Math.abs(f),g=this.repetitions-e;0>g?(this.clampWhenFinished?this.paused=!0:this.enabled=!1,b=0<a?c:0,this._mixer.dispatchEvent({type:"finished",action:this,direction:0<a?1:-1})):(0===g?(a=0>a,this._setEndings(a,!a,d)):this._setEndings(!1,!1,d),this._loopCount=e,this._mixer.dispatchEvent({type:"loop",action:this,loopDelta:f}))}if(d&&1===(e&1))return this.time=b,c-b}return this.time=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}};Object.assign(de.prototype,oa.prototype,{clipAction:function(a,b){var c=b||this._root,
-d=c.uuid,e="string"===typeof a?ta.findByName(c,a):a,c=null!==e?e.uuid:a,f=this._actionsByClip[c],g=null;if(void 0!==f){g=f.actionByRoot[d];if(void 0!==g)return g;g=f.knownActions[0];null===e&&(e=g._clip)}if(null===e)return null;e=new ce(this,e,b);this._bindAction(e,g);this._addInactiveAction(e,c,d);return e},existingAction:function(a,b){var c=b||this._root,d=c.uuid,c="string"===typeof a?ta.findByName(c,a):a,c=this._actionsByClip[c?c.uuid:a];return void 0!==c?c.actionByRoot[d]||null:null},stopAllAction:function(){for(var a=
-this._actions,b=this._nActiveActions,c=this._bindings,d=this._nActiveBindings,e=this._nActiveBindings=this._nActiveActions=0;e!==b;++e)a[e].reset();for(e=0;e!==d;++e)c[e].useCount=0;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){var h=b[g];h.enabled&&h._update(d,a,e,f)}a=this._bindings;b=this._nActiveBindings;for(g=0;g!==b;++g)a[g].apply(f);return this},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){for(var d=d.knownActions,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,c;for(c in b){var d=b[c].actionByRoot[a];void 0!==d&&(this._deactivateAction(d),this._removeInactiveAction(d))}c=
-this._bindingsByRootAndName[a];if(void 0!==c)for(var e in c)a=c[e],a.restoreOriginalState(),this._removeInactiveBinding(a)},uncacheAction:function(a,b){var c=this.existingAction(a,b);null!==c&&(this._deactivateAction(c),this._removeInactiveAction(c))}});Object.assign(de.prototype,{_bindAction:function(a,b){var c=a._localRoot||this._root,d=a._clip.tracks,e=d.length,f=a._propertyBindings,g=a._interpolants,h=c.uuid,k=this._bindingsByRootAndName,l=k[h];void 0===l&&(l={},k[h]=l);for(k=0;k!==e;++k){var q=
-d[k],p=q.name,n=l[p];if(void 0===n){n=f[k];if(void 0!==n){null===n._cacheIndex&&(++n.referenceCount,this._addInactiveBinding(n,h,p));continue}n=new Cd(ka.create(c,p,b&&b._propertyBindings[k].binding.parsedPath),q.ValueTypeName,q.getValueSize());++n.referenceCount;this._addInactiveBinding(n,h,p)}f[k]=n;g[k].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;var c=a._clip.uuid,d=this._actionsByClip,e=d[c],f=
-e.knownActions,g=f[f.length-1],h=a._byClipCacheIndex;g._byClipCacheIndex=h;f[h]=g;f.pop();a._byClipCacheIndex=null;delete e.actionByRoot[(b._localRoot||this._root).uuid];0===f.length&&delete d[c];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,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];a:{for(var h in f)break a;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 Wc(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)});Dd.prototype.clone=function(){return new Dd(void 0===this.value.clone?this.value:this.value.clone())};Bb.prototype=Object.create(D.prototype);Bb.prototype.constructor=Bb;
-Bb.prototype.isInstancedBufferGeometry=!0;Bb.prototype.addGroup=function(a,b,c){this.groups.push({start:a,count:b,materialIndex:c})};Bb.prototype.copy=function(a){var b=a.index;null!==b&&this.setIndex(b.clone());var b=a.attributes,c;for(c in b)this.addAttribute(c,b[c].clone());a=a.groups;c=0;for(b=a.length;c<b;c++){var d=a[c];this.addGroup(d.start,d.count,d.materialIndex)}return this};ee.prototype={constructor:ee,isInterleavedBufferAttribute:!0,get count(){return this.data.count},get array(){return this.data.array},
-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}};fc.prototype={constructor:fc,isInterleavedBuffer:!0,set needsUpdate(a){!0===a&&this.version++},setArray:function(a){if(Array.isArray(a))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.count=void 0!==a?a.length/this.stride:0;this.array=a},setDynamic:function(a){this.dynamic=a;return this},copy:function(a){this.array=new a.array.constructor(a.array);this.count=a.count;this.stride=a.stride;this.dynamic=a.dynamic;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}};gc.prototype=Object.create(fc.prototype);gc.prototype.constructor=gc;gc.prototype.isInstancedInterleavedBuffer=!0;gc.prototype.copy=function(a){fc.prototype.copy.call(this,a);this.meshPerAttribute=a.meshPerAttribute;
-return this};hc.prototype=Object.create(y.prototype);hc.prototype.constructor=hc;hc.prototype.isInstancedBufferAttribute=!0;hc.prototype.copy=function(a){y.prototype.copy.call(this,a);this.meshPerAttribute=a.meshPerAttribute;return this};fe.prototype={constructor:fe,linePrecision:1,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()):
-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)):console.error("THREE.Raycaster: Unsupported camera type.")},intersectObject:function(a,b){var c=[];ge(a,this,c,b);c.sort(Ie);return c},intersectObjects:function(a,b){var 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++)ge(a[d],this,c,b);c.sort(Ie);
-return c}};he.prototype={constructor:he,start:function(){this.oldTime=this.startTime=(performance||Date).now();this.elapsedTime=0;this.running=!0},stop:function(){this.getElapsedTime();this.running=!1},getElapsedTime:function(){this.getDelta();return this.elapsedTime},getDelta:function(){var a=0;this.autoStart&&!this.running&&this.start();if(this.running){var b=(performance||Date).now(),a=(b-this.oldTime)/1E3;this.oldTime=b;this.elapsedTime+=a}return a}};ie.prototype={constructor:ie,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){this.radius=a.length();0===this.radius?this.phi=this.theta=0:(this.theta=Math.atan2(a.x,a.z),this.phi=Math.acos(Q.clamp(a.y/this.radius,-1,1)));return this}};je.prototype={constructor:je,
-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){this.radius=Math.sqrt(a.x*a.x+a.z*a.z);this.theta=Math.atan2(a.x,a.z);this.y=a.y;return this}};ua.prototype=Object.create(Ba.prototype);ua.prototype.constructor=ua;ua.prototype.createAnimation=function(a,b,c,d){b={start:b,end:c,length:c-b+1,fps:d,duration:(c-b)/d,lastFrame:0,
-currentFrame:0,active:!1,time:0,direction:1,weight:1,directionBackwards:!1,mirroredLoop:!1};this.animationsMap[a]=b;this.animationsList.push(b)};ua.prototype.autoCreateAnimations=function(a){for(var b=/([a-z]+)_?(\d+)/i,c,d={},e=this.geometry,f=0,g=e.morphTargets.length;f<g;f++){var h=e.morphTargets[f].name.match(b);if(h&&1<h.length){var k=h[1];d[k]||(d[k]={start:Infinity,end:-Infinity});h=d[k];f<h.start&&(h.start=f);f>h.end&&(h.end=f);c||(c=k)}}for(k in d)h=d[k],this.createAnimation(k,h.start,h.end,
-a);this.firstAnimation=c};ua.prototype.setAnimationDirectionForward=function(a){if(a=this.animationsMap[a])a.direction=1,a.directionBackwards=!1};ua.prototype.setAnimationDirectionBackward=function(a){if(a=this.animationsMap[a])a.direction=-1,a.directionBackwards=!0};ua.prototype.setAnimationFPS=function(a,b){var c=this.animationsMap[a];c&&(c.fps=b,c.duration=(c.end-c.start)/c.fps)};ua.prototype.setAnimationDuration=function(a,b){var c=this.animationsMap[a];c&&(c.duration=b,c.fps=(c.end-c.start)/
-c.duration)};ua.prototype.setAnimationWeight=function(a,b){var c=this.animationsMap[a];c&&(c.weight=b)};ua.prototype.setAnimationTime=function(a,b){var c=this.animationsMap[a];c&&(c.time=b)};ua.prototype.getAnimationTime=function(a){var b=0;if(a=this.animationsMap[a])b=a.time;return b};ua.prototype.getAnimationDuration=function(a){var b=-1;if(a=this.animationsMap[a])b=a.duration;return b};ua.prototype.playAnimation=function(a){var b=this.animationsMap[a];b?(b.time=0,b.active=!0):console.warn("THREE.MorphBlendMesh: animation["+
-a+"] undefined in .playAnimation()")};ua.prototype.stopAnimation=function(a){if(a=this.animationsMap[a])a.active=!1};ua.prototype.update=function(a){for(var b=0,c=this.animationsList.length;b<c;b++){var d=this.animationsList[b];if(d.active){var e=d.duration/d.length;d.time+=d.direction*a;if(d.mirroredLoop){if(d.time>d.duration||0>d.time)d.direction*=-1,d.time>d.duration&&(d.time=d.duration,d.directionBackwards=!0),0>d.time&&(d.time=0,d.directionBackwards=!1)}else d.time%=d.duration,0>d.time&&(d.time+=
-d.duration);var f=d.start+Q.clamp(Math.floor(d.time/e),0,d.length-1),g=d.weight;f!==d.currentFrame&&(this.morphTargetInfluences[d.lastFrame]=0,this.morphTargetInfluences[d.currentFrame]=1*g,this.morphTargetInfluences[f]=0,d.lastFrame=d.currentFrame,d.currentFrame=f);e=d.time%e/e;d.directionBackwards&&(e=1-e);d.currentFrame!==d.lastFrame?(this.morphTargetInfluences[d.currentFrame]=e*g,this.morphTargetInfluences[d.lastFrame]=(1-e)*g):this.morphTargetInfluences[d.currentFrame]=g}}};$c.prototype=Object.create(G.prototype);
-$c.prototype.constructor=$c;$c.prototype.isImmediateRenderObject=!0;ad.prototype=Object.create(fa.prototype);ad.prototype.constructor=ad;ad.prototype.update=function(){var a=new q,b=new q,c=new za;return function(){var d=["a","b","c"];this.object.updateMatrixWorld(!0);c.getNormalMatrix(this.object.matrixWorld);var e=this.object.matrixWorld,f=this.geometry.attributes.position,g=this.object.geometry;if(g&&g.isGeometry)for(var h=g.vertices,k=g.faces,l=g=0,q=k.length;l<q;l++)for(var p=k[l],n=0,r=p.vertexNormals.length;n<
-r;n++){var w=p.vertexNormals[n];a.copy(h[p[d[n]]]).applyMatrix4(e);b.copy(w).applyMatrix3(c).normalize().multiplyScalar(this.size).add(a);f.setXYZ(g,a.x,a.y,a.z);g+=1;f.setXYZ(g,b.x,b.y,b.z);g+=1}else if(g&&g.isBufferGeometry)for(d=g.attributes.position,h=g.attributes.normal,n=g=0,r=d.count;n<r;n++)a.set(d.getX(n),d.getY(n),d.getZ(n)).applyMatrix4(e),b.set(h.getX(n),h.getY(n),h.getZ(n)),b.applyMatrix3(c).normalize().multiplyScalar(this.size).add(a),f.setXYZ(g,a.x,a.y,a.z),g+=1,f.setXYZ(g,b.x,b.y,
-b.z),g+=1;f.needsUpdate=!0;return this}}();ic.prototype=Object.create(G.prototype);ic.prototype.constructor=ic;ic.prototype.dispose=function(){this.cone.geometry.dispose();this.cone.material.dispose()};ic.prototype.update=function(){var a=new q,b=new q;return function(){var c=this.light.distance?this.light.distance:1E3,d=c*Math.tan(this.light.angle);this.cone.scale.set(d,d,c);a.setFromMatrixPosition(this.light.matrixWorld);b.setFromMatrixPosition(this.light.target.matrixWorld);this.cone.lookAt(b.sub(a));
-this.cone.material.color.copy(this.light.color).multiplyScalar(this.light.intensity)}}();jc.prototype=Object.create(fa.prototype);jc.prototype.constructor=jc;jc.prototype.getBoneList=function(a){var b=[];a&&a.isBone&&b.push(a);for(var c=0;c<a.children.length;c++)b.push.apply(b,this.getBoneList(a.children[c]));return b};jc.prototype.update=function(){var a=new q,b=new H,c=new H;return function(){var d=this.geometry,e=d.getAttribute("position");c.getInverse(this.root.matrixWorld);for(var f=0,g=0;f<
-this.bones.length;f++){var h=this.bones[f];h.parent&&h.parent.isBone&&(b.multiplyMatrices(c,h.matrixWorld),a.setFromMatrixPosition(b),e.setXYZ(g,a.x,a.y,a.z),b.multiplyMatrices(c,h.parent.matrixWorld),a.setFromMatrixPosition(b),e.setXYZ(g+1,a.x,a.y,a.z),g+=2)}d.getAttribute("position").needsUpdate=!0}}();kc.prototype=Object.create(Ba.prototype);kc.prototype.constructor=kc;kc.prototype.dispose=function(){this.geometry.dispose();this.material.dispose()};kc.prototype.update=function(){this.material.color.copy(this.light.color).multiplyScalar(this.light.intensity)};
-lc.prototype=Object.create(G.prototype);lc.prototype.constructor=lc;lc.prototype.dispose=function(){this.children[0].geometry.dispose();this.children[0].material.dispose();this.children[1].geometry.dispose();this.children[1].material.dispose()};lc.prototype.update=function(){var a=new q,b=new q;return function(){var c=this.children[0],d=this.children[1];if(this.light.target){a.setFromMatrixPosition(this.light.matrixWorld);b.setFromMatrixPosition(this.light.target.matrixWorld);var e=b.clone().sub(a);
-c.lookAt(e);d.lookAt(e)}c.material.color.copy(this.light.color).multiplyScalar(this.light.intensity);d.material.color.copy(this.light.color).multiplyScalar(this.light.intensity);var d=.5*this.light.width,e=.5*this.light.height,c=c.geometry.getAttribute("position"),f=c.array;f[0]=d;f[1]=-e;f[2]=0;f[3]=d;f[4]=e;f[5]=0;f[6]=-d;f[7]=e;f[8]=0;f[9]=-d;f[10]=e;f[11]=0;f[12]=-d;f[13]=-e;f[14]=0;f[15]=d;f[16]=-e;f[17]=0;c.needsUpdate=!0}}();mc.prototype=Object.create(G.prototype);mc.prototype.constructor=
-mc;mc.prototype.dispose=function(){this.children[0].geometry.dispose();this.children[0].material.dispose()};mc.prototype.update=function(){var a=new q,b=new N,c=new N;return function(){var d=this.children[0],e=d.geometry.getAttribute("color");b.copy(this.light.color).multiplyScalar(this.light.intensity);c.copy(this.light.groundColor).multiplyScalar(this.light.intensity);for(var f=0,g=e.count;f<g;f++){var h=f<g/2?b:c;e.setXYZ(f,h.r,h.g,h.b)}d.lookAt(a.setFromMatrixPosition(this.light.matrixWorld).negate());
-e.needsUpdate=!0}}();bd.prototype=Object.create(fa.prototype);bd.prototype.constructor=bd;Ed.prototype=Object.create(fa.prototype);Ed.prototype.constructor=Ed;cd.prototype=Object.create(fa.prototype);cd.prototype.constructor=cd;cd.prototype.update=function(){var a=new q,b=new q,c=new za;return function(){this.object.updateMatrixWorld(!0);c.getNormalMatrix(this.object.matrixWorld);for(var d=this.object.matrixWorld,e=this.geometry.attributes.position,f=this.object.geometry,g=f.vertices,f=f.faces,h=
-0,k=0,l=f.length;k<l;k++){var q=f[k],p=q.normal;a.copy(g[q.a]).add(g[q.b]).add(g[q.c]).divideScalar(3).applyMatrix4(d);b.copy(p).applyMatrix3(c).normalize().multiplyScalar(this.size).add(a);e.setXYZ(h,a.x,a.y,a.z);h+=1;e.setXYZ(h,b.x,b.y,b.z);h+=1}e.needsUpdate=!0;return this}}();nc.prototype=Object.create(G.prototype);nc.prototype.constructor=nc;nc.prototype.dispose=function(){var a=this.children[0],b=this.children[1];a.geometry.dispose();a.material.dispose();b.geometry.dispose();b.material.dispose()};
-nc.prototype.update=function(){var a=new q,b=new q,c=new q;return function(){a.setFromMatrixPosition(this.light.matrixWorld);b.setFromMatrixPosition(this.light.target.matrixWorld);c.subVectors(b,a);var d=this.children[0],e=this.children[1];d.lookAt(c);d.material.color.copy(this.light.color).multiplyScalar(this.light.intensity);e.lookAt(c);e.scale.z=c.length()}}();dd.prototype=Object.create(fa.prototype);dd.prototype.constructor=dd;dd.prototype.update=function(){function a(a,g,h,k){d.set(g,h,k).unproject(e);
-a=c[a];if(void 0!==a)for(g=b.getAttribute("position"),h=0,k=a.length;h<k;h++)g.setXYZ(a[h],d.x,d.y,d.z)}var b,c,d=new q,e=new sa;return function(){b=this.geometry;c=this.pointMap;e.projectionMatrix.copy(this.camera.projectionMatrix);a("c",0,0,-1);a("t",0,0,1);a("n1",-1,-1,-1);a("n2",1,-1,-1);a("n3",-1,1,-1);a("n4",1,1,-1);a("f1",-1,-1,1);a("f2",1,-1,1);a("f3",-1,1,1);a("f4",1,1,1);a("u1",.7,1.1,-1);a("u2",-.7,1.1,-1);a("u3",0,2,-1);a("cf1",-1,0,1);a("cf2",1,0,1);a("cf3",0,-1,1);a("cf4",0,1,1);a("cn1",
--1,0,-1);a("cn2",1,0,-1);a("cn3",0,-1,-1);a("cn4",0,1,-1);b.getAttribute("position").needsUpdate=!0}}();oc.prototype=Object.create(fa.prototype);oc.prototype.constructor=oc;oc.prototype.update=function(){var a=new ya;return function(b){b&&b.isBox3?a.copy(b):a.setFromObject(b);if(!a.isEmpty()){b=a.min;var c=a.max,d=this.geometry.attributes.position,e=d.array;e[0]=c.x;e[1]=c.y;e[2]=c.z;e[3]=b.x;e[4]=c.y;e[5]=c.z;e[6]=b.x;e[7]=b.y;e[8]=c.z;e[9]=c.x;e[10]=b.y;e[11]=c.z;e[12]=c.x;e[13]=c.y;e[14]=b.z;e[15]=
-b.x;e[16]=c.y;e[17]=b.z;e[18]=b.x;e[19]=b.y;e[20]=b.z;e[21]=c.x;e[22]=b.y;e[23]=b.z;d.needsUpdate=!0;this.geometry.computeBoundingSphere()}}}();var Je=new D;Je.addAttribute("position",new X([0,0,0,0,1,0],3));var Ke=new Wa(0,.5,1,5,1);Ke.translate(0,-.5,0);Cb.prototype=Object.create(G.prototype);Cb.prototype.constructor=Cb;Cb.prototype.setDirection=function(){var a=new q,b;return function(c){.99999<c.y?this.quaternion.set(0,0,0,1):-.99999>c.y?this.quaternion.set(1,0,0,0):(a.set(c.z,0,-c.x).normalize(),
-b=Math.acos(c.y),this.quaternion.setFromAxisAngle(a,b))}}();Cb.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(0,a-b),1);this.line.updateMatrix();this.cone.scale.set(c,b,c);this.cone.position.y=a;this.cone.updateMatrix()};Cb.prototype.setColor=function(a){this.line.material.color.copy(a);this.cone.material.color.copy(a)};Fd.prototype=Object.create(fa.prototype);Fd.prototype.constructor=Fd;var ke=function(){function a(){}var b=new q,c=new a,
-d=new a,e=new a;a.prototype.init=function(a,b,c,d){this.c0=a;this.c1=c;this.c2=-3*a+3*b-2*c-d;this.c3=2*a-2*b+c+d};a.prototype.initNonuniformCatmullRom=function(a,b,c,d,e,l,p){this.init(b,c,((b-a)/e-(c-a)/(e+l)+(c-b)/l)*l,((c-b)/l-(d-b)/(l+p)+(d-c)/p)*l)};a.prototype.initCatmullRom=function(a,b,c,d,e){this.init(b,c,e*(c-a),e*(d-b))};a.prototype.calc=function(a){var b=a*a;return this.c0+this.c1*a+this.c2*b+this.c3*b*a};return wa.create(function(a){this.points=a||[];this.closed=!1},function(a){var g=
-this.points,h,k;k=g.length;2>k&&console.log("duh, you need at least 2 points");a*=k-(this.closed?0:1);h=Math.floor(a);a-=h;this.closed?h+=0<h?0:(Math.floor(Math.abs(h)/g.length)+1)*g.length:0===a&&h===k-1&&(h=k-2,a=1);var l,x,p;this.closed||0<h?l=g[(h-1)%k]:(b.subVectors(g[0],g[1]).add(g[0]),l=b);x=g[h%k];p=g[(h+1)%k];this.closed||h+2<k?g=g[(h+2)%k]:(b.subVectors(g[k-1],g[k-2]).add(g[k-1]),g=b);if(void 0===this.type||"centripetal"===this.type||"chordal"===this.type){var n="chordal"===this.type?.5:
-.25;k=Math.pow(l.distanceToSquared(x),n);h=Math.pow(x.distanceToSquared(p),n);n=Math.pow(p.distanceToSquared(g),n);1E-4>h&&(h=1);1E-4>k&&(k=h);1E-4>n&&(n=h);c.initNonuniformCatmullRom(l.x,x.x,p.x,g.x,k,h,n);d.initNonuniformCatmullRom(l.y,x.y,p.y,g.y,k,h,n);e.initNonuniformCatmullRom(l.z,x.z,p.z,g.z,k,h,n)}else"catmullrom"===this.type&&(k=void 0!==this.tension?this.tension:.5,c.initCatmullRom(l.x,x.x,p.x,g.x,k),d.initCatmullRom(l.y,x.y,p.y,g.y,k),e.initCatmullRom(l.z,x.z,p.z,g.z,k));return new q(c.calc(a),
-d.calc(a),e.calc(a))})}(),Nf=wa.create(function(a){console.warn("THREE.SplineCurve3 will be deprecated. Please use THREE.CatmullRomCurve3");this.points=void 0===a?[]:a},function(a){var b=this.points;a*=b.length-1;var c=Math.floor(a);a-=c;var d=b[0==c?c:c-1],e=b[c],f=b[c>b.length-2?b.length-1:c+1],b=b[c>b.length-3?b.length-1:c+2],c=ed.interpolate;return new q(c(d.x,e.x,f.x,b.x,a),c(d.y,e.y,f.y,b.y,a),c(d.z,e.z,f.z,b.z,a))}),Of=wa.create(function(a,b,c,d){this.v0=a;this.v1=b;this.v2=c;this.v3=d},function(a){var b=
-pa.b3;return new q(b(a,this.v0.x,this.v1.x,this.v2.x,this.v3.x),b(a,this.v0.y,this.v1.y,this.v2.y,this.v3.y),b(a,this.v0.z,this.v1.z,this.v2.z,this.v3.z))}),Pf=wa.create(function(a,b,c){this.v0=a;this.v1=b;this.v2=c},function(a){var b=pa.b2;return new q(b(a,this.v0.x,this.v1.x,this.v2.x),b(a,this.v0.y,this.v1.y,this.v2.y),b(a,this.v0.z,this.v1.z,this.v2.z))}),Qf=wa.create(function(a,b){this.v1=a;this.v2=b},function(a){if(1===a)return this.v2.clone();var b=new q;b.subVectors(this.v2,this.v1);b.multiplyScalar(a);
-b.add(this.v1);return b});Gd.prototype=Object.create(Xa.prototype);Gd.prototype.constructor=Gd;Le.prototype=Object.create(ke.prototype);bd.prototype.setColors=function(){console.error("THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.")};Object.assign(pc.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(ya.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)}});gb.prototype.center=function(a){console.warn("THREE.Line3: .center() has been renamed to .getCenter().");
-return this.getCenter(a)};Q.random16=function(){console.warn("THREE.Math.random16() has been deprecated. Use Math.random() instead.");return Math.random()};Object.assign(za.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(a){console.warn("THREE.Matrix3: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead.");return this.applyToVector3Array(a)},applyToBuffer:function(a,b,c){console.warn("THREE.Matrix3: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.");return this.applyToBufferAttribute(a)}});Object.assign(H.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(){var a;return function(){void 0===a&&(a=new q);console.warn("THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.");return a.setFromMatrixColumn(this,3)}}(),setRotationFromQuaternion:function(a){console.warn("THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().");
-return this.makeRotationFromQuaternion(a)},multiplyVector3:function(a){console.warn("THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) or vector.applyProjection( matrix ) instead.");return a.applyProjection(this)},multiplyVector4:function(a){console.warn("THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.");return a.applyMatrix4(this)},multiplyVector3Array:function(a){console.warn("THREE.Matrix4: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead.");
-return this.applyToVector3Array(a)},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.")},applyToBuffer:function(a,b,c){console.warn("THREE.Matrix4: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.");return this.applyToBufferAttribute(a)}});ma.prototype.isIntersectionLine=function(a){console.warn("THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().");
-return this.intersectsLine(a)};da.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(bb.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(Ab.prototype,{extrude:function(a){console.warn("THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.");return new La(this,a)},makeGeometry:function(a){console.warn("THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.");return new Xb(this,a)}});Object.assign(q.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)}});S.prototype.computeTangents=function(){console.warn("THREE.Geometry: .computeTangents() has been removed.")};Object.assign(G.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)}});Object.defineProperties(G.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.defineProperties(Ac.prototype,{objects:{get:function(){console.warn("THREE.LOD: .objects has been renamed to .levels.");return this.levels}}});Ha.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(na.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(y.prototype,
-{length:{get:function(){console.warn("THREE.BufferAttribute: .length has been deprecated. Use .count instead.");return this.array.length}}});Object.assign(D.prototype,{addIndex:function(a){console.warn("THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().");this.setIndex(a)},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.")}});Object.defineProperties(D.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(Dd.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(W.prototype,{wrapAround:{get:function(){console.warn("THREE."+this.type+": .wrapAround has been removed.")},set:function(){console.warn("THREE."+this.type+
-": .wrapAround has been removed.")}},wrapRGB:{get:function(){console.warn("THREE."+this.type+": .wrapRGB has been removed.");return new N}}});Object.defineProperties(Ca.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(Ia.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}}});oa.prototype=Object.assign(Object.create({constructor:oa,apply:function(a){console.warn("THREE.EventDispatcher: .apply is deprecated, just inherit or Object.assign the prototype to mix-in.");Object.assign(a,this)}}),oa.prototype);Object.assign(Nd.prototype,{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.")}});Object.defineProperties(Nd.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(){return this.shadowMap.cullFace},set:function(a){console.warn("THREE.WebGLRenderer: .shadowMapCullFace is now .shadowMap.cullFace.");this.shadowMap.cullFace=a}}});Object.defineProperties(ye.prototype,{cullFace:{get:function(){return this.renderReverseSided?2:1},set:function(a){a=1!==a;console.warn("WebGLRenderer: .shadowMap.cullFace is deprecated. Set .shadowMap.renderReverseSided to "+a+".");this.renderReverseSided=a}}});Object.defineProperties(Db.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}}});ec.prototype.load=function(a){console.warn("THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.");var b=this;(new Wd).load(a,function(a){b.setBuffer(a)});return this};
-ae.prototype.getData=function(){console.warn("THREE.AudioAnalyser: .getData() is now .getFrequencyData().");return this.getFrequencyData()};l.WebGLRenderTargetCube=Eb;l.WebGLRenderTarget=Db;l.WebGLRenderer=Nd;l.ShaderLib=Gb;l.UniformsLib=U;l.UniformsUtils=Ja;l.ShaderChunk=Z;l.FogExp2=Ib;l.Fog=Jb;l.Scene=jb;l.LensFlare=Od;l.Sprite=zc;l.LOD=Ac;l.SkinnedMesh=jd;l.Skeleton=hd;l.Bone=id;l.Mesh=Ba;l.LineSegments=fa;l.Line=Va;l.Points=Kb;l.Group=Bc;l.VideoTexture=kd;l.DataTexture=db;l.CompressedTexture=
-Lb;l.CubeTexture=Za;l.CanvasTexture=ld;l.DepthTexture=Cc;l.Texture=ea;l.CompressedTextureLoader=Ee;l.BinaryTextureLoader=Qd;l.DataTextureLoader=Qd;l.CubeTextureLoader=Rd;l.TextureLoader=md;l.ObjectLoader=Fe;l.MaterialLoader=Ad;l.BufferGeometryLoader=Sd;l.DefaultLoadingManager=va;l.LoadingManager=Pd;l.JSONLoader=Td;l.ImageLoader=Vc;l.FontLoader=Ge;l.FileLoader=Ma;l.Loader=wb;l.Cache=ne;l.AudioLoader=Wd;l.SpotLightShadow=od;l.SpotLight=pd;l.PointLight=qd;l.RectAreaLight=Xd;l.HemisphereLight=nd;l.DirectionalLightShadow=
-rd;l.DirectionalLight=sd;l.AmbientLight=td;l.LightShadow=tb;l.Light=na;l.StereoCamera=He;l.PerspectiveCamera=Ha;l.OrthographicCamera=Hb;l.CubeCamera=Bd;l.Camera=sa;l.AudioListener=Yd;l.PositionalAudio=$d;l.AudioContext=Zd;l.AudioAnalyser=ae;l.Audio=ec;l.VectorKeyframeTrack=cc;l.StringKeyframeTrack=xd;l.QuaternionKeyframeTrack=Xc;l.NumberKeyframeTrack=dc;l.ColorKeyframeTrack=zd;l.BooleanKeyframeTrack=yd;l.PropertyMixer=Cd;l.PropertyBinding=ka;l.KeyframeTrack=vb;l.AnimationUtils=ba;l.AnimationObjectGroup=
-be;l.AnimationMixer=de;l.AnimationClip=ta;l.Uniform=Dd;l.InstancedBufferGeometry=Bb;l.BufferGeometry=D;l.GeometryIdCount=function(){return Kd++};l.Geometry=S;l.InterleavedBufferAttribute=ee;l.InstancedInterleavedBuffer=gc;l.InterleavedBuffer=fc;l.InstancedBufferAttribute=hc;l.Face3=ha;l.Object3D=G;l.Raycaster=fe;l.Layers=gd;l.EventDispatcher=oa;l.Clock=he;l.QuaternionLinearInterpolant=wd;l.LinearInterpolant=Wc;l.DiscreteInterpolant=vd;l.CubicInterpolant=ud;l.Interpolant=qa;l.Triangle=Aa;l.Spline=
-function(a){function b(a,b,c,d,e,f,g){a=.5*(c-a);d=.5*(d-b);return(2*(b-c)+a+d)*g+(-3*(b-c)-2*a-d)*f+a*e+b}this.points=a;var c=[],d={x:0,y:0,z:0},e,f,g,h,k,l,x,p,n;this.initFromArray=function(a){this.points=[];for(var b=0;b<a.length;b++)this.points[b]={x:a[b][0],y:a[b][1],z:a[b][2]}};this.getPoint=function(a){e=(this.points.length-1)*a;f=Math.floor(e);g=e-f;c[0]=0===f?f:f-1;c[1]=f;c[2]=f>this.points.length-2?this.points.length-1:f+1;c[3]=f>this.points.length-3?this.points.length-1:f+2;l=this.points[c[0]];
-x=this.points[c[1]];p=this.points[c[2]];n=this.points[c[3]];h=g*g;k=g*h;d.x=b(l.x,x.x,p.x,n.x,g,h,k);d.y=b(l.y,x.y,p.y,n.y,g,h,k);d.z=b(l.z,x.z,p.z,n.z,g,h,k);return d};this.getControlPointsArray=function(){var a,b,c=this.points.length,d=[];for(a=0;a<c;a++)b=this.points[a],d[a]=[b.x,b.y,b.z];return d};this.getLength=function(a){var b,c,d,e=0,f=new q,g=new q,h=[],k=0;h[0]=0;a||(a=100);c=this.points.length*a;f.copy(this.points[0]);for(a=1;a<c;a++)b=a/c,d=this.getPoint(b),g.copy(d),k+=g.distanceTo(f),
-f.copy(d),b*=this.points.length-1,b=Math.floor(b),b!==e&&(h[b]=k,e=b);h[h.length]=k;return{chunks:h,total:k}};this.reparametrizeByArcLength=function(a){var b,c,d,e,f,g,h=[],k=new q,l=this.getLength();h.push(k.copy(this.points[0]).clone());for(b=1;b<this.points.length;b++){c=l.chunks[b]-l.chunks[b-1];g=Math.ceil(a*c/l.total);e=(b-1)/(this.points.length-1);f=b/(this.points.length-1);for(c=1;c<g-1;c++)d=e+1/g*c*(f-e),d=this.getPoint(d),h.push(k.copy(d).clone());h.push(k.copy(this.points[b]).clone())}this.points=
-h}};l.Math=Q;l.Spherical=ie;l.Cylindrical=je;l.Plane=ma;l.Frustum=qc;l.Sphere=Fa;l.Ray=bb;l.Matrix4=H;l.Matrix3=za;l.Box3=ya;l.Box2=pc;l.Line3=gb;l.Euler=cb;l.Vector4=ga;l.Vector3=q;l.Vector2=C;l.Quaternion=da;l.Color=N;l.MorphBlendMesh=ua;l.ImmediateRenderObject=$c;l.VertexNormalsHelper=ad;l.SpotLightHelper=ic;l.SkeletonHelper=jc;l.PointLightHelper=kc;l.RectAreaLightHelper=lc;l.HemisphereLightHelper=mc;l.GridHelper=bd;l.PolarGridHelper=Ed;l.FaceNormalsHelper=cd;l.DirectionalLightHelper=nc;l.CameraHelper=
-dd;l.BoxHelper=oc;l.ArrowHelper=Cb;l.AxisHelper=Fd;l.CatmullRomCurve3=ke;l.SplineCurve3=Nf;l.CubicBezierCurve3=Of;l.QuadraticBezierCurve3=Pf;l.LineCurve3=Qf;l.ArcCurve=Gd;l.EllipseCurve=Xa;l.SplineCurve=xb;l.CubicBezierCurve=yb;l.QuadraticBezierCurve=zb;l.LineCurve=Qa;l.Shape=Ab;l.ShapePath=Ud;l.Path=Zc;l.Font=Vd;l.CurvePath=Yc;l.Curve=wa;l.ShapeUtils=pa;l.SceneUtils={createMultiMaterialObject:function(a,b){for(var c=new Bc,d=0,e=b.length;d<e;d++)c.add(new Ba(a,b[d]));return c},detach:function(a,
-b,c){a.applyMatrix(b.matrixWorld);b.remove(a);c.add(a)},attach:function(a,b,c){var d=new H;d.getInverse(c.matrixWorld);a.applyMatrix(d);b.remove(a);c.add(a)}};l.CurveUtils=ed;l.WireframeGeometry=Mb;l.ParametricGeometry=Dc;l.ParametricBufferGeometry=Nb;l.TetrahedronGeometry=Ec;l.TetrahedronBufferGeometry=Ob;l.OctahedronGeometry=Fc;l.OctahedronBufferGeometry=lb;l.IcosahedronGeometry=Gc;l.IcosahedronBufferGeometry=Pb;l.DodecahedronGeometry=Hc;l.DodecahedronBufferGeometry=Qb;l.PolyhedronGeometry=Ic;l.PolyhedronBufferGeometry=
-xa;l.TubeGeometry=Jc;l.TubeBufferGeometry=Rb;l.TorusKnotGeometry=Kc;l.TorusKnotBufferGeometry=Sb;l.TorusGeometry=Lc;l.TorusBufferGeometry=Tb;l.TextGeometry=Mc;l.SphereBufferGeometry=mb;l.SphereGeometry=Nc;l.RingGeometry=Oc;l.RingBufferGeometry=Ub;l.PlaneBufferGeometry=ib;l.PlaneGeometry=Pc;l.LatheGeometry=Qc;l.LatheBufferGeometry=Vb;l.ShapeGeometry=Xb;l.ShapeBufferGeometry=Wb;l.ExtrudeGeometry=La;l.EdgesGeometry=Yb;l.ConeGeometry=Rc;l.ConeBufferGeometry=Sc;l.CylinderGeometry=nb;l.CylinderBufferGeometry=
-Wa;l.CircleBufferGeometry=Zb;l.CircleGeometry=Tc;l.BoxBufferGeometry=hb;l.BoxGeometry=$b;l.ShadowMaterial=ac;l.SpriteMaterial=kb;l.RawShaderMaterial=bc;l.ShaderMaterial=Ia;l.PointsMaterial=Oa;l.MultiMaterial=Uc;l.MeshPhysicalMaterial=ob;l.MeshStandardMaterial=Pa;l.MeshPhongMaterial=Ca;l.MeshToonMaterial=pb;l.MeshNormalMaterial=qb;l.MeshLambertMaterial=rb;l.MeshDepthMaterial=ab;l.MeshBasicMaterial=Ka;l.LineDashedMaterial=sb;l.LineBasicMaterial=ia;l.Material=W;l.Float64BufferAttribute=wc;l.Float32BufferAttribute=
-X;l.Uint32BufferAttribute=Ua;l.Int32BufferAttribute=vc;l.Uint16BufferAttribute=Ra;l.Int16BufferAttribute=uc;l.Uint8ClampedBufferAttribute=tc;l.Uint8BufferAttribute=sc;l.Int8BufferAttribute=rc;l.BufferAttribute=y;l.REVISION="83";l.MOUSE={LEFT:0,MIDDLE:1,RIGHT:2};l.CullFaceNone=0;l.CullFaceBack=1;l.CullFaceFront=2;l.CullFaceFrontBack=3;l.FrontFaceDirectionCW=0;l.FrontFaceDirectionCCW=1;l.BasicShadowMap=0;l.PCFShadowMap=1;l.PCFSoftShadowMap=2;l.FrontSide=0;l.BackSide=1;l.DoubleSide=2;l.FlatShading=1;
-l.SmoothShading=2;l.NoColors=0;l.FaceColors=1;l.VertexColors=2;l.NoBlending=0;l.NormalBlending=1;l.AdditiveBlending=2;l.SubtractiveBlending=3;l.MultiplyBlending=4;l.CustomBlending=5;l.BlendingMode=Me;l.AddEquation=100;l.SubtractEquation=101;l.ReverseSubtractEquation=102;l.MinEquation=103;l.MaxEquation=104;l.ZeroFactor=200;l.OneFactor=201;l.SrcColorFactor=202;l.OneMinusSrcColorFactor=203;l.SrcAlphaFactor=204;l.OneMinusSrcAlphaFactor=205;l.DstAlphaFactor=206;l.OneMinusDstAlphaFactor=207;l.DstColorFactor=
-208;l.OneMinusDstColorFactor=209;l.SrcAlphaSaturateFactor=210;l.NeverDepth=0;l.AlwaysDepth=1;l.LessDepth=2;l.LessEqualDepth=3;l.EqualDepth=4;l.GreaterEqualDepth=5;l.GreaterDepth=6;l.NotEqualDepth=7;l.MultiplyOperation=0;l.MixOperation=1;l.AddOperation=2;l.NoToneMapping=0;l.LinearToneMapping=1;l.ReinhardToneMapping=2;l.Uncharted2ToneMapping=3;l.CineonToneMapping=4;l.UVMapping=300;l.CubeReflectionMapping=301;l.CubeRefractionMapping=302;l.EquirectangularReflectionMapping=303;l.EquirectangularRefractionMapping=
-304;l.SphericalReflectionMapping=305;l.CubeUVReflectionMapping=306;l.CubeUVRefractionMapping=307;l.TextureMapping=Ne;l.RepeatWrapping=1E3;l.ClampToEdgeWrapping=1001;l.MirroredRepeatWrapping=1002;l.TextureWrapping=le;l.NearestFilter=1003;l.NearestMipMapNearestFilter=1004;l.NearestMipMapLinearFilter=1005;l.LinearFilter=1006;l.LinearMipMapNearestFilter=1007;l.LinearMipMapLinearFilter=1008;l.TextureFilter=me;l.UnsignedByteType=1009;l.ByteType=1010;l.ShortType=1011;l.UnsignedShortType=1012;l.IntType=1013;
-l.UnsignedIntType=1014;l.FloatType=1015;l.HalfFloatType=1016;l.UnsignedShort4444Type=1017;l.UnsignedShort5551Type=1018;l.UnsignedShort565Type=1019;l.UnsignedInt248Type=1020;l.AlphaFormat=1021;l.RGBFormat=1022;l.RGBAFormat=1023;l.LuminanceFormat=1024;l.LuminanceAlphaFormat=1025;l.RGBEFormat=1023;l.DepthFormat=1026;l.DepthStencilFormat=1027;l.RGB_S3TC_DXT1_Format=2001;l.RGBA_S3TC_DXT1_Format=2002;l.RGBA_S3TC_DXT3_Format=2003;l.RGBA_S3TC_DXT5_Format=2004;l.RGB_PVRTC_4BPPV1_Format=2100;l.RGB_PVRTC_2BPPV1_Format=
-2101;l.RGBA_PVRTC_4BPPV1_Format=2102;l.RGBA_PVRTC_2BPPV1_Format=2103;l.RGB_ETC1_Format=2151;l.LoopOnce=2200;l.LoopRepeat=2201;l.LoopPingPong=2202;l.InterpolateDiscrete=2300;l.InterpolateLinear=2301;l.InterpolateSmooth=2302;l.ZeroCurvatureEnding=2400;l.ZeroSlopeEnding=2401;l.WrapAroundEnding=2402;l.TrianglesDrawMode=0;l.TriangleStripDrawMode=1;l.TriangleFanDrawMode=2;l.LinearEncoding=3E3;l.sRGBEncoding=3001;l.GammaEncoding=3007;l.RGBEEncoding=3002;l.LogLuvEncoding=3003;l.RGBM7Encoding=3004;l.RGBM16Encoding=
-3005;l.RGBDEncoding=3006;l.BasicDepthPacking=3200;l.RGBADepthPacking=3201;l.CubeGeometry=$b;l.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 ha(a,b,c,e,f,g)};l.LineStrip=0;l.LinePieces=1;l.MeshFaceMaterial=function(a){console.warn("THREE.MeshFaceMaterial has been renamed to THREE.MultiMaterial.");return new Uc(a)};l.PointCloud=function(a,b){console.warn("THREE.PointCloud has been renamed to THREE.Points.");return new Kb(a,
-b)};l.Particle=function(a){console.warn("THREE.Particle has been renamed to THREE.Sprite.");return new zc(a)};l.ParticleSystem=function(a,b){console.warn("THREE.ParticleSystem has been renamed to THREE.Points.");return new Kb(a,b)};l.PointCloudMaterial=function(a){console.warn("THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial.");return new Oa(a)};l.ParticleBasicMaterial=function(a){console.warn("THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial.");return new Oa(a)};
-l.ParticleSystemMaterial=function(a){console.warn("THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial.");return new Oa(a)};l.Vertex=function(a,b,c){console.warn("THREE.Vertex has been removed. Use THREE.Vector3 instead.");return new q(a,b,c)};l.DynamicBufferAttribute=function(a,b){console.warn("THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setDynamic( true ) instead.");return(new y(a,b)).setDynamic(!0)};l.Int8Attribute=function(a,b){console.warn("THREE.Int8Attribute has been removed. Use new THREE.Int8BufferAttribute() instead.");
-return new rc(a,b)};l.Uint8Attribute=function(a,b){console.warn("THREE.Uint8Attribute has been removed. Use new THREE.Uint8BufferAttribute() instead.");return new sc(a,b)};l.Uint8ClampedAttribute=function(a,b){console.warn("THREE.Uint8ClampedAttribute has been removed. Use new THREE.Uint8ClampedBufferAttribute() instead.");return new tc(a,b)};l.Int16Attribute=function(a,b){console.warn("THREE.Int16Attribute has been removed. Use new THREE.Int16BufferAttribute() instead.");return new uc(a,b)};l.Uint16Attribute=
-function(a,b){console.warn("THREE.Uint16Attribute has been removed. Use new THREE.Uint16BufferAttribute() instead.");return new Ra(a,b)};l.Int32Attribute=function(a,b){console.warn("THREE.Int32Attribute has been removed. Use new THREE.Int32BufferAttribute() instead.");return new vc(a,b)};l.Uint32Attribute=function(a,b){console.warn("THREE.Uint32Attribute has been removed. Use new THREE.Uint32BufferAttribute() instead.");return new Ua(a,b)};l.Float32Attribute=function(a,b){console.warn("THREE.Float32Attribute has been removed. Use new THREE.Float32BufferAttribute() instead.");
-return new X(a,b)};l.Float64Attribute=function(a,b){console.warn("THREE.Float64Attribute has been removed. Use new THREE.Float64BufferAttribute() instead.");return new wc(a,b)};l.ClosedSplineCurve3=Le;l.BoundingBoxHelper=function(a,b){console.warn("THREE.BoundingBoxHelper has been deprecated. Creating a THREE.BoxHelper instead.");return new oc(a,b)};l.EdgesHelper=function(a,b){console.warn("THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead.");return new fa(new Yb(a.geometry),new ia({color:void 0!==
-b?b:16777215}))};l.WireframeHelper=function(a,b){console.warn("THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead.");return new fa(new Mb(a.geometry),new ia({color:void 0!==b?b:16777215}))};l.XHRLoader=function(a){console.warn("THREE.XHRLoader has been renamed to THREE.FileLoader.");return new Ma(a)};l.GeometryUtils={merge:function(a,b,c){console.warn("THREE.GeometryUtils: .merge() has been moved to Geometry. Use geometry.merge( geometry2, matrix, materialIndexOffset ) instead.");
-var d;b.isMesh&&(b.matrixAutoUpdate&&b.updateMatrix(),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()}};l.ImageUtils={crossOrigin:void 0,loadTexture:function(a,b,c,d){console.warn("THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.");var e=new md;e.setCrossOrigin(this.crossOrigin);a=e.load(a,c,void 0,d);b&&(a.mapping=b);return a},
-loadTextureCube:function(a,b,c,d){console.warn("THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.");var e=new Rd;e.setCrossOrigin(this.crossOrigin);a=e.load(a,c,void 0,d);b&&(a.mapping=b);return a},loadCompressedTexture:function(){console.error("THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.")},loadCompressedTextureCube:function(){console.error("THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.")}};
-l.Projector=function(){console.error("THREE.Projector has been moved to /examples/js/renderers/Projector.js.");this.projectVector=function(a,b){console.warn("THREE.Projector: .projectVector() is now vector.project().");a.project(b)};this.unprojectVector=function(a,b){console.warn("THREE.Projector: .unprojectVector() is now vector.unproject().");a.unproject(b)};this.pickingRay=function(){console.error("THREE.Projector: .pickingRay() is now raycaster.setFromCamera().")}};l.CanvasRenderer=function(){console.error("THREE.CanvasRenderer has been moved to /examples/js/renderers/CanvasRenderer.js");
-this.domElement=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");this.clear=function(){};this.render=function(){};this.setClearColor=function(){};this.setSize=function(){}};Object.defineProperty(l,"__esModule",{value:!0})});
-
-},{}],168:[function(require,module,exports){
-//     Underscore.js 1.8.3
-//     http://underscorejs.org
-//     (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
-//     Underscore may be freely distributed under the MIT license.
-
-(function() {
-
-  // Baseline setup
-  // --------------
-
-  // Establish the root object, `window` in the browser, or `exports` on the server.
-  var root = this;
-
-  // Save the previous value of the `_` variable.
-  var previousUnderscore = root._;
-
-  // Save bytes in the minified (but not gzipped) version:
-  var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;
-
-  // Create quick reference variables for speed access to core prototypes.
-  var
-    push             = ArrayProto.push,
-    slice            = ArrayProto.slice,
-    toString         = ObjProto.toString,
-    hasOwnProperty   = ObjProto.hasOwnProperty;
-
-  // All **ECMAScript 5** native function implementations that we hope to use
-  // are declared here.
-  var
-    nativeIsArray      = Array.isArray,
-    nativeKeys         = Object.keys,
-    nativeBind         = FuncProto.bind,
-    nativeCreate       = Object.create;
-
-  // Naked function reference for surrogate-prototype-swapping.
-  var Ctor = function(){};
-
-  // Create a safe reference to the Underscore object for use below.
-  var _ = function(obj) {
-    if (obj instanceof _) return obj;
-    if (!(this instanceof _)) return new _(obj);
-    this._wrapped = obj;
-  };
-
-  // Export the Underscore object for **Node.js**, with
-  // backwards-compatibility for the old `require()` API. If we're in
-  // the browser, add `_` as a global object.
-  if (typeof exports !== 'undefined') {
-    if (typeof module !== 'undefined' && module.exports) {
-      exports = module.exports = _;
-    }
-    exports._ = _;
-  } else {
-    root._ = _;
-  }
-
-  // Current version.
-  _.VERSION = '1.8.3';
-
-  // Internal function that returns an efficient (for current engines) version
-  // of the passed-in callback, to be repeatedly applied in other Underscore
-  // functions.
-  var optimizeCb = function(func, context, argCount) {
-    if (context === void 0) return func;
-    switch (argCount == null ? 3 : argCount) {
-      case 1: return function(value) {
-        return func.call(context, value);
-      };
-      case 2: return function(value, other) {
-        return func.call(context, value, other);
-      };
-      case 3: return function(value, index, collection) {
-        return func.call(context, value, index, collection);
-      };
-      case 4: return function(accumulator, value, index, collection) {
-        return func.call(context, accumulator, value, index, collection);
-      };
-    }
-    return function() {
-      return func.apply(context, arguments);
-    };
-  };
-
-  // A mostly-internal function to generate callbacks that can be applied
-  // to each element in a collection, returning the desired result â€” either
-  // identity, an arbitrary callback, a property matcher, or a property accessor.
-  var cb = function(value, context, argCount) {
-    if (value == null) return _.identity;
-    if (_.isFunction(value)) return optimizeCb(value, context, argCount);
-    if (_.isObject(value)) return _.matcher(value);
-    return _.property(value);
-  };
-  _.iteratee = function(value, context) {
-    return cb(value, context, Infinity);
-  };
-
-  // An internal function for creating assigner functions.
-  var createAssigner = function(keysFunc, undefinedOnly) {
-    return function(obj) {
-      var length = arguments.length;
-      if (length < 2 || obj == null) return obj;
-      for (var index = 1; index < length; index++) {
-        var source = arguments[index],
-            keys = keysFunc(source),
-            l = keys.length;
-        for (var i = 0; i < l; i++) {
-          var key = keys[i];
-          if (!undefinedOnly || obj[key] === void 0) obj[key] = source[key];
-        }
-      }
-      return obj;
-    };
-  };
-
-  // An internal function for creating a new object that inherits from another.
-  var baseCreate = function(prototype) {
-    if (!_.isObject(prototype)) return {};
-    if (nativeCreate) return nativeCreate(prototype);
-    Ctor.prototype = prototype;
-    var result = new Ctor;
-    Ctor.prototype = null;
-    return result;
-  };
-
-  var property = function(key) {
-    return function(obj) {
-      return obj == null ? void 0 : obj[key];
-    };
-  };
-
-  // Helper for collection methods to determine whether a collection
-  // should be iterated as an array or as an object
-  // Related: http://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength
-  // Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094
-  var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;
-  var getLength = property('length');
-  var isArrayLike = function(collection) {
-    var length = getLength(collection);
-    return typeof length == 'number' && length >= 0 && length <= MAX_ARRAY_INDEX;
-  };
-
-  // Collection Functions
-  // --------------------
-
-  // The cornerstone, an `each` implementation, aka `forEach`.
-  // Handles raw objects in addition to array-likes. Treats all
-  // sparse array-likes as if they were dense.
-  _.each = _.forEach = function(obj, iteratee, context) {
-    iteratee = optimizeCb(iteratee, context);
-    var i, length;
-    if (isArrayLike(obj)) {
-      for (i = 0, length = obj.length; i < length; i++) {
-        iteratee(obj[i], i, obj);
-      }
-    } else {
-      var keys = _.keys(obj);
-      for (i = 0, length = keys.length; i < length; i++) {
-        iteratee(obj[keys[i]], keys[i], obj);
-      }
-    }
-    return obj;
-  };
-
-  // Return the results of applying the iteratee to each element.
-  _.map = _.collect = function(obj, iteratee, context) {
-    iteratee = cb(iteratee, context);
-    var keys = !isArrayLike(obj) && _.keys(obj),
-        length = (keys || obj).length,
-        results = Array(length);
-    for (var index = 0; index < length; index++) {
-      var currentKey = keys ? keys[index] : index;
-      results[index] = iteratee(obj[currentKey], currentKey, obj);
-    }
-    return results;
-  };
-
-  // Create a reducing function iterating left or right.
-  function createReduce(dir) {
-    // Optimized iterator function as using arguments.length
-    // in the main function will deoptimize the, see #1991.
-    function iterator(obj, iteratee, memo, keys, index, length) {
-      for (; index >= 0 && index < length; index += dir) {
-        var currentKey = keys ? keys[index] : index;
-        memo = iteratee(memo, obj[currentKey], currentKey, obj);
-      }
-      return memo;
-    }
-
-    return function(obj, iteratee, memo, context) {
-      iteratee = optimizeCb(iteratee, context, 4);
-      var keys = !isArrayLike(obj) && _.keys(obj),
-          length = (keys || obj).length,
-          index = dir > 0 ? 0 : length - 1;
-      // Determine the initial value if none is provided.
-      if (arguments.length < 3) {
-        memo = obj[keys ? keys[index] : index];
-        index += dir;
-      }
-      return iterator(obj, iteratee, memo, keys, index, length);
-    };
-  }
-
-  // **Reduce** builds up a single result from a list of values, aka `inject`,
-  // or `foldl`.
-  _.reduce = _.foldl = _.inject = createReduce(1);
-
-  // The right-associative version of reduce, also known as `foldr`.
-  _.reduceRight = _.foldr = createReduce(-1);
-
-  // Return the first value which passes a truth test. Aliased as `detect`.
-  _.find = _.detect = function(obj, predicate, context) {
-    var key;
-    if (isArrayLike(obj)) {
-      key = _.findIndex(obj, predicate, context);
-    } else {
-      key = _.findKey(obj, predicate, context);
-    }
-    if (key !== void 0 && key !== -1) return obj[key];
-  };
-
-  // Return all the elements that pass a truth test.
-  // Aliased as `select`.
-  _.filter = _.select = function(obj, predicate, context) {
-    var results = [];
-    predicate = cb(predicate, context);
-    _.each(obj, function(value, index, list) {
-      if (predicate(value, index, list)) results.push(value);
-    });
-    return results;
-  };
-
-  // Return all the elements for which a truth test fails.
-  _.reject = function(obj, predicate, context) {
-    return _.filter(obj, _.negate(cb(predicate)), context);
-  };
-
-  // Determine whether all of the elements match a truth test.
-  // Aliased as `all`.
-  _.every = _.all = function(obj, predicate, context) {
-    predicate = cb(predicate, context);
-    var keys = !isArrayLike(obj) && _.keys(obj),
-        length = (keys || obj).length;
-    for (var index = 0; index < length; index++) {
-      var currentKey = keys ? keys[index] : index;
-      if (!predicate(obj[currentKey], currentKey, obj)) return false;
-    }
-    return true;
-  };
-
-  // Determine if at least one element in the object matches a truth test.
-  // Aliased as `any`.
-  _.some = _.any = function(obj, predicate, context) {
-    predicate = cb(predicate, context);
-    var keys = !isArrayLike(obj) && _.keys(obj),
-        length = (keys || obj).length;
-    for (var index = 0; index < length; index++) {
-      var currentKey = keys ? keys[index] : index;
-      if (predicate(obj[currentKey], currentKey, obj)) return true;
-    }
-    return false;
-  };
-
-  // Determine if the array or object contains a given item (using `===`).
-  // Aliased as `includes` and `include`.
-  _.contains = _.includes = _.include = function(obj, item, fromIndex, guard) {
-    if (!isArrayLike(obj)) obj = _.values(obj);
-    if (typeof fromIndex != 'number' || guard) fromIndex = 0;
-    return _.indexOf(obj, item, fromIndex) >= 0;
-  };
-
-  // Invoke a method (with arguments) on every item in a collection.
-  _.invoke = function(obj, method) {
-    var args = slice.call(arguments, 2);
-    var isFunc = _.isFunction(method);
-    return _.map(obj, function(value) {
-      var func = isFunc ? method : value[method];
-      return func == null ? func : func.apply(value, args);
-    });
-  };
-
-  // Convenience version of a common use case of `map`: fetching a property.
-  _.pluck = function(obj, key) {
-    return _.map(obj, _.property(key));
-  };
-
-  // Convenience version of a common use case of `filter`: selecting only objects
-  // containing specific `key:value` pairs.
-  _.where = function(obj, attrs) {
-    return _.filter(obj, _.matcher(attrs));
-  };
-
-  // Convenience version of a common use case of `find`: getting the first object
-  // containing specific `key:value` pairs.
-  _.findWhere = function(obj, attrs) {
-    return _.find(obj, _.matcher(attrs));
-  };
-
-  // Return the maximum element (or element-based computation).
-  _.max = function(obj, iteratee, context) {
-    var result = -Infinity, lastComputed = -Infinity,
-        value, computed;
-    if (iteratee == null && obj != null) {
-      obj = isArrayLike(obj) ? obj : _.values(obj);
-      for (var i = 0, length = obj.length; i < length; i++) {
-        value = obj[i];
-        if (value > result) {
-          result = value;
-        }
-      }
-    } else {
-      iteratee = cb(iteratee, context);
-      _.each(obj, function(value, index, list) {
-        computed = iteratee(value, index, list);
-        if (computed > lastComputed || computed === -Infinity && result === -Infinity) {
-          result = value;
-          lastComputed = computed;
-        }
-      });
-    }
-    return result;
-  };
-
-  // Return the minimum element (or element-based computation).
-  _.min = function(obj, iteratee, context) {
-    var result = Infinity, lastComputed = Infinity,
-        value, computed;
-    if (iteratee == null && obj != null) {
-      obj = isArrayLike(obj) ? obj : _.values(obj);
-      for (var i = 0, length = obj.length; i < length; i++) {
-        value = obj[i];
-        if (value < result) {
-          result = value;
-        }
-      }
-    } else {
-      iteratee = cb(iteratee, context);
-      _.each(obj, function(value, index, list) {
-        computed = iteratee(value, index, list);
-        if (computed < lastComputed || computed === Infinity && result === Infinity) {
-          result = value;
-          lastComputed = computed;
-        }
-      });
-    }
-    return result;
-  };
-
-  // Shuffle a collection, using the modern version of the
-  // [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle).
-  _.shuffle = function(obj) {
-    var set = isArrayLike(obj) ? obj : _.values(obj);
-    var length = set.length;
-    var shuffled = Array(length);
-    for (var index = 0, rand; index < length; index++) {
-      rand = _.random(0, index);
-      if (rand !== index) shuffled[index] = shuffled[rand];
-      shuffled[rand] = set[index];
-    }
-    return shuffled;
-  };
-
-  // Sample **n** random values from a collection.
-  // If **n** is not specified, returns a single random element.
-  // The internal `guard` argument allows it to work with `map`.
-  _.sample = function(obj, n, guard) {
-    if (n == null || guard) {
-      if (!isArrayLike(obj)) obj = _.values(obj);
-      return obj[_.random(obj.length - 1)];
-    }
-    return _.shuffle(obj).slice(0, Math.max(0, n));
-  };
-
-  // Sort the object's values by a criterion produced by an iteratee.
-  _.sortBy = function(obj, iteratee, context) {
-    iteratee = cb(iteratee, context);
-    return _.pluck(_.map(obj, function(value, index, list) {
-      return {
-        value: value,
-        index: index,
-        criteria: iteratee(value, index, list)
-      };
-    }).sort(function(left, right) {
-      var a = left.criteria;
-      var b = right.criteria;
-      if (a !== b) {
-        if (a > b || a === void 0) return 1;
-        if (a < b || b === void 0) return -1;
-      }
-      return left.index - right.index;
-    }), 'value');
-  };
-
-  // An internal function used for aggregate "group by" operations.
-  var group = function(behavior) {
-    return function(obj, iteratee, context) {
-      var result = {};
-      iteratee = cb(iteratee, context);
-      _.each(obj, function(value, index) {
-        var key = iteratee(value, index, obj);
-        behavior(result, value, key);
-      });
-      return result;
-    };
-  };
-
-  // Groups the object's values by a criterion. Pass either a string attribute
-  // to group by, or a function that returns the criterion.
-  _.groupBy = group(function(result, value, key) {
-    if (_.has(result, key)) result[key].push(value); else result[key] = [value];
-  });
-
-  // Indexes the object's values by a criterion, similar to `groupBy`, but for
-  // when you know that your index values will be unique.
-  _.indexBy = group(function(result, value, key) {
-    result[key] = value;
-  });
-
-  // Counts instances of an object that group by a certain criterion. Pass
-  // either a string attribute to count by, or a function that returns the
-  // criterion.
-  _.countBy = group(function(result, value, key) {
-    if (_.has(result, key)) result[key]++; else result[key] = 1;
-  });
-
-  // Safely create a real, live array from anything iterable.
-  _.toArray = function(obj) {
-    if (!obj) return [];
-    if (_.isArray(obj)) return slice.call(obj);
-    if (isArrayLike(obj)) return _.map(obj, _.identity);
-    return _.values(obj);
-  };
-
-  // Return the number of elements in an object.
-  _.size = function(obj) {
-    if (obj == null) return 0;
-    return isArrayLike(obj) ? obj.length : _.keys(obj).length;
-  };
-
-  // Split a collection into two arrays: one whose elements all satisfy the given
-  // predicate, and one whose elements all do not satisfy the predicate.
-  _.partition = function(obj, predicate, context) {
-    predicate = cb(predicate, context);
-    var pass = [], fail = [];
-    _.each(obj, function(value, key, obj) {
-      (predicate(value, key, obj) ? pass : fail).push(value);
-    });
-    return [pass, fail];
-  };
-
-  // Array Functions
-  // ---------------
-
-  // Get the first element of an array. Passing **n** will return the first N
-  // values in the array. Aliased as `head` and `take`. The **guard** check
-  // allows it to work with `_.map`.
-  _.first = _.head = _.take = function(array, n, guard) {
-    if (array == null) return void 0;
-    if (n == null || guard) return array[0];
-    return _.initial(array, array.length - n);
-  };
-
-  // Returns everything but the last entry of the array. Especially useful on
-  // the arguments object. Passing **n** will return all the values in
-  // the array, excluding the last N.
-  _.initial = function(array, n, guard) {
-    return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));
-  };
-
-  // Get the last element of an array. Passing **n** will return the last N
-  // values in the array.
-  _.last = function(array, n, guard) {
-    if (array == null) return void 0;
-    if (n == null || guard) return array[array.length - 1];
-    return _.rest(array, Math.max(0, array.length - n));
-  };
-
-  // Returns everything but the first entry of the array. Aliased as `tail` and `drop`.
-  // Especially useful on the arguments object. Passing an **n** will return
-  // the rest N values in the array.
-  _.rest = _.tail = _.drop = function(array, n, guard) {
-    return slice.call(array, n == null || guard ? 1 : n);
-  };
-
-  // Trim out all falsy values from an array.
-  _.compact = function(array) {
-    return _.filter(array, _.identity);
-  };
-
-  // Internal implementation of a recursive `flatten` function.
-  var flatten = function(input, shallow, strict, startIndex) {
-    var output = [], idx = 0;
-    for (var i = startIndex || 0, length = getLength(input); i < length; i++) {
-      var value = input[i];
-      if (isArrayLike(value) && (_.isArray(value) || _.isArguments(value))) {
-        //flatten current level of array or arguments object
-        if (!shallow) value = flatten(value, shallow, strict);
-        var j = 0, len = value.length;
-        output.length += len;
-        while (j < len) {
-          output[idx++] = value[j++];
-        }
-      } else if (!strict) {
-        output[idx++] = value;
-      }
-    }
-    return output;
-  };
-
-  // Flatten out an array, either recursively (by default), or just one level.
-  _.flatten = function(array, shallow) {
-    return flatten(array, shallow, false);
-  };
-
-  // Return a version of the array that does not contain the specified value(s).
-  _.without = function(array) {
-    return _.difference(array, slice.call(arguments, 1));
-  };
-
-  // Produce a duplicate-free version of the array. If the array has already
-  // been sorted, you have the option of using a faster algorithm.
-  // Aliased as `unique`.
-  _.uniq = _.unique = function(array, isSorted, iteratee, context) {
-    if (!_.isBoolean(isSorted)) {
-      context = iteratee;
-      iteratee = isSorted;
-      isSorted = false;
-    }
-    if (iteratee != null) iteratee = cb(iteratee, context);
-    var result = [];
-    var seen = [];
-    for (var i = 0, length = getLength(array); i < length; i++) {
-      var value = array[i],
-          computed = iteratee ? iteratee(value, i, array) : value;
-      if (isSorted) {
-        if (!i || seen !== computed) result.push(value);
-        seen = computed;
-      } else if (iteratee) {
-        if (!_.contains(seen, computed)) {
-          seen.push(computed);
-          result.push(value);
-        }
-      } else if (!_.contains(result, value)) {
-        result.push(value);
-      }
-    }
-    return result;
-  };
-
-  // Produce an array that contains the union: each distinct element from all of
-  // the passed-in arrays.
-  _.union = function() {
-    return _.uniq(flatten(arguments, true, true));
-  };
-
-  // Produce an array that contains every item shared between all the
-  // passed-in arrays.
-  _.intersection = function(array) {
-    var result = [];
-    var argsLength = arguments.length;
-    for (var i = 0, length = getLength(array); i < length; i++) {
-      var item = array[i];
-      if (_.contains(result, item)) continue;
-      for (var j = 1; j < argsLength; j++) {
-        if (!_.contains(arguments[j], item)) break;
-      }
-      if (j === argsLength) result.push(item);
-    }
-    return result;
-  };
-
-  // Take the difference between one array and a number of other arrays.
-  // Only the elements present in just the first array will remain.
-  _.difference = function(array) {
-    var rest = flatten(arguments, true, true, 1);
-    return _.filter(array, function(value){
-      return !_.contains(rest, value);
-    });
-  };
-
-  // Zip together multiple lists into a single array -- elements that share
-  // an index go together.
-  _.zip = function() {
-    return _.unzip(arguments);
-  };
-
-  // Complement of _.zip. Unzip accepts an array of arrays and groups
-  // each array's elements on shared indices
-  _.unzip = function(array) {
-    var length = array && _.max(array, getLength).length || 0;
-    var result = Array(length);
-
-    for (var index = 0; index < length; index++) {
-      result[index] = _.pluck(array, index);
-    }
-    return result;
-  };
-
-  // Converts lists into objects. Pass either a single array of `[key, value]`
-  // pairs, or two parallel arrays of the same length -- one of keys, and one of
-  // the corresponding values.
-  _.object = function(list, values) {
-    var result = {};
-    for (var i = 0, length = getLength(list); i < length; i++) {
-      if (values) {
-        result[list[i]] = values[i];
-      } else {
-        result[list[i][0]] = list[i][1];
-      }
-    }
-    return result;
-  };
-
-  // Generator function to create the findIndex and findLastIndex functions
-  function createPredicateIndexFinder(dir) {
-    return function(array, predicate, context) {
-      predicate = cb(predicate, context);
-      var length = getLength(array);
-      var index = dir > 0 ? 0 : length - 1;
-      for (; index >= 0 && index < length; index += dir) {
-        if (predicate(array[index], index, array)) return index;
-      }
-      return -1;
-    };
-  }
-
-  // Returns the first index on an array-like that passes a predicate test
-  _.findIndex = createPredicateIndexFinder(1);
-  _.findLastIndex = createPredicateIndexFinder(-1);
-
-  // Use a comparator function to figure out the smallest index at which
-  // an object should be inserted so as to maintain order. Uses binary search.
-  _.sortedIndex = function(array, obj, iteratee, context) {
-    iteratee = cb(iteratee, context, 1);
-    var value = iteratee(obj);
-    var low = 0, high = getLength(array);
-    while (low < high) {
-      var mid = Math.floor((low + high) / 2);
-      if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;
-    }
-    return low;
-  };
-
-  // Generator function to create the indexOf and lastIndexOf functions
-  function createIndexFinder(dir, predicateFind, sortedIndex) {
-    return function(array, item, idx) {
-      var i = 0, length = getLength(array);
-      if (typeof idx == 'number') {
-        if (dir > 0) {
-            i = idx >= 0 ? idx : Math.max(idx + length, i);
-        } else {
-            length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;
-        }
-      } else if (sortedIndex && idx && length) {
-        idx = sortedIndex(array, item);
-        return array[idx] === item ? idx : -1;
-      }
-      if (item !== item) {
-        idx = predicateFind(slice.call(array, i, length), _.isNaN);
-        return idx >= 0 ? idx + i : -1;
-      }
-      for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) {
-        if (array[idx] === item) return idx;
-      }
-      return -1;
-    };
-  }
-
-  // Return the position of the first occurrence of an item in an array,
-  // or -1 if the item is not included in the array.
-  // If the array is large and already in sort order, pass `true`
-  // for **isSorted** to use binary search.
-  _.indexOf = createIndexFinder(1, _.findIndex, _.sortedIndex);
-  _.lastIndexOf = createIndexFinder(-1, _.findLastIndex);
-
-  // Generate an integer Array containing an arithmetic progression. A port of
-  // the native Python `range()` function. See
-  // [the Python documentation](http://docs.python.org/library/functions.html#range).
-  _.range = function(start, stop, step) {
-    if (stop == null) {
-      stop = start || 0;
-      start = 0;
-    }
-    step = step || 1;
-
-    var length = Math.max(Math.ceil((stop - start) / step), 0);
-    var range = Array(length);
-
-    for (var idx = 0; idx < length; idx++, start += step) {
-      range[idx] = start;
-    }
-
-    return range;
-  };
-
-  // Function (ahem) Functions
-  // ------------------
-
-  // Determines whether to execute a function as a constructor
-  // or a normal function with the provided arguments
-  var executeBound = function(sourceFunc, boundFunc, context, callingContext, args) {
-    if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args);
-    var self = baseCreate(sourceFunc.prototype);
-    var result = sourceFunc.apply(self, args);
-    if (_.isObject(result)) return result;
-    return self;
-  };
-
-  // Create a function bound to a given object (assigning `this`, and arguments,
-  // optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if
-  // available.
-  _.bind = function(func, context) {
-    if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));
-    if (!_.isFunction(func)) throw new TypeError('Bind must be called on a function');
-    var args = slice.call(arguments, 2);
-    var bound = function() {
-      return executeBound(func, bound, context, this, args.concat(slice.call(arguments)));
-    };
-    return bound;
-  };
-
-  // Partially apply a function by creating a version that has had some of its
-  // arguments pre-filled, without changing its dynamic `this` context. _ acts
-  // as a placeholder, allowing any combination of arguments to be pre-filled.
-  _.partial = function(func) {
-    var boundArgs = slice.call(arguments, 1);
-    var bound = function() {
-      var position = 0, length = boundArgs.length;
-      var args = Array(length);
-      for (var i = 0; i < length; i++) {
-        args[i] = boundArgs[i] === _ ? arguments[position++] : boundArgs[i];
-      }
-      while (position < arguments.length) args.push(arguments[position++]);
-      return executeBound(func, bound, this, this, args);
-    };
-    return bound;
-  };
-
-  // Bind a number of an object's methods to that object. Remaining arguments
-  // are the method names to be bound. Useful for ensuring that all callbacks
-  // defined on an object belong to it.
-  _.bindAll = function(obj) {
-    var i, length = arguments.length, key;
-    if (length <= 1) throw new Error('bindAll must be passed function names');
-    for (i = 1; i < length; i++) {
-      key = arguments[i];
-      obj[key] = _.bind(obj[key], obj);
-    }
-    return obj;
-  };
-
-  // Memoize an expensive function by storing its results.
-  _.memoize = function(func, hasher) {
-    var memoize = function(key) {
-      var cache = memoize.cache;
-      var address = '' + (hasher ? hasher.apply(this, arguments) : key);
-      if (!_.has(cache, address)) cache[address] = func.apply(this, arguments);
-      return cache[address];
-    };
-    memoize.cache = {};
-    return memoize;
-  };
-
-  // Delays a function for the given number of milliseconds, and then calls
-  // it with the arguments supplied.
-  _.delay = function(func, wait) {
-    var args = slice.call(arguments, 2);
-    return setTimeout(function(){
-      return func.apply(null, args);
-    }, wait);
-  };
-
-  // Defers a function, scheduling it to run after the current call stack has
-  // cleared.
-  _.defer = _.partial(_.delay, _, 1);
-
-  // Returns a function, that, when invoked, will only be triggered at most once
-  // during a given window of time. Normally, the throttled function will run
-  // as much as it can, without ever going more than once per `wait` duration;
-  // but if you'd like to disable the execution on the leading edge, pass
-  // `{leading: false}`. To disable execution on the trailing edge, ditto.
-  _.throttle = function(func, wait, options) {
-    var context, args, result;
-    var timeout = null;
-    var previous = 0;
-    if (!options) options = {};
-    var later = function() {
-      previous = options.leading === false ? 0 : _.now();
-      timeout = null;
-      result = func.apply(context, args);
-      if (!timeout) context = args = null;
-    };
-    return function() {
-      var now = _.now();
-      if (!previous && options.leading === false) previous = now;
-      var remaining = wait - (now - previous);
-      context = this;
-      args = arguments;
-      if (remaining <= 0 || remaining > wait) {
-        if (timeout) {
-          clearTimeout(timeout);
-          timeout = null;
-        }
-        previous = now;
-        result = func.apply(context, args);
-        if (!timeout) context = args = null;
-      } else if (!timeout && options.trailing !== false) {
-        timeout = setTimeout(later, remaining);
-      }
-      return result;
-    };
-  };
-
-  // Returns a function, that, as long as it continues to be invoked, will not
-  // be triggered. The function will be called after it stops being called for
-  // N milliseconds. If `immediate` is passed, trigger the function on the
-  // leading edge, instead of the trailing.
-  _.debounce = function(func, wait, immediate) {
-    var timeout, args, context, timestamp, result;
-
-    var later = function() {
-      var last = _.now() - timestamp;
-
-      if (last < wait && last >= 0) {
-        timeout = setTimeout(later, wait - last);
-      } else {
-        timeout = null;
-        if (!immediate) {
-          result = func.apply(context, args);
-          if (!timeout) context = args = null;
-        }
-      }
-    };
-
-    return function() {
-      context = this;
-      args = arguments;
-      timestamp = _.now();
-      var callNow = immediate && !timeout;
-      if (!timeout) timeout = setTimeout(later, wait);
-      if (callNow) {
-        result = func.apply(context, args);
-        context = args = null;
-      }
-
-      return result;
-    };
-  };
-
-  // Returns the first function passed as an argument to the second,
-  // allowing you to adjust arguments, run code before and after, and
-  // conditionally execute the original function.
-  _.wrap = function(func, wrapper) {
-    return _.partial(wrapper, func);
-  };
-
-  // Returns a negated version of the passed-in predicate.
-  _.negate = function(predicate) {
-    return function() {
-      return !predicate.apply(this, arguments);
-    };
-  };
-
-  // Returns a function that is the composition of a list of functions, each
-  // consuming the return value of the function that follows.
-  _.compose = function() {
-    var args = arguments;
-    var start = args.length - 1;
-    return function() {
-      var i = start;
-      var result = args[start].apply(this, arguments);
-      while (i--) result = args[i].call(this, result);
-      return result;
-    };
-  };
-
-  // Returns a function that will only be executed on and after the Nth call.
-  _.after = function(times, func) {
-    return function() {
-      if (--times < 1) {
-        return func.apply(this, arguments);
-      }
-    };
-  };
-
-  // Returns a function that will only be executed up to (but not including) the Nth call.
-  _.before = function(times, func) {
-    var memo;
-    return function() {
-      if (--times > 0) {
-        memo = func.apply(this, arguments);
-      }
-      if (times <= 1) func = null;
-      return memo;
-    };
-  };
-
-  // Returns a function that will be executed at most one time, no matter how
-  // often you call it. Useful for lazy initialization.
-  _.once = _.partial(_.before, 2);
-
-  // Object Functions
-  // ----------------
-
-  // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.
-  var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');
-  var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',
-                      'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];
-
-  function collectNonEnumProps(obj, keys) {
-    var nonEnumIdx = nonEnumerableProps.length;
-    var constructor = obj.constructor;
-    var proto = (_.isFunction(constructor) && constructor.prototype) || ObjProto;
-
-    // Constructor is a special case.
-    var prop = 'constructor';
-    if (_.has(obj, prop) && !_.contains(keys, prop)) keys.push(prop);
-
-    while (nonEnumIdx--) {
-      prop = nonEnumerableProps[nonEnumIdx];
-      if (prop in obj && obj[prop] !== proto[prop] && !_.contains(keys, prop)) {
-        keys.push(prop);
-      }
-    }
-  }
-
-  // Retrieve the names of an object's own properties.
-  // Delegates to **ECMAScript 5**'s native `Object.keys`
-  _.keys = function(obj) {
-    if (!_.isObject(obj)) return [];
-    if (nativeKeys) return nativeKeys(obj);
-    var keys = [];
-    for (var key in obj) if (_.has(obj, key)) keys.push(key);
-    // Ahem, IE < 9.
-    if (hasEnumBug) collectNonEnumProps(obj, keys);
-    return keys;
-  };
-
-  // Retrieve all the property names of an object.
-  _.allKeys = function(obj) {
-    if (!_.isObject(obj)) return [];
-    var keys = [];
-    for (var key in obj) keys.push(key);
-    // Ahem, IE < 9.
-    if (hasEnumBug) collectNonEnumProps(obj, keys);
-    return keys;
-  };
-
-  // Retrieve the values of an object's properties.
-  _.values = function(obj) {
-    var keys = _.keys(obj);
-    var length = keys.length;
-    var values = Array(length);
-    for (var i = 0; i < length; i++) {
-      values[i] = obj[keys[i]];
-    }
-    return values;
-  };
-
-  // Returns the results of applying the iteratee to each element of the object
-  // In contrast to _.map it returns an object
-  _.mapObject = function(obj, iteratee, context) {
-    iteratee = cb(iteratee, context);
-    var keys =  _.keys(obj),
-          length = keys.length,
-          results = {},
-          currentKey;
-      for (var index = 0; index < length; index++) {
-        currentKey = keys[index];
-        results[currentKey] = iteratee(obj[currentKey], currentKey, obj);
-      }
-      return results;
-  };
-
-  // Convert an object into a list of `[key, value]` pairs.
-  _.pairs = function(obj) {
-    var keys = _.keys(obj);
-    var length = keys.length;
-    var pairs = Array(length);
-    for (var i = 0; i < length; i++) {
-      pairs[i] = [keys[i], obj[keys[i]]];
-    }
-    return pairs;
-  };
-
-  // Invert the keys and values of an object. The values must be serializable.
-  _.invert = function(obj) {
-    var result = {};
-    var keys = _.keys(obj);
-    for (var i = 0, length = keys.length; i < length; i++) {
-      result[obj[keys[i]]] = keys[i];
-    }
-    return result;
-  };
-
-  // Return a sorted list of the function names available on the object.
-  // Aliased as `methods`
-  _.functions = _.methods = function(obj) {
-    var names = [];
-    for (var key in obj) {
-      if (_.isFunction(obj[key])) names.push(key);
-    }
-    return names.sort();
-  };
-
-  // Extend a given object with all the properties in passed-in object(s).
-  _.extend = createAssigner(_.allKeys);
-
-  // Assigns a given object with all the own properties in the passed-in object(s)
-  // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)
-  _.extendOwn = _.assign = createAssigner(_.keys);
-
-  // Returns the first key on an object that passes a predicate test
-  _.findKey = function(obj, predicate, context) {
-    predicate = cb(predicate, context);
-    var keys = _.keys(obj), key;
-    for (var i = 0, length = keys.length; i < length; i++) {
-      key = keys[i];
-      if (predicate(obj[key], key, obj)) return key;
-    }
-  };
-
-  // Return a copy of the object only containing the whitelisted properties.
-  _.pick = function(object, oiteratee, context) {
-    var result = {}, obj = object, iteratee, keys;
-    if (obj == null) return result;
-    if (_.isFunction(oiteratee)) {
-      keys = _.allKeys(obj);
-      iteratee = optimizeCb(oiteratee, context);
-    } else {
-      keys = flatten(arguments, false, false, 1);
-      iteratee = function(value, key, obj) { return key in obj; };
-      obj = Object(obj);
-    }
-    for (var i = 0, length = keys.length; i < length; i++) {
-      var key = keys[i];
-      var value = obj[key];
-      if (iteratee(value, key, obj)) result[key] = value;
-    }
-    return result;
-  };
-
-   // Return a copy of the object without the blacklisted properties.
-  _.omit = function(obj, iteratee, context) {
-    if (_.isFunction(iteratee)) {
-      iteratee = _.negate(iteratee);
-    } else {
-      var keys = _.map(flatten(arguments, false, false, 1), String);
-      iteratee = function(value, key) {
-        return !_.contains(keys, key);
-      };
-    }
-    return _.pick(obj, iteratee, context);
-  };
-
-  // Fill in a given object with default properties.
-  _.defaults = createAssigner(_.allKeys, true);
-
-  // Creates an object that inherits from the given prototype object.
-  // If additional properties are provided then they will be added to the
-  // created object.
-  _.create = function(prototype, props) {
-    var result = baseCreate(prototype);
-    if (props) _.extendOwn(result, props);
-    return result;
-  };
-
-  // Create a (shallow-cloned) duplicate of an object.
-  _.clone = function(obj) {
-    if (!_.isObject(obj)) return obj;
-    return _.isArray(obj) ? obj.slice() : _.extend({}, obj);
-  };
-
-  // Invokes interceptor with the obj, and then returns obj.
-  // The primary purpose of this method is to "tap into" a method chain, in
-  // order to perform operations on intermediate results within the chain.
-  _.tap = function(obj, interceptor) {
-    interceptor(obj);
-    return obj;
-  };
-
-  // Returns whether an object has a given set of `key:value` pairs.
-  _.isMatch = function(object, attrs) {
-    var keys = _.keys(attrs), length = keys.length;
-    if (object == null) return !length;
-    var obj = Object(object);
-    for (var i = 0; i < length; i++) {
-      var key = keys[i];
-      if (attrs[key] !== obj[key] || !(key in obj)) return false;
-    }
-    return true;
-  };
-
-
-  // Internal recursive comparison function for `isEqual`.
-  var eq = function(a, b, aStack, bStack) {
-    // Identical objects are equal. `0 === -0`, but they aren't identical.
-    // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal).
-    if (a === b) return a !== 0 || 1 / a === 1 / b;
-    // A strict comparison is necessary because `null == undefined`.
-    if (a == null || b == null) return a === b;
-    // Unwrap any wrapped objects.
-    if (a instanceof _) a = a._wrapped;
-    if (b instanceof _) b = b._wrapped;
-    // Compare `[[Class]]` names.
-    var className = toString.call(a);
-    if (className !== toString.call(b)) return false;
-    switch (className) {
-      // Strings, numbers, regular expressions, dates, and booleans are compared by value.
-      case '[object RegExp]':
-      // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')
-      case '[object String]':
-        // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
-        // equivalent to `new String("5")`.
-        return '' + a === '' + b;
-      case '[object Number]':
-        // `NaN`s are equivalent, but non-reflexive.
-        // Object(NaN) is equivalent to NaN
-        if (+a !== +a) return +b !== +b;
-        // An `egal` comparison is performed for other numeric values.
-        return +a === 0 ? 1 / +a === 1 / b : +a === +b;
-      case '[object Date]':
-      case '[object Boolean]':
-        // Coerce dates and booleans to numeric primitive values. Dates are compared by their
-        // millisecond representations. Note that invalid dates with millisecond representations
-        // of `NaN` are not equivalent.
-        return +a === +b;
-    }
-
-    var areArrays = className === '[object Array]';
-    if (!areArrays) {
-      if (typeof a != 'object' || typeof b != 'object') return false;
-
-      // Objects with different constructors are not equivalent, but `Object`s or `Array`s
-      // from different frames are.
-      var aCtor = a.constructor, bCtor = b.constructor;
-      if (aCtor !== bCtor && !(_.isFunction(aCtor) && aCtor instanceof aCtor &&
-                               _.isFunction(bCtor) && bCtor instanceof bCtor)
-                          && ('constructor' in a && 'constructor' in b)) {
-        return false;
-      }
-    }
-    // Assume equality for cyclic structures. The algorithm for detecting cyclic
-    // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
-
-    // Initializing stack of traversed objects.
-    // It's done here since we only need them for objects and arrays comparison.
-    aStack = aStack || [];
-    bStack = bStack || [];
-    var length = aStack.length;
-    while (length--) {
-      // Linear search. Performance is inversely proportional to the number of
-      // unique nested structures.
-      if (aStack[length] === a) return bStack[length] === b;
-    }
-
-    // Add the first object to the stack of traversed objects.
-    aStack.push(a);
-    bStack.push(b);
-
-    // Recursively compare objects and arrays.
-    if (areArrays) {
-      // Compare array lengths to determine if a deep comparison is necessary.
-      length = a.length;
-      if (length !== b.length) return false;
-      // Deep compare the contents, ignoring non-numeric properties.
-      while (length--) {
-        if (!eq(a[length], b[length], aStack, bStack)) return false;
-      }
-    } else {
-      // Deep compare objects.
-      var keys = _.keys(a), key;
-      length = keys.length;
-      // Ensure that both objects contain the same number of properties before comparing deep equality.
-      if (_.keys(b).length !== length) return false;
-      while (length--) {
-        // Deep compare each member
-        key = keys[length];
-        if (!(_.has(b, key) && eq(a[key], b[key], aStack, bStack))) return false;
-      }
-    }
-    // Remove the first object from the stack of traversed objects.
-    aStack.pop();
-    bStack.pop();
-    return true;
-  };
-
-  // Perform a deep comparison to check if two objects are equal.
-  _.isEqual = function(a, b) {
-    return eq(a, b);
-  };
-
-  // Is a given array, string, or object empty?
-  // An "empty" object has no enumerable own-properties.
-  _.isEmpty = function(obj) {
-    if (obj == null) return true;
-    if (isArrayLike(obj) && (_.isArray(obj) || _.isString(obj) || _.isArguments(obj))) return obj.length === 0;
-    return _.keys(obj).length === 0;
-  };
-
-  // Is a given value a DOM element?
-  _.isElement = function(obj) {
-    return !!(obj && obj.nodeType === 1);
-  };
-
-  // Is a given value an array?
-  // Delegates to ECMA5's native Array.isArray
-  _.isArray = nativeIsArray || function(obj) {
-    return toString.call(obj) === '[object Array]';
-  };
-
-  // Is a given variable an object?
-  _.isObject = function(obj) {
-    var type = typeof obj;
-    return type === 'function' || type === 'object' && !!obj;
-  };
-
-  // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp, isError.
-  _.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Error'], function(name) {
-    _['is' + name] = function(obj) {
-      return toString.call(obj) === '[object ' + name + ']';
-    };
-  });
-
-  // Define a fallback version of the method in browsers (ahem, IE < 9), where
-  // there isn't any inspectable "Arguments" type.
-  if (!_.isArguments(arguments)) {
-    _.isArguments = function(obj) {
-      return _.has(obj, 'callee');
-    };
-  }
-
-  // Optimize `isFunction` if appropriate. Work around some typeof bugs in old v8,
-  // IE 11 (#1621), and in Safari 8 (#1929).
-  if (typeof /./ != 'function' && typeof Int8Array != 'object') {
-    _.isFunction = function(obj) {
-      return typeof obj == 'function' || false;
-    };
-  }
-
-  // Is a given object a finite number?
-  _.isFinite = function(obj) {
-    return isFinite(obj) && !isNaN(parseFloat(obj));
-  };
-
-  // Is the given value `NaN`? (NaN is the only number which does not equal itself).
-  _.isNaN = function(obj) {
-    return _.isNumber(obj) && obj !== +obj;
-  };
-
-  // Is a given value a boolean?
-  _.isBoolean = function(obj) {
-    return obj === true || obj === false || toString.call(obj) === '[object Boolean]';
-  };
-
-  // Is a given value equal to null?
-  _.isNull = function(obj) {
-    return obj === null;
-  };
-
-  // Is a given variable undefined?
-  _.isUndefined = function(obj) {
-    return obj === void 0;
-  };
-
-  // Shortcut function for checking if an object has a given property directly
-  // on itself (in other words, not on a prototype).
-  _.has = function(obj, key) {
-    return obj != null && hasOwnProperty.call(obj, key);
-  };
-
-  // Utility Functions
-  // -----------------
-
-  // Run Underscore.js in *noConflict* mode, returning the `_` variable to its
-  // previous owner. Returns a reference to the Underscore object.
-  _.noConflict = function() {
-    root._ = previousUnderscore;
-    return this;
-  };
-
-  // Keep the identity function around for default iteratees.
-  _.identity = function(value) {
-    return value;
-  };
-
-  // Predicate-generating functions. Often useful outside of Underscore.
-  _.constant = function(value) {
-    return function() {
-      return value;
-    };
-  };
-
-  _.noop = function(){};
-
-  _.property = property;
-
-  // Generates a function for a given object that returns a given property.
-  _.propertyOf = function(obj) {
-    return obj == null ? function(){} : function(key) {
-      return obj[key];
-    };
-  };
-
-  // Returns a predicate for checking whether an object has a given set of
-  // `key:value` pairs.
-  _.matcher = _.matches = function(attrs) {
-    attrs = _.extendOwn({}, attrs);
-    return function(obj) {
-      return _.isMatch(obj, attrs);
-    };
-  };
-
-  // Run a function **n** times.
-  _.times = function(n, iteratee, context) {
-    var accum = Array(Math.max(0, n));
-    iteratee = optimizeCb(iteratee, context, 1);
-    for (var i = 0; i < n; i++) accum[i] = iteratee(i);
-    return accum;
-  };
-
-  // Return a random integer between min and max (inclusive).
-  _.random = function(min, max) {
-    if (max == null) {
-      max = min;
-      min = 0;
-    }
-    return min + Math.floor(Math.random() * (max - min + 1));
-  };
-
-  // A (possibly faster) way to get the current timestamp as an integer.
-  _.now = Date.now || function() {
-    return new Date().getTime();
-  };
-
-   // List of HTML entities for escaping.
-  var escapeMap = {
-    '&': '&amp;',
-    '<': '&lt;',
-    '>': '&gt;',
-    '"': '&quot;',
-    "'": '&#x27;',
-    '`': '&#x60;'
-  };
-  var unescapeMap = _.invert(escapeMap);
-
-  // Functions for escaping and unescaping strings to/from HTML interpolation.
-  var createEscaper = function(map) {
-    var escaper = function(match) {
-      return map[match];
-    };
-    // Regexes for identifying a key that needs to be escaped
-    var source = '(?:' + _.keys(map).join('|') + ')';
-    var testRegexp = RegExp(source);
-    var replaceRegexp = RegExp(source, 'g');
-    return function(string) {
-      string = string == null ? '' : '' + string;
-      return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;
-    };
-  };
-  _.escape = createEscaper(escapeMap);
-  _.unescape = createEscaper(unescapeMap);
-
-  // If the value of the named `property` is a function then invoke it with the
-  // `object` as context; otherwise, return it.
-  _.result = function(object, property, fallback) {
-    var value = object == null ? void 0 : object[property];
-    if (value === void 0) {
-      value = fallback;
-    }
-    return _.isFunction(value) ? value.call(object) : value;
-  };
-
-  // Generate a unique integer id (unique within the entire client session).
-  // Useful for temporary DOM ids.
-  var idCounter = 0;
-  _.uniqueId = function(prefix) {
-    var id = ++idCounter + '';
-    return prefix ? prefix + id : id;
-  };
-
-  // By default, Underscore uses ERB-style template delimiters, change the
-  // following template settings to use alternative delimiters.
-  _.templateSettings = {
-    evaluate    : /<%([\s\S]+?)%>/g,
-    interpolate : /<%=([\s\S]+?)%>/g,
-    escape      : /<%-([\s\S]+?)%>/g
-  };
-
-  // When customizing `templateSettings`, if you don't want to define an
-  // interpolation, evaluation or escaping regex, we need one that is
-  // guaranteed not to match.
-  var noMatch = /(.)^/;
-
-  // Certain characters need to be escaped so that they can be put into a
-  // string literal.
-  var escapes = {
-    "'":      "'",
-    '\\':     '\\',
-    '\r':     'r',
-    '\n':     'n',
-    '\u2028': 'u2028',
-    '\u2029': 'u2029'
-  };
-
-  var escaper = /\\|'|\r|\n|\u2028|\u2029/g;
-
-  var escapeChar = function(match) {
-    return '\\' + escapes[match];
-  };
-
-  // JavaScript micro-templating, similar to John Resig's implementation.
-  // Underscore templating handles arbitrary delimiters, preserves whitespace,
-  // and correctly escapes quotes within interpolated code.
-  // NB: `oldSettings` only exists for backwards compatibility.
-  _.template = function(text, settings, oldSettings) {
-    if (!settings && oldSettings) settings = oldSettings;
-    settings = _.defaults({}, settings, _.templateSettings);
-
-    // Combine delimiters into one regular expression via alternation.
-    var matcher = RegExp([
-      (settings.escape || noMatch).source,
-      (settings.interpolate || noMatch).source,
-      (settings.evaluate || noMatch).source
-    ].join('|') + '|$', 'g');
-
-    // Compile the template source, escaping string literals appropriately.
-    var index = 0;
-    var source = "__p+='";
-    text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
-      source += text.slice(index, offset).replace(escaper, escapeChar);
-      index = offset + match.length;
-
-      if (escape) {
-        source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
-      } else if (interpolate) {
-        source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
-      } else if (evaluate) {
-        source += "';\n" + evaluate + "\n__p+='";
-      }
-
-      // Adobe VMs need the match returned to produce the correct offest.
-      return match;
-    });
-    source += "';\n";
-
-    // If a variable is not specified, place data values in local scope.
-    if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
-
-    source = "var __t,__p='',__j=Array.prototype.join," +
-      "print=function(){__p+=__j.call(arguments,'');};\n" +
-      source + 'return __p;\n';
-
-    try {
-      var render = new Function(settings.variable || 'obj', '_', source);
-    } catch (e) {
-      e.source = source;
-      throw e;
-    }
-
-    var template = function(data) {
-      return render.call(this, data, _);
-    };
-
-    // Provide the compiled source as a convenience for precompilation.
-    var argument = settings.variable || 'obj';
-    template.source = 'function(' + argument + '){\n' + source + '}';
-
-    return template;
-  };
-
-  // Add a "chain" function. Start chaining a wrapped Underscore object.
-  _.chain = function(obj) {
-    var instance = _(obj);
-    instance._chain = true;
-    return instance;
-  };
-
-  // OOP
-  // ---------------
-  // If Underscore is called as a function, it returns a wrapped object that
-  // can be used OO-style. This wrapper holds altered versions of all the
-  // underscore functions. Wrapped objects may be chained.
-
-  // Helper function to continue chaining intermediate results.
-  var result = function(instance, obj) {
-    return instance._chain ? _(obj).chain() : obj;
-  };
-
-  // Add your own custom functions to the Underscore object.
-  _.mixin = function(obj) {
-    _.each(_.functions(obj), function(name) {
-      var func = _[name] = obj[name];
-      _.prototype[name] = function() {
-        var args = [this._wrapped];
-        push.apply(args, arguments);
-        return result(this, func.apply(_, args));
-      };
-    });
-  };
-
-  // Add all of the Underscore functions to the wrapper object.
-  _.mixin(_);
-
-  // Add all mutator Array functions to the wrapper.
-  _.each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
-    var method = ArrayProto[name];
-    _.prototype[name] = function() {
-      var obj = this._wrapped;
-      method.apply(obj, arguments);
-      if ((name === 'shift' || name === 'splice') && obj.length === 0) delete obj[0];
-      return result(this, obj);
-    };
-  });
-
-  // Add all accessor Array functions to the wrapper.
-  _.each(['concat', 'join', 'slice'], function(name) {
-    var method = ArrayProto[name];
-    _.prototype[name] = function() {
-      return result(this, method.apply(this._wrapped, arguments));
-    };
-  });
-
-  // Extracts the result from a wrapped and chained object.
-  _.prototype.value = function() {
-    return this._wrapped;
-  };
-
-  // Provide unwrapping proxy for some methods used in engine operations
-  // such as arithmetic and JSON stringification.
-  _.prototype.valueOf = _.prototype.toJSON = _.prototype.value;
-
-  _.prototype.toString = function() {
-    return '' + this._wrapped;
-  };
-
-  // AMD registration happens at the end for compatibility with AMD loaders
-  // that may not enforce next-turn semantics on modules. Even though general
-  // practice for AMD registration is to be anonymous, underscore registers
-  // as a named module because, like jQuery, it is a base library that is
-  // popular enough to be bundled in a third party lib, but not be part of
-  // an AMD load request. Those cases could generate an error when an
-  // anonymous define() is called outside of a loader request.
-  if (typeof define === 'function' && define.amd) {
-    define('underscore', [], function() {
-      return _;
-    });
-  }
-}.call(this));
-
-},{}],169:[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));
-};
-
-},{}],170:[function(require,module,exports){
-var createElement = require("./vdom/create-element.js")
-
-module.exports = createElement
-
-},{"./vdom/create-element.js":176}],171:[function(require,module,exports){
-var diff = require("./vtree/diff.js")
-
-module.exports = diff
-
-},{"./vtree/diff.js":196}],172:[function(require,module,exports){
-var h = require("./virtual-hyperscript/index.js")
-
-module.exports = h
-
-},{"./virtual-hyperscript/index.js":183}],173:[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":170,"./diff.js":171,"./h.js":172,"./patch.js":174,"./vnode/vnode.js":192,"./vnode/vtext.js":194}],174:[function(require,module,exports){
-var patch = require("./vdom/patch.js")
-
-module.exports = patch
-
-},{"./vdom/patch.js":179}],175:[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":187,"is-object":18}],176:[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":185,"../vnode/is-vnode.js":188,"../vnode/is-vtext.js":189,"../vnode/is-widget.js":190,"./apply-properties":175,"global/document":14}],177:[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
-}
-
-},{}],178:[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":190,"../vnode/vpatch.js":193,"./apply-properties":175,"./update-widget":180}],179:[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":176,"./dom-index":177,"./patch-op":178,"global/document":14,"x-is-array":215}],180:[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":190}],181:[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":7}],182:[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;
-    }
-};
-
-},{}],183:[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":186,"../vnode/is-vhook":187,"../vnode/is-vnode":188,"../vnode/is-vtext":189,"../vnode/is-widget":190,"../vnode/vnode.js":192,"../vnode/vtext.js":194,"./hooks/ev-hook.js":181,"./hooks/soft-set-hook.js":182,"./parse-tag.js":184,"x-is-array":215}],184:[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":3}],185:[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":186,"./is-vnode":188,"./is-vtext":189,"./is-widget":190}],186:[function(require,module,exports){
-module.exports = isThunk
-
-function isThunk(t) {
-    return t && t.type === "Thunk"
-}
-
-},{}],187:[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"))
-}
-
-},{}],188:[function(require,module,exports){
-var version = require("./version")
-
-module.exports = isVirtualNode
-
-function isVirtualNode(x) {
-    return x && x.type === "VirtualNode" && x.version === version
-}
-
-},{"./version":191}],189:[function(require,module,exports){
-var version = require("./version")
-
-module.exports = isVirtualText
-
-function isVirtualText(x) {
-    return x && x.type === "VirtualText" && x.version === version
-}
-
-},{"./version":191}],190:[function(require,module,exports){
-module.exports = isWidget
-
-function isWidget(w) {
-    return w && w.type === "Widget"
-}
-
-},{}],191:[function(require,module,exports){
-module.exports = "2"
-
-},{}],192:[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":186,"./is-vhook":187,"./is-vnode":188,"./is-widget":190,"./version":191}],193:[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":191}],194:[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":191}],195:[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":187,"is-object":18}],196:[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":185,"../vnode/is-thunk":186,"../vnode/is-vnode":188,"../vnode/is-vtext":189,"../vnode/is-widget":190,"../vnode/vpatch":193,"./diff-props":195,"x-is-array":215}],197:[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":198,"./env":210,"./makePromise":212}],198:[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(); }));
-
-},{}],199:[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(); }));
-},{}],200:[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(); }));
-
-
-
-},{}],201:[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) {
-                       var h = Promise._handler(p);
-                       if(h.state() === 0) {
-                               return toPromise(p).then(state.fulfilled, state.rejected);
-                       }
-
-                       h._unreport();
-                       return state.inspect(h);
-               }
-
-               /**
-                * 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":200,"../state":213}],202:[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(); }));
-
-},{}],203:[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(); }));
-
-},{}],204:[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":213}],205:[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(); }));
-
-},{}],206:[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(); }));
-
-},{}],207:[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":199,"../env":210}],208:[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":210,"../format":211}],209:[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(); }));
-
-
-},{}],210:[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 === 'function' && MutationObserver) ||
-                       (typeof WebKitMutationObserver === 'function' && 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":4}],211:[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(); }));
-
-},{}],212:[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 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' && typeof CustomEvent === 'function') {
-                               return (function(noop, self, CustomEvent) {
-                                       var hasCustomEvent = false;
-                                       try {
-                                               var ev = new CustomEvent('unhandledRejection');
-                                               hasCustomEvent = ev instanceof CustomEvent;
-                                       } catch (e) {}
-
-                                       return !hasCustomEvent ? noop : function(type, rejection) {
-                                               var ev = new CustomEvent(type, {
-                                                       detail: {
-                                                               reason: rejection.value,
-                                                               key: rejection
-                                                       },
-                                                       bubbles: false,
-                                                       cancelable: true
-                                               });
-
-                                               return !self.dispatchEvent(ev);
-                                       };
-                               }(noop, self, CustomEvent));
-                       }
-
-                       return noop;
-               }
-
-               return Promise;
-       };
-});
-}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
-
-}).call(this,require('_process'))
-
-},{"_process":4}],213:[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(); }));
-
-},{}],214:[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":197,"./lib/TimeoutError":199,"./lib/apply":200,"./lib/decorators/array":201,"./lib/decorators/flow":202,"./lib/decorators/fold":203,"./lib/decorators/inspect":204,"./lib/decorators/iterate":205,"./lib/decorators/progress":206,"./lib/decorators/timed":207,"./lib/decorators/unhandledRejection":208,"./lib/decorators/with":209}],215:[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]"
-}
-
-},{}],216:[function(require,module,exports){
-"use strict";
-var APIv3_1 = require("./api/APIv3");
-exports.APIv3 = APIv3_1.APIv3;
-var ModelCreator_1 = require("./api/ModelCreator");
-exports.ModelCreator = ModelCreator_1.ModelCreator;
-
-},{"./api/APIv3":228,"./api/ModelCreator":229}],217:[function(require,module,exports){
-"use strict";
-var Component_1 = require("./component/Component");
-exports.Component = Component_1.Component;
-var ComponentService_1 = require("./component/ComponentService");
-exports.ComponentService = ComponentService_1.ComponentService;
-var AttributionComponent_1 = require("./component/AttributionComponent");
-exports.AttributionComponent = AttributionComponent_1.AttributionComponent;
-var BackgroundComponent_1 = require("./component/BackgroundComponent");
-exports.BackgroundComponent = BackgroundComponent_1.BackgroundComponent;
-var BearingComponent_1 = require("./component/BearingComponent");
-exports.BearingComponent = BearingComponent_1.BearingComponent;
-var CacheComponent_1 = require("./component/CacheComponent");
-exports.CacheComponent = CacheComponent_1.CacheComponent;
-var CoverComponent_1 = require("./component/CoverComponent");
-exports.CoverComponent = CoverComponent_1.CoverComponent;
-var DebugComponent_1 = require("./component/DebugComponent");
-exports.DebugComponent = DebugComponent_1.DebugComponent;
-var DirectionComponent_1 = require("./component/direction/DirectionComponent");
-exports.DirectionComponent = DirectionComponent_1.DirectionComponent;
-var DirectionDOMCalculator_1 = require("./component/direction/DirectionDOMCalculator");
-exports.DirectionDOMCalculator = DirectionDOMCalculator_1.DirectionDOMCalculator;
-var DirectionDOMRenderer_1 = require("./component/direction/DirectionDOMRenderer");
-exports.DirectionDOMRenderer = DirectionDOMRenderer_1.DirectionDOMRenderer;
-var ImageComponent_1 = require("./component/ImageComponent");
-exports.ImageComponent = ImageComponent_1.ImageComponent;
-var KeyboardComponent_1 = require("./component/KeyboardComponent");
-exports.KeyboardComponent = KeyboardComponent_1.KeyboardComponent;
-var LoadingComponent_1 = require("./component/LoadingComponent");
-exports.LoadingComponent = LoadingComponent_1.LoadingComponent;
-var Marker_1 = require("./component/marker/Marker");
-exports.Marker = Marker_1.Marker;
-var MarkerComponent_1 = require("./component/marker/MarkerComponent");
-exports.MarkerComponent = MarkerComponent_1.MarkerComponent;
-var MouseComponent_1 = require("./component/MouseComponent");
-exports.MouseComponent = MouseComponent_1.MouseComponent;
-var NavigationComponent_1 = require("./component/NavigationComponent");
-exports.NavigationComponent = NavigationComponent_1.NavigationComponent;
-var RouteComponent_1 = require("./component/RouteComponent");
-exports.RouteComponent = RouteComponent_1.RouteComponent;
-var SequenceComponent_1 = require("./component/sequence/SequenceComponent");
-exports.SequenceComponent = SequenceComponent_1.SequenceComponent;
-var SequenceDOMRenderer_1 = require("./component/sequence/SequenceDOMRenderer");
-exports.SequenceDOMRenderer = SequenceDOMRenderer_1.SequenceDOMRenderer;
-var SequenceDOMInteraction_1 = require("./component/sequence/SequenceDOMInteraction");
-exports.SequenceDOMInteraction = SequenceDOMInteraction_1.SequenceDOMInteraction;
-var ImagePlaneComponent_1 = require("./component/imageplane/ImagePlaneComponent");
-exports.ImagePlaneComponent = ImagePlaneComponent_1.ImagePlaneComponent;
-var ImagePlaneFactory_1 = require("./component/imageplane/ImagePlaneFactory");
-exports.ImagePlaneFactory = ImagePlaneFactory_1.ImagePlaneFactory;
-var ImagePlaneGLRenderer_1 = require("./component/imageplane/ImagePlaneGLRenderer");
-exports.ImagePlaneGLRenderer = ImagePlaneGLRenderer_1.ImagePlaneGLRenderer;
-var ImagePlaneScene_1 = require("./component/imageplane/ImagePlaneScene");
-exports.ImagePlaneScene = ImagePlaneScene_1.ImagePlaneScene;
-var ImagePlaneShaders_1 = require("./component/imageplane/ImagePlaneShaders");
-exports.ImagePlaneShaders = ImagePlaneShaders_1.ImagePlaneShaders;
-var SimpleMarker_1 = require("./component/marker/SimpleMarker");
-exports.SimpleMarker = SimpleMarker_1.SimpleMarker;
-var SliderComponent_1 = require("./component/imageplane/SliderComponent");
-exports.SliderComponent = SliderComponent_1.SliderComponent;
-var StatsComponent_1 = require("./component/StatsComponent");
-exports.StatsComponent = StatsComponent_1.StatsComponent;
-var Tag_1 = require("./component/tag/tag/Tag");
-exports.Tag = Tag_1.Tag;
-var Alignment_1 = require("./component/tag/tag/Alignment");
-exports.Alignment = Alignment_1.Alignment;
-var OutlineTag_1 = require("./component/tag/tag/OutlineTag");
-exports.OutlineTag = OutlineTag_1.OutlineTag;
-var RenderTag_1 = require("./component/tag/tag/RenderTag");
-exports.RenderTag = RenderTag_1.RenderTag;
-var OutlineRenderTag_1 = require("./component/tag/tag/OutlineRenderTag");
-exports.OutlineRenderTag = OutlineRenderTag_1.OutlineRenderTag;
-var OutlineCreateTag_1 = require("./component/tag/tag/OutlineCreateTag");
-exports.OutlineCreateTag = OutlineCreateTag_1.OutlineCreateTag;
-var SpotTag_1 = require("./component/tag/tag/SpotTag");
-exports.SpotTag = SpotTag_1.SpotTag;
-var SpotRenderTag_1 = require("./component/tag/tag/SpotRenderTag");
-exports.SpotRenderTag = SpotRenderTag_1.SpotRenderTag;
-var TagComponent_1 = require("./component/tag/TagComponent");
-exports.TagComponent = TagComponent_1.TagComponent;
-var TagCreator_1 = require("./component/tag/TagCreator");
-exports.TagCreator = TagCreator_1.TagCreator;
-var TagDOMRenderer_1 = require("./component/tag/TagDOMRenderer");
-exports.TagDOMRenderer = TagDOMRenderer_1.TagDOMRenderer;
-var TagGLRenderer_1 = require("./component/tag/TagGLRenderer");
-exports.TagGLRenderer = TagGLRenderer_1.TagGLRenderer;
-var TagOperation_1 = require("./component/tag/TagOperation");
-exports.TagOperation = TagOperation_1.TagOperation;
-var TagSet_1 = require("./component/tag/TagSet");
-exports.TagSet = TagSet_1.TagSet;
-var Geometry_1 = require("./component/tag/geometry/Geometry");
-exports.Geometry = Geometry_1.Geometry;
-var VertexGeometry_1 = require("./component/tag/geometry/VertexGeometry");
-exports.VertexGeometry = VertexGeometry_1.VertexGeometry;
-var RectGeometry_1 = require("./component/tag/geometry/RectGeometry");
-exports.RectGeometry = RectGeometry_1.RectGeometry;
-var PointGeometry_1 = require("./component/tag/geometry/PointGeometry");
-exports.PointGeometry = PointGeometry_1.PointGeometry;
-var PolygonGeometry_1 = require("./component/tag/geometry/PolygonGeometry");
-exports.PolygonGeometry = PolygonGeometry_1.PolygonGeometry;
-var GeometryTagError_1 = require("./component/tag/error/GeometryTagError");
-exports.GeometryTagError = GeometryTagError_1.GeometryTagError;
-
-},{"./component/AttributionComponent":230,"./component/BackgroundComponent":231,"./component/BearingComponent":232,"./component/CacheComponent":233,"./component/Component":234,"./component/ComponentService":235,"./component/CoverComponent":236,"./component/DebugComponent":237,"./component/ImageComponent":238,"./component/KeyboardComponent":239,"./component/LoadingComponent":240,"./component/MouseComponent":241,"./component/NavigationComponent":242,"./component/RouteComponent":243,"./component/StatsComponent":244,"./component/direction/DirectionComponent":245,"./component/direction/DirectionDOMCalculator":246,"./component/direction/DirectionDOMRenderer":247,"./component/imageplane/ImagePlaneComponent":248,"./component/imageplane/ImagePlaneFactory":249,"./component/imageplane/ImagePlaneGLRenderer":250,"./component/imageplane/ImagePlaneScene":251,"./component/imageplane/ImagePlaneShaders":252,"./component/imageplane/SliderComponent":253,"./component/marker/Marker":254,"./component/marker/MarkerComponent":255,"./component/marker/SimpleMarker":256,"./component/sequence/SequenceComponent":257,"./component/sequence/SequenceDOMInteraction":258,"./component/sequence/SequenceDOMRenderer":259,"./component/tag/TagComponent":261,"./component/tag/TagCreator":262,"./component/tag/TagDOMRenderer":263,"./component/tag/TagGLRenderer":264,"./component/tag/TagOperation":265,"./component/tag/TagSet":266,"./component/tag/error/GeometryTagError":267,"./component/tag/geometry/Geometry":268,"./component/tag/geometry/PointGeometry":269,"./component/tag/geometry/PolygonGeometry":270,"./component/tag/geometry/RectGeometry":271,"./component/tag/geometry/VertexGeometry":272,"./component/tag/tag/Alignment":273,"./component/tag/tag/OutlineCreateTag":274,"./component/tag/tag/OutlineRenderTag":275,"./component/tag/tag/OutlineTag":276,"./component/tag/tag/RenderTag":277,"./component/tag/tag/SpotRenderTag":278,"./component/tag/tag/SpotTag":279,"./component/tag/tag/Tag":280}],218:[function(require,module,exports){
-"use strict";
-var EdgeDirection_1 = require("./graph/edge/EdgeDirection");
-exports.EdgeDirection = EdgeDirection_1.EdgeDirection;
-var EdgeCalculatorSettings_1 = require("./graph/edge/EdgeCalculatorSettings");
-exports.EdgeCalculatorSettings = EdgeCalculatorSettings_1.EdgeCalculatorSettings;
-var EdgeCalculatorDirections_1 = require("./graph/edge/EdgeCalculatorDirections");
-exports.EdgeCalculatorDirections = EdgeCalculatorDirections_1.EdgeCalculatorDirections;
-var EdgeCalculatorCoefficients_1 = require("./graph/edge/EdgeCalculatorCoefficients");
-exports.EdgeCalculatorCoefficients = EdgeCalculatorCoefficients_1.EdgeCalculatorCoefficients;
-var EdgeCalculator_1 = require("./graph/edge/EdgeCalculator");
-exports.EdgeCalculator = EdgeCalculator_1.EdgeCalculator;
-
-},{"./graph/edge/EdgeCalculator":298,"./graph/edge/EdgeCalculatorCoefficients":299,"./graph/edge/EdgeCalculatorDirections":300,"./graph/edge/EdgeCalculatorSettings":301,"./graph/edge/EdgeDirection":302}],219:[function(require,module,exports){
-"use strict";
-var ArgumentMapillaryError_1 = require("./error/ArgumentMapillaryError");
-exports.ArgumentMapillaryError = ArgumentMapillaryError_1.ArgumentMapillaryError;
-var GraphMapillaryError_1 = require("./error/GraphMapillaryError");
-exports.GraphMapillaryError = GraphMapillaryError_1.GraphMapillaryError;
-var MapillaryError_1 = require("./error/MapillaryError");
-exports.MapillaryError = MapillaryError_1.MapillaryError;
-
-},{"./error/ArgumentMapillaryError":281,"./error/GraphMapillaryError":282,"./error/MapillaryError":283}],220:[function(require,module,exports){
-"use strict";
-var Camera_1 = require("./geo/Camera");
-exports.Camera = Camera_1.Camera;
-var GeoCoords_1 = require("./geo/GeoCoords");
-exports.GeoCoords = GeoCoords_1.GeoCoords;
-var ViewportCoords_1 = require("./geo/ViewportCoords");
-exports.ViewportCoords = ViewportCoords_1.ViewportCoords;
-var Spatial_1 = require("./geo/Spatial");
-exports.Spatial = Spatial_1.Spatial;
-var Transform_1 = require("./geo/Transform");
-exports.Transform = Transform_1.Transform;
-
-},{"./geo/Camera":284,"./geo/GeoCoords":285,"./geo/Spatial":286,"./geo/Transform":287,"./geo/ViewportCoords":288}],221:[function(require,module,exports){
-"use strict";
-var FilterCreator_1 = require("./graph/FilterCreator");
-exports.FilterCreator = FilterCreator_1.FilterCreator;
-var Graph_1 = require("./graph/Graph");
-exports.Graph = Graph_1.Graph;
-var GraphCalculator_1 = require("./graph/GraphCalculator");
-exports.GraphCalculator = GraphCalculator_1.GraphCalculator;
-var GraphService_1 = require("./graph/GraphService");
-exports.GraphService = GraphService_1.GraphService;
-var ImageLoadingService_1 = require("./graph/ImageLoadingService");
-exports.ImageLoadingService = ImageLoadingService_1.ImageLoadingService;
-var MeshReader_1 = require("./graph/MeshReader");
-exports.MeshReader = MeshReader_1.MeshReader;
-var Node_1 = require("./graph/Node");
-exports.Node = Node_1.Node;
-var NodeCache_1 = require("./graph/NodeCache");
-exports.NodeCache = NodeCache_1.NodeCache;
-var Sequence_1 = require("./graph/Sequence");
-exports.Sequence = Sequence_1.Sequence;
-
-},{"./graph/FilterCreator":289,"./graph/Graph":290,"./graph/GraphCalculator":291,"./graph/GraphService":292,"./graph/ImageLoadingService":293,"./graph/MeshReader":294,"./graph/Node":295,"./graph/NodeCache":296,"./graph/Sequence":297}],222:[function(require,module,exports){
-/**
- * MapillaryJS is a WebGL JavaScript library for exploring street level imagery
- * @name Mapillary
- */
-"use strict";
-var Edge_1 = require("./Edge");
-exports.EdgeDirection = Edge_1.EdgeDirection;
-var Render_1 = require("./Render");
-exports.RenderMode = Render_1.RenderMode;
-var Viewer_1 = require("./Viewer");
-exports.ImageSize = Viewer_1.ImageSize;
-exports.Viewer = Viewer_1.Viewer;
-var TagComponent = require("./component/tag/Tag");
-exports.TagComponent = TagComponent;
-
-},{"./Edge":218,"./Render":223,"./Viewer":227,"./component/tag/Tag":260}],223:[function(require,module,exports){
-"use strict";
-var DOMRenderer_1 = require("./render/DOMRenderer");
-exports.DOMRenderer = DOMRenderer_1.DOMRenderer;
-var GLRenderer_1 = require("./render/GLRenderer");
-exports.GLRenderer = GLRenderer_1.GLRenderer;
-var GLRenderStage_1 = require("./render/GLRenderStage");
-exports.GLRenderStage = GLRenderStage_1.GLRenderStage;
-var RenderCamera_1 = require("./render/RenderCamera");
-exports.RenderCamera = RenderCamera_1.RenderCamera;
-var RenderMode_1 = require("./render/RenderMode");
-exports.RenderMode = RenderMode_1.RenderMode;
-var RenderService_1 = require("./render/RenderService");
-exports.RenderService = RenderService_1.RenderService;
-
-},{"./render/DOMRenderer":303,"./render/GLRenderStage":304,"./render/GLRenderer":305,"./render/RenderCamera":306,"./render/RenderMode":307,"./render/RenderService":308}],224:[function(require,module,exports){
-"use strict";
-var State_1 = require("./state/State");
-exports.State = State_1.State;
-var StateBase_1 = require("./state/states/StateBase");
-exports.StateBase = StateBase_1.StateBase;
-var StateContext_1 = require("./state/StateContext");
-exports.StateContext = StateContext_1.StateContext;
-var StateService_1 = require("./state/StateService");
-exports.StateService = StateService_1.StateService;
-var TraversingState_1 = require("./state/states/TraversingState");
-exports.TraversingState = TraversingState_1.TraversingState;
-var WaitingState_1 = require("./state/states/WaitingState");
-exports.WaitingState = WaitingState_1.WaitingState;
-
-},{"./state/State":309,"./state/StateContext":310,"./state/StateService":311,"./state/states/StateBase":312,"./state/states/TraversingState":313,"./state/states/WaitingState":314}],225:[function(require,module,exports){
-"use strict";
-var ImageTileLoader_1 = require("./tiles/ImageTileLoader");
-exports.ImageTileLoader = ImageTileLoader_1.ImageTileLoader;
-var ImageTileStore_1 = require("./tiles/ImageTileStore");
-exports.ImageTileStore = ImageTileStore_1.ImageTileStore;
-var TextureProvider_1 = require("./tiles/TextureProvider");
-exports.TextureProvider = TextureProvider_1.TextureProvider;
-var RegionOfInterestCalculator_1 = require("./tiles/RegionOfInterestCalculator");
-exports.RegionOfInterestCalculator = RegionOfInterestCalculator_1.RegionOfInterestCalculator;
-
-},{"./tiles/ImageTileLoader":315,"./tiles/ImageTileStore":316,"./tiles/RegionOfInterestCalculator":317,"./tiles/TextureProvider":318}],226:[function(require,module,exports){
-"use strict";
-var EventEmitter_1 = require("./utils/EventEmitter");
-exports.EventEmitter = EventEmitter_1.EventEmitter;
-var Settings_1 = require("./utils/Settings");
-exports.Settings = Settings_1.Settings;
-var Urls_1 = require("./utils/Urls");
-exports.Urls = Urls_1.Urls;
-
-},{"./utils/EventEmitter":319,"./utils/Settings":320,"./utils/Urls":321}],227:[function(require,module,exports){
-"use strict";
-var Container_1 = require("./viewer/Container");
-exports.Container = Container_1.Container;
-var CacheService_1 = require("./viewer/CacheService");
-exports.CacheService = CacheService_1.CacheService;
-var EventLauncher_1 = require("./viewer/EventLauncher");
-exports.EventLauncher = EventLauncher_1.EventLauncher;
-var ImageSize_1 = require("./viewer/ImageSize");
-exports.ImageSize = ImageSize_1.ImageSize;
-var LoadingService_1 = require("./viewer/LoadingService");
-exports.LoadingService = LoadingService_1.LoadingService;
-var MouseService_1 = require("./viewer/MouseService");
-exports.MouseService = MouseService_1.MouseService;
-var Navigator_1 = require("./viewer/Navigator");
-exports.Navigator = Navigator_1.Navigator;
-var ComponentController_1 = require("./viewer/ComponentController");
-exports.ComponentController = ComponentController_1.ComponentController;
-var SpriteAlignment_1 = require("./viewer/SpriteAlignment");
-exports.SpriteAlignment = SpriteAlignment_1.SpriteAlignment;
-var SpriteService_1 = require("./viewer/SpriteService");
-exports.SpriteService = SpriteService_1.SpriteService;
-var TouchService_1 = require("./viewer/TouchService");
-exports.TouchService = TouchService_1.TouchService;
-exports.TouchMove = TouchService_1.TouchMove;
-var Viewer_1 = require("./viewer/Viewer");
-exports.Viewer = Viewer_1.Viewer;
-
-},{"./viewer/CacheService":322,"./viewer/ComponentController":323,"./viewer/Container":324,"./viewer/EventLauncher":325,"./viewer/ImageSize":326,"./viewer/LoadingService":327,"./viewer/MouseService":328,"./viewer/Navigator":329,"./viewer/SpriteAlignment":330,"./viewer/SpriteService":331,"./viewer/TouchService":332,"./viewer/Viewer":333}],228:[function(require,module,exports){
-/// <reference path="../../typings/index.d.ts" />
-"use strict";
-var Observable_1 = require("rxjs/Observable");
-require("rxjs/add/observable/defer");
-require("rxjs/add/observable/fromPromise");
-require("rxjs/add/operator/catch");
-require("rxjs/add/operator/map");
-var API_1 = require("../API");
-var APIv3 = (function () {
-    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",
-        ];
-        this._propertiesFill = [
-            "captured_at",
-            "user",
-            "project",
-        ];
-        this._propertiesKey = [
-            "key",
-        ];
-        this._propertiesSequence = [
-            "keys",
-        ];
-        this._propertiesSpatial = [
-            "atomic_scale",
-            "ca",
-            "calt",
-            "cca",
-            "cfocal",
-            "gpano",
-            "height",
-            "merge_cc",
-            "merge_version",
-            "c_rotation",
-            "orientation",
-            "width",
-        ];
-        this._propertiesUser = [
-            "username",
-        ];
-    }
-    ;
-    APIv3.prototype.imageByKeyFill$ = function (keys) {
-        return this._catchInvalidateGet$(this._wrapPromise$(this._model.get([
-            this._pathImageByKey,
-            keys,
-            this._propertiesKey
-                .concat(this._propertiesFill)
-                .concat(this._propertiesSpatial),
-            this._propertiesKey
-                .concat(this._propertiesUser)
-        ]))
-            .map(function (value) {
-            return value.json.imageByKey;
-        }), this._pathImageByKey, keys);
-    };
-    APIv3.prototype.imageByKeyFull$ = function (keys) {
-        return this._catchInvalidateGet$(this._wrapPromise$(this._model.get([
-            this._pathImageByKey,
-            keys,
-            this._propertiesKey
-                .concat(this._propertiesCore)
-                .concat(this._propertiesFill)
-                .concat(this._propertiesSpatial),
-            this._propertiesKey
-                .concat(this._propertiesUser)
-        ]))
-            .map(function (value) {
-            return value.json.imageByKey;
-        }), this._pathImageByKey, keys);
-    };
-    APIv3.prototype.imageCloseTo$ = function (lat, lon) {
-        var lonLat = lon + ":" + lat;
-        return this._catchInvalidateGet$(this._wrapPromise$(this._model.get([
-            this._pathImageCloseTo,
-            [lonLat],
-            this._propertiesKey
-                .concat(this._propertiesCore)
-                .concat(this._propertiesFill)
-                .concat(this._propertiesSpatial),
-            this._propertiesKey
-                .concat(this._propertiesUser)
-        ]))
-            .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._wrapPromise$(this._model.get([
-            this._pathImagesByH,
-            hs,
-            { from: 0, to: this._pageCount },
-            this._propertiesKey
-                .concat(this._propertiesCore),
-            this._propertiesKey
-        ]))
-            .map(function (value) {
-            if (value == null) {
-                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._wrapPromise$(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._wrapPromise$(this._model.get([
-            this._pathSequenceByKey,
-            sequenceKeys,
-            this._propertiesKey
-                .concat(this._propertiesSequence)
-        ]))
-            .map(function (value) {
-            return value.json.sequenceByKey;
-        }), this._pathSequenceByKey, sequenceKeys);
-    };
-    APIv3.prototype.sequenceViewAdd$ = function (sequenceKeys) {
-        return this._catchInvalidateCall$(this._wrapPromise$(this._model.call([this._pathSequenceViewAdd], [sequenceKeys])), this._pathSequenceViewAdd, sequenceKeys);
-    };
-    Object.defineProperty(APIv3.prototype, "clientId", {
-        get: function () {
-            return this._clientId;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    APIv3.prototype._catchInvalidateGet$ = function (observable, path, paths) {
-        var _this = this;
-        return observable
-            .catch(function (error) {
-            _this._invalidateGet(path, paths);
-            throw error;
-        });
-    };
-    APIv3.prototype._catchInvalidateCall$ = function (observable, path, paths) {
-        var _this = this;
-        return observable
-            .catch(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._wrapPromise$ = function (promise) {
-        return Observable_1.Observable.defer(function () { return Observable_1.Observable.fromPromise(promise); });
-    };
-    return APIv3;
-}());
-exports.APIv3 = APIv3;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = APIv3;
-
-},{"../API":216,"rxjs/Observable":28,"rxjs/add/observable/defer":38,"rxjs/add/observable/fromPromise":42,"rxjs/add/operator/catch":49,"rxjs/add/operator/map":62}],229:[function(require,module,exports){
-/// <reference path="../../typings/index.d.ts" />
-"use strict";
-var falcor = require("falcor");
-var HttpDataSource = require("falcor-http-datasource");
-var Utils_1 = require("../Utils");
-var ModelCreator = (function () {
-    function ModelCreator() {
-    }
-    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 HttpDataSource(Utils_1.Urls.falcorModel(clientId), configuration),
-        });
-    };
-    return ModelCreator;
-}());
-exports.ModelCreator = ModelCreator;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = ModelCreator;
-
-},{"../Utils":226,"falcor":13,"falcor-http-datasource":8}],230:[function(require,module,exports){
-/// <reference path="../../typings/index.d.ts" />
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var vd = require("virtual-dom");
-var Component_1 = require("../Component");
-var AttributionComponent = (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 = this._navigator.stateService.currentNode$
-            .map(function (node) {
-            return { name: _this._name, vnode: _this._getAttributionNode(node.username, node.key) };
-        })
-            .subscribe(this._container.domRenderer.render$);
-    };
-    AttributionComponent.prototype._deactivate = function () {
-        this._disposable.unsubscribe();
-    };
-    AttributionComponent.prototype._getDefaultConfiguration = function () {
-        return {};
-    };
-    AttributionComponent.prototype._getAttributionNode = function (username, photoId) {
-        return vd.h("div.Attribution", {}, [
-            vd.h("a", { href: "https://www.mapillary.com/app/user/" + username,
-                target: "_blank",
-                textContent: "@" + username,
-            }, []),
-            vd.h("span", { textContent: "|" }, []),
-            vd.h("a", { href: "https://www.mapillary.com/app/?pKey=" + photoId + "&focus=photo",
-                target: "_blank",
-                textContent: "mapillary.com",
-            }, []),
-        ]);
-    };
-    return AttributionComponent;
-}(Component_1.Component));
-AttributionComponent.componentName = "attribution";
-exports.AttributionComponent = AttributionComponent;
-Component_1.ComponentService.register(AttributionComponent);
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = AttributionComponent;
-
-},{"../Component":217,"virtual-dom":173}],231:[function(require,module,exports){
-/// <reference path="../../typings/index.d.ts" />
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var vd = require("virtual-dom");
-var Component_1 = require("../Component");
-var BackgroundComponent = (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 photo.") });
-    };
-    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 }, []),
-        ]);
-    };
-    return BackgroundComponent;
-}(Component_1.Component));
-BackgroundComponent.componentName = "background";
-exports.BackgroundComponent = BackgroundComponent;
-Component_1.ComponentService.register(BackgroundComponent);
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = BackgroundComponent;
-
-},{"../Component":217,"virtual-dom":173}],232:[function(require,module,exports){
-/// <reference path="../../typings/index.d.ts" />
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var vd = require("virtual-dom");
-var Observable_1 = require("rxjs/Observable");
-var Component_1 = require("../Component");
-var Geo_1 = require("../Geo");
-var BearingComponent = (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._svgNamespace = "http://www.w3.org/2000/svg";
-        _this._distinctThreshold = Math.PI / 90;
-        return _this;
-    }
-    BearingComponent.prototype._activate = function () {
-        var _this = this;
-        var nodeBearingFov$ = this._navigator.stateService.currentState$
-            .distinctUntilChanged(undefined, function (frame) {
-            return frame.state.currentNode.key;
-        })
-            .map(function (frame) {
-            var node = frame.state.currentNode;
-            var transform = frame.state.currentTransform;
-            if (node.pano) {
-                var hFov_1 = 2 * Math.PI * node.gpano.CroppedAreaImageWidthPixels / node.gpano.FullPanoWidthPixels;
-                return [_this._spatial.degToRad(node.ca), hFov_1];
-            }
-            var size = Math.max(transform.basicWidth, transform.basicHeight);
-            if (size <= 0) {
-                console.warn("Original image size (" + transform.basicWidth + ", " + transform.basicHeight + ") is invalid (" + node.key + ". " +
-                    "Not showing available fov.");
-            }
-            var hFov = size > 0 ?
-                2 * Math.atan(0.5 * transform.basicWidth / (size * transform.focal)) :
-                0;
-            return [_this._spatial.degToRad(node.ca), hFov];
-        })
-            .distinctUntilChanged(function (a1, a2) {
-            return Math.abs(a2[0] - a1[0]) < _this._distinctThreshold &&
-                Math.abs(a2[1] - a1[1]) < _this._distinctThreshold;
-        });
-        var cameraBearingFov$ = this._container.renderService.renderCamera$
-            .map(function (rc) {
-            var vFov = _this._spatial.degToRad(rc.perspective.fov);
-            var hFov = Math.atan(rc.perspective.aspect * Math.tan(0.5 * vFov)) * 2;
-            return [_this._spatial.azimuthalToBearing(rc.rotation.phi), hFov];
-        })
-            .distinctUntilChanged(function (a1, a2) {
-            return Math.abs(a2[0] - a1[0]) < _this._distinctThreshold &&
-                Math.abs(a2[1] - a1[1]) < _this._distinctThreshold;
-        });
-        this._renderSubscription = Observable_1.Observable
-            .combineLatest(nodeBearingFov$, cameraBearingFov$)
-            .map(function (args) {
-            var background = vd.h("div.BearingIndicatorBackground", {}, [
-                vd.h("div.BearingIndicatorBackgroundRectangle", {}, []),
-                vd.h("div.BearingIndicatorBackgroundCircle", {}, []),
-            ]);
-            var north = vd.h("div.BearingIndicatorNorth", {}, []);
-            var nodeSector = _this._createCircleSector(args[0][0], args[0][1], "#000");
-            var cameraSector = _this._createCircleSector(args[1][0], args[1][1], "#fff");
-            var compass = _this._createCircleSectorCompass(nodeSector, cameraSector);
-            return {
-                name: _this._name,
-                vnode: vd.h("div.BearingIndicator", {}, [
-                    background,
-                    north,
-                    compass,
-                ]),
-            };
-        })
-            .subscribe(this._container.domRenderer.render$);
-    };
-    BearingComponent.prototype._deactivate = function () {
-        this._renderSubscription.unsubscribe();
-    };
-    BearingComponent.prototype._getDefaultConfiguration = function () {
-        return {};
-    };
-    BearingComponent.prototype._createCircleSectorCompass = function (nodeSector, cameraSector) {
-        var group = vd.h("g", {
-            attributes: { transform: "translate(1,1)" },
-            namespace: this._svgNamespace,
-        }, [nodeSector, cameraSector]);
-        var centerCircle = vd.h("circle", {
-            attributes: {
-                cx: "1",
-                cy: "1",
-                fill: "#abb1b9",
-                r: "0.291667",
-                stroke: "#000",
-                "stroke-width": "0.0833333",
-            },
-            namespace: this._svgNamespace,
-        }, []);
-        var svg = vd.h("svg", {
-            attributes: { viewBox: "0 0 2 2" },
-            namespace: this._svgNamespace,
-            style: {
-                bottom: "4px",
-                height: "48px",
-                left: "4px",
-                position: "absolute",
-                width: "48px",
-            },
-        }, [group, centerCircle]);
-        return svg;
-    };
-    BearingComponent.prototype._createCircleSector = function (bearing, 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 = bearing - fov / 2 - Math.PI / 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,
-        }, []);
-    };
-    return BearingComponent;
-}(Component_1.Component));
-BearingComponent.componentName = "bearing";
-exports.BearingComponent = BearingComponent;
-Component_1.ComponentService.register(BearingComponent);
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = BearingComponent;
-
-},{"../Component":217,"../Geo":220,"rxjs/Observable":28,"virtual-dom":173}],233:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Observable_1 = require("rxjs/Observable");
-require("rxjs/add/observable/combineLatest");
-require("rxjs/add/observable/from");
-require("rxjs/add/observable/merge");
-require("rxjs/add/observable/of");
-require("rxjs/add/observable/zip");
-require("rxjs/add/operator/catch");
-require("rxjs/add/operator/combineLatest");
-require("rxjs/add/operator/distinct");
-require("rxjs/add/operator/expand");
-require("rxjs/add/operator/filter");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/merge");
-require("rxjs/add/operator/mergeMap");
-require("rxjs/add/operator/mergeAll");
-require("rxjs/add/operator/skip");
-require("rxjs/add/operator/switchMap");
-var Edge_1 = require("../Edge");
-var Component_1 = require("../Component");
-var CacheComponent = (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 = Observable_1.Observable
-            .combineLatest(this._navigator.stateService.currentNode$
-            .switchMap(function (node) {
-            return node.sequenceEdges$;
-        })
-            .filter(function (status) {
-            return status.cached;
-        }), this._configuration$)
-            .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 Observable_1.Observable
-                .merge(next$, prev$)
-                .catch(function (error, caught) {
-                console.error("Failed to cache sequence edges.", error);
-                return Observable_1.Observable.empty();
-            });
-        })
-            .subscribe(function () { });
-        this._spatialSubscription = this._navigator.stateService.currentNode$
-            .switchMap(function (node) {
-            return Observable_1.Observable
-                .combineLatest(Observable_1.Observable.of(node), node.spatialEdges$
-                .filter(function (status) {
-                return status.cached;
-            }));
-        })
-            .combineLatest(this._configuration$, function (ns, configuration) {
-            return [ns[0], ns[1], configuration];
-        })
-            .switchMap(function (args) {
-            var node = args[0];
-            var edges = args[1].edges;
-            var depth = args[2].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 Observable_1.Observable
-                .merge(forward$, backward$, left$, right$, pano$, turnLeft$, turnRight$, turnU$)
-                .catch(function (error, caught) {
-                console.error("Failed to cache spatial edges.", error);
-                return Observable_1.Observable.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 Observable_1.Observable
-            .zip(Observable_1.Observable.of(edges), Observable_1.Observable.of(depth))
-            .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(Observable_1.Observable
-                            .zip(_this._navigator.graphService.cacheNode$(edge.to)
-                            .mergeMap(function (n) {
-                            return _this._nodeToEdges$(n, direction);
-                        }), Observable_1.Observable.of(d - 1)));
-                    }
-                }
-            }
-            return Observable_1.Observable
-                .from(edgesDepths$)
-                .mergeAll();
-        })
-            .skip(1);
-    };
-    CacheComponent.prototype._nodeToEdges$ = function (node, direction) {
-        return ([Edge_1.EdgeDirection.Next, Edge_1.EdgeDirection.Prev].indexOf(direction) > -1 ?
-            node.sequenceEdges$ :
-            node.spatialEdges$)
-            .first(function (status) {
-            return status.cached;
-        })
-            .map(function (status) {
-            return status.edges;
-        });
-    };
-    return CacheComponent;
-}(Component_1.Component));
-CacheComponent.componentName = "cache";
-exports.CacheComponent = CacheComponent;
-Component_1.ComponentService.register(CacheComponent);
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = CacheComponent;
-
-},{"../Component":217,"../Edge":218,"rxjs/Observable":28,"rxjs/add/observable/combineLatest":37,"rxjs/add/observable/from":40,"rxjs/add/observable/merge":43,"rxjs/add/observable/of":44,"rxjs/add/observable/zip":46,"rxjs/add/operator/catch":49,"rxjs/add/operator/combineLatest":50,"rxjs/add/operator/distinct":54,"rxjs/add/operator/expand":57,"rxjs/add/operator/filter":58,"rxjs/add/operator/map":62,"rxjs/add/operator/merge":63,"rxjs/add/operator/mergeAll":64,"rxjs/add/operator/mergeMap":65,"rxjs/add/operator/skip":72,"rxjs/add/operator/switchMap":76}],234:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var BehaviorSubject_1 = require("rxjs/BehaviorSubject");
-var Subject_1 = require("rxjs/Subject");
-require("rxjs/add/operator/publishReplay");
-require("rxjs/add/operator/scan");
-require("rxjs/add/operator/startWith");
-var Utils_1 = require("../Utils");
-var Component = (function (_super) {
-    __extends(Component, _super);
-    function Component(name, container, navigator) {
-        var _this = _super.call(this) || this;
-        _this._activated$ = new BehaviorSubject_1.BehaviorSubject(false);
-        _this._configurationSubject$ = new Subject_1.Subject();
-        _this._activated = false;
-        _this._container = container;
-        _this._name = name;
-        _this._navigator = navigator;
-        _this._configuration$ =
-            _this._configurationSubject$
-                .startWith(_this.defaultConfiguration)
-                .scan(function (conf, newConf) {
-                for (var key in newConf) {
-                    if (newConf.hasOwnProperty(key)) {
-                        conf[key] = newConf[key];
-                    }
-                }
-                return conf;
-            })
-                .publishReplay(1)
-                .refCount();
-        _this._configuration$.subscribe(function () { });
-        return _this;
-    }
-    Object.defineProperty(Component.prototype, "activated", {
-        get: function () {
-            return this._activated;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Component.prototype, "activated$", {
-        get: function () {
-            return this._activated$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Component.prototype, "defaultConfiguration", {
-        /**
-         * Get default configuration.
-         *
-         * @returns {TConfiguration} Default configuration for component.
-         */
-        get: function () {
-            return this._getDefaultConfiguration();
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Component.prototype, "configuration$", {
-        get: function () {
-            return this._configuration$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Component.prototype.activate = function (conf) {
-        if (this._activated) {
-            return;
-        }
-        if (conf !== undefined) {
-            this._configurationSubject$.next(conf);
-        }
-        this._activate();
-        this._activated = true;
-        this._activated$.next(true);
-    };
-    ;
-    Component.prototype.configure = function (conf) {
-        this._configurationSubject$.next(conf);
-    };
-    Component.prototype.deactivate = function () {
-        if (!this._activated) {
-            return;
-        }
-        this._deactivate();
-        this._container.domRenderer.clear(this._name);
-        this._container.glRenderer.clear(this._name);
-        this._activated = false;
-        this._activated$.next(false);
-    };
-    ;
-    /**
-     * Detect the viewer's new width and height and resize the component's
-     * rendered elements accordingly if applicable.
-     */
-    Component.prototype.resize = function () { return; };
-    return Component;
-}(Utils_1.EventEmitter));
-/**
- * Component name. Used when interacting with component through the Viewer's API.
- */
-Component.componentName = "not_worthy";
-exports.Component = Component;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = Component;
-
-},{"../Utils":226,"rxjs/BehaviorSubject":25,"rxjs/Subject":33,"rxjs/add/operator/publishReplay":69,"rxjs/add/operator/scan":70,"rxjs/add/operator/startWith":75}],235:[function(require,module,exports){
-/// <reference path="../../typings/index.d.ts" />
-"use strict";
-var _ = require("underscore");
-var Error_1 = require("../Error");
-var ComponentService = (function () {
-    function ComponentService(container, navigator) {
-        this._components = {};
-        this._container = container;
-        this._navigator = navigator;
-        for (var _i = 0, _a = _.values(ComponentService.registeredComponents); _i < _a.length; _i++) {
-            var component = _a[_i];
-            this._components[component.componentName] = {
-                active: false,
-                component: new component(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;
-    };
-    ComponentService.prototype.activateCover = function () {
-        if (this._coverActivated) {
-            return;
-        }
-        this._coverActivated = true;
-        for (var _i = 0, _a = _.values(this._components); _i < _a.length; _i++) {
-            var component = _a[_i];
-            if (component.active) {
-                component.component.deactivate();
-            }
-        }
-        return;
-    };
-    ComponentService.prototype.deactivateCover = function () {
-        if (!this._coverActivated) {
-            return;
-        }
-        this._coverActivated = false;
-        for (var _i = 0, _a = _.values(this._components); _i < _a.length; _i++) {
-            var component = _a[_i];
-            if (component.active) {
-                component.component.activate();
-            }
-        }
-        return;
-    };
-    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.resize = function () {
-        for (var _i = 0, _a = _.values(this._components); _i < _a.length; _i++) {
-            var component = _a[_i];
-            component.component.resize();
-        }
-    };
-    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);
-        }
-    };
-    return ComponentService;
-}());
-ComponentService.registeredComponents = {};
-exports.ComponentService = ComponentService;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = ComponentService;
-
-},{"../Error":219,"underscore":168}],236:[function(require,module,exports){
-/// <reference path="../../typings/index.d.ts" />
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var vd = require("virtual-dom");
-require("rxjs/add/operator/filter");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/withLatestFrom");
-var Component_1 = require("../Component");
-var CoverComponent = (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._keyDisposable = this._navigator.stateService.currentNode$
-            .withLatestFrom(this._configuration$, function (node, configuration) {
-            return [node, configuration];
-        })
-            .filter(function (nc) {
-            return nc[0].key !== nc[1].key;
-        })
-            .map(function (nc) { return nc[0]; })
-            .map(function (node) {
-            return { key: node.key, src: node.image.src };
-        })
-            .subscribe(this._configurationSubject$);
-        this._disposable = this._configuration$
-            .map(function (conf) {
-            if (!conf.key) {
-                return { name: _this._name, vnode: vd.h("div", []) };
-            }
-            if (!conf.visible) {
-                return { name: _this._name, vnode: vd.h("div.Cover.CoverDone", [_this._getCoverBackgroundVNode(conf)]) };
-            }
-            return { name: _this._name, vnode: _this._getCoverButtonVNode(conf) };
-        })
-            .subscribe(this._container.domRenderer.render$);
-    };
-    CoverComponent.prototype._deactivate = function () {
-        this._disposable.unsubscribe();
-        this._keyDisposable.unsubscribe();
-    };
-    CoverComponent.prototype._getDefaultConfiguration = function () {
-        return { "loading": false, "visible": true };
-    };
-    CoverComponent.prototype._getCoverButtonVNode = function (conf) {
-        var _this = this;
-        var cover = conf.loading ? "div.Cover.CoverLoading" : "div.Cover";
-        return vd.h(cover, [
-            this._getCoverBackgroundVNode(conf),
-            vd.h("button.CoverButton", { onclick: function () { _this.configure({ loading: true }); } }, ["Explore"]),
-            vd.h("a.CoverLogo", { href: "https://www.mapillary.com", target: "_blank" }, []),
-        ]);
-    };
-    CoverComponent.prototype._getCoverBackgroundVNode = function (conf) {
-        var url = conf.src != null ?
-            "url(" + conf.src + ")" :
-            "url(https://d1cuyjsrcm0gby.cloudfront.net/" + conf.key + "/thumb-640.jpg)";
-        var properties = { style: { backgroundImage: url } };
-        var children = [];
-        if (conf.loading) {
-            children.push(vd.h("div.Spinner", {}, []));
-        }
-        children.push(vd.h("div.CoverBackgroundGradient", {}, []));
-        return vd.h("div.CoverBackground", properties, children);
-    };
-    return CoverComponent;
-}(Component_1.Component));
-CoverComponent.componentName = "cover";
-exports.CoverComponent = CoverComponent;
-Component_1.ComponentService.registerCover(CoverComponent);
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = CoverComponent;
-
-},{"../Component":217,"rxjs/add/operator/filter":58,"rxjs/add/operator/map":62,"rxjs/add/operator/withLatestFrom":80,"virtual-dom":173}],237:[function(require,module,exports){
-/// <reference path="../../typings/index.d.ts" />
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var _ = require("underscore");
-var vd = require("virtual-dom");
-var BehaviorSubject_1 = require("rxjs/BehaviorSubject");
-require("rxjs/add/operator/combineLatest");
-var Component_1 = require("../Component");
-var DebugComponent = (function (_super) {
-    __extends(DebugComponent, _super);
-    function DebugComponent(name, container, navigator) {
-        var _this = _super.call(this, name, container, navigator) || this;
-        _this._open$ = new BehaviorSubject_1.BehaviorSubject(false);
-        _this._displaying = false;
-        return _this;
-    }
-    DebugComponent.prototype._activate = function () {
-        var _this = this;
-        this._disposable = this._navigator.stateService.currentState$
-            .combineLatest(this._open$, this._navigator.imageLoadingService.loadstatus$, function (frame, open, loadStatus) {
-            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 _i = 0, _a = _.values(loadStatus); _i < _a.length; _i++) {
-            var loadStat = _a[_i];
-            total += loadStat.loaded;
-            if (loadStat.loaded !== loadStat.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);
-    };
-    return DebugComponent;
-}(Component_1.Component));
-DebugComponent.componentName = "debug";
-exports.DebugComponent = DebugComponent;
-Component_1.ComponentService.register(DebugComponent);
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = DebugComponent;
-
-},{"../Component":217,"rxjs/BehaviorSubject":25,"rxjs/add/operator/combineLatest":50,"underscore":168,"virtual-dom":173}],238:[function(require,module,exports){
-/// <reference path="../../typings/index.d.ts" />
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var vd = require("virtual-dom");
-require("rxjs/add/operator/combineLatest");
-var Component_1 = require("../Component");
-var ImageComponent = (function (_super) {
-    __extends(ImageComponent, _super);
-    function ImageComponent(name, container, navigator) {
-        var _this = _super.call(this, name, container, navigator) || this;
-        _this._canvasId = container.id + "-" + _this._name;
-        return _this;
-    }
-    ImageComponent.prototype._activate = function () {
-        var _this = this;
-        this.drawSubscription = this._container.domRenderer.element$
-            .combineLatest(this._navigator.stateService.currentNode$, function (element, node) {
-            var canvas = document.getElementById(_this._canvasId);
-            return { canvas: canvas, node: node };
-        })
-            .subscribe(function (canvasNode) {
-            var canvas = canvasNode.canvas;
-            var node = canvasNode.node;
-            if (!node || !canvas) {
-                return null;
-            }
-            var adaptableDomRenderer = canvas.parentElement;
-            var width = adaptableDomRenderer.offsetWidth;
-            var height = adaptableDomRenderer.offsetHeight;
-            canvas.width = width;
-            canvas.height = height;
-            var ctx = canvas.getContext("2d");
-            ctx.drawImage(node.image, 0, 0, width, 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 {};
-    };
-    return ImageComponent;
-}(Component_1.Component));
-ImageComponent.componentName = "image";
-exports.ImageComponent = ImageComponent;
-Component_1.ComponentService.register(ImageComponent);
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = ImageComponent;
-
-},{"../Component":217,"rxjs/add/operator/combineLatest":50,"virtual-dom":173}],239:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Observable_1 = require("rxjs/Observable");
-require("rxjs/add/observable/fromEvent");
-require("rxjs/add/operator/withLatestFrom");
-var Edge_1 = require("../Edge");
-var Component_1 = require("../Component");
-var Geo_1 = require("../Geo");
-var KeyboardComponent = (function (_super) {
-    __extends(KeyboardComponent, _super);
-    function KeyboardComponent(name, container, navigator) {
-        var _this = _super.call(this, name, container, navigator) || this;
-        _this._spatial = new Geo_1.Spatial();
-        _this._perspectiveDirections = [
-            Edge_1.EdgeDirection.StepForward,
-            Edge_1.EdgeDirection.StepBackward,
-            Edge_1.EdgeDirection.StepLeft,
-            Edge_1.EdgeDirection.StepRight,
-            Edge_1.EdgeDirection.TurnLeft,
-            Edge_1.EdgeDirection.TurnRight,
-            Edge_1.EdgeDirection.TurnU,
-        ];
-        return _this;
-    }
-    KeyboardComponent.prototype._activate = function () {
-        var _this = this;
-        var sequenceEdges$ = this._navigator.stateService.currentNode$
-            .switchMap(function (node) {
-            return node.sequenceEdges$;
-        });
-        var spatialEdges$ = this._navigator.stateService.currentNode$
-            .switchMap(function (node) {
-            return node.spatialEdges$;
-        });
-        this._disposable = Observable_1.Observable
-            .fromEvent(document, "keydown")
-            .withLatestFrom(this._navigator.stateService.currentState$, sequenceEdges$, spatialEdges$, function (event, frame, sequenceEdges, spatialEdges) {
-            return { event: event, frame: frame, sequenceEdges: sequenceEdges, spatialEdges: spatialEdges };
-        })
-            .subscribe(function (kf) {
-            if (!kf.frame.state.currentNode.pano) {
-                _this._navigatePerspective(kf.event, kf.sequenceEdges, kf.spatialEdges);
-            }
-            else {
-                _this._navigatePanorama(kf.event, kf.sequenceEdges, kf.spatialEdges, kf.frame.state.camera);
-            }
-        });
-    };
-    KeyboardComponent.prototype._deactivate = function () {
-        this._disposable.unsubscribe();
-    };
-    KeyboardComponent.prototype._getDefaultConfiguration = function () {
-        return {};
-    };
-    KeyboardComponent.prototype._navigatePanorama = function (event, sequenceEdges, spatialEdges, camera) {
-        var navigationAngle = 0;
-        var stepDirection = null;
-        var sequenceDirection = null;
-        var phi = this._rotationFromCamera(camera).phi;
-        switch (event.keyCode) {
-            case 37:
-                if (event.shiftKey || event.altKey) {
-                    break;
-                }
-                navigationAngle = Math.PI / 2 + phi;
-                stepDirection = Edge_1.EdgeDirection.StepLeft;
-                break;
-            case 38:
-                if (event.shiftKey) {
-                    break;
-                }
-                if (event.altKey) {
-                    sequenceDirection = Edge_1.EdgeDirection.Next;
-                    break;
-                }
-                navigationAngle = phi;
-                stepDirection = Edge_1.EdgeDirection.StepForward;
-                break;
-            case 39:
-                if (event.shiftKey || event.altKey) {
-                    break;
-                }
-                navigationAngle = -Math.PI / 2 + phi;
-                stepDirection = Edge_1.EdgeDirection.StepRight;
-                break;
-            case 40:
-                if (event.shiftKey) {
-                    break;
-                }
-                if (event.altKey) {
-                    sequenceDirection = Edge_1.EdgeDirection.Prev;
-                    break;
-                }
-                navigationAngle = Math.PI + phi;
-                stepDirection = Edge_1.EdgeDirection.StepBackward;
-                break;
-            default:
-                return;
-        }
-        event.preventDefault();
-        if (sequenceDirection != null) {
-            this._moveInDir(sequenceDirection, sequenceEdges);
-            return;
-        }
-        if (stepDirection == null || !spatialEdges.cached) {
-            return;
-        }
-        navigationAngle = this._spatial.wrapAngle(navigationAngle);
-        var threshold = Math.PI / 4;
-        var edges = spatialEdges.edges.filter(function (e) {
-            return e.data.direction === Edge_1.EdgeDirection.Pano ||
-                e.data.direction === stepDirection;
-        });
-        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._navigator.moveToKey$(toKey)
-            .subscribe(function (n) { return; }, function (e) { console.error(e); });
-    };
-    KeyboardComponent.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 };
-    };
-    KeyboardComponent.prototype._navigatePerspective = function (event, sequenceEdges, spatialEdges) {
-        var direction = null;
-        var sequenceDirection = null;
-        switch (event.keyCode) {
-            case 37:
-                if (event.altKey) {
-                    break;
-                }
-                direction = event.shiftKey ? Edge_1.EdgeDirection.TurnLeft : Edge_1.EdgeDirection.StepLeft;
-                break;
-            case 38:
-                if (event.altKey) {
-                    sequenceDirection = Edge_1.EdgeDirection.Next;
-                    break;
-                }
-                direction = event.shiftKey ? Edge_1.EdgeDirection.Pano : Edge_1.EdgeDirection.StepForward;
-                break;
-            case 39:
-                if (event.altKey) {
-                    break;
-                }
-                direction = event.shiftKey ? Edge_1.EdgeDirection.TurnRight : Edge_1.EdgeDirection.StepRight;
-                break;
-            case 40:
-                if (event.altKey) {
-                    sequenceDirection = Edge_1.EdgeDirection.Prev;
-                    break;
-                }
-                direction = event.shiftKey ? Edge_1.EdgeDirection.TurnU : Edge_1.EdgeDirection.StepBackward;
-                break;
-            default:
-                return;
-        }
-        event.preventDefault();
-        if (sequenceDirection != null) {
-            this._moveInDir(sequenceDirection, sequenceEdges);
-            return;
-        }
-        this._moveInDir(direction, spatialEdges);
-    };
-    KeyboardComponent.prototype._moveInDir = function (direction, edgeStatus) {
-        if (!edgeStatus.cached) {
-            return;
-        }
-        for (var _i = 0, _a = edgeStatus.edges; _i < _a.length; _i++) {
-            var edge = _a[_i];
-            if (edge.data.direction === direction) {
-                this._navigator.moveToKey$(edge.to)
-                    .subscribe(function (n) { return; }, function (e) { console.error(e); });
-                return;
-            }
-        }
-    };
-    return KeyboardComponent;
-}(Component_1.Component));
-KeyboardComponent.componentName = "keyboard";
-exports.KeyboardComponent = KeyboardComponent;
-Component_1.ComponentService.register(KeyboardComponent);
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = KeyboardComponent;
-
-},{"../Component":217,"../Edge":218,"../Geo":220,"rxjs/Observable":28,"rxjs/add/observable/fromEvent":41,"rxjs/add/operator/withLatestFrom":80}],240:[function(require,module,exports){
-/// <reference path="../../typings/index.d.ts" />
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var _ = require("underscore");
-var vd = require("virtual-dom");
-require("rxjs/add/operator/combineLatest");
-var Component_1 = require("../Component");
-var LoadingComponent = (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$
-            .combineLatest(this._navigator.imageLoadingService.loadstatus$, function (loading, loadStatus) {
-            if (!loading) {
-                return { name: "loading", vnode: _this._getBarVNode(100) };
-            }
-            var total = 0;
-            var loaded = 0;
-            for (var _i = 0, _a = _.values(loadStatus); _i < _a.length; _i++) {
-                var loadStat = _a[_i];
-                if (loadStat.loaded !== loadStat.total) {
-                    loaded += loadStat.loaded;
-                    total += loadStat.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 }, [])]);
-    };
-    return LoadingComponent;
-}(Component_1.Component));
-LoadingComponent.componentName = "loading";
-exports.LoadingComponent = LoadingComponent;
-Component_1.ComponentService.register(LoadingComponent);
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = LoadingComponent;
-
-},{"../Component":217,"rxjs/add/operator/combineLatest":50,"underscore":168,"virtual-dom":173}],241:[function(require,module,exports){
-/// <reference path="../../typings/index.d.ts" />
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var THREE = require("three");
-var vd = require("virtual-dom");
-var Observable_1 = require("rxjs/Observable");
-require("rxjs/add/observable/merge");
-require("rxjs/add/operator/filter");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/withLatestFrom");
-var Component_1 = require("../Component");
-var Geo_1 = require("../Geo");
-/**
- * @class MouseComponent
- * @classdesc Component handling mouse and touch events for camera movement.
- */
-var MouseComponent = (function (_super) {
-    __extends(MouseComponent, _super);
-    function MouseComponent(name, container, navigator) {
-        var _this = _super.call(this, name, container, navigator) || this;
-        _this._basicDistanceThreshold = 1e-3;
-        _this._basicRotationThreshold = 5e-2;
-        _this._bounceCoeff = 1e-1;
-        _this._forceCoeff = 2e-1;
-        _this._viewportCoords = new Geo_1.ViewportCoords();
-        _this._spatial = new Geo_1.Spatial();
-        return _this;
-    }
-    MouseComponent.prototype._activate = function () {
-        var _this = this;
-        var draggingStarted$ = this._container.mouseService
-            .filtered$(this._name, this._container.mouseService.mouseDragStart$)
-            .map(function (event) {
-            return true;
-        });
-        var draggingStopped$ = this._container.mouseService
-            .filtered$(this._name, this._container.mouseService.mouseDragEnd$)
-            .map(function (event) {
-            return false;
-        });
-        var dragging$ = Observable_1.Observable
-            .merge(draggingStarted$, draggingStopped$)
-            .startWith(false)
-            .share();
-        this._activeMouseSubscription = dragging$
-            .subscribe(this._container.mouseService.activate$);
-        var touchMovingStarted$ = this._container.touchService.singleTouchMoveStart$
-            .map(function (event) {
-            return true;
-        });
-        var touchMovingStopped$ = this._container.touchService.singleTouchMoveEnd$
-            .map(function (event) {
-            return false;
-        });
-        var touchMoving$ = Observable_1.Observable
-            .merge(touchMovingStarted$, touchMovingStopped$)
-            .startWith(false)
-            .share();
-        this._activeTouchSubscription = touchMoving$
-            .subscribe(this._container.touchService.activate$);
-        this._cursorSubscription = dragging$
-            .map(function (dragging) {
-            var className = dragging ? "MouseContainerGrabbing" : "MouseContainerGrab";
-            var vNode = vd.h("div." + className, {}, []);
-            return { name: _this._name, vnode: vNode };
-        })
-            .subscribe(this._container.domRenderer.render$);
-        var mouseMovement$ = this._container.mouseService
-            .filtered$(this._name, this._container.mouseService.mouseDrag$)
-            .map(function (e) {
-            return {
-                clientX: e.clientX,
-                clientY: e.clientY,
-                movementX: e.movementX,
-                movementY: e.movementY,
-            };
-        });
-        var touchMovement$ = this._container.touchService.singleTouchMove$
-            .map(function (touch) {
-            return {
-                clientX: touch.clientX,
-                clientY: touch.clientY,
-                movementX: touch.movementX,
-                movementY: touch.movementY,
-            };
-        });
-        this._movementSubscription = Observable_1.Observable
-            .merge(mouseMovement$, touchMovement$)
-            .withLatestFrom(this._navigator.stateService.currentState$, function (m, f) {
-            return [m, f];
-        })
-            .filter(function (args) {
-            var state = args[1].state;
-            return state.currentNode.fullPano || state.nodesAhead < 1;
-        })
-            .map(function (args) {
-            return args[0];
-        })
-            .withLatestFrom(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$, this._navigator.stateService.currentCamera$, function (m, r, t, c) {
-            return [m, r, t, c];
-        })
-            .map(function (args) {
-            var movement = args[0];
-            var render = args[1];
-            var transform = args[2];
-            var camera = args[3].clone();
-            var element = _this._container.element;
-            var offsetWidth = element.offsetWidth;
-            var offsetHeight = element.offsetHeight;
-            var clientRect = element.getBoundingClientRect();
-            var canvasX = movement.clientX - clientRect.left;
-            var canvasY = movement.clientY - clientRect.top;
-            var currentDirection = _this._viewportCoords.unprojectFromCanvas(canvasX, canvasY, offsetWidth, offsetHeight, render.perspective)
-                .sub(render.perspective.position);
-            var directionX = _this._viewportCoords.unprojectFromCanvas(canvasX - movement.movementX, canvasY, offsetWidth, offsetHeight, render.perspective)
-                .sub(render.perspective.position);
-            var directionY = _this._viewportCoords.unprojectFromCanvas(canvasX, canvasY - movement.movementY, offsetWidth, offsetHeight, render.perspective)
-                .sub(render.perspective.position);
-            var deltaPhi = (movement.movementX > 0 ? 1 : -1) * directionX.angleTo(currentDirection);
-            var deltaTheta = (movement.movementY > 0 ? -1 : 1) * directionY.angleTo(currentDirection);
-            var upQuaternion = new THREE.Quaternion().setFromUnitVectors(camera.up, new THREE.Vector3(0, 0, 1));
-            var upQuaternionInverse = upQuaternion.clone().inverse();
-            var offset = new THREE.Vector3();
-            offset.copy(camera.lookat).sub(camera.position);
-            offset.applyQuaternion(upQuaternion);
-            var length = offset.length();
-            var phi = Math.atan2(offset.y, offset.x);
-            phi += deltaPhi;
-            var theta = Math.atan2(Math.sqrt(offset.x * offset.x + offset.y * offset.y), offset.z);
-            theta += deltaTheta;
-            theta = Math.max(0.01, Math.min(Math.PI - 0.01, theta));
-            offset.x = Math.sin(theta) * Math.cos(phi);
-            offset.y = Math.sin(theta) * Math.sin(phi);
-            offset.z = Math.cos(theta);
-            offset.applyQuaternion(upQuaternionInverse);
-            var lookat = new THREE.Vector3().copy(camera.position).add(offset.multiplyScalar(length));
-            var basic = transform.projectBasic(lookat.toArray());
-            var original = transform.projectBasic(camera.lookat.toArray());
-            var x = basic[0] - original[0];
-            var y = basic[1] - original[1];
-            if (Math.abs(x) > 1) {
-                x = 0;
-            }
-            else if (x > 0.5) {
-                x = x - 1;
-            }
-            else if (x < -0.5) {
-                x = x + 1;
-            }
-            var rotationThreshold = _this._basicRotationThreshold;
-            x = _this._spatial.clamp(x, -rotationThreshold, rotationThreshold);
-            y = _this._spatial.clamp(y, -rotationThreshold, rotationThreshold);
-            if (transform.fullPano) {
-                return [x, y];
-            }
-            var pixelDistances = _this._viewportCoords.getPixelDistances(_this._container.element.offsetWidth, _this._container.element.offsetHeight, transform, render.perspective);
-            var coeff = _this._forceCoeff;
-            if (pixelDistances[0] > 0 && y < 0 && basic[1] < 0.5) {
-                y /= Math.max(1, coeff * pixelDistances[0]);
-            }
-            if (pixelDistances[1] > 0 && x > 0 && basic[0] > 0.5) {
-                x /= Math.max(1, coeff * pixelDistances[1]);
-            }
-            if (pixelDistances[2] > 0 && y > 0 && basic[1] > 0.5) {
-                y /= Math.max(1, coeff * pixelDistances[2]);
-            }
-            if (pixelDistances[3] > 0 && x < 0 && basic[0] < 0.5) {
-                x /= Math.max(1, coeff * pixelDistances[3]);
-            }
-            return [x, y];
-        })
-            .subscribe(function (basicRotation) {
-            _this._navigator.stateService.rotateBasic(basicRotation);
-        });
-        this._mouseWheelSubscription = this._container.mouseService
-            .filtered$(this._name, this._container.mouseService.mouseWheel$)
-            .withLatestFrom(this._navigator.stateService.currentState$, function (w, f) {
-            return [w, f];
-        })
-            .filter(function (args) {
-            var state = args[1].state;
-            return state.currentNode.fullPano || state.nodesAhead < 1;
-        })
-            .map(function (args) {
-            return args[0];
-        })
-            .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 offsetWidth = element.offsetWidth;
-            var offsetHeight = element.offsetHeight;
-            var clientRect = element.getBoundingClientRect();
-            var canvasX = event.clientX - clientRect.left;
-            var canvasY = event.clientY - clientRect.top;
-            var unprojected = _this._viewportCoords.unprojectFromCanvas(canvasX, canvasY, offsetWidth, offsetHeight, 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 zoom = -3 * deltaY / offsetHeight;
-            _this._navigator.stateService.zoomIn(zoom, reference);
-        });
-        this._pinchSubscription = this._container.touchService.pinch$
-            .withLatestFrom(this._navigator.stateService.currentState$, function (p, f) {
-            return [p, f];
-        })
-            .filter(function (args) {
-            var state = args[1].state;
-            return state.currentNode.fullPano || state.nodesAhead < 1;
-        })
-            .map(function (args) {
-            return args[0];
-        })
-            .withLatestFrom(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$, function (p, r, t) {
-            return [p, r, t];
-        })
-            .subscribe(function (args) {
-            var pinch = args[0];
-            var render = args[1];
-            var transform = args[2];
-            var element = _this._container.element;
-            var offsetWidth = element.offsetWidth;
-            var offsetHeight = element.offsetHeight;
-            var clientRect = element.getBoundingClientRect();
-            var unprojected = _this._viewportCoords.unprojectFromCanvas(pinch.centerClientX - clientRect.left, pinch.centerClientY - clientRect.top, offsetWidth, offsetHeight, render.perspective);
-            var reference = transform.projectBasic(unprojected.toArray());
-            var zoom = 3 * pinch.distanceChange / Math.min(offsetHeight, offsetWidth);
-            _this._navigator.stateService.zoomIn(zoom, reference);
-        });
-        this._bounceSubscription = Observable_1.Observable
-            .combineLatest(this._navigator.stateService.inTranslation$, this._container.mouseService.active$, this._container.touchService.active$)
-            .map(function (noForce) {
-            return noForce[0] || noForce[1] || noForce[2];
-        })
-            .distinctUntilChanged()
-            .switchMap(function (noForce) {
-            return noForce ?
-                Observable_1.Observable.empty() :
-                Observable_1.Observable.combineLatest(_this._container.renderService.renderCamera$, _this._navigator.stateService.currentTransform$.first());
-        })
-            .subscribe(function (args) {
-            var renderCamera = args[0];
-            var perspectiveCamera = renderCamera.perspective;
-            var transform = args[1];
-            var distanceThreshold = _this._basicDistanceThreshold / Math.pow(2, renderCamera.zoom);
-            var basicCenter = _this._viewportCoords.viewportToBasic(0, 0, transform, perspectiveCamera);
-            if (Math.abs(basicCenter[0] - 0.5) < distanceThreshold && Math.abs(basicCenter[1] - 0.5) < distanceThreshold) {
-                return;
-            }
-            var basicDistances = _this._viewportCoords.getBasicDistances(transform, perspectiveCamera);
-            var basicX = 0;
-            var basicY = 0;
-            if (basicDistances[0] < distanceThreshold && basicDistances[1] < distanceThreshold &&
-                basicDistances[2] < distanceThreshold && basicDistances[3] < distanceThreshold) {
-                return;
-            }
-            if (Math.abs(basicDistances[0] - basicDistances[2]) < distanceThreshold &&
-                Math.abs(basicDistances[1] - basicDistances[3]) < distanceThreshold) {
-                return;
-            }
-            var coeff = _this._bounceCoeff;
-            if (basicDistances[1] > 0 && basicDistances[3] === 0) {
-                basicX = -coeff * basicDistances[1];
-            }
-            else if (basicDistances[1] === 0 && basicDistances[3] > 0) {
-                basicX = coeff * basicDistances[3];
-            }
-            else if (basicDistances[1] > 0 && basicDistances[3] > 0) {
-                basicX = coeff * (basicDistances[3] - basicDistances[1]) / 2;
-            }
-            if (basicDistances[0] > 0 && basicDistances[2] === 0) {
-                basicY = coeff * basicDistances[0];
-            }
-            else if (basicDistances[0] === 0 && basicDistances[2] > 0) {
-                basicY = -coeff * basicDistances[2];
-            }
-            else if (basicDistances[0] > 0 && basicDistances[2] > 0) {
-                basicY = coeff * (basicDistances[0] - basicDistances[2]) / 2;
-            }
-            var rotationThreshold = _this._basicRotationThreshold;
-            basicX = _this._spatial.clamp(basicX, -rotationThreshold, rotationThreshold);
-            basicY = _this._spatial.clamp(basicY, -rotationThreshold, rotationThreshold);
-            _this._navigator.stateService.rotateBasicUnbounded([basicX, basicY]);
-        });
-        this._container.mouseService.claimMouse(this._name, 0);
-    };
-    MouseComponent.prototype._deactivate = function () {
-        this._container.mouseService.unclaimMouse(this._name);
-        this._activeMouseSubscription.unsubscribe();
-        this._activeTouchSubscription.unsubscribe();
-        this._bounceSubscription.unsubscribe();
-        this._cursorSubscription.unsubscribe();
-        this._movementSubscription.unsubscribe();
-        this._mouseWheelSubscription.unsubscribe();
-        this._pinchSubscription.unsubscribe();
-    };
-    MouseComponent.prototype._getDefaultConfiguration = function () {
-        return {};
-    };
-    return MouseComponent;
-}(Component_1.Component));
-/** @inheritdoc */
-MouseComponent.componentName = "mouse";
-exports.MouseComponent = MouseComponent;
-Component_1.ComponentService.register(MouseComponent);
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = MouseComponent;
-
-},{"../Component":217,"../Geo":220,"rxjs/Observable":28,"rxjs/add/observable/merge":43,"rxjs/add/operator/filter":58,"rxjs/add/operator/map":62,"rxjs/add/operator/withLatestFrom":80,"three":167,"virtual-dom":173}],242:[function(require,module,exports){
-/// <reference path="../../typings/index.d.ts" />
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var vd = require("virtual-dom");
-var Observable_1 = require("rxjs/Observable");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/first");
-var Edge_1 = require("../Edge");
-var Component_1 = require("../Component");
-var NavigationComponent = (function (_super) {
-    __extends(NavigationComponent, _super);
-    function NavigationComponent(name, container, navigator) {
-        var _this = _super.call(this, name, container, navigator) || this;
-        _this._dirNames = {};
-        _this._dirNames[Edge_1.EdgeDirection.StepForward] = "Forward";
-        _this._dirNames[Edge_1.EdgeDirection.StepBackward] = "Backward";
-        _this._dirNames[Edge_1.EdgeDirection.StepLeft] = "Left";
-        _this._dirNames[Edge_1.EdgeDirection.StepRight] = "Right";
-        _this._dirNames[Edge_1.EdgeDirection.TurnLeft] = "Turnleft";
-        _this._dirNames[Edge_1.EdgeDirection.TurnRight] = "Turnright";
-        _this._dirNames[Edge_1.EdgeDirection.TurnU] = "Turnaround";
-        return _this;
-    }
-    NavigationComponent.prototype._activate = function () {
-        var _this = this;
-        this._renderSubscription = this._navigator.stateService.currentNode$
-            .switchMap(function (node) {
-            return node.pano ?
-                Observable_1.Observable.of([]) :
-                Observable_1.Observable.combineLatest(node.sequenceEdges$, node.spatialEdges$, function (seq, spa) {
-                    return seq.edges.concat(spa.edges);
-                });
-        })
-            .map(function (edges) {
-            var btns = [];
-            for (var _i = 0, edges_1 = edges; _i < edges_1.length; _i++) {
-                var edge = edges_1[_i];
-                var direction = edge.data.direction;
-                var name_1 = _this._dirNames[direction];
-                if (name_1 == null) {
-                    continue;
-                }
-                btns.push(_this._createVNode(direction, name_1));
-            }
-            return { name: _this._name, vnode: vd.h("div.NavigationComponent", btns) };
-        })
-            .subscribe(this._container.domRenderer.render$);
-    };
-    NavigationComponent.prototype._deactivate = function () {
-        this._renderSubscription.unsubscribe();
-    };
-    NavigationComponent.prototype._getDefaultConfiguration = function () {
-        return {};
-    };
-    NavigationComponent.prototype._createVNode = function (direction, name) {
-        var _this = this;
-        return vd.h("span.Direction.Direction" + name, {
-            onclick: function (ev) {
-                _this._navigator.moveDir$(direction)
-                    .subscribe(function (node) { return; }, function (error) { console.error(error); });
-            },
-        }, []);
-    };
-    return NavigationComponent;
-}(Component_1.Component));
-NavigationComponent.componentName = "navigation";
-exports.NavigationComponent = NavigationComponent;
-Component_1.ComponentService.register(NavigationComponent);
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = NavigationComponent;
-
-},{"../Component":217,"../Edge":218,"rxjs/Observable":28,"rxjs/add/operator/first":60,"rxjs/add/operator/map":62,"virtual-dom":173}],243:[function(require,module,exports){
-/// <reference path="../../typings/index.d.ts" />
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var _ = require("underscore");
-var vd = require("virtual-dom");
-var Observable_1 = require("rxjs/Observable");
-require("rxjs/add/observable/fromPromise");
-require("rxjs/add/observable/of");
-require("rxjs/add/operator/combineLatest");
-require("rxjs/add/operator/distinct");
-require("rxjs/add/operator/distinctUntilChanged");
-require("rxjs/add/operator/filter");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/mergeMap");
-require("rxjs/add/operator/pluck");
-require("rxjs/add/operator/scan");
-var Component_1 = require("../Component");
-var DescriptionState = (function () {
-    function DescriptionState() {
-    }
-    return DescriptionState;
-}());
-var RouteState = (function () {
-    function RouteState() {
-    }
-    return RouteState;
-}());
-var RouteTrack = (function () {
-    function RouteTrack() {
-        this.nodeInstructions = [];
-        this.nodeInstructionsOrdered = [];
-    }
-    return RouteTrack;
-}());
-var RouteComponent = (function (_super) {
-    __extends(RouteComponent, _super);
-    function RouteComponent(name, container, navigator) {
-        return _super.call(this, name, container, navigator) || this;
-    }
-    RouteComponent.prototype._activate = function () {
-        var _this = this;
-        var _slowedStream$;
-        _slowedStream$ = this._navigator.stateService.currentState$.filter(function (frame) {
-            return (frame.id % 2) === 0;
-        }).filter(function (frame) {
-            return frame.state.nodesAhead < 15;
-        }).distinctUntilChanged(undefined, function (frame) {
-            return frame.state.lastNode.key;
-        });
-        var _routeTrack$;
-        _routeTrack$ = this.configuration$.mergeMap(function (conf) {
-            return Observable_1.Observable.from(conf.paths);
-        }).distinct(function (p) {
-            return p.sequenceKey;
-        }).mergeMap(function (path) {
-            return _this._navigator.apiV3.sequenceByKey$([path.sequenceKey])
-                .map(function (sequenceByKey) {
-                return sequenceByKey[path.sequenceKey];
-            });
-        }).combineLatest(this.configuration$, function (sequence, conf) {
-            var i = 0;
-            var instructionPlaces = [];
-            for (var _i = 0, _a = conf.paths; _i < _a.length; _i++) {
-                var path = _a[_i];
-                if (path.sequenceKey === sequence.key) {
-                    var nodeInstructions = [];
-                    var saveKey = false;
-                    for (var _b = 0, _c = sequence.keys; _b < _c.length; _b++) {
-                        var key = _c[_b];
-                        if (path.startKey === key) {
-                            saveKey = true;
-                        }
-                        if (saveKey) {
-                            var description = null;
-                            for (var _d = 0, _e = path.infoKeys; _d < _e.length; _d++) {
-                                var infoKey = _e[_d];
-                                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;
-        }).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;
-            }
-            routeTrack.nodeInstructions = _.flatten(routeTrack.nodeInstructionsOrdered);
-            return routeTrack;
-        }, new RouteTrack());
-        this._disposable = _slowedStream$
-            .combineLatest(_routeTrack$, this.configuration$, function (frame, routeTrack, conf) {
-            return { conf: conf, frame: frame, routeTrack: routeTrack };
-        }).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())
-            .filter(function (routeState) {
-            return routeState.playing;
-        }).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;
-        }).distinctUntilChanged(undefined, function (routeState) {
-            return routeState.lastNode.key;
-        }).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 Observable_1.Observable.of(null);
-            }
-            return _this._navigator.graphService.cacheNode$(nextInstruction.key);
-        }).combineLatest(this.configuration$, function (node, conf) {
-            return { conf: conf, node: node };
-        }).filter(function (cAN) {
-            return cAN.node !== null && cAN.conf.playing;
-        }).pluck("node").subscribe(this._navigator.stateService.appendNode$);
-        this._disposableDescription = this._navigator.stateService.currentNode$
-            .combineLatest(_routeTrack$, this.configuration$, function (node, routeTrack, conf) {
-            if (conf.playing !== undefined && !conf.playing) {
-                return "quit";
-            }
-            var description = null;
-            for (var _i = 0, _a = routeTrack.nodeInstructions; _i < _a.length; _i++) {
-                var nodeInstruction = _a[_i];
-                if (nodeInstruction.key === node.key) {
-                    description = nodeInstruction.description;
-                    break;
-                }
-            }
-            return description;
-        }).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()).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.play = function () {
-        this.configure({ playing: true });
-    };
-    RouteComponent.prototype.stop = function () {
-        this.configure({ playing: false });
-    };
-    RouteComponent.prototype._getRouteAnnotationNode = function (description) {
-        return vd.h("div.RouteFrame", {}, [
-            vd.h("p", { textContent: description }, []),
-        ]);
-    };
-    return RouteComponent;
-}(Component_1.Component));
-RouteComponent.componentName = "route";
-exports.RouteComponent = RouteComponent;
-Component_1.ComponentService.register(RouteComponent);
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = RouteComponent;
-
-},{"../Component":217,"rxjs/Observable":28,"rxjs/add/observable/fromPromise":42,"rxjs/add/observable/of":44,"rxjs/add/operator/combineLatest":50,"rxjs/add/operator/distinct":54,"rxjs/add/operator/distinctUntilChanged":55,"rxjs/add/operator/filter":58,"rxjs/add/operator/map":62,"rxjs/add/operator/mergeMap":65,"rxjs/add/operator/pluck":67,"rxjs/add/operator/scan":70,"underscore":168,"virtual-dom":173}],244:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Observable_1 = require("rxjs/Observable");
-require("rxjs/add/operator/buffer");
-require("rxjs/add/operator/debounceTime");
-require("rxjs/add/operator/filter");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/scan");
-var Component_1 = require("../Component");
-var StatsComponent = (function (_super) {
-    __extends(StatsComponent, _super);
-    function StatsComponent(name, container, navigator) {
-        return _super.call(this, name, container, navigator) || this;
-    }
-    StatsComponent.prototype._activate = function () {
-        var _this = this;
-        this._sequenceSubscription = this._navigator.stateService.currentNode$
-            .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: {} })
-            .filter(function (keys) {
-            return keys.report.length > 0;
-        })
-            .mergeMap(function (keys) {
-            return _this._navigator.apiV3.sequenceViewAdd$(keys.report)
-                .catch(function (error, caught) {
-                console.error("Failed to report sequence stats (" + keys.report + ")", error);
-                return Observable_1.Observable.empty();
-            });
-        })
-            .subscribe(function () { });
-        this._imageSubscription = this._navigator.stateService.currentNode$
-            .map(function (node) {
-            return node.key;
-        })
-            .buffer(this._navigator.stateService.currentNode$.debounceTime(5000))
-            .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: {} })
-            .filter(function (keys) {
-            return keys.report.length > 0;
-        })
-            .mergeMap(function (keys) {
-            return _this._navigator.apiV3.imageViewAdd$(keys.report)
-                .catch(function (error, caught) {
-                console.error("Failed to report image stats (" + keys.report + ")", error);
-                return Observable_1.Observable.empty();
-            });
-        })
-            .subscribe(function () { });
-    };
-    StatsComponent.prototype._deactivate = function () {
-        this._sequenceSubscription.unsubscribe();
-        this._imageSubscription.unsubscribe();
-    };
-    StatsComponent.prototype._getDefaultConfiguration = function () {
-        return {};
-    };
-    return StatsComponent;
-}(Component_1.Component));
-StatsComponent.componentName = "stats";
-exports.StatsComponent = StatsComponent;
-Component_1.ComponentService.register(StatsComponent);
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = StatsComponent;
-
-},{"../Component":217,"rxjs/Observable":28,"rxjs/add/operator/buffer":47,"rxjs/add/operator/debounceTime":52,"rxjs/add/operator/filter":58,"rxjs/add/operator/map":62,"rxjs/add/operator/scan":70}],245:[function(require,module,exports){
-/// <reference path="../../../typings/index.d.ts" />
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var vd = require("virtual-dom");
-var Observable_1 = require("rxjs/Observable");
-var Subject_1 = require("rxjs/Subject");
-require("rxjs/add/observable/combineLatest");
-require("rxjs/add/operator/do");
-require("rxjs/add/operator/distinctUntilChanged");
-require("rxjs/add/operator/filter");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/share");
-var Component_1 = require("../../Component");
-/**
- * @class DirectionComponent
- * @classdesc Component showing navigation arrows for steps and turns.
- */
-var DirectionComponent = (function (_super) {
-    __extends(DirectionComponent, _super);
-    function DirectionComponent(name, container, navigator) {
-        var _this = _super.call(this, name, container, navigator) || this;
-        _this._renderer = new Component_1.DirectionDOMRenderer(_this.defaultConfiguration, container.element);
-        _this._hoveredKeySubject$ = new Subject_1.Subject();
-        _this._hoveredKey$ = _this._hoveredKeySubject$.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: true,
-        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 });
-    };
-    /** @inheritdoc */
-    DirectionComponent.prototype.resize = function () {
-        this._renderer.resize(this._container.element);
-    };
-    DirectionComponent.prototype._activate = function () {
-        var _this = this;
-        this._configurationSubscription = this._configuration$
-            .subscribe(function (configuration) {
-            _this._renderer.setConfiguration(configuration);
-        });
-        this._nodeSubscription = this._navigator.stateService.currentNode$
-            .do(function (node) {
-            _this._container.domRenderer.render$.next({ name: _this._name, vnode: vd.h("div", {}, []) });
-            _this._renderer.setNode(node);
-        })
-            .withLatestFrom(this._configuration$)
-            .switchMap(function (nc) {
-            var node = nc[0];
-            var configuration = nc[1];
-            return node.spatialEdges$
-                .withLatestFrom(configuration.distinguishSequence ?
-                _this._navigator.graphService
-                    .cacheSequence$(node.sequenceKey)
-                    .catch(function (error, caught) {
-                    console.error("Failed to cache sequence (" + node.sequenceKey + ")", error);
-                    return Observable_1.Observable.empty();
-                }) :
-                Observable_1.Observable.of(null));
-        })
-            .subscribe(function (es) {
-            _this._renderer.setEdges(es[0], es[1]);
-        });
-        this._renderCameraSubscription = this._container.renderService.renderCameraFrame$
-            .do(function (renderCamera) {
-            _this._renderer.setRenderCamera(renderCamera);
-        })
-            .map(function (renderCamera) {
-            return _this._renderer;
-        })
-            .filter(function (renderer) {
-            return renderer.needsRender;
-        })
-            .map(function (renderer) {
-            return { name: _this._name, vnode: renderer.render(_this._navigator) };
-        })
-            .subscribe(this._container.domRenderer.render$);
-        this._hoveredKeySubscription = Observable_1.Observable
-            .combineLatest([
-            this._container.domRenderer.element$,
-            this._container.renderService.renderCamera$,
-            this._container.mouseService.mouseMove$.startWith(null),
-            this._container.mouseService.mouseUp$.startWith(null),
-        ], function (e, rc, mm, mu) {
-            return e;
-        })
-            .map(function (element) {
-            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;
-        })
-            .distinctUntilChanged()
-            .subscribe(this._hoveredKeySubject$);
-    };
-    DirectionComponent.prototype._deactivate = function () {
-        this._configurationSubscription.unsubscribe();
-        this._nodeSubscription.unsubscribe();
-        this._renderCameraSubscription.unsubscribe();
-        this._hoveredKeySubscription.unsubscribe();
-    };
-    DirectionComponent.prototype._getDefaultConfiguration = function () {
-        return {
-            distinguishSequence: false,
-            maxWidth: 460,
-            minWidth: 260,
-        };
-    };
-    return DirectionComponent;
-}(Component_1.Component));
-/** @inheritdoc */
-DirectionComponent.componentName = "direction";
-exports.DirectionComponent = DirectionComponent;
-Component_1.ComponentService.register(DirectionComponent);
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = DirectionComponent;
-
-},{"../../Component":217,"rxjs/Observable":28,"rxjs/Subject":33,"rxjs/add/observable/combineLatest":37,"rxjs/add/operator/distinctUntilChanged":55,"rxjs/add/operator/do":56,"rxjs/add/operator/filter":58,"rxjs/add/operator/map":62,"rxjs/add/operator/share":71,"virtual-dom":173}],246:[function(require,module,exports){
-"use strict";
-var Geo_1 = require("../../Geo");
-/**
- * @class DirectionDOMCalculator
- * @classdesc Helper class for calculating DOM CSS properties.
- */
-var DirectionDOMCalculator = (function () {
-    function DirectionDOMCalculator(configuration, element) {
-        this._spatial = new Geo_1.Spatial();
-        this._minThresholdWidth = 320;
-        this._maxThresholdWidth = 1480;
-        this._minThresholdHeight = 240;
-        this._maxThresholdHeight = 820;
-        this._configure(configuration);
-        this._resize(element);
-        this._reset();
-    }
-    Object.defineProperty(DirectionDOMCalculator.prototype, "minWidth", {
-        get: function () {
-            return this._minWidth;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "maxWidth", {
-        get: function () {
-            return this._maxWidth;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "containerWidth", {
-        get: function () {
-            return this._containerWidth;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "containerWidthCss", {
-        get: function () {
-            return this._containerWidthCss;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "containerMarginCss", {
-        get: function () {
-            return this._containerMarginCss;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "containerLeftCss", {
-        get: function () {
-            return this._containerLeftCss;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "containerHeight", {
-        get: function () {
-            return this._containerHeight;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "containerHeightCss", {
-        get: function () {
-            return this._containerHeightCss;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "containerBottomCss", {
-        get: function () {
-            return this._containerBottomCss;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "stepCircleSize", {
-        get: function () {
-            return this._stepCircleSize;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "stepCircleSizeCss", {
-        get: function () {
-            return this._stepCircleSizeCss;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "stepCircleMarginCss", {
-        get: function () {
-            return this._stepCircleMarginCss;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "turnCircleSize", {
-        get: function () {
-            return this._turnCircleSize;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "turnCircleSizeCss", {
-        get: function () {
-            return this._turnCircleSizeCss;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "outerRadius", {
-        get: function () {
-            return this._outerRadius;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "innerRadius", {
-        get: function () {
-            return this._innerRadius;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "shadowOffset", {
-        get: function () {
-            return this._shadowOffset;
-        },
-        enumerable: true,
-        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 element.
-     *
-     * @param {HTMLElement} element The container element from which to extract
-     * the width and height.
-     */
-    DirectionDOMCalculator.prototype.resize = function (element) {
-        this._resize(element);
-        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 (element) {
-        this._elementWidth = element.offsetWidth;
-        this._elementHeight = element.offsetHeight;
-    };
-    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;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = DirectionDOMCalculator;
-
-},{"../../Geo":220}],247:[function(require,module,exports){
-/// <reference path="../../../typings/index.d.ts" />
-"use strict";
-var vd = require("virtual-dom");
-var Component_1 = require("../../Component");
-var Edge_1 = require("../../Edge");
-var Geo_1 = require("../../Geo");
-/**
- * @class DirectionDOMRenderer
- * @classdesc DOM renderer for direction arrows.
- */
-var DirectionDOMRenderer = (function () {
-    function DirectionDOMRenderer(configuration, element) {
-        this._isEdge = false;
-        this._spatial = new Geo_1.Spatial();
-        this._calculator = new Component_1.DirectionDOMCalculator(configuration, element);
-        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: true,
-        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 {HTMLElement} element Viewer container element.
-     */
-    DirectionDOMRenderer.prototype.resize = function (element) {
-        this._calculator.resize(element);
-        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(function (node) { return; }, function (error) { 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(function (node) { return; }, function (error) { 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(function (node) { return; }, function (error) { 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 perspectiveStyle = {
-            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", { style: perspectiveStyle }, turns.concat(steps));
-    };
-    return DirectionDOMRenderer;
-}());
-exports.DirectionDOMRenderer = DirectionDOMRenderer;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = DirectionDOMRenderer;
-
-},{"../../Component":217,"../../Edge":218,"../../Geo":220,"virtual-dom":173}],248:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Observable_1 = require("rxjs/Observable");
-var Subject_1 = require("rxjs/Subject");
-require("rxjs/add/operator/catch");
-require("rxjs/add/operator/combineLatest");
-require("rxjs/add/operator/debounceTime");
-require("rxjs/add/operator/distinctUntilChanged");
-require("rxjs/add/operator/filter");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/pairwise");
-require("rxjs/add/operator/publish");
-require("rxjs/add/operator/publishReplay");
-require("rxjs/add/operator/scan");
-require("rxjs/add/operator/skipWhile");
-require("rxjs/add/operator/startWith");
-require("rxjs/add/operator/switchMap");
-require("rxjs/add/operator/takeUntil");
-require("rxjs/add/operator/withLatestFrom");
-var Component_1 = require("../../Component");
-var Render_1 = require("../../Render");
-var Tiles_1 = require("../../Tiles");
-var Utils_1 = require("../../Utils");
-var ImagePlaneComponent = (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 Subject_1.Subject();
-        _this._rendererCreator$ = new Subject_1.Subject();
-        _this._rendererDisposer$ = new Subject_1.Subject();
-        _this._renderer$ = _this._rendererOperation$
-            .scan(function (renderer, operation) {
-            return operation(renderer);
-        }, null)
-            .filter(function (renderer) {
-            return renderer != null;
-        })
-            .distinctUntilChanged(undefined, function (renderer) {
-            return renderer.frameId;
-        });
-        _this._rendererCreator$
-            .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$
-            .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$
-            .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$
-            .map(function (frame) {
-            return function (renderer) {
-                renderer.updateFrame(frame);
-                return renderer;
-            };
-        })
-            .subscribe(this._rendererOperation$);
-        var textureProvider$ = this._navigator.stateService.currentState$
-            .distinctUntilChanged(undefined, function (frame) {
-            return frame.state.currentNode.key;
-        })
-            .combineLatest(this._configuration$)
-            .filter(function (args) {
-            return args[1].imageTiling === true;
-        })
-            .map(function (args) {
-            return args[0];
-        })
-            .withLatestFrom(this._container.glRenderer.webGLRenderer$, this._container.renderService.size$)
-            .map(function (args) {
-            var state = args[0].state;
-            var renderer = args[1];
-            var viewportSize = args[2];
-            var currentNode = state.currentNode;
-            var currentTransform = state.currentTransform;
-            var tileSize = Math.max(viewportSize.width, viewportSize.height) > 1024 ? 1024 : 512;
-            return new Tiles_1.TextureProvider(currentNode.key, currentTransform.basicWidth, currentTransform.basicHeight, tileSize, currentNode.image, _this._imageTileLoader, new Tiles_1.ImageTileStore(), renderer);
-        })
-            .publishReplay(1)
-            .refCount();
-        this._textureProviderSubscription = textureProvider$.subscribe(function () { });
-        this._setTextureProviderSubscription = textureProvider$
-            .map(function (provider) {
-            return function (renderer) {
-                renderer.setTextureProvider(provider.key, provider);
-                return renderer;
-            };
-        })
-            .subscribe(this._rendererOperation$);
-        this._abortTextureProviderSubscription = textureProvider$
-            .pairwise()
-            .subscribe(function (pair) {
-            var previous = pair[0];
-            previous.abort();
-        });
-        var roiTrigger$ = this._container.renderService.renderCameraFrame$
-            .map(function (renderCamera) {
-            return [
-                renderCamera.camera.position.clone(),
-                renderCamera.camera.lookat.clone(),
-                renderCamera.zoom.valueOf()
-            ];
-        })
-            .pairwise()
-            .skipWhile(function (pls) {
-            return pls[1][2] - pls[0][2] < 0 || pls[1][2] === 0;
-        })
-            .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];
-            return samePosition && sameLookat && sameZoom;
-        })
-            .distinctUntilChanged()
-            .filter(function (stalled) {
-            return stalled;
-        })
-            .switchMap(function (stalled) {
-            return _this._container.renderService.renderCameraFrame$
-                .first();
-        })
-            .withLatestFrom(this._container.renderService.size$, this._navigator.stateService.currentTransform$);
-        this._setRegionOfInterestSubscription = textureProvider$
-            .switchMap(function (provider) {
-            return roiTrigger$
-                .map(function (args) {
-                return [
-                    _this._roiCalculator.computeRegionOfInterest(args[0], args[1], args[2]),
-                    provider,
-                ];
-            });
-        })
-            .filter(function (args) {
-            return !args[1].disposed;
-        })
-            .subscribe(function (args) {
-            var roi = args[0];
-            var provider = args[1];
-            provider.setRegionOfInterest(roi);
-        });
-        var hasTexture$ = textureProvider$
-            .switchMap(function (provider) {
-            return provider.hasTexture$;
-        })
-            .startWith(false)
-            .publishReplay(1)
-            .refCount();
-        this._hasTextureSubscription = hasTexture$.subscribe(function () { });
-        var nodeImage$ = this._navigator.stateService.currentNode$
-            .debounceTime(1000)
-            .withLatestFrom(hasTexture$)
-            .filter(function (args) {
-            return !args[1];
-        })
-            .map(function (args) {
-            return args[0];
-        })
-            .filter(function (node) {
-            return node.pano ?
-                Utils_1.Settings.maxImageSize > Utils_1.Settings.basePanoramaSize :
-                Utils_1.Settings.maxImageSize > Utils_1.Settings.baseImageSize;
-        })
-            .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 Observable_1.Observable.empty();
-            }
-            var image$ = node
-                .cacheImage$(Utils_1.Settings.maxImageSize)
-                .map(function (n) {
-                return [n.image, n];
-            });
-            return image$
-                .takeUntil(hasTexture$
-                .filter(function (hasTexture) {
-                return hasTexture;
-            }))
-                .catch(function (error, caught) {
-                console.error("Failed to fetch high res image (" + node.key + ")", error);
-                return Observable_1.Observable.empty();
-            });
-        })
-            .publish()
-            .refCount();
-        this._updateBackgroundSubscription = nodeImage$
-            .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$
-            .map(function (imn) {
-            return function (renderer) {
-                renderer.updateTextureImage(imn[0], imn[1]);
-                return renderer;
-            };
-        })
-            .subscribe(this._rendererOperation$);
-    };
-    ImagePlaneComponent.prototype._deactivate = function () {
-        this._rendererDisposer$.next(null);
-        this._abortTextureProviderSubscription.unsubscribe();
-        this._hasTextureSubscription.unsubscribe();
-        this._rendererSubscription.unsubscribe();
-        this._setRegionOfInterestSubscription.unsubscribe();
-        this._setTextureProviderSubscription.unsubscribe();
-        this._stateSubscription.unsubscribe();
-        this._textureProviderSubscription.unsubscribe();
-        this._updateBackgroundSubscription.unsubscribe();
-        this._updateTextureImageSubscription.unsubscribe();
-    };
-    ImagePlaneComponent.prototype._getDefaultConfiguration = function () {
-        return { imageTiling: false };
-    };
-    return ImagePlaneComponent;
-}(Component_1.Component));
-ImagePlaneComponent.componentName = "imagePlane";
-exports.ImagePlaneComponent = ImagePlaneComponent;
-Component_1.ComponentService.register(ImagePlaneComponent);
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = ImagePlaneComponent;
-
-},{"../../Component":217,"../../Render":223,"../../Tiles":225,"../../Utils":226,"rxjs/Observable":28,"rxjs/Subject":33,"rxjs/add/operator/catch":49,"rxjs/add/operator/combineLatest":50,"rxjs/add/operator/debounceTime":52,"rxjs/add/operator/distinctUntilChanged":55,"rxjs/add/operator/filter":58,"rxjs/add/operator/map":62,"rxjs/add/operator/pairwise":66,"rxjs/add/operator/publish":68,"rxjs/add/operator/publishReplay":69,"rxjs/add/operator/scan":70,"rxjs/add/operator/skipWhile":74,"rxjs/add/operator/startWith":75,"rxjs/add/operator/switchMap":76,"rxjs/add/operator/takeUntil":78,"rxjs/add/operator/withLatestFrom":80}],249:[function(require,module,exports){
-/// <reference path="../../../typings/index.d.ts" />
-"use strict";
-var THREE = require("three");
-var Component_1 = require("../../Component");
-var ImagePlaneFactory = (function () {
-    function ImagePlaneFactory(imagePlaneDepth, imageSphereRadius) {
-        this._imagePlaneDepth = imagePlaneDepth != null ? imagePlaneDepth : 200;
-        this._imageSphereRadius = imageSphereRadius != null ? imageSphereRadius : 200;
-    }
-    ImagePlaneFactory.prototype.createMesh = function (node, transform) {
-        var mesh = node.pano ?
-            this._createImageSphere(node, transform) :
-            this._createImagePlane(node, transform);
-        return mesh;
-    };
-    ImagePlaneFactory.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;
-    };
-    ImagePlaneFactory.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._getFlatImagePlaneGeo(transform);
-        return new THREE.Mesh(geometry, material);
-    };
-    ImagePlaneFactory.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.ImagePlaneShaders.equirectangular.fragment,
-            side: THREE.DoubleSide,
-            transparent: true,
-            uniforms: {
-                opacity: {
-                    type: "f",
-                    value: 1,
-                },
-                phiLength: {
-                    type: "f",
-                    value: phiLength,
-                },
-                phiShift: {
-                    type: "f",
-                    value: phiShift,
-                },
-                projectorMat: {
-                    type: "m4",
-                    value: transform.rt,
-                },
-                projectorTex: {
-                    type: "t",
-                    value: texture,
-                },
-                thetaLength: {
-                    type: "f",
-                    value: thetaLength,
-                },
-                thetaShift: {
-                    type: "f",
-                    value: thetaShift,
-                },
-            },
-            vertexShader: Component_1.ImagePlaneShaders.equirectangular.vertex,
-        };
-        return materialParameters;
-    };
-    ImagePlaneFactory.prototype._createPlaneMaterialParameters = function (transform, texture) {
-        var materialParameters = {
-            depthWrite: false,
-            fragmentShader: Component_1.ImagePlaneShaders.perspective.fragment,
-            side: THREE.DoubleSide,
-            transparent: true,
-            uniforms: {
-                bbox: {
-                    type: "v4",
-                    value: new THREE.Vector4(0, 0, 1, 1),
-                },
-                opacity: {
-                    type: "f",
-                    value: 1,
-                },
-                projectorMat: {
-                    type: "m4",
-                    value: transform.projectorMatrix(),
-                },
-                projectorTex: {
-                    type: "t",
-                    value: texture,
-                },
-            },
-            vertexShader: Component_1.ImagePlaneShaders.perspective.vertex,
-        };
-        return materialParameters;
-    };
-    ImagePlaneFactory.prototype._createTexture = function (image) {
-        var texture = new THREE.Texture(image);
-        texture.minFilter = THREE.LinearFilter;
-        texture.needsUpdate = true;
-        return texture;
-    };
-    ImagePlaneFactory.prototype._useMesh = function (transform, node) {
-        return node.mesh.vertices.length &&
-            transform.scale > 1e-2 &&
-            transform.scale < 50;
-    };
-    ImagePlaneFactory.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.addAttribute("position", new THREE.BufferAttribute(positions, 3));
-        geometry.setIndex(new THREE.BufferAttribute(indices, 1));
-        return geometry;
-    };
-    ImagePlaneFactory.prototype._getImagePlaneGeo = 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 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.addAttribute("position", new THREE.BufferAttribute(positions, 3));
-        geometry.setIndex(new THREE.BufferAttribute(indices, 1));
-        return geometry;
-    };
-    ImagePlaneFactory.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.applyMatrix(new THREE.Matrix4().getInverse(transform.rt));
-        return geometry;
-    };
-    ImagePlaneFactory.prototype._getFlatImagePlaneGeo = 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;
-        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));
-        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.addAttribute("position", new THREE.BufferAttribute(positions, 3));
-        geometry.setIndex(new THREE.BufferAttribute(indices, 1));
-        return geometry;
-    };
-    return ImagePlaneFactory;
-}());
-exports.ImagePlaneFactory = ImagePlaneFactory;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = ImagePlaneFactory;
-
-},{"../../Component":217,"three":167}],250:[function(require,module,exports){
-/// <reference path="../../../typings/index.d.ts" />
-"use strict";
-var Component_1 = require("../../Component");
-var Geo_1 = require("../../Geo");
-var ImagePlaneGLRenderer = (function () {
-    function ImagePlaneGLRenderer() {
-        this._imagePlaneFactory = new Component_1.ImagePlaneFactory();
-        this._imagePlaneScene = new Component_1.ImagePlaneScene();
-        this._alpha = 0;
-        this._alphaOld = 0;
-        this._fadeOutSpeed = 0.05;
-        this._lastCamera = new Geo_1.Camera();
-        this._epsilon = 0.000001;
-        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: true,
-        configurable: true
-    });
-    Object.defineProperty(ImagePlaneGLRenderer.prototype, "needsRender", {
-        get: function () {
-            return this._needsRender;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    ImagePlaneGLRenderer.prototype.indicateNeedsRender = function () {
-        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._updateTexture = function (texture) {
-        this._needsRender = true;
-        for (var _i = 0, _a = this._imagePlaneScene.imagePlanes; _i < _a.length; _i++) {
-            var plane = _a[_i];
-            var material = plane.material;
-            var oldTexture = material.uniforms.projectorTex.value;
-            material.uniforms.projectorTex.value = null;
-            oldTexture.dispose();
-            material.uniforms.projectorTex.value = texture;
-        }
-    };
-    ImagePlaneGLRenderer.prototype.updateTextureImage = function (image, node) {
-        if (this._currentKey !== node.key) {
-            return;
-        }
-        this._needsRender = true;
-        for (var _i = 0, _a = this._imagePlaneScene.imagePlanes; _i < _a.length; _i++) {
-            var plane = _a[_i];
-            var material = plane.material;
-            var texture = material.uniforms.projectorTex.value;
-            texture.image = image;
-            texture.needsUpdate = true;
-        }
-    };
-    ImagePlaneGLRenderer.prototype.render = function (perspectiveCamera, renderer) {
-        var planeAlpha = this._imagePlaneScene.imagePlanesOld.length ? 1 : this._alpha;
-        for (var _i = 0, _a = this._imagePlaneScene.imagePlanes; _i < _a.length; _i++) {
-            var plane = _a[_i];
-            plane.material.uniforms.opacity.value = planeAlpha;
-        }
-        for (var _b = 0, _c = this._imagePlaneScene.imagePlanesOld; _b < _c.length; _b++) {
-            var plane = _c[_b];
-            plane.material.uniforms.opacity.value = this._alphaOld;
-        }
-        renderer.render(this._imagePlaneScene.scene, perspectiveCamera);
-        renderer.render(this._imagePlaneScene.sceneOld, perspectiveCamera);
-        for (var _d = 0, _e = this._imagePlaneScene.imagePlanes; _d < _e.length; _d++) {
-            var plane = _e[_d];
-            plane.material.uniforms.opacity.value = this._alpha;
-        }
-        renderer.render(this._imagePlaneScene.scene, perspectiveCamera);
-    };
-    ImagePlaneGLRenderer.prototype.clearNeedsRender = function () {
-        this._needsRender = false;
-    };
-    ImagePlaneGLRenderer.prototype.dispose = function () {
-        this._imagePlaneScene.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._imagePlaneFactory.createMesh(state.previousNode, state.previousTransform);
-                this._imagePlaneScene.updateImagePlanes([previousMesh]);
-            }
-            this._previousKey = previousKey;
-        }
-        this._currentKey = currentKey;
-        var currentMesh = this._imagePlaneFactory.createMesh(state.currentNode, state.currentTransform);
-        this._imagePlaneScene.updateImagePlanes([currentMesh]);
-        this._alphaOld = 1;
-        return true;
-    };
-    return ImagePlaneGLRenderer;
-}());
-exports.ImagePlaneGLRenderer = ImagePlaneGLRenderer;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = ImagePlaneGLRenderer;
-
-},{"../../Component":217,"../../Geo":220}],251:[function(require,module,exports){
-/// <reference path="../../../typings/index.d.ts" />
-"use strict";
-var THREE = require("three");
-var ImagePlaneScene = (function () {
-    function ImagePlaneScene() {
-        this.scene = new THREE.Scene();
-        this.sceneOld = new THREE.Scene();
-        this.imagePlanes = [];
-        this.imagePlanesOld = [];
-    }
-    ImagePlaneScene.prototype.updateImagePlanes = function (planes) {
-        this._dispose(this.imagePlanesOld, this.sceneOld);
-        for (var _i = 0, _a = this.imagePlanes; _i < _a.length; _i++) {
-            var plane = _a[_i];
-            this.scene.remove(plane);
-            this.sceneOld.add(plane);
-        }
-        for (var _b = 0, planes_1 = planes; _b < planes_1.length; _b++) {
-            var plane = planes_1[_b];
-            this.scene.add(plane);
-        }
-        this.imagePlanesOld = this.imagePlanes;
-        this.imagePlanes = planes;
-    };
-    ImagePlaneScene.prototype.addImagePlanes = function (planes) {
-        for (var _i = 0, planes_2 = planes; _i < planes_2.length; _i++) {
-            var plane = planes_2[_i];
-            this.scene.add(plane);
-            this.imagePlanes.push(plane);
-        }
-    };
-    ImagePlaneScene.prototype.addImagePlanesOld = function (planes) {
-        for (var _i = 0, planes_3 = planes; _i < planes_3.length; _i++) {
-            var plane = planes_3[_i];
-            this.sceneOld.add(plane);
-            this.imagePlanesOld.push(plane);
-        }
-    };
-    ImagePlaneScene.prototype.setImagePlanes = function (planes) {
-        this._clear();
-        this.addImagePlanes(planes);
-    };
-    ImagePlaneScene.prototype.setImagePlanesOld = function (planes) {
-        this._clearOld();
-        this.addImagePlanesOld(planes);
-    };
-    ImagePlaneScene.prototype.clear = function () {
-        this._clear();
-        this._clearOld();
-    };
-    ImagePlaneScene.prototype._clear = function () {
-        this._dispose(this.imagePlanes, this.scene);
-        this.imagePlanes.length = 0;
-    };
-    ImagePlaneScene.prototype._clearOld = function () {
-        this._dispose(this.imagePlanesOld, this.sceneOld);
-        this.imagePlanesOld.length = 0;
-    };
-    ImagePlaneScene.prototype._dispose = function (planes, scene) {
-        for (var _i = 0, planes_4 = planes; _i < planes_4.length; _i++) {
-            var plane = planes_4[_i];
-            scene.remove(plane);
-            plane.geometry.dispose();
-            plane.material.dispose();
-            var texture = plane.material.uniforms.projectorTex.value;
-            if (texture != null) {
-                texture.dispose();
-            }
-        }
-    };
-    return ImagePlaneScene;
-}());
-exports.ImagePlaneScene = ImagePlaneScene;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = ImagePlaneScene;
-
-},{"three":167}],252:[function(require,module,exports){
-/// <reference path="../../../typings/index.d.ts" />
-"use strict";
-
-var path = require("path");
-var ImagePlaneShaders = (function () {
-    function ImagePlaneShaders() {
-    }
-    return ImagePlaneShaders;
-}());
-ImagePlaneShaders.equirectangular = {
-    fragment: "#ifdef GL_ES\nprecision highp 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}",
-};
-ImagePlaneShaders.perspective = {
-    fragment: "#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform sampler2D projectorTex;\nuniform float opacity;\nuniform vec4 bbox;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    float x = vRstq.x / vRstq.w;\n    float y = vRstq.y / vRstq.w;\n\n    vec4 baseColor;\n    if (x > bbox[0] && y > bbox[1] && x < bbox[2] && y < bbox[3]) {\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}",
-};
-exports.ImagePlaneShaders = ImagePlaneShaders;
-
-},{"path":21}],253:[function(require,module,exports){
-/// <reference path="../../../typings/index.d.ts" />
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var vd = require("virtual-dom");
-var Observable_1 = require("rxjs/Observable");
-var Subject_1 = require("rxjs/Subject");
-require("rxjs/add/observable/combineLatest");
-require("rxjs/add/observable/fromEvent");
-require("rxjs/add/observable/of");
-require("rxjs/add/observable/zip");
-require("rxjs/add/operator/distinctUntilChanged");
-require("rxjs/add/operator/filter");
-require("rxjs/add/operator/first");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/merge");
-require("rxjs/add/operator/mergeMap");
-require("rxjs/add/operator/scan");
-require("rxjs/add/operator/switchMap");
-require("rxjs/add/operator/withLatestFrom");
-require("rxjs/add/operator/zip");
-var State_1 = require("../../State");
-var Render_1 = require("../../Render");
-var Utils_1 = require("../../Utils");
-var Component_1 = require("../../Component");
-var SliderState = (function () {
-    function SliderState() {
-        this._imagePlaneFactory = new Component_1.ImagePlaneFactory();
-        this._imagePlaneScene = new Component_1.ImagePlaneScene();
-        this._currentKey = null;
-        this._previousKey = null;
-        this._currentPano = false;
-        this._frameId = 0;
-        this._glNeedsRender = false;
-        this._domNeedsRender = true;
-        this._curtain = 1;
-    }
-    Object.defineProperty(SliderState.prototype, "frameId", {
-        get: function () {
-            return this._frameId;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(SliderState.prototype, "curtain", {
-        get: function () {
-            return this._curtain;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(SliderState.prototype, "glNeedsRender", {
-        get: function () {
-            return this._glNeedsRender;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(SliderState.prototype, "domNeedsRender", {
-        get: function () {
-            return this._domNeedsRender;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(SliderState.prototype, "sliderVisible", {
-        get: function () {
-            return this._sliderVisible;
-        },
-        set: function (value) {
-            this._sliderVisible = value;
-            this._domNeedsRender = true;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(SliderState.prototype, "disabled", {
-        get: function () {
-            return this._currentKey == null ||
-                this._previousKey == null ||
-                this._currentPano;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    SliderState.prototype.update = function (frame) {
-        this._updateFrameId(frame.id);
-        var needsRender = this._updateImagePlanes(frame.state);
-        this._domNeedsRender = needsRender || this._domNeedsRender;
-        needsRender = this._updateCurtain(frame.state.alpha) || needsRender;
-        this._glNeedsRender = needsRender || this._glNeedsRender;
-    };
-    SliderState.prototype.updateTexture = function (image, node) {
-        var imagePlanes = node.key === this._currentKey ?
-            this._imagePlaneScene.imagePlanes :
-            node.key === this._previousKey ?
-                this._imagePlaneScene.imagePlanesOld :
-                [];
-        if (imagePlanes.length === 0) {
-            return;
-        }
-        this._glNeedsRender = true;
-        for (var _i = 0, imagePlanes_1 = imagePlanes; _i < imagePlanes_1.length; _i++) {
-            var plane = imagePlanes_1[_i];
-            var material = plane.material;
-            var texture = material.uniforms.projectorTex.value;
-            texture.image = image;
-            texture.needsUpdate = true;
-        }
-    };
-    SliderState.prototype.render = function (perspectiveCamera, renderer) {
-        if (!this.disabled) {
-            renderer.render(this._imagePlaneScene.sceneOld, perspectiveCamera);
-        }
-        renderer.render(this._imagePlaneScene.scene, perspectiveCamera);
-    };
-    SliderState.prototype.dispose = function () {
-        this._imagePlaneScene.clear();
-    };
-    SliderState.prototype.clearGLNeedsRender = function () {
-        this._glNeedsRender = false;
-    };
-    SliderState.prototype.clearDomNeedsRender = function () {
-        this._domNeedsRender = false;
-    };
-    SliderState.prototype._updateFrameId = function (frameId) {
-        this._frameId = frameId;
-    };
-    SliderState.prototype._updateImagePlanes = function (state) {
-        if (state.currentNode == null) {
-            return;
-        }
-        var needsRender = false;
-        if (state.previousNode != null && this._previousKey !== state.previousNode.key) {
-            needsRender = true;
-            this._previousKey = state.previousNode.key;
-            this._imagePlaneScene.setImagePlanesOld([
-                this._imagePlaneFactory.createMesh(state.previousNode, state.previousTransform),
-            ]);
-        }
-        if (this._currentKey !== state.currentNode.key) {
-            needsRender = true;
-            this._currentKey = state.currentNode.key;
-            this._currentPano = state.currentNode.pano;
-            this._imagePlaneScene.setImagePlanes([
-                this._imagePlaneFactory.createMesh(state.currentNode, state.currentTransform),
-            ]);
-            if (!this.disabled) {
-                this._updateBbox();
-            }
-        }
-        return needsRender;
-    };
-    SliderState.prototype._updateCurtain = function (alpha) {
-        if (this.disabled ||
-            Math.abs(this._curtain - alpha) < 0.001) {
-            return false;
-        }
-        this._curtain = alpha;
-        this._updateBbox();
-        return true;
-    };
-    SliderState.prototype._updateBbox = function () {
-        for (var _i = 0, _a = this._imagePlaneScene.imagePlanes; _i < _a.length; _i++) {
-            var plane = _a[_i];
-            var shaderMaterial = plane.material;
-            var bbox = shaderMaterial.uniforms.bbox.value;
-            bbox.z = this._curtain;
-        }
-    };
-    return SliderState;
-}());
-var SliderComponent = (function (_super) {
-    __extends(SliderComponent, _super);
-    /**
-     * Create a new slider component instance.
-     * @class SliderComponent
-     */
-    function SliderComponent(name, container, navigator) {
-        var _this = _super.call(this, name, container, navigator) || this;
-        _this._sliderStateOperation$ = new Subject_1.Subject();
-        _this._sliderStateCreator$ = new Subject_1.Subject();
-        _this._sliderStateDisposer$ = new Subject_1.Subject();
-        _this._sliderState$ = _this._sliderStateOperation$
-            .scan(function (sliderState, operation) {
-            return operation(sliderState);
-        }, null)
-            .filter(function (sliderState) {
-            return sliderState != null;
-        })
-            .distinctUntilChanged(undefined, function (sliderState) {
-            return sliderState.frameId;
-        });
-        _this._sliderStateCreator$
-            .map(function () {
-            return function (sliderState) {
-                if (sliderState != null) {
-                    throw new Error("Multiple slider states can not be created at the same time");
-                }
-                return new SliderState();
-            };
-        })
-            .subscribe(_this._sliderStateOperation$);
-        _this._sliderStateDisposer$
-            .map(function () {
-            return function (sliderState) {
-                sliderState.dispose();
-                return null;
-            };
-        })
-            .subscribe(_this._sliderStateOperation$);
-        return _this;
-    }
-    /**
-     * Set the image keys.
-     *
-     * Configures the component to show the image planes for the supplied image keys.
-     *
-     * @param {keys} ISliderKeys - 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 initial position.
-     *
-     * 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 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._container.mouseService.preventDefaultMouseDown$.next(false);
-        this._container.touchService.preventDefaultTouchMove$.next(false);
-        Observable_1.Observable
-            .combineLatest(this._navigator.stateService.state$, this._configuration$)
-            .first()
-            .subscribe(function (stateConfig) {
-            if (stateConfig[0] === State_1.State.Traversing) {
-                _this._navigator.stateService.wait();
-                var position = stateConfig[1].initialPosition;
-                _this._navigator.stateService.moveTo(position != null ? position : 1);
-            }
-        });
-        this._glRenderSubscription = this._sliderState$
-            .map(function (sliderState) {
-            var renderHash = {
-                name: _this._name,
-                render: {
-                    frameId: sliderState.frameId,
-                    needsRender: sliderState.glNeedsRender,
-                    render: sliderState.render.bind(sliderState),
-                    stage: Render_1.GLRenderStage.Background,
-                },
-            };
-            sliderState.clearGLNeedsRender();
-            return renderHash;
-        })
-            .subscribe(this._container.glRenderer.render$);
-        this._domRenderSubscription = this._sliderState$
-            .filter(function (sliderState) {
-            return sliderState.domNeedsRender;
-        })
-            .map(function (sliderState) {
-            var sliderInput = vd.h("input.SliderControl", {
-                max: 1000,
-                min: 0,
-                type: "range",
-                value: 1000 * sliderState.curtain,
-            }, []);
-            var vNode = sliderState.disabled || !sliderState.sliderVisible ?
-                null :
-                vd.h("div.SliderWrapper", {}, [sliderInput]);
-            var hash = {
-                name: _this._name,
-                vnode: vNode,
-            };
-            sliderState.clearDomNeedsRender();
-            return hash;
-        })
-            .subscribe(this._container.domRenderer.render$);
-        this._elementSubscription = this._container.domRenderer.element$
-            .map(function (e) {
-            var nodeList = e.getElementsByClassName("SliderControl");
-            var slider = nodeList.length > 0 ? nodeList[0] : null;
-            return slider;
-        })
-            .filter(function (input) {
-            return input != null;
-        })
-            .switchMap(function (input) {
-            return Observable_1.Observable.fromEvent(input, "input");
-        })
-            .map(function (e) {
-            return Number(e.target.value) / 1000;
-        })
-            .subscribe(function (curtain) {
-            _this._navigator.stateService.moveTo(curtain);
-        });
-        this._sliderStateCreator$.next(null);
-        this._stateSubscription = this._navigator.stateService.currentState$
-            .map(function (frame) {
-            return function (sliderState) {
-                sliderState.update(frame);
-                return sliderState;
-            };
-        })
-            .subscribe(this._sliderStateOperation$);
-        this._setSliderVisibleSubscription = this._configuration$
-            .map(function (configuration) {
-            return configuration.sliderVisible == null || configuration.sliderVisible;
-        })
-            .distinctUntilChanged()
-            .map(function (sliderVisible) {
-            return function (sliderState) {
-                sliderState.sliderVisible = sliderVisible;
-                return sliderState;
-            };
-        })
-            .subscribe(this._sliderStateOperation$);
-        this._setKeysSubscription = this._configuration$
-            .filter(function (configuration) {
-            return configuration.keys != null;
-        })
-            .switchMap(function (configuration) {
-            return Observable_1.Observable
-                .zip(_this._catchCacheNode$(configuration.keys.background), _this._catchCacheNode$(configuration.keys.foreground))
-                .map(function (nodes) {
-                return { background: nodes[0], foreground: nodes[1] };
-            })
-                .zip(_this._navigator.stateService.currentState$.first())
-                .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$
-            .map(function (frame) {
-            return frame.state.previousNode;
-        })
-            .filter(function (node) {
-            return node != null;
-        })
-            .distinctUntilChanged(undefined, function (node) {
-            return node.key;
-        });
-        this._nodeSubscription = Observable_1.Observable
-            .merge(previousNode$, this._navigator.stateService.currentNode$)
-            .filter(function (node) {
-            return node.pano ?
-                Utils_1.Settings.maxImageSize > Utils_1.Settings.basePanoramaSize :
-                Utils_1.Settings.maxImageSize > Utils_1.Settings.baseImageSize;
-        })
-            .mergeMap(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 Observable_1.Observable.empty();
-            }
-            return node.cacheImage$(Utils_1.Settings.maxImageSize)
-                .map(function (n) {
-                return [n.image, n];
-            })
-                .catch(function (error, caught) {
-                console.error("Failed to fetch high res slider image (" + node.key + ")", error);
-                return Observable_1.Observable.empty();
-            });
-        })
-            .map(function (imn) {
-            return function (sliderState) {
-                sliderState.updateTexture(imn[0], imn[1]);
-                return sliderState;
-            };
-        })
-            .subscribe(this._sliderStateOperation$);
-    };
-    SliderComponent.prototype._deactivate = function () {
-        var _this = this;
-        this._container.mouseService.preventDefaultMouseDown$.next(true);
-        this._container.touchService.preventDefaultTouchMove$.next(true);
-        this._navigator.stateService.state$
-            .first()
-            .subscribe(function (state) {
-            if (state === State_1.State.Waiting) {
-                _this._navigator.stateService.traverse();
-            }
-        });
-        this._sliderStateDisposer$.next(null);
-        this._setKeysSubscription.unsubscribe();
-        this._setSliderVisibleSubscription.unsubscribe();
-        this._elementSubscription.unsubscribe();
-        this._stateSubscription.unsubscribe();
-        this._glRenderSubscription.unsubscribe();
-        this._domRenderSubscription.unsubscribe();
-        this._nodeSubscription.unsubscribe();
-        this.configure({ keys: null });
-    };
-    SliderComponent.prototype._getDefaultConfiguration = function () {
-        return {};
-    };
-    SliderComponent.prototype._catchCacheNode$ = function (key) {
-        return this._navigator.graphService.cacheNode$(key)
-            .catch(function (error, caught) {
-            console.error("Failed to cache slider node (" + key + ")", error);
-            return Observable_1.Observable.empty();
-        });
-    };
-    return SliderComponent;
-}(Component_1.Component));
-SliderComponent.componentName = "slider";
-exports.SliderComponent = SliderComponent;
-Component_1.ComponentService.register(SliderComponent);
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = SliderComponent;
-
-},{"../../Component":217,"../../Render":223,"../../State":224,"../../Utils":226,"rxjs/Observable":28,"rxjs/Subject":33,"rxjs/add/observable/combineLatest":37,"rxjs/add/observable/fromEvent":41,"rxjs/add/observable/of":44,"rxjs/add/observable/zip":46,"rxjs/add/operator/distinctUntilChanged":55,"rxjs/add/operator/filter":58,"rxjs/add/operator/first":60,"rxjs/add/operator/map":62,"rxjs/add/operator/merge":63,"rxjs/add/operator/mergeMap":65,"rxjs/add/operator/scan":70,"rxjs/add/operator/switchMap":76,"rxjs/add/operator/withLatestFrom":80,"rxjs/add/operator/zip":81,"virtual-dom":173}],254:[function(require,module,exports){
-"use strict";
-var Marker = (function () {
-    function Marker(latLonAlt, markerOptions) {
-        this.visibleInKeys = [];
-        this._id = markerOptions.id;
-        this._latLonAlt = latLonAlt;
-        this._markerOptions = markerOptions;
-        this._type = markerOptions.type;
-    }
-    Object.defineProperty(Marker.prototype, "id", {
-        get: function () {
-            return this._id;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Marker.prototype, "type", {
-        get: function () {
-            return this._type;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Marker.prototype, "latLonAlt", {
-        get: function () {
-            return this._latLonAlt;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    return Marker;
-}());
-exports.Marker = Marker;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = Marker;
-
-},{}],255:[function(require,module,exports){
-/// <reference path="../../../typings/index.d.ts" />
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var _ = require("underscore");
-var THREE = require("three");
-var rbush = require("rbush");
-var Observable_1 = require("rxjs/Observable");
-var Subject_1 = require("rxjs/Subject");
-require("rxjs/add/observable/combineLatest");
-require("rxjs/add/operator/distinctUntilChanged");
-require("rxjs/add/operator/filter");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/publishReplay");
-require("rxjs/add/operator/scan");
-require("rxjs/add/operator/switchMap");
-var Component_1 = require("../../Component");
-var Render_1 = require("../../Render");
-var Geo_1 = require("../../Geo");
-var MarkerSet = (function () {
-    function MarkerSet() {
-        this._create$ = new Subject_1.Subject();
-        this._remove$ = new Subject_1.Subject();
-        this._update$ = new Subject_1.Subject();
-        // markers list stream is the result of applying marker updates.
-        this._markers$ = this._update$
-            .scan(function (markers, operation) {
-            return operation(markers);
-        }, { hash: {}, spatial: rbush(16, [".lon", ".lat", ".lon", ".lat"]) })
-            .map(function (markers) {
-            return markers.spatial;
-        })
-            .publishReplay(1)
-            .refCount();
-        // creation stream generate creation updates from given markers.
-        this._create$
-            .map(function (marker) {
-            return function (markers) {
-                if (markers.hash[marker.id]) {
-                    markers.spatial.remove(markers.hash[marker.id]);
-                }
-                var rbushObj = {
-                    id: marker.id,
-                    lat: marker.latLonAlt.lat,
-                    lon: marker.latLonAlt.lon,
-                    marker: marker,
-                };
-                markers.spatial.insert(rbushObj);
-                markers.hash[marker.id] = rbushObj;
-                return markers;
-            };
-        })
-            .subscribe(this._update$);
-        // remove stream generates remove updates from given markers
-        this._remove$
-            .map(function (id) {
-            return function (markers) {
-                var rbushObj = markers.hash[id];
-                markers.spatial.remove(rbushObj);
-                delete markers.hash[id];
-                return markers;
-            };
-        })
-            .subscribe(this._update$);
-    }
-    MarkerSet.prototype.addMarker = function (marker) {
-        this._create$.next(marker);
-    };
-    MarkerSet.prototype.removeMarker = function (id) {
-        this._remove$.next(id);
-    };
-    Object.defineProperty(MarkerSet.prototype, "markers$", {
-        get: function () {
-            return this._markers$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    return MarkerSet;
-}());
-exports.MarkerSet = MarkerSet;
-var MarkerComponent = (function (_super) {
-    __extends(MarkerComponent, _super);
-    function MarkerComponent(name, container, navigator) {
-        return _super.call(this, name, container, navigator) || this;
-    }
-    MarkerComponent.prototype._activate = function () {
-        var _this = this;
-        this._scene = new THREE.Scene();
-        this._markerSet = new MarkerSet();
-        this._markerObjects = {};
-        this._disposable = Observable_1.Observable
-            .combineLatest([
-            this._navigator.stateService.currentState$,
-            this._markerSet.markers$,
-        ], function (frame, markers) {
-            return { frame: frame, markers: markers };
-        })
-            .distinctUntilChanged(undefined, function (args) {
-            return args.frame.id;
-        })
-            .map(function (args) {
-            return _this._renderHash(args);
-        })
-            .subscribe(this._container.glRenderer.render$);
-    };
-    MarkerComponent.prototype._deactivate = function () {
-        // release memory
-        this._disposeScene();
-        this._disposable.unsubscribe();
-    };
-    MarkerComponent.prototype._getDefaultConfiguration = function () {
-        return {};
-    };
-    MarkerComponent.prototype.createMarker = function (latLonAlt, markerOptions) {
-        if (markerOptions.type === "marker") {
-            return new Component_1.SimpleMarker(latLonAlt, markerOptions);
-        }
-        return null;
-    };
-    MarkerComponent.prototype.addMarker = function (marker) {
-        this._markerSet.addMarker(marker);
-    };
-    Object.defineProperty(MarkerComponent.prototype, "markers$", {
-        get: function () {
-            return this._markerSet.markers$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    MarkerComponent.prototype.removeMarker = function (id) {
-        this._markerSet.removeMarker(id);
-    };
-    MarkerComponent.prototype._renderHash = function (args) {
-        // determine if render is needed while updating scene
-        // specific properies.
-        var needsRender = this._updateScene(args);
-        // return render hash with render function and
-        // render in foreground.
-        return {
-            name: this._name,
-            render: {
-                frameId: args.frame.id,
-                needsRender: needsRender,
-                render: this._render.bind(this),
-                stage: Render_1.GLRenderStage.Foreground,
-            },
-        };
-    };
-    MarkerComponent.prototype._updateScene = function (args) {
-        if (!args.frame ||
-            !args.markers ||
-            !args.frame.state.currentNode) {
-            return false;
-        }
-        var needRender = false;
-        var oldObjects = this._markerObjects;
-        var node = args.frame.state.currentNode;
-        this._markerObjects = {};
-        var boxWidth = 0.001;
-        var minLon = node.latLon.lon - boxWidth / 2;
-        var minLat = node.latLon.lat - boxWidth / 2;
-        var maxLon = node.latLon.lon + boxWidth / 2;
-        var maxLat = node.latLon.lat + boxWidth / 2;
-        var markers = _.map(args.markers.search({ maxX: maxLon, maxY: maxLat, minX: minLon, minY: minLat }), function (item) {
-            return item.marker;
-        }).filter(function (marker) {
-            return marker.visibleInKeys.length === 0 || _.contains(marker.visibleInKeys, node.key);
-        });
-        for (var _i = 0, markers_1 = markers; _i < markers_1.length; _i++) {
-            var marker = markers_1[_i];
-            if (marker.id in oldObjects) {
-                this._markerObjects[marker.id] = oldObjects[marker.id];
-                delete oldObjects[marker.id];
-            }
-            else {
-                var reference = args.frame.state.reference;
-                var p = (new Geo_1.GeoCoords).geodeticToEnu(marker.latLonAlt.lat, marker.latLonAlt.lon, marker.latLonAlt.alt, reference.lat, reference.lon, reference.alt);
-                var o = marker.createGeometry();
-                o.position.set(p[0], p[1], p[2]);
-                this._scene.add(o);
-                this._markerObjects[marker.id] = o;
-                needRender = true;
-            }
-        }
-        for (var i in oldObjects) {
-            if (oldObjects.hasOwnProperty(i)) {
-                this._disposeObject(oldObjects[i]);
-                needRender = true;
-            }
-        }
-        return needRender;
-    };
-    MarkerComponent.prototype._render = function (perspectiveCamera, renderer) {
-        renderer.render(this._scene, perspectiveCamera);
-    };
-    MarkerComponent.prototype._disposeObject = function (object) {
-        this._scene.remove(object);
-        for (var i = 0; i < object.children.length; ++i) {
-            var c = object.children[i];
-            c.geometry.dispose();
-            c.material.dispose();
-        }
-    };
-    MarkerComponent.prototype._disposeScene = function () {
-        for (var i in this._markerObjects) {
-            if (this._markerObjects.hasOwnProperty(i)) {
-                this._disposeObject(this._markerObjects[i]);
-            }
-        }
-        this._markerObjects = {};
-    };
-    return MarkerComponent;
-}(Component_1.Component));
-MarkerComponent.componentName = "marker";
-exports.MarkerComponent = MarkerComponent;
-Component_1.ComponentService.register(MarkerComponent);
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = MarkerComponent;
-
-},{"../../Component":217,"../../Geo":220,"../../Render":223,"rbush":24,"rxjs/Observable":28,"rxjs/Subject":33,"rxjs/add/observable/combineLatest":37,"rxjs/add/operator/distinctUntilChanged":55,"rxjs/add/operator/filter":58,"rxjs/add/operator/map":62,"rxjs/add/operator/publishReplay":69,"rxjs/add/operator/scan":70,"rxjs/add/operator/switchMap":76,"three":167,"underscore":168}],256:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var THREE = require("three");
-var Component_1 = require("../../Component");
-var SimpleMarker = (function (_super) {
-    __extends(SimpleMarker, _super);
-    function SimpleMarker(latLonAlt, markerOptions) {
-        var _this = _super.call(this, latLonAlt, markerOptions) || this;
-        _this._circleToRayAngle = 2.0;
-        _this._simpleMarkerStyle = markerOptions.style;
-        return _this;
-    }
-    SimpleMarker.prototype.createGeometry = function () {
-        var radius = 2;
-        var cone = new THREE.Mesh(this._markerGeometry(radius, 16, 8), new THREE.MeshBasicMaterial({
-            color: this._stringToRBG(this._simpleMarkerStyle.color),
-            depthWrite: false,
-            opacity: this._simpleMarkerStyle.opacity,
-            shading: THREE.SmoothShading,
-            transparent: true,
-        }));
-        var ball = new THREE.Mesh(new THREE.SphereGeometry(radius / 2, 16, 8), new THREE.MeshBasicMaterial({
-            color: this._stringToRBG(this._simpleMarkerStyle.ballColor),
-            depthWrite: false,
-            opacity: this._simpleMarkerStyle.ballOpacity,
-            shading: THREE.SmoothShading,
-            transparent: true,
-        }));
-        ball.position.z = this._markerHeight(radius);
-        var group = new THREE.Object3D();
-        group.add(ball);
-        group.add(cone);
-        return group;
-    };
-    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;
-    };
-    SimpleMarker.prototype._stringToRBG = function (str) {
-        var ret = 0;
-        for (var i = 0; i < str.length; i++) {
-            ret = str.charCodeAt(i) + ((ret << 5) - ret);
-        }
-        return ret;
-    };
-    return SimpleMarker;
-}(Component_1.Marker));
-exports.SimpleMarker = SimpleMarker;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = SimpleMarker;
-
-},{"../../Component":217,"three":167}],257:[function(require,module,exports){
-/// <reference path="../../../typings/index.d.ts" />
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Observable_1 = require("rxjs/Observable");
-var Subject_1 = require("rxjs/Subject");
-require("rxjs/add/observable/combineLatest");
-require("rxjs/add/observable/of");
-require("rxjs/add/operator/bufferCount");
-require("rxjs/add/operator/concat");
-require("rxjs/add/operator/distinctUntilChanged");
-require("rxjs/add/operator/filter");
-require("rxjs/add/operator/finally");
-require("rxjs/add/operator/first");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/publishReplay");
-require("rxjs/add/operator/scan");
-require("rxjs/add/operator/share");
-require("rxjs/add/operator/switchMap");
-require("rxjs/add/operator/takeUntil");
-require("rxjs/add/operator/withLatestFrom");
-var Component_1 = require("../../Component");
-var Edge_1 = require("../../Edge");
-/**
- * @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 = (function (_super) {
-    __extends(SequenceComponent, _super);
-    function SequenceComponent(name, container, navigator) {
-        var _this = _super.call(this, name, container, navigator) || this;
-        _this._nodesAhead = 5;
-        _this._configurationOperation$ = new Subject_1.Subject();
-        _this._sequenceDOMRenderer = new Component_1.SequenceDOMRenderer(container.element);
-        _this._sequenceDOMInteraction = new Component_1.SequenceDOMInteraction();
-        _this._containerWidth$ = new Subject_1.Subject();
-        _this._hoveredKeySubject$ = new Subject_1.Subject();
-        _this._hoveredKey$ = _this._hoveredKeySubject$.share();
-        _this._edgeStatus$ = _this._navigator.stateService.currentNode$
-            .switchMap(function (node) {
-            return node.sequenceEdges$;
-        })
-            .publishReplay(1)
-            .refCount();
-        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: true,
-        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 });
-    };
-    /** @inheritdoc */
-    SequenceComponent.prototype.resize = function () {
-        var _this = this;
-        this._configuration$
-            .first()
-            .map(function (configuration) {
-            return _this._sequenceDOMRenderer.getContainerWidth(_this._container.element, configuration);
-        })
-            .subscribe(function (containerWidth) {
-            _this._containerWidth$.next(containerWidth);
-        });
-    };
-    SequenceComponent.prototype._activate = function () {
-        var _this = this;
-        this._renderSubscription = Observable_1.Observable
-            .combineLatest(this._edgeStatus$, this._configuration$, this._containerWidth$)
-            .map(function (ec) {
-            var edgeStatus = ec[0];
-            var configuration = ec[1];
-            var containerWidth = ec[2];
-            var vNode = _this._sequenceDOMRenderer
-                .render(edgeStatus, configuration, containerWidth, _this, _this._sequenceDOMInteraction, _this._navigator);
-            return { name: _this._name, vnode: vNode };
-        })
-            .subscribe(this._container.domRenderer.render$);
-        this._containerWidthSubscription = this._configuration$
-            .distinctUntilChanged(function (value1, value2) {
-            return value1[0] === value2[0] && value1[1] === value2[1];
-        }, function (configuration) {
-            return [configuration.minWidth, configuration.maxWidth];
-        })
-            .map(function (configuration) {
-            return _this._sequenceDOMRenderer.getContainerWidth(_this._container.element, configuration);
-        })
-            .subscribe(this._containerWidth$);
-        this._configurationSubscription = this._configurationOperation$
-            .scan(function (configuration, operation) {
-            return operation(configuration);
-        }, { playing: false })
-            .finally(function () {
-            if (_this._playingSubscription != null) {
-                _this._navigator.stateService.cutNodes();
-                _this._stop();
-            }
-        })
-            .subscribe(function () { });
-        this._configuration$
-            .map(function (newConfiguration) {
-            return function (configuration) {
-                if (newConfiguration.playing !== configuration.playing) {
-                    _this._navigator.stateService.cutNodes();
-                    if (newConfiguration.playing) {
-                        _this._play();
-                    }
-                    else {
-                        _this._stop();
-                    }
-                }
-                configuration.playing = newConfiguration.playing;
-                return configuration;
-            };
-        })
-            .subscribe(this._configurationOperation$);
-        this._stopSubscription = this._configuration$
-            .switchMap(function (configuration) {
-            var edgeStatus$ = configuration.playing ?
-                _this._edgeStatus$ :
-                Observable_1.Observable.empty();
-            var edgeDirection$ = Observable_1.Observable
-                .of(configuration.direction);
-            return Observable_1.Observable
-                .combineLatest(edgeStatus$, edgeDirection$);
-        })
-            .map(function (ne) {
-            var edgeStatus = ne[0];
-            var direction = ne[1];
-            if (!edgeStatus.cached) {
-                return true;
-            }
-            for (var _i = 0, _a = edgeStatus.edges; _i < _a.length; _i++) {
-                var edge = _a[_i];
-                if (edge.data.direction === direction) {
-                    return true;
-                }
-            }
-            return false;
-        })
-            .filter(function (hasEdge) {
-            return !hasEdge;
-        })
-            .map(function (hasEdge) {
-            return { playing: false };
-        })
-            .subscribe(this._configurationSubject$);
-        this._hoveredKeySubscription = this._sequenceDOMInteraction.mouseEnterDirection$
-            .switchMap(function (direction) {
-            return _this._edgeStatus$
-                .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;
-            })
-                .takeUntil(_this._sequenceDOMInteraction.mouseLeaveDirection$)
-                .concat(Observable_1.Observable.of(null));
-        })
-            .distinctUntilChanged()
-            .subscribe(this._hoveredKeySubject$);
-    };
-    SequenceComponent.prototype._deactivate = function () {
-        this._stopSubscription.unsubscribe();
-        this._renderSubscription.unsubscribe();
-        this._configurationSubscription.unsubscribe();
-        this._containerWidthSubscription.unsubscribe();
-        this._hoveredKeySubscription.unsubscribe();
-        this.stop();
-    };
-    SequenceComponent.prototype._getDefaultConfiguration = function () {
-        return {
-            direction: Edge_1.EdgeDirection.Next,
-            maxWidth: 117,
-            minWidth: 70,
-            playing: false,
-            visible: true,
-        };
-    };
-    SequenceComponent.prototype._play = function () {
-        var _this = this;
-        this._playingSubscription = this._navigator.stateService.currentState$
-            .filter(function (frame) {
-            return frame.state.nodesAhead < _this._nodesAhead;
-        })
-            .map(function (frame) {
-            return frame.state.lastNode;
-        })
-            .distinctUntilChanged(undefined, function (lastNode) {
-            return lastNode.key;
-        })
-            .withLatestFrom(this._configuration$, function (lastNode, configuration) {
-            return [lastNode, configuration.direction];
-        })
-            .switchMap(function (nd) {
-            return ([Edge_1.EdgeDirection.Next, Edge_1.EdgeDirection.Prev].indexOf(nd[1]) > -1 ?
-                nd[0].sequenceEdges$ :
-                nd[0].spatialEdges$)
-                .filter(function (status) {
-                return status.cached;
-            })
-                .zip(Observable_1.Observable.of(nd[1]), function (status, direction) {
-                return [status, direction];
-            });
-        })
-            .map(function (ed) {
-            var direction = ed[1];
-            for (var _i = 0, _a = ed[0].edges; _i < _a.length; _i++) {
-                var edge = _a[_i];
-                if (edge.data.direction === direction) {
-                    return edge.to;
-                }
-            }
-            return null;
-        })
-            .filter(function (key) {
-            return key != null;
-        })
-            .switchMap(function (key) {
-            return _this._navigator.graphService.cacheNode$(key);
-        })
-            .subscribe(function (node) {
-            _this._navigator.stateService.appendNodes([node]);
-        }, function (error) {
-            console.error(error);
-            _this.stop();
-        });
-        this._clearSubscription = this._navigator.stateService.currentNode$
-            .bufferCount(1, 7)
-            .subscribe(function (nodes) {
-            _this._navigator.stateService.clearPriorNodes();
-        });
-        this.fire(SequenceComponent.playingchanged, true);
-    };
-    SequenceComponent.prototype._stop = function () {
-        this._playingSubscription.unsubscribe();
-        this._playingSubscription = null;
-        this._clearSubscription.unsubscribe();
-        this._clearSubscription = null;
-        this.fire(SequenceComponent.playingchanged, false);
-    };
-    return SequenceComponent;
-}(Component_1.Component));
-/** @inheritdoc */
-SequenceComponent.componentName = "sequence";
-/**
- * Event fired when playing starts or stops.
- *
- * @event PlayerComponent#playingchanged
- * @type {boolean} Indicates whether the player is playing.
- */
-SequenceComponent.playingchanged = "playingchanged";
-exports.SequenceComponent = SequenceComponent;
-Component_1.ComponentService.register(SequenceComponent);
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = SequenceComponent;
-
-},{"../../Component":217,"../../Edge":218,"rxjs/Observable":28,"rxjs/Subject":33,"rxjs/add/observable/combineLatest":37,"rxjs/add/observable/of":44,"rxjs/add/operator/bufferCount":48,"rxjs/add/operator/concat":51,"rxjs/add/operator/distinctUntilChanged":55,"rxjs/add/operator/filter":58,"rxjs/add/operator/finally":59,"rxjs/add/operator/first":60,"rxjs/add/operator/map":62,"rxjs/add/operator/publishReplay":69,"rxjs/add/operator/scan":70,"rxjs/add/operator/share":71,"rxjs/add/operator/switchMap":76,"rxjs/add/operator/takeUntil":78,"rxjs/add/operator/withLatestFrom":80}],258:[function(require,module,exports){
-"use strict";
-var Subject_1 = require("rxjs/Subject");
-var SequenceDOMInteraction = (function () {
-    function SequenceDOMInteraction() {
-        this._mouseEnterDirection$ = new Subject_1.Subject();
-        this._mouseLeaveDirection$ = new Subject_1.Subject();
-    }
-    Object.defineProperty(SequenceDOMInteraction.prototype, "mouseEnterDirection$", {
-        get: function () {
-            return this._mouseEnterDirection$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(SequenceDOMInteraction.prototype, "mouseLeaveDirection$", {
-        get: function () {
-            return this._mouseLeaveDirection$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    return SequenceDOMInteraction;
-}());
-exports.SequenceDOMInteraction = SequenceDOMInteraction;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = SequenceDOMInteraction;
-
-},{"rxjs/Subject":33}],259:[function(require,module,exports){
-/// <reference path="../../../typings/index.d.ts" />
-"use strict";
-var vd = require("virtual-dom");
-var Edge_1 = require("../../Edge");
-var SequenceDOMRenderer = (function () {
-    function SequenceDOMRenderer(element) {
-        this._minThresholdWidth = 320;
-        this._maxThresholdWidth = 1480;
-        this._minThresholdHeight = 240;
-        this._maxThresholdHeight = 820;
-    }
-    SequenceDOMRenderer.prototype.render = function (edgeStatus, configuration, containerWidth, component, interaction, navigator) {
-        if (configuration.visible === false) {
-            return vd.h("div.SequenceContainer", {}, []);
-        }
-        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 arrows = this._createSequenceArrows(nextKey, prevKey, configuration, interaction, navigator);
-        var containerProperties = {
-            style: { height: (0.27 * containerWidth) + "px", width: containerWidth + "px" },
-        };
-        return vd.h("div.SequenceContainer", containerProperties, arrows.concat([playingButton]));
-    };
-    SequenceDOMRenderer.prototype.getContainerWidth = function (element, configuration) {
-        var elementWidth = element.offsetWidth;
-        var elementHeight = element.offsetHeight;
-        var minWidth = configuration.minWidth;
-        var maxWidth = configuration.maxWidth;
-        if (maxWidth < minWidth) {
-            maxWidth = minWidth;
-        }
-        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)));
-        return minWidth + coeff * (maxWidth - minWidth);
-    };
-    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,
-            style: {},
-        };
-        var iconClass = configuration.playing ?
-            "Stop" :
-            canPlay ? "Play" : "PlayDisabled";
-        var icon = vd.h("div.SequenceComponentIcon", { className: iconClass }, []);
-        var buttonClass = canPlay ? "SequencePlay" : "SequencePlayDisabled";
-        return vd.h("div." + buttonClass, buttonProperties, [icon]);
-    };
-    SequenceDOMRenderer.prototype._createSequenceArrows = function (nextKey, prevKey, configuration, interaction, navigator) {
-        var nextProperties = {
-            onclick: nextKey != null ?
-                function (e) {
-                    navigator.moveDir$(Edge_1.EdgeDirection.Next)
-                        .subscribe(function (node) { return; }, function (error) { console.error(error); });
-                } :
-                null,
-            onmouseenter: function (e) { interaction.mouseEnterDirection$.next(Edge_1.EdgeDirection.Next); },
-            onmouseleave: function (e) { interaction.mouseLeaveDirection$.next(Edge_1.EdgeDirection.Next); },
-            style: {},
-        };
-        var prevProperties = {
-            onclick: prevKey != null ?
-                function (e) {
-                    navigator.moveDir$(Edge_1.EdgeDirection.Prev)
-                        .subscribe(function (node) { return; }, function (error) { console.error(error); });
-                } :
-                null,
-            onmouseenter: function (e) { interaction.mouseEnterDirection$.next(Edge_1.EdgeDirection.Prev); },
-            onmouseleave: function (e) { interaction.mouseLeaveDirection$.next(Edge_1.EdgeDirection.Prev); },
-            style: {},
-        };
-        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." + nextClass, nextProperties, [nextIcon]),
-            vd.h("div." + prevClass, prevProperties, [prevIcon]),
-        ];
-    };
-    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;
-    };
-    return SequenceDOMRenderer;
-}());
-exports.SequenceDOMRenderer = SequenceDOMRenderer;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = SequenceDOMRenderer;
-
-},{"../../Edge":218,"virtual-dom":173}],260:[function(require,module,exports){
-"use strict";
-var GeometryTagError_1 = require("./error/GeometryTagError");
-exports.GeometryTagError = GeometryTagError_1.GeometryTagError;
-var PointGeometry_1 = require("./geometry/PointGeometry");
-exports.PointGeometry = PointGeometry_1.PointGeometry;
-var RectGeometry_1 = require("./geometry/RectGeometry");
-exports.RectGeometry = RectGeometry_1.RectGeometry;
-var PolygonGeometry_1 = require("./geometry/PolygonGeometry");
-exports.PolygonGeometry = PolygonGeometry_1.PolygonGeometry;
-var OutlineTag_1 = require("./tag/OutlineTag");
-exports.OutlineTag = OutlineTag_1.OutlineTag;
-var SpotTag_1 = require("./tag/SpotTag");
-exports.SpotTag = SpotTag_1.SpotTag;
-var Alignment_1 = require("./tag/Alignment");
-exports.Alignment = Alignment_1.Alignment;
-var TagComponent_1 = require("./TagComponent");
-exports.TagComponent = TagComponent_1.TagComponent;
-
-},{"./TagComponent":261,"./error/GeometryTagError":267,"./geometry/PointGeometry":269,"./geometry/PolygonGeometry":270,"./geometry/RectGeometry":271,"./tag/Alignment":273,"./tag/OutlineTag":276,"./tag/SpotTag":279}],261:[function(require,module,exports){
-/// <reference path="../../../typings/index.d.ts" />
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Observable_1 = require("rxjs/Observable");
-var Subject_1 = require("rxjs/Subject");
-require("rxjs/add/observable/combineLatest");
-require("rxjs/add/observable/empty");
-require("rxjs/add/observable/from");
-require("rxjs/add/observable/merge");
-require("rxjs/add/observable/of");
-require("rxjs/add/operator/combineLatest");
-require("rxjs/add/operator/concat");
-require("rxjs/add/operator/distinctUntilChanged");
-require("rxjs/add/operator/do");
-require("rxjs/add/operator/filter");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/merge");
-require("rxjs/add/operator/mergeMap");
-require("rxjs/add/operator/publishReplay");
-require("rxjs/add/operator/scan");
-require("rxjs/add/operator/share");
-require("rxjs/add/operator/skip");
-require("rxjs/add/operator/skipUntil");
-require("rxjs/add/operator/startWith");
-require("rxjs/add/operator/switchMap");
-require("rxjs/add/operator/take");
-require("rxjs/add/operator/takeUntil");
-require("rxjs/add/operator/withLatestFrom");
-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.
- */
-var TagComponent = (function (_super) {
-    __extends(TagComponent, _super);
-    function TagComponent(name, container, navigator) {
-        var _this = _super.call(this, name, container, navigator) || this;
-        _this._tagDomRenderer = new Component_1.TagDOMRenderer();
-        _this._tagSet = new Component_1.TagSet();
-        _this._tagCreator = new Component_1.TagCreator();
-        _this._viewportCoords = new Geo_1.ViewportCoords();
-        _this._tagGlRendererOperation$ = new Subject_1.Subject();
-        _this._tagGlRenderer$ = _this._tagGlRendererOperation$
-            .startWith(function (renderer) {
-            return renderer;
-        })
-            .scan(function (renderer, operation) {
-            return operation(renderer);
-        }, new Component_1.TagGLRenderer());
-        _this._tags$ = _this._tagSet.tagData$
-            .map(function (tagData) {
-            var tags = [];
-            // ensure that tags are always rendered in the same order
-            // to avoid hover tracking problems on first resize.
-            for (var _i = 0, _a = Object.keys(tagData).sort(); _i < _a.length; _i++) {
-                var key = _a[_i];
-                tags.push(tagData[key]);
-            }
-            return tags;
-        })
-            .share();
-        _this._renderTags$ = _this.tags$
-            .withLatestFrom(_this._navigator.stateService.currentTransform$)
-            .map(function (args) {
-            var tags = args[0];
-            var transform = args[1];
-            var renderTags = tags
-                .map(function (tag) {
-                if (tag instanceof Component_1.OutlineTag) {
-                    return new Component_1.OutlineRenderTag(tag, transform);
-                }
-                else if (tag instanceof Component_1.SpotTag) {
-                    return new Component_1.SpotRenderTag(tag, transform);
-                }
-                throw new Error("Tag type not supported");
-            });
-            return renderTags;
-        })
-            .share();
-        _this._tagChanged$ = _this._tags$
-            .switchMap(function (tags) {
-            return Observable_1.Observable
-                .from(tags)
-                .mergeMap(function (tag) {
-                return Observable_1.Observable
-                    .merge(tag.changed$, tag.geometryChanged$);
-            });
-        })
-            .share();
-        _this._renderTagGLChanged$ = _this._renderTags$
-            .switchMap(function (tags) {
-            return Observable_1.Observable
-                .from(tags)
-                .mergeMap(function (tag) {
-                return tag.glObjectsChanged$;
-            });
-        })
-            .share();
-        _this._tagInterationInitiated$ = _this._renderTags$
-            .switchMap(function (tags) {
-            return Observable_1.Observable
-                .from(tags)
-                .mergeMap(function (tag) {
-                return tag.interact$
-                    .map(function (interaction) {
-                    return interaction.tag.id;
-                });
-            });
-        })
-            .share();
-        _this._tagInteractionAbort$ = Observable_1.Observable
-            .merge(_this._container.mouseService.mouseUp$, _this._container.mouseService.mouseLeave$)
-            .map(function (e) {
-            return;
-        })
-            .share();
-        _this._activeTag$ = _this._renderTags$
-            .switchMap(function (tags) {
-            return Observable_1.Observable
-                .from(tags)
-                .mergeMap(function (tag) {
-                return tag.interact$;
-            });
-        })
-            .merge(_this._tagInteractionAbort$
-            .map(function () {
-            return { offsetX: 0, offsetY: 0, operation: Component_1.TagOperation.None, tag: null };
-        }))
-            .share();
-        _this._createGeometryChanged$ = _this._tagCreator.tag$
-            .switchMap(function (tag) {
-            return tag != null ?
-                tag.geometryChanged$ :
-                Observable_1.Observable.empty();
-        })
-            .share();
-        _this._tagCreated$ = _this._tagCreator.tag$
-            .switchMap(function (tag) {
-            return tag != null ?
-                tag.created$ :
-                Observable_1.Observable.empty();
-        })
-            .share();
-        _this._vertexGeometryCreated$ = _this._tagCreated$
-            .map(function (tag) {
-            return tag.geometry;
-        })
-            .share();
-        _this._pointGeometryCreated$ = new Subject_1.Subject();
-        _this._geometryCreated$ = Observable_1.Observable
-            .merge(_this._vertexGeometryCreated$, _this._pointGeometryCreated$)
-            .share();
-        _this._basicClick$ = _this._container.mouseService.staticClick$
-            .withLatestFrom(_this._container.renderService.renderCamera$, _this._navigator.stateService.currentTransform$, function (event, renderCamera, transform) {
-            return [event, renderCamera, transform];
-        })
-            .map(function (ert) {
-            var event = ert[0];
-            var camera = ert[1];
-            var transform = ert[2];
-            var basic = _this._mouseEventToBasic(event, _this._container.element, camera, transform);
-            return basic;
-        })
-            .share();
-        _this._validBasicClick$ = _this._basicClick$
-            .filter(function (basic) {
-            var x = basic[0];
-            var y = basic[1];
-            return 0 <= x && x <= 1 && 0 <= y && y <= 1;
-        })
-            .share();
-        _this._creatingConfiguration$ = _this._configuration$
-            .distinctUntilChanged(function (c1, c2) {
-            return c1.creating === c2.creating && c1.createType === c2.createType;
-        }, function (configuration) {
-            return {
-                createColor: configuration.createColor,
-                createType: configuration.createType,
-                creating: configuration.creating,
-            };
-        })
-            .publishReplay(1)
-            .refCount();
-        _this._creating$ = _this._creatingConfiguration$
-            .map(function (configuration) {
-            return configuration.creating;
-        })
-            .publishReplay(1)
-            .refCount();
-        _this._creating$
-            .subscribe(function (creating) {
-            _this.fire(TagComponent.creatingchanged, creating);
-        });
-        return _this;
-    }
-    Object.defineProperty(TagComponent.prototype, "tags$", {
-        /**
-         * Get tags observable.
-         *
-         * @description An observable emitting every time the items in the
-         * tag array changes.
-         *
-         * @returns {Observable<Tag[]>}
-         */
-        get: function () {
-            return this._tags$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(TagComponent.prototype, "geometryCreated$", {
-        /**
-         * Get geometry created observable.
-         *
-         * @description An observable emitting every time a geometry
-         * has been created.
-         *
-         * @returns {Observable<Geometry>}
-         */
-        get: function () {
-            return this._geometryCreated$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    /**
-     * Set the tags to display.
-     *
-     * @param {Tag[]} tags - The tags.
-     */
-    TagComponent.prototype.setTags = function (tags) {
-        this._tagSet.set$.next(tags);
-    };
-    /**
-     * Configure the component to enter create mode for
-     * creating a geometry of a certain type.
-     *
-     * @description Supported geometry types are: rect
-     *
-     * @param {string} geometryType - String specifying the geometry type.
-     */
-    TagComponent.prototype.startCreate = function (geometryType) {
-        this.configure({ createType: geometryType, creating: true });
-    };
-    /**
-     * Configure the component to leave create mode.
-     *
-     * @description A non completed geometry will be removed.
-     */
-    TagComponent.prototype.stopCreate = function () {
-        this.configure({ createType: null, creating: false });
-    };
-    TagComponent.prototype._activate = function () {
-        var _this = this;
-        this._geometryCreatedEventSubscription = this._geometryCreated$
-            .subscribe(function (geometry) {
-            _this.fire(TagComponent.geometrycreated, geometry);
-        });
-        this._tagsChangedEventSubscription = this._tags$
-            .subscribe(function (tags) {
-            _this.fire(TagComponent.tagschanged, tags);
-        });
-        var nodeChanged$ = this.configuration$
-            .switchMap(function (configuration) {
-            return configuration.creating ?
-                _this._navigator.stateService.currentNode$
-                    .skip(1)
-                    .take(1)
-                    .map(function (n) { return null; }) :
-                Observable_1.Observable.empty();
-        });
-        var tagAborted$ = this._tagCreator.tag$
-            .switchMap(function (tag) {
-            return tag != null ?
-                tag.aborted$
-                    .map(function (t) { return null; }) :
-                Observable_1.Observable.empty();
-        });
-        var tagCreated$ = this._tagCreated$
-            .map(function (t) { return null; });
-        var pointGeometryCreated$ = this._pointGeometryCreated$
-            .map(function (p) { return null; });
-        this._stopCreateSubscription = Observable_1.Observable
-            .merge(nodeChanged$, tagAborted$, tagCreated$, pointGeometryCreated$)
-            .subscribe(function () { _this.stopCreate(); });
-        this._creatorConfigurationSubscription = this._configuration$
-            .subscribe(this._tagCreator.configuration$);
-        this._createSubscription = this._creatingConfiguration$
-            .switchMap(function (configuration) {
-            return configuration.creating &&
-                configuration.createType === "rect" ||
-                configuration.createType === "polygon" ?
-                _this._validBasicClick$.take(1) :
-                Observable_1.Observable.empty();
-        })
-            .subscribe(this._tagCreator.create$);
-        this._createPointSubscription = this._creatingConfiguration$
-            .switchMap(function (configuration) {
-            return configuration.creating &&
-                configuration.createType === "point" ?
-                _this._validBasicClick$.take(1) :
-                Observable_1.Observable.empty();
-        })
-            .map(function (basic) {
-            return new Component_1.PointGeometry(basic);
-        })
-            .subscribe(this._pointGeometryCreated$);
-        this._setCreateVertexSubscription = Observable_1.Observable
-            .combineLatest(this._container.mouseService.mouseMove$, this._tagCreator.tag$, this._container.renderService.renderCamera$)
-            .filter(function (etr) {
-            return etr[1] != null;
-        })
-            .withLatestFrom(this._navigator.stateService.currentTransform$, function (etr, transform) {
-            return [etr[0], etr[1], etr[2], transform];
-        })
-            .subscribe(function (etrt) {
-            var event = etrt[0];
-            var tag = etrt[1];
-            var camera = etrt[2];
-            var transform = etrt[3];
-            var basic = _this._mouseEventToBasic(event, _this._container.element, camera, transform);
-            if (tag.geometry instanceof Component_1.RectGeometry) {
-                tag.geometry.setVertex2d(3, basic, transform);
-            }
-            else if (tag.geometry instanceof Component_1.PolygonGeometry) {
-                tag.geometry.setVertex2d(tag.geometry.polygon.length - 2, basic, transform);
-            }
-        });
-        this._addPointSubscription = this._creatingConfiguration$
-            .switchMap(function (configuration) {
-            var createType = configuration.createType;
-            return configuration.creating &&
-                (createType === "rect" || createType === "polygon") ?
-                _this._basicClick$.skipUntil(_this._validBasicClick$).skip(1) :
-                Observable_1.Observable.empty();
-        })
-            .withLatestFrom(this._tagCreator.tag$, function (basic, tag) {
-            return [basic, tag];
-        })
-            .subscribe(function (bt) {
-            var basic = bt[0];
-            var tag = bt[1];
-            tag.addPoint(basic);
-        });
-        this._deleteCreatedSubscription = this._creating$
-            .subscribe(function (creating) {
-            _this._tagCreator.delete$.next(null);
-        });
-        this._setGLCreateTagSubscription = Observable_1.Observable
-            .merge(this._tagCreator.tag$, this._createGeometryChanged$)
-            .withLatestFrom(this._navigator.stateService.currentTransform$, function (tag, transform) {
-            return [tag, transform];
-        })
-            .map(function (tt) {
-            return function (renderer) {
-                var tag = tt[0];
-                var transform = tt[1];
-                if (tag == null) {
-                    renderer.removeCreateTag();
-                }
-                else {
-                    renderer.setCreateTag(tag, transform);
-                }
-                return renderer;
-            };
-        })
-            .subscribe(this._tagGlRendererOperation$);
-        this._claimMouseSubscription = this._tagInterationInitiated$
-            .switchMap(function (id) {
-            return _this._container.mouseService.mouseMove$
-                .takeUntil(_this._tagInteractionAbort$)
-                .take(1);
-        })
-            .subscribe(function (e) {
-            _this._container.mouseService.claimMouse(_this._name, 1);
-        });
-        this._mouseDragSubscription = this._activeTag$
-            .withLatestFrom(this._container.mouseService.mouseMove$, function (a, e) {
-            return [a, e];
-        })
-            .switchMap(function (args) {
-            var activeTag = args[0];
-            var mouseMove = args[1];
-            if (activeTag.operation === Component_1.TagOperation.None) {
-                return Observable_1.Observable.empty();
-            }
-            var mouseDrag$ = Observable_1.Observable
-                .of(mouseMove)
-                .concat(_this._container.mouseService.filtered$(_this._name, _this._container.mouseService.mouseDrag$));
-            return Observable_1.Observable
-                .combineLatest(mouseDrag$, _this._container.renderService.renderCamera$)
-                .withLatestFrom(Observable_1.Observable.of(activeTag), _this._navigator.stateService.currentTransform$, function (ec, a, t) {
-                return [ec[0], ec[1], a, t];
-            });
-        })
-            .subscribe(function (args) {
-            var mouseEvent = args[0];
-            var renderCamera = args[1];
-            var activeTag = args[2];
-            var transform = args[3];
-            if (activeTag.operation === Component_1.TagOperation.None) {
-                return;
-            }
-            var basic = _this._mouseEventToBasic(mouseEvent, _this._container.element, renderCamera, transform, activeTag.offsetX, activeTag.offsetY);
-            if (activeTag.operation === Component_1.TagOperation.Centroid) {
-                activeTag.tag.geometry.setCentroid2d(basic, transform);
-            }
-            else if (activeTag.operation === Component_1.TagOperation.Vertex) {
-                var vertexGeometry = activeTag.tag.geometry;
-                vertexGeometry.setVertex2d(activeTag.vertexIndex, basic, transform);
-            }
-        });
-        this._unclaimMouseSubscription = this._container.mouseService
-            .filtered$(this._name, this._container.mouseService.mouseDragEnd$)
-            .subscribe(function (e) {
-            _this._container.mouseService.unclaimMouse(_this._name);
-        });
-        this._setTagsSubscription = this._renderTags$
-            .map(function (tags) {
-            return function (renderer) {
-                renderer.setTags(tags);
-                return renderer;
-            };
-        })
-            .subscribe(this._tagGlRendererOperation$);
-        this._updateGLTagSubscription = this._renderTagGLChanged$
-            .map(function (tag) {
-            return function (renderer) {
-                renderer.updateTag(tag);
-                return renderer;
-            };
-        })
-            .subscribe(this._tagGlRendererOperation$);
-        this._setNeedsRenderSubscription = this._tagChanged$
-            .map(function (tag) {
-            return function (renderer) {
-                renderer.setNeedsRender();
-                return renderer;
-            };
-        })
-            .subscribe(this._tagGlRendererOperation$);
-        this._domSubscription = this._renderTags$
-            .startWith([])
-            .do(function (tags) {
-            _this._container.domRenderer.render$.next({
-                name: _this._name,
-                vnode: _this._tagDomRenderer.clear(),
-            });
-        })
-            .combineLatest(this._container.renderService.renderCamera$, this._container.spriteService.spriteAtlas$, this._tagChanged$.startWith(null), this._tagCreator.tag$.merge(this._createGeometryChanged$).startWith(null), this._configuration$, function (renderTags, rc, atlas, tag, ct, c) {
-            return [rc, atlas, renderTags, tag, ct, c];
-        })
-            .withLatestFrom(this._navigator.stateService.currentTransform$, function (args, transform) {
-            return [args[0], args[1], args[2], args[3], args[4], args[5], transform];
-        })
-            .map(function (args) {
-            return {
-                name: _this._name,
-                vnode: _this._tagDomRenderer.render(args[2], args[4], args[1], args[0].perspective, args[6], args[5]),
-            };
-        })
-            .subscribe(this._container.domRenderer.render$);
-        this._glSubscription = this._navigator.stateService.currentState$
-            .withLatestFrom(this._tagGlRenderer$, function (frame, renderer) {
-            return [frame, renderer];
-        })
-            .map(function (fr) {
-            var frame = fr[0];
-            var renderer = fr[1];
-            return {
-                name: _this._name,
-                render: {
-                    frameId: frame.id,
-                    needsRender: renderer.needsRender,
-                    render: renderer.render.bind(renderer),
-                    stage: Render_1.GLRenderStage.Foreground,
-                },
-            };
-        })
-            .subscribe(this._container.glRenderer.render$);
-    };
-    TagComponent.prototype._deactivate = function () {
-        this._tagGlRendererOperation$
-            .next(function (renderer) {
-            renderer.dispose();
-            return renderer;
-        });
-        this._tagSet.set$.next([]);
-        this._tagCreator.delete$.next(null);
-        this._claimMouseSubscription.unsubscribe();
-        this._mouseDragSubscription.unsubscribe();
-        this._unclaimMouseSubscription.unsubscribe();
-        this._setTagsSubscription.unsubscribe();
-        this._updateGLTagSubscription.unsubscribe();
-        this._setNeedsRenderSubscription.unsubscribe();
-        this._stopCreateSubscription.unsubscribe();
-        this._creatorConfigurationSubscription.unsubscribe();
-        this._createSubscription.unsubscribe();
-        this._createPointSubscription.unsubscribe();
-        this._setCreateVertexSubscription.unsubscribe();
-        this._addPointSubscription.unsubscribe();
-        this._deleteCreatedSubscription.unsubscribe();
-        this._setGLCreateTagSubscription.unsubscribe();
-        this._domSubscription.unsubscribe();
-        this._glSubscription.unsubscribe();
-        this._geometryCreatedEventSubscription.unsubscribe();
-        this._tagsChangedEventSubscription.unsubscribe();
-    };
-    TagComponent.prototype._getDefaultConfiguration = function () {
-        return {
-            createColor: 0xFFFFFF,
-            creating: false,
-        };
-    };
-    TagComponent.prototype._mouseEventToBasic = function (event, element, camera, transform, offsetX, offsetY) {
-        offsetX = offsetX != null ? offsetX : 0;
-        offsetY = offsetY != null ? offsetY : 0;
-        var clientRect = element.getBoundingClientRect();
-        var canvasX = event.clientX - clientRect.left - offsetX;
-        var canvasY = event.clientY - clientRect.top - offsetY;
-        var canvasWidth = element.offsetWidth;
-        var canvasHeight = element.offsetHeight;
-        var basic = this._viewportCoords.canvasToBasic(canvasX, canvasY, canvasWidth, canvasHeight, transform, camera.perspective);
-        return basic;
-    };
-    return TagComponent;
-}(Component_1.Component));
-/** @inheritdoc */
-TagComponent.componentName = "tag";
-/**
- * Event fired when creation starts and stops.
- *
- * @event TagComponent#creatingchanged
- * @type {boolean} Indicates whether the component is creating a tag.
- */
-TagComponent.creatingchanged = "creatingchanged";
-/**
- * Event fired when a geometry has been created.
- *
- * @event TagComponent#geometrycreated
- * @type {Geometry} Created geometry.
- */
-TagComponent.geometrycreated = "geometrycreated";
-/**
- * Event fired when the tags collection has changed.
- *
- * @event TagComponent#tagschanged
- * @type {Array<Tag>} Current array of tags.
- */
-TagComponent.tagschanged = "tagschanged";
-exports.TagComponent = TagComponent;
-Component_1.ComponentService.register(TagComponent);
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = TagComponent;
-
-},{"../../Component":217,"../../Geo":220,"../../Render":223,"rxjs/Observable":28,"rxjs/Subject":33,"rxjs/add/observable/combineLatest":37,"rxjs/add/observable/empty":39,"rxjs/add/observable/from":40,"rxjs/add/observable/merge":43,"rxjs/add/observable/of":44,"rxjs/add/operator/combineLatest":50,"rxjs/add/operator/concat":51,"rxjs/add/operator/distinctUntilChanged":55,"rxjs/add/operator/do":56,"rxjs/add/operator/filter":58,"rxjs/add/operator/map":62,"rxjs/add/operator/merge":63,"rxjs/add/operator/mergeMap":65,"rxjs/add/operator/publishReplay":69,"rxjs/add/operator/scan":70,"rxjs/add/operator/share":71,"rxjs/add/operator/skip":72,"rxjs/add/operator/skipUntil":73,"rxjs/add/operator/startWith":75,"rxjs/add/operator/switchMap":76,"rxjs/add/operator/take":77,"rxjs/add/operator/takeUntil":78,"rxjs/add/operator/withLatestFrom":80}],262:[function(require,module,exports){
-"use strict";
-var Subject_1 = require("rxjs/Subject");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/scan");
-require("rxjs/add/operator/share");
-require("rxjs/add/operator/withLatestFrom");
-var Component_1 = require("../../Component");
-var TagCreator = (function () {
-    function TagCreator() {
-        this._tagOperation$ = new Subject_1.Subject();
-        this._create$ = new Subject_1.Subject();
-        this._delete$ = new Subject_1.Subject();
-        this._configuration$ = new Subject_1.Subject();
-        this._tag$ = this._tagOperation$
-            .scan(function (tag, operation) {
-            return operation(tag);
-        }, null)
-            .share();
-        this._create$
-            .withLatestFrom(this._configuration$, function (coordinate, type) {
-            return [coordinate, type];
-        })
-            .map(function (ct) {
-            return function (tag) {
-                var coordinate = ct[0];
-                var configuration = ct[1];
-                if (configuration.createType === "rect") {
-                    var geometry = new Component_1.RectGeometry([
-                        coordinate[0],
-                        coordinate[1],
-                        coordinate[0],
-                        coordinate[1],
-                    ]);
-                    return new Component_1.OutlineCreateTag(geometry, { color: configuration.createColor });
-                }
-                else if (configuration.createType === "polygon") {
-                    var geometry = new Component_1.PolygonGeometry([
-                        [coordinate[0], coordinate[1]],
-                        [coordinate[0], coordinate[1]],
-                        [coordinate[0], coordinate[1]],
-                    ]);
-                    return new Component_1.OutlineCreateTag(geometry, { color: configuration.createColor });
-                }
-                return null;
-            };
-        })
-            .subscribe(this._tagOperation$);
-        this._delete$
-            .map(function () {
-            return function (tag) {
-                return null;
-            };
-        })
-            .subscribe(this._tagOperation$);
-    }
-    Object.defineProperty(TagCreator.prototype, "create$", {
-        get: function () {
-            return this._create$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(TagCreator.prototype, "delete$", {
-        get: function () {
-            return this._delete$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(TagCreator.prototype, "configuration$", {
-        get: function () {
-            return this._configuration$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(TagCreator.prototype, "tag$", {
-        get: function () {
-            return this._tag$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    return TagCreator;
-}());
-exports.TagCreator = TagCreator;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = TagCreator;
-
-},{"../../Component":217,"rxjs/Subject":33,"rxjs/add/operator/map":62,"rxjs/add/operator/scan":70,"rxjs/add/operator/share":71,"rxjs/add/operator/withLatestFrom":80}],263:[function(require,module,exports){
-/// <reference path="../../../typings/index.d.ts" />
-"use strict";
-var THREE = require("three");
-var vd = require("virtual-dom");
-var TagDOMRenderer = (function () {
-    function TagDOMRenderer() {
-    }
-    TagDOMRenderer.prototype.render = function (tags, createTag, atlas, camera, transform, configuration) {
-        var matrixWorldInverse = new THREE.Matrix4().getInverse(camera.matrixWorld);
-        var projectionMatrix = camera.projectionMatrix;
-        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, matrixWorldInverse, projectionMatrix));
-        }
-        if (createTag != null) {
-            vNodes = vNodes.concat(createTag.getDOMObjects(transform, matrixWorldInverse, projectionMatrix));
-        }
-        var properties = {
-            style: {
-                "pointer-events": configuration.creating ? "all" : "none",
-            },
-        };
-        return vd.h("div.TagContainer", properties, vNodes);
-    };
-    TagDOMRenderer.prototype.clear = function () {
-        return vd.h("div", {}, []);
-    };
-    return TagDOMRenderer;
-}());
-exports.TagDOMRenderer = TagDOMRenderer;
-
-},{"three":167,"virtual-dom":173}],264:[function(require,module,exports){
-/// <reference path="../../../typings/index.d.ts" />
-"use strict";
-var THREE = require("three");
-var TagGLRenderer = (function () {
-    function TagGLRenderer() {
-        this._scene = new THREE.Scene();
-        this._tags = {};
-        this._createTag = null;
-        this._needsRender = false;
-    }
-    Object.defineProperty(TagGLRenderer.prototype, "needsRender", {
-        get: function () {
-            return this._needsRender;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    TagGLRenderer.prototype.render = function (perspectiveCamera, renderer) {
-        renderer.render(this._scene, perspectiveCamera);
-        this._needsRender = false;
-    };
-    TagGLRenderer.prototype.setCreateTag = function (tag, transform) {
-        this._disposeCreateTag();
-        this._addCreateTag(tag, transform);
-        this._needsRender = true;
-    };
-    TagGLRenderer.prototype.removeCreateTag = function () {
-        this._disposeCreateTag();
-        this._needsRender = true;
-    };
-    TagGLRenderer.prototype.setTags = function (tags) {
-        this._disposeTags();
-        for (var _i = 0, tags_1 = tags; _i < tags_1.length; _i++) {
-            var tag = tags_1[_i];
-            this._addTag(tag);
-        }
-        this._needsRender = true;
-    };
-    TagGLRenderer.prototype.updateTag = function (tag) {
-        for (var _i = 0, _a = this._tags[tag.tag.id][1]; _i < _a.length; _i++) {
-            var object3d = _a[_i];
-            this._scene.remove(object3d);
-        }
-        this._addTag(tag);
-    };
-    TagGLRenderer.prototype.setNeedsRender = function () {
-        this._needsRender = true;
-    };
-    TagGLRenderer.prototype.dispose = function () {
-        this._disposeTags();
-        this._disposeCreateTag();
-        this._needsRender = false;
-    };
-    TagGLRenderer.prototype._addTag = function (tag) {
-        var objects = tag.glObjects;
-        this._tags[tag.tag.id] = [tag, []];
-        for (var _i = 0, objects_1 = objects; _i < objects_1.length; _i++) {
-            var object = objects_1[_i];
-            this._tags[tag.tag.id][1].push(object);
-            this._scene.add(object);
-        }
-    };
-    TagGLRenderer.prototype._addCreateTag = function (tag, transform) {
-        var object = tag.getGLObject(transform);
-        this._createTag = object;
-        this._scene.add(object);
-    };
-    TagGLRenderer.prototype._disposeTags = function () {
-        for (var _i = 0, _a = Object.keys(this._tags); _i < _a.length; _i++) {
-            var id = _a[_i];
-            for (var _b = 0, _c = this._tags[id][1]; _b < _c.length; _b++) {
-                var object = _c[_b];
-                this._scene.remove(object);
-            }
-            this._tags[id][0].dispose();
-            delete this._tags[id];
-        }
-    };
-    TagGLRenderer.prototype._disposeCreateTag = function () {
-        if (this._createTag == null) {
-            return;
-        }
-        var mesh = this._createTag;
-        this._scene.remove(mesh);
-        mesh.geometry.dispose();
-        mesh.material.dispose();
-        this._createTag = null;
-    };
-    return TagGLRenderer;
-}());
-exports.TagGLRenderer = TagGLRenderer;
-
-},{"three":167}],265:[function(require,module,exports){
-"use strict";
-var TagOperation;
-(function (TagOperation) {
-    TagOperation[TagOperation["None"] = 0] = "None";
-    TagOperation[TagOperation["Centroid"] = 1] = "Centroid";
-    TagOperation[TagOperation["Vertex"] = 2] = "Vertex";
-})(TagOperation = exports.TagOperation || (exports.TagOperation = {}));
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = TagOperation;
-
-},{}],266:[function(require,module,exports){
-"use strict";
-var Subject_1 = require("rxjs/Subject");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/scan");
-require("rxjs/add/operator/share");
-var TagSet = (function () {
-    function TagSet() {
-        this._tagDataOperation$ = new Subject_1.Subject();
-        this._set$ = new Subject_1.Subject();
-        this._tagData$ = this._tagDataOperation$
-            .scan(function (tagData, operation) {
-            return operation(tagData);
-        }, {})
-            .share();
-        this._set$
-            .map(function (tags) {
-            return function (tagData) {
-                for (var _i = 0, _a = Object.keys(tagData); _i < _a.length; _i++) {
-                    var key = _a[_i];
-                    delete tagData[key];
-                }
-                for (var _b = 0, tags_1 = tags; _b < tags_1.length; _b++) {
-                    var tag = tags_1[_b];
-                    tagData[tag.id] = tag;
-                }
-                return tagData;
-            };
-        })
-            .subscribe(this._tagDataOperation$);
-    }
-    Object.defineProperty(TagSet.prototype, "tagData$", {
-        get: function () {
-            return this._tagData$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(TagSet.prototype, "set$", {
-        get: function () {
-            return this._set$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    return TagSet;
-}());
-exports.TagSet = TagSet;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = TagSet;
-
-},{"rxjs/Subject":33,"rxjs/add/operator/map":62,"rxjs/add/operator/scan":70,"rxjs/add/operator/share":71}],267:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Error_1 = require("../../../Error");
-var GeometryTagError = (function (_super) {
-    __extends(GeometryTagError, _super);
-    function GeometryTagError(message) {
-        var _this = _super.call(this, message != null ? message : "The provided geometry value is incorrect") || this;
-        _this.name = "GeometryTagError";
-        return _this;
-    }
-    return GeometryTagError;
-}(Error_1.MapillaryError));
-exports.GeometryTagError = GeometryTagError;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = Error_1.MapillaryError;
-
-},{"../../../Error":219}],268:[function(require,module,exports){
-"use strict";
-var Subject_1 = require("rxjs/Subject");
-/**
- * @class Geometry
- * @abstract
- * @classdesc Represents a geometry.
- */
-var Geometry = (function () {
-    /**
-     * Create a geometry.
-     *
-     * @constructor
-     */
-    function Geometry() {
-        this._notifyChanged$ = new Subject_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.
-         */
-        get: function () {
-            return this._notifyChanged$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    return Geometry;
-}());
-exports.Geometry = Geometry;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = Geometry;
-
-},{"rxjs/Subject":33}],269:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Component_1 = require("../../../Component");
-/**
- * @class PointGeometry
- * @classdesc Represents a point geometry in the basic coordinate system.
- */
-var PointGeometry = (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: true,
-        configurable: true
-    });
-    /**
-     * 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.
-     */
-    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.
-     */
-    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;
-
-},{"../../../Component":217}],270:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Component_1 = require("../../../Component");
-/**
- * @class PolygonGeometry
- * @classdesc Represents a polygon geometry in the basic coordinate system.
- */
-var PolygonGeometry = (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: true,
-        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: true,
-        configurable: true
-    });
-    /**
-     * Add a vertex to the polygon by appending it after the last vertex.
-     *
-     * @param {Array<number>} vertex - Vertex to add.
-     */
-    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);
-    };
-    /**
-     * Remove a vertex from the polygon.
-     *
-     * @param {number} index - The index of the vertex to remove.
-     */
-    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);
-    };
-    /** @inheritdoc */
-    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);
-    };
-    /** @inheritdoc */
-    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);
-    };
-    /** @inheritdoc */
-    PolygonGeometry.prototype.getPoints3d = function (transform) {
-        return this.getVertices3d(transform);
-    };
-    /** @inheritdoc */
-    PolygonGeometry.prototype.getVertex3d = function (index, transform) {
-        return transform.unprojectBasic(this._polygon[index], 200);
-    };
-    /** @inheritdoc */
-    PolygonGeometry.prototype.getVertices3d = function (transform) {
-        return this._polygon
-            .map(function (point) {
-            return transform.unprojectBasic(point, 200);
-        });
-    };
-    /**
-     * 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.
-     */
-    PolygonGeometry.prototype.getHoleVertices3d = function (transform) {
-        var holes3d = [];
-        for (var _i = 0, _a = this._holes; _i < _a.length; _i++) {
-            var hole = _a[_i];
-            var hole3d = hole
-                .map(function (point) {
-                return transform.unprojectBasic(point, 200);
-            });
-            holes3d.push(hole3d);
-        }
-        return holes3d;
-    };
-    /** @inheritdoc */
-    PolygonGeometry.prototype.getCentroid3d = function (transform) {
-        var centroid2d = this._getCentroid2d();
-        return transform.unprojectBasic(centroid2d, 200);
-    };
-    /** @inheritdoc */
-    PolygonGeometry.prototype.getTriangles3d = function (transform) {
-        return this._triangulate(this._polygon, this.getPoints3d(transform), this._holes, this.getHoleVertices3d(transform));
-    };
-    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];
-    };
-    return PolygonGeometry;
-}(Component_1.VertexGeometry));
-exports.PolygonGeometry = PolygonGeometry;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = PolygonGeometry;
-
-},{"../../../Component":217}],271:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Component_1 = require("../../../Component");
-/**
- * @class RectGeometry
- * @classdesc Represents a rectangle geometry in the basic coordinate system.
- */
-var RectGeometry = (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._rect = rect.slice(0, 4);
-        if (_this._rect[0] > _this._rect[2]) {
-            _this._inverted = true;
-        }
-        return _this;
-    }
-    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: true,
-        configurable: true
-    });
-    /**
-     * 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.
-     */
-    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.gpano) {
-            var passingBoundaryLeft = index < 2 && changed[0] > 0.75 && original[0] < 0.25 ||
-                index >= 2 && this._inverted && changed[0] > 0.75 && original[2] < 0.25;
-            var passingBoundaryRight = index < 2 && this._inverted && changed[0] < 0.25 && original[0] > 0.75 ||
-                index >= 2 && changed[0] < 0.25 && original[2] > 0.75;
-            if (passingBoundaryLeft || passingBoundaryRight) {
-                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);
-    };
-    /** @inheritdoc */
-    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.
-     */
-    RectGeometry.prototype.getPoints3d = function (transform) {
-        return this._getPoints2d(transform)
-            .map(function (point) {
-            return transform.unprojectBasic(point, 200);
-        });
-    };
-    /**
-     * 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.
-     */
-    RectGeometry.prototype.getVertex3d = function (index, transform) {
-        return transform.unprojectBasic(this._rectToVertices2d(this._rect)[index], 200);
-    };
-    /**
-     * 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.
-     */
-    RectGeometry.prototype.getVertices3d = function (transform) {
-        return this._rectToVertices2d(this._rect)
-            .map(function (vertex) {
-            return transform.unprojectBasic(vertex, 200);
-        });
-    };
-    /** @inheritdoc */
-    RectGeometry.prototype.getCentroid3d = function (transform) {
-        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 - x0) / 2;
-        var centroidY = y0 + (y1 - y0) / 2;
-        return transform.unprojectBasic([centroidX, centroidY], 200);
-    };
-    /** @inheritdoc */
-    RectGeometry.prototype.getTriangles3d = function (transform) {
-        return this._triangulate(this._rectToVertices2d(this._rect), this.getVertices3d(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.
-     */
-    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.
-     *
-     * @param {Transform} transform - The transform of the node related to
-     * the rectangle.
-     * @returns {Array<Array<number>>} Polygon array of 2D basic coordinates
-     * representing the rectangle.
-     */
-    RectGeometry.prototype._getPoints2d = function (transform) {
-        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-right corner going
-     * 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]],
-        ];
-    };
-    return RectGeometry;
-}(Component_1.VertexGeometry));
-exports.RectGeometry = RectGeometry;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = RectGeometry;
-
-},{"../../../Component":217}],272:[function(require,module,exports){
-/// <reference path="../../../../typings/index.d.ts" />
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var earcut = require("earcut");
-var Component_1 = require("../../../Component");
-/**
- * @class VertexGeometry
- * @abstract
- * @classdesc Represents a vertex geometry.
- */
-var VertexGeometry = (function (_super) {
-    __extends(VertexGeometry, _super);
-    /**
-     * Create a vertex geometry.
-     *
-     * @constructor
-     */
-    function VertexGeometry() {
-        return _super.call(this) || this;
-    }
-    /**
-     * 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.
-     */
-    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.flatten(data);
-        var indices = earcut(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;
-    };
-    return VertexGeometry;
-}(Component_1.Geometry));
-exports.VertexGeometry = VertexGeometry;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = VertexGeometry;
-
-},{"../../../Component":217,"earcut":6}],273:[function(require,module,exports){
-"use strict";
-var Alignment;
-(function (Alignment) {
-    Alignment[Alignment["Center"] = 0] = "Center";
-    Alignment[Alignment["Outer"] = 1] = "Outer";
-})(Alignment = exports.Alignment || (exports.Alignment = {}));
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = Alignment;
-
-},{}],274:[function(require,module,exports){
-/// <reference path="../../../../typings/index.d.ts" />
-"use strict";
-var THREE = require("three");
-var vd = require("virtual-dom");
-var Subject_1 = require("rxjs/Subject");
-var Component_1 = require("../../../Component");
-var OutlineCreateTag = (function () {
-    function OutlineCreateTag(geometry, options) {
-        this._geometry = geometry;
-        this._options = { color: options.color == null ? 0xFFFFFF : options.color };
-        this._created$ = new Subject_1.Subject();
-        this._aborted$ = new Subject_1.Subject();
-    }
-    Object.defineProperty(OutlineCreateTag.prototype, "geometry", {
-        get: function () {
-            return this._geometry;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(OutlineCreateTag.prototype, "created$", {
-        get: function () {
-            return this._created$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(OutlineCreateTag.prototype, "aborted$", {
-        get: function () {
-            return this._aborted$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(OutlineCreateTag.prototype, "geometryChanged$", {
-        get: function () {
-            var _this = this;
-            return this._geometry.changed$
-                .map(function (geometry) {
-                return _this;
-            });
-        },
-        enumerable: true,
-        configurable: true
-    });
-    OutlineCreateTag.prototype.getGLObject = function (transform) {
-        var polygon3d = this._geometry.getPoints3d(transform);
-        var positions = this._getPositions(polygon3d);
-        var geometry = new THREE.BufferGeometry();
-        geometry.addAttribute("position", new THREE.BufferAttribute(positions, 3));
-        var material = new THREE.LineBasicMaterial({
-            color: this._options.color,
-            linewidth: 1,
-        });
-        return new THREE.Line(geometry, material);
-    };
-    OutlineCreateTag.prototype.getDOMObjects = function (transform, matrixWorldInverse, projectionMatrix) {
-        var _this = this;
-        var vNodes = [];
-        var abort = function (e) {
-            e.stopPropagation();
-            _this._aborted$.next(_this);
-        };
-        if (this._geometry instanceof Component_1.RectGeometry) {
-            var topLeftPoint3d = this._geometry.getVertex3d(1, transform);
-            var topLeftCameraSpace = this._convertToCameraSpace(topLeftPoint3d, matrixWorldInverse);
-            if (topLeftCameraSpace.z < 0) {
-                var centerCanvas = this._projectToCanvas(topLeftCameraSpace, projectionMatrix);
-                var centerCss = centerCanvas.map(function (coord) { return (100 * coord) + "%"; });
-                var pointProperties = {
-                    style: {
-                        background: "#" + ("000000" + this._options.color.toString(16)).substr(-6),
-                        left: centerCss[0],
-                        position: "absolute",
-                        top: centerCss[1],
-                    },
-                };
-                var completerProperties = {
-                    onclick: abort,
-                    style: { left: centerCss[0], position: "absolute", top: centerCss[1] },
-                };
-                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 firstVertex3d = this._geometry.getVertex3d(0, transform);
-            var firstCameraSpace = this._convertToCameraSpace(firstVertex3d, matrixWorldInverse);
-            if (firstCameraSpace.z < 0) {
-                var centerCanvas = this._projectToCanvas(firstCameraSpace, projectionMatrix);
-                var centerCss = centerCanvas.map(function (coord) { return (100 * coord) + "%"; });
-                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 completerProperties = {
-                    onclick: firstOnclick,
-                    style: { left: centerCss[0], position: "absolute", top: centerCss[1] },
-                };
-                var firstClass = polygonGeometry_1.polygon.length > 4 ?
-                    "TagCompleter" :
-                    "TagInteractor";
-                vNodes.push(vd.h("div." + firstClass, completerProperties, []));
-            }
-            if (polygonGeometry_1.polygon.length > 3) {
-                var lastVertex3d = this._geometry.getVertex3d(polygonGeometry_1.polygon.length - 3, transform);
-                var lastCameraSpace = this._convertToCameraSpace(lastVertex3d, matrixWorldInverse);
-                if (lastCameraSpace.z < 0) {
-                    var centerCanvas = this._projectToCanvas(lastCameraSpace, projectionMatrix);
-                    var centerCss = centerCanvas.map(function (coord) { return (100 * coord) + "%"; });
-                    var remove = function (e) {
-                        e.stopPropagation();
-                        polygonGeometry_1.removeVertex2d(polygonGeometry_1.polygon.length - 3);
-                    };
-                    var completerProperties = {
-                        onclick: remove,
-                        style: { left: centerCss[0], position: "absolute", top: centerCss[1] },
-                    };
-                    vNodes.push(vd.h("div.TagInteractor", completerProperties, []));
-                }
-            }
-            var vertices3d = this._geometry.getVertices3d(transform);
-            vertices3d.splice(-2, 2);
-            for (var _i = 0, vertices3d_1 = vertices3d; _i < vertices3d_1.length; _i++) {
-                var vertex = vertices3d_1[_i];
-                var vertexCameraSpace = this._convertToCameraSpace(vertex, matrixWorldInverse);
-                if (vertexCameraSpace.z < 0) {
-                    var centerCanvas = this._projectToCanvas(vertexCameraSpace, projectionMatrix);
-                    var centerCss = centerCanvas.map(function (coord) { return (100 * coord) + "%"; });
-                    var pointProperties = {
-                        style: {
-                            background: "#" + ("000000" + this._options.color.toString(16)).substr(-6),
-                            left: centerCss[0],
-                            position: "absolute",
-                            top: centerCss[1],
-                        },
-                    };
-                    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._getPositions = 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;
-    };
-    OutlineCreateTag.prototype._projectToCanvas = function (point, projectionMatrix) {
-        var projected = new THREE.Vector3(point.x, point.y, point.z)
-            .applyProjection(projectionMatrix);
-        return [(projected.x + 1) / 2, (-projected.y + 1) / 2];
-    };
-    OutlineCreateTag.prototype._convertToCameraSpace = function (point, matrixWorldInverse) {
-        return new THREE.Vector3(point[0], point[1], point[2]).applyMatrix4(matrixWorldInverse);
-    };
-    return OutlineCreateTag;
-}());
-exports.OutlineCreateTag = OutlineCreateTag;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = OutlineCreateTag;
-
-},{"../../../Component":217,"rxjs/Subject":33,"three":167,"virtual-dom":173}],275:[function(require,module,exports){
-/// <reference path="../../../../typings/index.d.ts" />
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var THREE = require("three");
-var vd = require("virtual-dom");
-var Component_1 = require("../../../Component");
-var Viewer_1 = require("../../../Viewer");
-/**
- * @class OutlineRenderTag
- * @classdesc Tag visualizing the properties of an OutlineTag.
- */
-var OutlineRenderTag = (function (_super) {
-    __extends(OutlineRenderTag, _super);
-    function OutlineRenderTag(tag, transform) {
-        var _this = _super.call(this, tag, transform) || this;
-        _this._fill = _this._tag.fillOpacity > 0 && !transform.gpano ?
-            _this._createFill() :
-            null;
-        _this._holes = _this._tag.lineWidth >= 1 ?
-            _this._createHoles() :
-            [];
-        _this._outline = _this._tag.lineWidth >= 1 ?
-            _this._createOutline() :
-            null;
-        _this._glObjects = _this._createGLObjects();
-        _this._tag.geometry.changed$
-            .subscribe(function (geometry) {
-            if (_this._fill != null) {
-                _this._updateFillGeometry();
-            }
-            if (_this._holes.length > 0) {
-                _this._updateHoleGeometries();
-            }
-            if (_this._outline != null) {
-                _this._updateOulineGeometry();
-            }
-        });
-        _this._tag.changed$
-            .subscribe(function (changedTag) {
-            var glObjectsChanged = false;
-            if (_this._fill == null) {
-                if (_this._tag.fillOpacity > 0 && !_this._transform.gpano) {
-                    _this._fill = _this._createFill();
-                    glObjectsChanged = true;
-                }
-            }
-            else {
-                _this._updateFillMaterial();
-            }
-            if (_this._outline == null) {
-                if (_this._tag.lineWidth > 0) {
-                    _this._holes = _this._createHoles();
-                    _this._outline = _this._createOutline();
-                    glObjectsChanged = true;
-                }
-            }
-            else {
-                _this._updateHoleMaterials();
-                _this._updateOutlineMaterial();
-            }
-            if (glObjectsChanged) {
-                _this._glObjects = _this._createGLObjects();
-                _this._glObjectsChanged$.next(_this);
-            }
-        });
-        return _this;
-    }
-    OutlineRenderTag.prototype.dispose = function () {
-        this._disposeFill();
-        this._disposeHoles();
-        this._disposeOutline();
-    };
-    OutlineRenderTag.prototype.getDOMObjects = function (atlas, matrixWorldInverse, projectionMatrix) {
-        var _this = this;
-        var vNodes = [];
-        if (this._tag.geometry instanceof Component_1.RectGeometry) {
-            if (this._tag.icon != null) {
-                var iconVertex = this._tag.geometry.getVertex3d(this._tag.iconIndex, this._transform);
-                var iconCameraSpace = this._convertToCameraSpace(iconVertex, matrixWorldInverse);
-                if (iconCameraSpace.z < 0) {
-                    var interact = function (e) {
-                        _this._interact$.next({ offsetX: 0, offsetY: 0, operation: Component_1.TagOperation.None, tag: _this._tag });
-                    };
-                    if (atlas.loaded) {
-                        var spriteAlignments = this._getSpriteAlignment(this._tag.iconIndex, this._tag.iconAlignment);
-                        var sprite = atlas.getDOMSprite(this._tag.icon, spriteAlignments[0], spriteAlignments[1]);
-                        var click = function (e) {
-                            e.stopPropagation();
-                            _this._tag.click$.next(_this._tag);
-                        };
-                        var iconCanvas = this._projectToCanvas(iconCameraSpace, projectionMatrix);
-                        var iconCss = iconCanvas.map(function (coord) { return (100 * coord) + "%"; });
-                        var properties = {
-                            onclick: click,
-                            onmousedown: interact,
-                            style: {
-                                left: iconCss[0],
-                                pointerEvents: "all",
-                                position: "absolute",
-                                top: iconCss[1],
-                            },
-                        };
-                        vNodes.push(vd.h("div.TagSymbol", properties, [sprite]));
-                    }
-                }
-            }
-            else if (this._tag.text != null) {
-                var textVertex = this._tag.geometry.getVertex3d(3, this._transform);
-                var textCameraSpace = this._convertToCameraSpace(textVertex, matrixWorldInverse);
-                if (textCameraSpace.z < 0) {
-                    var interact = function (e) {
-                        _this._interact$.next({ offsetX: 0, offsetY: 0, operation: Component_1.TagOperation.None, tag: _this._tag });
-                    };
-                    var labelCanvas = this._projectToCanvas(textCameraSpace, projectionMatrix);
-                    var labelCss = labelCanvas.map(function (coord) { return (100 * coord) + "%"; });
-                    var properties = {
-                        onmousedown: interact,
-                        style: {
-                            color: "#" + ("000000" + this._tag.textColor.toString(16)).substr(-6),
-                            left: labelCss[0],
-                            pointerEvents: "all",
-                            position: "absolute",
-                            top: labelCss[1],
-                        },
-                        textContent: this._tag.text,
-                    };
-                    vNodes.push(vd.h("span.TagSymbol", properties, []));
-                }
-            }
-        }
-        if (!this._tag.editable) {
-            return vNodes;
-        }
-        var lineColor = "#" + ("000000" + this._tag.lineColor.toString(16)).substr(-6);
-        if (this._tag.geometry instanceof Component_1.RectGeometry) {
-            var centroid3d = this._tag.geometry.getCentroid3d(this._transform);
-            var centroidCameraSpace = this._convertToCameraSpace(centroid3d, matrixWorldInverse);
-            if (centroidCameraSpace.z < 0) {
-                var interact = this._interact(Component_1.TagOperation.Centroid);
-                var centerCanvas = this._projectToCanvas(centroidCameraSpace, projectionMatrix);
-                var centerCss = centerCanvas.map(function (coord) { return (100 * coord) + "%"; });
-                var properties = {
-                    onmousedown: interact,
-                    style: { background: lineColor, left: centerCss[0], position: "absolute", top: centerCss[1] },
-                };
-                vNodes.push(vd.h("div.TagMover", properties, []));
-            }
-        }
-        var vertices3d = this._tag.geometry.getVertices3d(this._transform);
-        for (var i = 0; i < vertices3d.length - 1; i++) {
-            var isRectGeometry = this._tag.geometry instanceof Component_1.RectGeometry;
-            if (isRectGeometry &&
-                ((this._tag.icon != null && i === this._tag.iconIndex) ||
-                    (this._tag.icon == null && this._tag.text != null && i === 3))) {
-                continue;
-            }
-            var vertexCameraSpace = this._convertToCameraSpace(vertices3d[i], matrixWorldInverse);
-            if (vertexCameraSpace.z > 0) {
-                continue;
-            }
-            var interact = this._interact(Component_1.TagOperation.Vertex, i);
-            var vertexCanvas = this._projectToCanvas(vertexCameraSpace, projectionMatrix);
-            var vertexCss = vertexCanvas.map(function (coord) { return (100 * coord) + "%"; });
-            var properties = {
-                onmousedown: interact,
-                style: {
-                    background: lineColor,
-                    left: vertexCss[0],
-                    position: "absolute",
-                    top: vertexCss[1],
-                },
-            };
-            if (isRectGeometry) {
-                properties.style.cursor = i % 2 === 0 ? "nesw-resize" : "nwse-resize";
-            }
-            vNodes.push(vd.h("div.TagResizer", properties, []));
-            if (!this._tag.indicateVertices) {
-                continue;
-            }
-            var pointProperties = {
-                style: {
-                    background: lineColor,
-                    left: vertexCss[0],
-                    position: "absolute",
-                    top: vertexCss[1],
-                },
-            };
-            vNodes.push(vd.h("div.TagVertex", pointProperties, []));
-        }
-        return vNodes;
-    };
-    OutlineRenderTag.prototype._createFill = function () {
-        var triangles = this._tag.geometry.getTriangles3d(this._transform);
-        var positions = new Float32Array(triangles);
-        var geometry = new THREE.BufferGeometry();
-        geometry.addAttribute("position", new THREE.BufferAttribute(positions, 3));
-        geometry.computeBoundingSphere();
-        var material = new THREE.MeshBasicMaterial({
-            color: this._tag.fillColor,
-            opacity: this._tag.fillOpacity,
-            side: THREE.DoubleSide,
-            transparent: true,
-        });
-        return new THREE.Mesh(geometry, material);
-    };
-    OutlineRenderTag.prototype._createGLObjects = 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._createHoles = function () {
-        var holes = [];
-        if (this._tag.geometry instanceof Component_1.PolygonGeometry) {
-            var polygonGeometry = this._tag.geometry;
-            var holes3d = polygonGeometry.getHoleVertices3d(this._transform);
-            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._createLine = function (points3d) {
-        var positions = this._getLinePositions(points3d);
-        var geometry = new THREE.BufferGeometry();
-        geometry.addAttribute("position", new THREE.BufferAttribute(positions, 3));
-        geometry.computeBoundingSphere();
-        var material = new THREE.LineBasicMaterial({
-            color: this._tag.lineColor,
-            linewidth: this._tag.lineWidth,
-        });
-        return new THREE.Line(geometry, material);
-    };
-    OutlineRenderTag.prototype._createOutline = function () {
-        var points3d = this._tag.geometry.getPoints3d(this._transform);
-        return this._createLine(points3d);
-    };
-    OutlineRenderTag.prototype._disposeFill = function () {
-        if (this._fill == null) {
-            return;
-        }
-        this._fill.geometry.dispose();
-        this._fill.material.dispose();
-        this._fill = null;
-    };
-    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._disposeOutline = function () {
-        if (this._outline == null) {
-            return;
-        }
-        this._outline.geometry.dispose();
-        this._outline.material.dispose();
-        this._outline = null;
-    };
-    OutlineRenderTag.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;
-    };
-    OutlineRenderTag.prototype._getSpriteAlignment = function (index, alignment) {
-        var horizontalAlignment = Viewer_1.SpriteAlignment.Center;
-        var verticalAlignment = Viewer_1.SpriteAlignment.Center;
-        if (alignment === Component_1.Alignment.Outer) {
-            switch (index) {
-                case 0:
-                    horizontalAlignment = Viewer_1.SpriteAlignment.End;
-                    verticalAlignment = Viewer_1.SpriteAlignment.Start;
-                    break;
-                case 1:
-                    horizontalAlignment = Viewer_1.SpriteAlignment.End;
-                    verticalAlignment = Viewer_1.SpriteAlignment.End;
-                    break;
-                case 2:
-                    horizontalAlignment = Viewer_1.SpriteAlignment.Start;
-                    verticalAlignment = Viewer_1.SpriteAlignment.End;
-                    break;
-                case 3:
-                    horizontalAlignment = Viewer_1.SpriteAlignment.Start;
-                    verticalAlignment = Viewer_1.SpriteAlignment.Start;
-                    break;
-                default:
-                    break;
-            }
-        }
-        return [horizontalAlignment, verticalAlignment];
-    };
-    OutlineRenderTag.prototype._interact = function (operation, 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({
-                offsetX: offsetX,
-                offsetY: offsetY,
-                operation: operation,
-                tag: _this._tag,
-                vertexIndex: vertexIndex,
-            });
-        };
-    };
-    OutlineRenderTag.prototype._updateFillGeometry = function () {
-        var triangles = this._tag.geometry.getTriangles3d(this._transform);
-        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.addAttribute("position", new THREE.BufferAttribute(positions, 3));
-        }
-        geometry.computeBoundingSphere();
-    };
-    OutlineRenderTag.prototype._updateFillMaterial = function () {
-        var material = this._fill.material;
-        material.color = new THREE.Color(this._tag.fillColor);
-        material.opacity = this._tag.fillOpacity;
-        material.needsUpdate = true;
-    };
-    OutlineRenderTag.prototype._updateHoleGeometries = function () {
-        var polygonGeometry = this._tag.geometry;
-        var holes3d = polygonGeometry.getHoleVertices3d(this._transform);
-        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];
-            var material = hole.material;
-            this._updateLineBasicMaterial(material);
-        }
-    };
-    OutlineRenderTag.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();
-    };
-    OutlineRenderTag.prototype._updateOulineGeometry = function () {
-        var points3d = this._tag.geometry.getPoints3d(this._transform);
-        this._updateLine(this._outline, points3d);
-    };
-    OutlineRenderTag.prototype._updateOutlineMaterial = function () {
-        var material = this._outline.material;
-        this._updateLineBasicMaterial(material);
-    };
-    OutlineRenderTag.prototype._updateLineBasicMaterial = function (material) {
-        material.color = new THREE.Color(this._tag.lineColor);
-        material.linewidth = Math.max(this._tag.lineWidth, 1);
-        material.opacity = this._tag.lineWidth >= 1 ? 1 : 0;
-        material.transparent = this._tag.lineWidth <= 0;
-        material.needsUpdate = true;
-    };
-    return OutlineRenderTag;
-}(Component_1.RenderTag));
-exports.OutlineRenderTag = OutlineRenderTag;
-
-},{"../../../Component":217,"../../../Viewer":227,"three":167,"virtual-dom":173}],276:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subject_1 = require("rxjs/Subject");
-var Component_1 = require("../../../Component");
-/**
- * @class OutlineTag
- * @classdesc Tag holding properties for visualizing a geometry outline.
- */
-var OutlineTag = (function (_super) {
-    __extends(OutlineTag, _super);
-    /**
-     * Create an outline tag.
-     *
-     * @override
-     * @constructor
-     * @param {string} id
-     * @param {Geometry} geometry
-     * @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;
-        _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._icon = options.icon === undefined ? null : options.icon;
-        _this._iconAlignment = options.iconAlignment == null ? Component_1.Alignment.Outer : options.iconAlignment;
-        _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._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 Subject_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: true,
-        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) {
-            this._editable = value;
-            this._notifyChanged$.next(this);
-        },
-        enumerable: true,
-        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: true,
-        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: true,
-        configurable: true
-    });
-    Object.defineProperty(OutlineTag.prototype, "geometry", {
-        get: function () {
-            return this._geometry;
-        },
-        enumerable: true,
-        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: true,
-        configurable: true
-    });
-    Object.defineProperty(OutlineTag.prototype, "iconAlignment", {
-        /**
-         * Get icon alignment property.
-         * @returns {Alignment}
-         */
-        get: function () {
-            return this._iconAlignment;
-        },
-        /**
-         * Set icon alignment property.
-         * @param {Alignment}
-         *
-         * @fires Tag#changed
-         */
-        set: function (value) {
-            this._iconAlignment = value;
-            this._notifyChanged$.next(this);
-        },
-        enumerable: true,
-        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: true,
-        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: true,
-        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: true,
-        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: true,
-        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: true,
-        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: true,
-        configurable: true
-    });
-    /**
-     * Set options for tag.
-     *
-     * @description Sets all the option properties provided and keps
-     * the rest of the values as is.
-     *
-     * @param {IOutlineTagOptions} options - Outline tag options
-     *
-     * @fires {Tag#changed}
-     */
-    OutlineTag.prototype.setOptions = function (options) {
-        this._editable = options.editable == null ? this._editable : options.editable;
-        this._icon = options.icon === undefined ? this._icon : options.icon;
-        this._iconAlignment = options.iconAlignment == null ? this._iconAlignment : options.iconAlignment;
-        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);
-    };
-    return OutlineTag;
-}(Component_1.Tag));
-/**
- * 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";
-exports.OutlineTag = OutlineTag;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = OutlineTag;
-
-},{"../../../Component":217,"rxjs/Subject":33}],277:[function(require,module,exports){
-/// <reference path="../../../../typings/index.d.ts" />
-"use strict";
-var THREE = require("three");
-var Subject_1 = require("rxjs/Subject");
-var RenderTag = (function () {
-    function RenderTag(tag, transform) {
-        this._tag = tag;
-        this._transform = transform;
-        this._glObjects = [];
-        this._glObjectsChanged$ = new Subject_1.Subject();
-        this._interact$ = new Subject_1.Subject();
-    }
-    Object.defineProperty(RenderTag.prototype, "glObjects", {
-        /**
-         * Get the GL objects for rendering of the tag.
-         * @return {Array<Object3D>}
-         */
-        get: function () {
-            return this._glObjects;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(RenderTag.prototype, "glObjectsChanged$", {
-        get: function () {
-            return this._glObjectsChanged$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(RenderTag.prototype, "interact$", {
-        get: function () {
-            return this._interact$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(RenderTag.prototype, "tag", {
-        get: function () {
-            return this._tag;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    RenderTag.prototype._projectToCanvas = function (point3d, projectionMatrix) {
-        var projected = new THREE.Vector3(point3d.x, point3d.y, point3d.z)
-            .applyProjection(projectionMatrix);
-        return [(projected.x + 1) / 2, (-projected.y + 1) / 2];
-    };
-    RenderTag.prototype._convertToCameraSpace = function (point3d, matrixWorldInverse) {
-        return new THREE.Vector3(point3d[0], point3d[1], point3d[2]).applyMatrix4(matrixWorldInverse);
-    };
-    return RenderTag;
-}());
-exports.RenderTag = RenderTag;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = RenderTag;
-
-},{"rxjs/Subject":33,"three":167}],278:[function(require,module,exports){
-/// <reference path="../../../../typings/index.d.ts" />
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-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 = (function (_super) {
-    __extends(SpotRenderTag, _super);
-    function SpotRenderTag() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    SpotRenderTag.prototype.dispose = function () { return; };
-    SpotRenderTag.prototype.getDOMObjects = function (atlas, matrixWorldInverse, projectionMatrix) {
-        var _this = this;
-        var vNodes = [];
-        var centroid3d = this._tag.geometry.getCentroid3d(this._transform);
-        var centroidCameraSpace = this._convertToCameraSpace(centroid3d, matrixWorldInverse);
-        if (centroidCameraSpace.z < 0) {
-            var centroidCanvas = this._projectToCanvas(centroidCameraSpace, projectionMatrix);
-            var centroidCss = centroidCanvas.map(function (coord) { return (100 * coord) + "%"; });
-            var interactNone = function (e) {
-                _this._interact$.next({ offsetX: 0, offsetY: 0, operation: Component_1.TagOperation.None, tag: _this._tag });
-            };
-            if (this._tag.icon != null) {
-                if (atlas.loaded) {
-                    var sprite = atlas.getDOMSprite(this._tag.icon, Viewer_1.SpriteAlignment.Center, Viewer_1.SpriteAlignment.End);
-                    var properties = {
-                        onmousedown: interactNone,
-                        style: {
-                            bottom: 100 * (1 - centroidCanvas[1]) + "%",
-                            left: centroidCss[0],
-                            pointerEvents: "all",
-                            position: "absolute",
-                            transform: "translate(0px, -8px)",
-                        },
-                    };
-                    vNodes.push(vd.h("div", properties, [sprite]));
-                }
-            }
-            else if (this._tag.text != null) {
-                var properties = {
-                    onmousedown: interactNone,
-                    style: {
-                        bottom: 100 * (1 - centroidCanvas[1]) + "%",
-                        color: "#" + ("000000" + this._tag.textColor.toString(16)).substr(-6),
-                        left: centroidCss[0],
-                        pointerEvents: "all",
-                        position: "absolute",
-                        transform: "translate(-50%, -7px)",
-                    },
-                    textContent: this._tag.text,
-                };
-                vNodes.push(vd.h("span.TagSymbol", properties, []));
-            }
-            var interact = this._interact(Component_1.TagOperation.Centroid);
-            var background = "#" + ("000000" + this._tag.color.toString(16)).substr(-6);
-            if (this._tag.editable) {
-                var interactorProperties = {
-                    onmousedown: interact,
-                    style: {
-                        background: background,
-                        left: centroidCss[0],
-                        pointerEvents: "all",
-                        position: "absolute",
-                        top: centroidCss[1],
-                    },
-                };
-                vNodes.push(vd.h("div.TagSpotInteractor", interactorProperties, []));
-            }
-            var pointProperties = {
-                style: {
-                    background: background,
-                    left: centroidCss[0],
-                    position: "absolute",
-                    top: centroidCss[1],
-                },
-            };
-            vNodes.push(vd.h("div.TagVertex", pointProperties, []));
-        }
-        return vNodes;
-    };
-    SpotRenderTag.prototype._interact = function (operation, 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({
-                offsetX: offsetX,
-                offsetY: offsetY,
-                operation: operation,
-                tag: _this._tag,
-                vertexIndex: vertexIndex,
-            });
-        };
-    };
-    return SpotRenderTag;
-}(Component_1.RenderTag));
-exports.SpotRenderTag = SpotRenderTag;
-
-},{"../../../Component":217,"../../../Viewer":227,"virtual-dom":173}],279:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Component_1 = require("../../../Component");
-/**
- * @class SpotTag
- * @classdesc Tag holding properties for visualizing the centroid of a geometry.
- */
-var SpotTag = (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;
-        _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: true,
-        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: true,
-        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: true,
-        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: true,
-        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: true,
-        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;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = SpotTag;
-
-},{"../../../Component":217}],280:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Subject_1 = require("rxjs/Subject");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/share");
-var Utils_1 = require("../../../Utils");
-/**
- * @class Tag
- * @abstract
- * @classdesc Abstract class representing the basic functionality of for a tag.
- */
-var Tag = (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 Subject_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: true,
-        configurable: true
-    });
-    Object.defineProperty(Tag.prototype, "geometry", {
-        /**
-         * Get geometry property.
-         * @returns {Geometry}
-         */
-        get: function () {
-            return this._geometry;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Tag.prototype, "changed$", {
-        /**
-         * Get changed observable.
-         * @returns {Observable<Tag>}
-         */
-        get: function () {
-            return this._notifyChanged$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Tag.prototype, "geometryChanged$", {
-        /**
-         * Get geometry changed observable.
-         * @returns {Observable<Tag>}
-         */
-        get: function () {
-            var _this = this;
-            return this._geometry.changed$
-                .map(function (geometry) {
-                return _this;
-            })
-                .share();
-        },
-        enumerable: true,
-        configurable: true
-    });
-    return Tag;
-}(Utils_1.EventEmitter));
-/**
- * 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";
-exports.Tag = Tag;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = Tag;
-
-},{"../../../Utils":226,"rxjs/Subject":33,"rxjs/add/operator/map":62,"rxjs/add/operator/share":71}],281:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var MapillaryError_1 = require("./MapillaryError");
-var ArgumentMapillaryError = (function (_super) {
-    __extends(ArgumentMapillaryError, _super);
-    function ArgumentMapillaryError(message) {
-        var _this = _super.call(this, message != null ? message : "The argument is not valid.") || this;
-        _this.name = "ArgumentMapillaryError";
-        return _this;
-    }
-    return ArgumentMapillaryError;
-}(MapillaryError_1.MapillaryError));
-exports.ArgumentMapillaryError = ArgumentMapillaryError;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = ArgumentMapillaryError;
-
-},{"./MapillaryError":283}],282:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var MapillaryError_1 = require("./MapillaryError");
-var GraphMapillaryError = (function (_super) {
-    __extends(GraphMapillaryError, _super);
-    function GraphMapillaryError(message) {
-        var _this = _super.call(this, message) || this;
-        _this.name = "GraphMapillaryError";
-        return _this;
-    }
-    return GraphMapillaryError;
-}(MapillaryError_1.MapillaryError));
-exports.GraphMapillaryError = GraphMapillaryError;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = GraphMapillaryError;
-
-},{"./MapillaryError":283}],283:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var MapillaryError = (function (_super) {
-    __extends(MapillaryError, _super);
-    function MapillaryError(message) {
-        var _this = _super.call(this, message) || this;
-        _this.name = "MapillaryError";
-        return _this;
-    }
-    return MapillaryError;
-}(Error));
-exports.MapillaryError = MapillaryError;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = MapillaryError;
-
-},{}],284:[function(require,module,exports){
-/// <reference path="../../typings/index.d.ts" />
-"use strict";
-var THREE = require("three");
-/**
- * @class Camera
- *
- * @classdesc Holds information about a camera.
- */
-var Camera = (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: true,
-        configurable: true
-    });
-    Object.defineProperty(Camera.prototype, "lookat", {
-        /**
-         * Get lookat.
-         * @returns {THREE.Vector3} The lookat vector.
-         */
-        get: function () {
-            return this._lookat;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Camera.prototype, "up", {
-        /**
-         * Get up.
-         * @returns {THREE.Vector3} The up vector.
-         */
-        get: function () {
-            return this._up;
-        },
-        enumerable: true,
-        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: true,
-        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":167}],285:[function(require,module,exports){
-"use strict";
-/**
- * @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 = (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;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = GeoCoords;
-
-},{}],286:[function(require,module,exports){
-/// <reference path="../../typings/index.d.ts" />
-"use strict";
-var THREE = require("three");
-/**
- * @class Spatial
- *
- * @classdesc Provides methods for scalar, vector and matrix calculations.
- */
-var Spatial = (function () {
-    function Spatial() {
-        this._epsilon = 1e-9;
-    }
-    Spatial.prototype.azimuthalToBearing = function (phi) {
-        return -phi + Math.PI / 2;
-    };
-    /**
-     * Converts degrees to radians.
-     *
-     * @param {number} deg Degrees.
-     */
-    Spatial.prototype.degToRad = function (deg) {
-        return Math.PI * deg / 180;
-    };
-    /**
-     * Converts radians to degrees.
-     *
-     * @param {number} rad Radians.
-     */
-    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.
-     */
-    Spatial.prototype.rotationMatrix = function (angleAxis) {
-        var axis = new THREE.Vector3(angleAxis[0], angleAxis[1], angleAxis[2]);
-        var angle = axis.length();
-        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.
-     */
-    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.
-     */
-    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.
-     */
-    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.
-     *
-     * @returs {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.
-     *
-     * @returs {number} The 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} The 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-value of first vector.
-     * @param {number} y1 Y-value of first vector.
-     * @param {number} x2 X-value of second vector.
-     * @param {number} y2 Y-value of second vector.
-     */
-    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 The origin angle.
-     * @param {number} angle2 The destination angle.
-     */
-    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.
-     */
-    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 theta = Math.acos((elements[0] + elements[5] + elements[10] - 1) / 2);
-        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.
-     */
-    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);
-    };
-    /**
-     * Calculates the distance between two coordinates
-     * (latitude longitude pairs) in meters according to
-     * the haversine formula.
-     *
-     * @param {number} lat1 The latitude of the first coordinate.
-     * @param {number} lon1 The longitude of the first coordinate.
-     * @param {number} lat2 The latitude of the second coordinate.
-     * @param {number} lon2 The longitude of the second coordinate.
-     */
-    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(lat1) * Math.cos(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;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = Spatial;
-
-},{"three":167}],287:[function(require,module,exports){
-/// <reference path="../../typings/index.d.ts" />
-"use strict";
-var THREE = require("three");
-/**
- * @class Transform
- *
- * @classdesc Class used for calculating coordinate transformations
- * and projections.
- */
-var Transform = (function () {
-    /**
-     * Create a new transform instance.
-     * @param {Node} apiNavImIm - Node properties.
-     * @param {HTMLImageElement} image - Node image.
-     * @param {Array<number>} translation - Node translation vector in three dimensions.
-     */
-    function Transform(node, image, translation) {
-        this._orientation = this._getValue(node.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(node.width, keepOrientation ? imageWidth : imageHeight);
-        this._height = this._getValue(node.height, keepOrientation ? imageHeight : imageWidth);
-        this._basicAspect = keepOrientation ?
-            this._width / this._height :
-            this._height / this._width;
-        this._basicWidth = keepOrientation ? node.width : node.height;
-        this._basicHeight = keepOrientation ? node.height : node.width;
-        this._focal = this._getValue(node.focal, 1);
-        this._scale = this._getValue(node.scale, 0);
-        this._gpano = node.gpano != null ? node.gpano : null;
-        this._rt = this._getRt(node.rotation, translation);
-        this._srt = this._getSrt(this._rt, this._scale);
-    }
-    Object.defineProperty(Transform.prototype, "basicAspect", {
-        /**
-         * Get basic aspect.
-         * @returns {number} The orientation adjusted aspect ratio.
-         */
-        get: function () {
-            return this._basicAspect;
-        },
-        enumerable: true,
-        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: true,
-        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: true,
-        configurable: true
-    });
-    Object.defineProperty(Transform.prototype, "focal", {
-        /**
-         * Get focal.
-         * @returns {number} The node focal length.
-         */
-        get: function () {
-            return this._focal;
-        },
-        enumerable: true,
-        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: true,
-        configurable: true
-    });
-    Object.defineProperty(Transform.prototype, "gpano", {
-        /**
-         * Get gpano.
-         * @returns {number} The node gpano information.
-         */
-        get: function () {
-            return this._gpano;
-        },
-        enumerable: true,
-        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: true,
-        configurable: true
-    });
-    Object.defineProperty(Transform.prototype, "orientation", {
-        /**
-         * Get orientation.
-         * @returns {number} The image orientation.
-         */
-        get: function () {
-            return this._orientation;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Transform.prototype, "rt", {
-        /**
-         * Get rt.
-         * @returns {THREE.Matrix4} The extrinsic camera matrix.
-         */
-        get: function () {
-            return this._rt;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Transform.prototype, "srt", {
-        /**
-         * Get srt.
-         * @returns {THREE.Matrix4} The scaled extrinsic camera matrix.
-         */
-        get: function () {
-            return this._srt;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Transform.prototype, "scale", {
-        /**
-         * Get scale.
-         * @returns {number} The node atomic reconstruction scale.
-         */
-        get: function () {
-            return this._scale;
-        },
-        enumerable: true,
-        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: true,
-        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 - Depth to unproject from camera center.
-     * @returns {Array<number>} Unprojected 3D world coordinates.
-     */
-    Transform.prototype.unprojectBasic = function (basic, distance) {
-        var sfm = this._basicToSfm(basic);
-        return this.unprojectSfM(sfm, distance);
-    };
-    /**
-     * 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 - Depth to unproject from camera center.
-     * @returns {Array<number>} Unprojected 3D world coordinates.
-     */
-    Transform.prototype.unprojectSfM = function (sfm, distance) {
-        var bearing = this._sfmToBearing(sfm);
-        var v = 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 {
-            var v = new THREE.Vector3(sfm[0], sfm[1], this._focal);
-            v.normalize();
-            return [v.x, v.y, v.z];
-        }
-    };
-    /**
-     * 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 (bearing[2] > 0) {
-                return [
-                    bearing[0] * this._focal / bearing[2],
-                    bearing[1] * this._focal / bearing[2],
-                ];
-            }
-            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();
-        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;
-    };
-    /**
-     * 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 w = size / this._width;
-        var h = size / this._height;
-        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":167}],288:[function(require,module,exports){
-/// <reference path="../../typings/index.d.ts" />
-"use strict";
-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
- * photo.
- *
- * 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 = (function () {
-    function ViewportCoords() {
-        this._unprojectDepth = 200;
-    }
-    /**
-     * Convert basic coordinates to canvas coordinates.
-     *
-     * @description Transform origin and perspective camera position needs to be the
-     * equal for reliable return value.
-     *
-     * @param {number} basicX - Basic X coordinate.
-     * @param {number} basicY - Basic Y coordinate.
-     * @param {number} canvasWidth - Width of canvas.
-     * @param {number} canvasHeight - Height of canvas.
-     * @param {Transform} transform - Transform of the node to unproject from.
-     * @param {THREE.PerspectiveCamera} perspectiveCamera - Perspective camera used in rendering.
-     * @returns {Array<number>} 2D canvas coordinates.
-     */
-    ViewportCoords.prototype.basicToCanvas = function (basicX, basicY, canvasWidth, canvasHeight, transform, perspectiveCamera) {
-        var point3d = transform.unprojectBasic([basicX, basicY], this._unprojectDepth);
-        var canvas = this.projectToCanvas(point3d, canvasWidth, canvasHeight, perspectiveCamera);
-        return canvas;
-    };
-    /**
-     * Convert basic coordinates to viewport coordinates.
-     *
-     * @description Transform origin and perspective camera position needs to be the
-     * equal for reliable return value.
-     *
-     * @param {number} basicX - Basic X coordinate.
-     * @param {number} basicY - Basic Y coordinate.
-     * @param {number} canvasWidth - Width of canvas.
-     * @param {number} canvasHeight - Height of canvas.
-     * @param {Transform} transform - Transform of the node to unproject from.
-     * @param {THREE.PerspectiveCamera} perspectiveCamera - Perspective camera used in rendering.
-     * @returns {Array<number>} 2D canvas coordinates.
-     */
-    ViewportCoords.prototype.basicToViewport = function (basicX, basicY, transform, perspectiveCamera) {
-        var point3d = transform.unprojectBasic([basicX, basicY], this._unprojectDepth);
-        var viewport = this.projectToViewport(point3d, perspectiveCamera);
-        return viewport;
-    };
-    /**
-     * Convert canvas coordinates to basic coordinates.
-     *
-     * @description Transform origin and perspective camera position needs to be the
-     * equal for reliable return value.
-     *
-     * @param {number} canvasX - Canvas X coordinate.
-     * @param {number} canvasY - Canvas Y coordinate.
-     * @param {number} canvasWidth - Width of canvas.
-     * @param {number} canvasHeight - Height of canvas.
-     * @param {Transform} transform - Transform of the node to unproject from.
-     * @param {THREE.PerspectiveCamera} perspectiveCamera - Perspective camera used in rendering.
-     * @returns {Array<number>} 2D basic coordinates.
-     */
-    ViewportCoords.prototype.canvasToBasic = function (canvasX, canvasY, canvasWidth, canvasHeight, transform, perspectiveCamera) {
-        var point3d = this.unprojectFromCanvas(canvasX, canvasY, canvasWidth, canvasHeight, perspectiveCamera)
-            .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 {number} canvasWidth - Width of canvas.
-     * @param {number} canvasHeight - Height of canvas.
-     * @returns {Array<number>} 2D viewport coordinates.
-     */
-    ViewportCoords.prototype.canvasToViewport = function (canvasX, canvasY, canvasWidth, canvasHeight) {
-        var viewportX = 2 * canvasX / canvasWidth - 1;
-        var viewportY = 1 - 2 * canvasY / canvasHeight;
-        return [viewportX, viewportY];
-    };
-    /**
-     * Determine basic distances from image to canvas corners.
-     *
-     * @description Transform origin and perspective 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.PerspectiveCamera} perspectiveCamera - Perspective camera used in rendering.
-     * @returns {Array<number>} Array of basic distances as [top, right, bottom, left].
-     */
-    ViewportCoords.prototype.getBasicDistances = function (transform, perspectiveCamera) {
-        var topLeftBasic = this.viewportToBasic(-1, 1, transform, perspectiveCamera);
-        var topRightBasic = this.viewportToBasic(1, 1, transform, perspectiveCamera);
-        var bottomRightBasic = this.viewportToBasic(1, -1, transform, perspectiveCamera);
-        var bottomLeftBasic = this.viewportToBasic(-1, -1, transform, perspectiveCamera);
-        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 perspective camera position needs to be the
-     * equal for reliable return value.
-     *
-     * Determines the smallest pixel distance for every side of the canvas.
-     *
-     * @param {number} canvasWidth - Width of canvas.
-     * @param {number} canvasHeight - Height of canvas.
-     * @param {Transform} transform - Transform of the node to unproject from.
-     * @param {THREE.PerspectiveCamera} perspectiveCamera - Perspective camera used in rendering.
-     * @returns {Array<number>} Array of pixel distances as [top, right, bottom, left].
-     */
-    ViewportCoords.prototype.getPixelDistances = function (canvasWidth, canvasHeight, transform, perspectiveCamera) {
-        var topLeftBasic = this.viewportToBasic(-1, 1, transform, perspectiveCamera);
-        var topRightBasic = this.viewportToBasic(1, 1, transform, perspectiveCamera);
-        var bottomRightBasic = this.viewportToBasic(1, -1, transform, perspectiveCamera);
-        var bottomLeftBasic = this.viewportToBasic(-1, -1, transform, perspectiveCamera);
-        var topPixelDistance = 0;
-        var rightPixelDistance = 0;
-        var bottomPixelDistance = 0;
-        var leftPixelDistance = 0;
-        if (topLeftBasic[1] < 0 && topRightBasic[1] < 0) {
-            var basicX = topLeftBasic[1] > topRightBasic[1] ?
-                topLeftBasic[0] :
-                topRightBasic[0];
-            var canvas = this.basicToCanvas(basicX, 0, canvasWidth, canvasHeight, transform, perspectiveCamera);
-            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, canvasWidth, canvasHeight, transform, perspectiveCamera);
-            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, canvasWidth, canvasHeight, transform, perspectiveCamera);
-            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, canvasWidth, canvasHeight, transform, perspectiveCamera);
-            leftPixelDistance = canvas[0] > 0 ? canvas[0] : 0;
-        }
-        return [topPixelDistance, rightPixelDistance, bottomPixelDistance, leftPixelDistance];
-    };
-    /**
-     * Project 3D world coordinates to canvas coordinates.
-     *
-     * @param {Array<number>} point3D - 3D world coordinates.
-     * @param {number} canvasWidth - Width of canvas.
-     * @param {number} canvasHeight - Height of canvas.
-     * @param {THREE.PerspectiveCamera} perspectiveCamera - Perspective camera used in rendering.
-     * @returns {Array<number>} 3D world coordinates.
-     */
-    ViewportCoords.prototype.projectToCanvas = function (point3d, canvasWidth, canvasHeight, perspectiveCamera) {
-        var viewport = this.projectToViewport(point3d, perspectiveCamera);
-        var canvas = this.viewportToCanvas(viewport[0], viewport[1], canvasWidth, canvasHeight);
-        return canvas;
-    };
-    /**
-     * Project 3D world coordinates to viewport coordinates.
-     *
-     * @param {Array<number>} point3D - 3D world coordinates.
-     * @param {THREE.PerspectiveCamera} perspectiveCamera - Perspective camera used in rendering.
-     * @returns {Array<number>} 3D world coordinates.
-     */
-    ViewportCoords.prototype.projectToViewport = function (point3d, perspectiveCamera) {
-        var projected = new THREE.Vector3(point3d[0], point3d[1], point3d[2])
-            .project(perspectiveCamera);
-        var z = Math.abs(projected.z) < 1e-9 ?
-            projected.z < 0 ?
-                -1e-9 : 1e-9 :
-            projected.z;
-        var viewportX = projected.x / z;
-        var viewportY = projected.y / z;
-        return [viewportX, viewportY];
-    };
-    /**
-     * Uproject canvas coordinates to 3D world coordinates.
-     *
-     * @param {number} canvasX - Canvas X coordinate.
-     * @param {number} canvasY - Canvas Y coordinate.
-     * @param {number} canvasWidth - Width of canvas.
-     * @param {number} canvasHeight - Height of canvas.
-     * @param {THREE.PerspectiveCamera} perspectiveCamera - Perspective camera used in rendering.
-     * @returns {Array<number>} 3D world coordinates.
-     */
-    ViewportCoords.prototype.unprojectFromCanvas = function (canvasX, canvasY, canvasWidth, canvasHeight, perspectiveCamera) {
-        var viewport = this.canvasToViewport(canvasX, canvasY, canvasWidth, canvasHeight);
-        var point3d = this.unprojectFromViewport(viewport[0], viewport[1], perspectiveCamera);
-        return point3d;
-    };
-    /**
-     * Unproject viewport coordinates to 3D world coordinates.
-     *
-     * @param {number} viewportX - Viewport X coordinate.
-     * @param {number} viewportY - Viewport Y coordinate.
-     * @param {THREE.PerspectiveCamera} perspectiveCamera - Perspective camera used in rendering.
-     * @returns {Array<number>} 3D world coordinates.
-     */
-    ViewportCoords.prototype.unprojectFromViewport = function (viewportX, viewportY, perspectiveCamera) {
-        var point3d = new THREE.Vector3(viewportX, viewportY, 1)
-            .unproject(perspectiveCamera);
-        return point3d;
-    };
-    /**
-     * Convert viewport coordinates to basic coordinates.
-     *
-     * @description Transform origin and perspective 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.PerspectiveCamera} perspectiveCamera - Perspective camera used in rendering.
-     * @returns {Array<number>} 2D basic coordinates.
-     */
-    ViewportCoords.prototype.viewportToBasic = function (viewportX, viewportY, transform, perspectiveCamera) {
-        var point3d = new THREE.Vector3(viewportX, viewportY, 1)
-            .unproject(perspectiveCamera)
-            .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 {number} canvasWidth - Width of canvas.
-     * @param {number} canvasHeight - Height of canvas.
-     * @returns {Array<number>} 2D canvas coordinates.
-     */
-    ViewportCoords.prototype.viewportToCanvas = function (viewportX, viewportY, canvasWidth, canvasHeight) {
-        var canvasX = canvasWidth * (viewportX + 1) / 2;
-        var canvasY = -canvasHeight * (viewportY - 1) / 2;
-        return [canvasX, canvasY];
-    };
-    return ViewportCoords;
-}());
-exports.ViewportCoords = ViewportCoords;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = ViewportCoords;
-
-},{"three":167}],289:[function(require,module,exports){
-"use strict";
-/**
- * @class Filter
- *
- * @classdesc Represents a class for creating node filters. Implementation and
- * definitions based on https://github.com/mapbox/feature-filter.
- */
-var FilterCreator = (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;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = FilterCreator;
-
-},{}],290:[function(require,module,exports){
-/// <reference path="../../typings/index.d.ts" />
-"use strict";
-var rbush = require("rbush");
-var Subject_1 = require("rxjs/Subject");
-require("rxjs/add/observable/from");
-require("rxjs/add/operator/catch");
-require("rxjs/add/operator/do");
-require("rxjs/add/operator/finally");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/publish");
-var Edge_1 = require("../Edge");
-var Error_1 = require("../Error");
-var Graph_1 = require("../Graph");
-/**
- * @class Graph
- *
- * @classdesc Represents a graph of nodes with edges.
- */
-var Graph = (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._cachedSpatialEdges = {};
-        this._cachedTiles = {};
-        this._cachingFill$ = {};
-        this._cachingFull$ = {};
-        this._cachingSequences$ = {};
-        this._cachingSpatialArea$ = {};
-        this._cachingTiles$ = {};
-        this._changed$ = new Subject_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,
-                maxUnusedTiles: 20,
-            };
-        this._nodes = {};
-        this._nodeIndex = nodeIndex != null ? nodeIndex : rbush(16, [".lat", ".lon", ".lat", ".lon"]);
-        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: true,
-        configurable: true
-    });
-    /**
-     * 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])
-            .do(function (imageByKeyFill) {
-            if (!node.full) {
-                _this._makeFull(node, imageByKeyFill[key]);
-            }
-            delete _this._cachingFill$[key];
-        })
-            .map(function (imageByKeyFill) {
-            return _this;
-        })
-            .finally(function () {
-            if (key in _this._cachingFill$) {
-                delete _this._cachingFill$[key];
-            }
-            _this._changed$.next(_this);
-        })
-            .publish()
-            .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])
-            .do(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 == null || fn.sequence.key == null) {
-                    throw new Error_1.GraphMapillaryError("Node has no sequence (" + 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];
-            }
-        })
-            .map(function (imageByKeyFull) {
-            return _this;
-        })
-            .finally(function () {
-            if (key in _this._cachingFull$) {
-                delete _this._cachingFull$[key];
-            }
-            _this._changed$.next(_this);
-        })
-            .publish()
-            .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 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)
-                .do(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];
-                }
-            })
-                .map(function (imageByKeyFill) {
-                return _this;
-            })
-                .catch(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;
-            })
-                .finally(function () {
-                if (Object.keys(spatialArea.cacheNodes).length === 0) {
-                    _this._changed$.next(_this);
-                }
-            })
-                .publish()
-                .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 {Observable<Graph>} Observable emitting the graph
-     * when the tiles 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$ = null;
-            if (h in this_2._cachingTiles$) {
-                cacheTile$ = this_2._cachingTiles$[h];
-            }
-            else {
-                cacheTile$ = this_2._apiV3.imagesByH$([h])
-                    .do(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 == null ||
-                            coreNode.sequence.key == null) {
-                            console.warn("Sequence missing, discarding (" + coreNode.key + ")");
-                            continue;
-                        }
-                        if (preStored != null && coreNode.key in preStored) {
-                            var node_1 = preStored[coreNode.key];
-                            delete preStored[coreNode.key];
-                            hCache.push(node_1);
-                            var nodeIndexItem_1 = {
-                                lat: node_1.latLon.lat,
-                                lon: node_1.latLon.lon,
-                                node: node_1,
-                            };
-                            _this._nodeIndex.insert(nodeIndexItem_1);
-                            _this._nodeIndexTiles[h].push(nodeIndexItem_1);
-                            _this._nodeToTile[node_1.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];
-                })
-                    .map(function (imagesByH) {
-                    return _this;
-                })
-                    .catch(function (error) {
-                    delete _this._cachingTiles$[h];
-                    throw error;
-                })
-                    .publish()
-                    .refCount();
-                this_2._cachingTiles$[h] = cacheTile$;
-            }
-            cacheTiles$.push(cacheTile$
-                .do(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;
-                }
-            })
-                .catch(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;
-            })
-                .finally(function () {
-                _this._changed$.next(_this);
-            })
-                .publish()
-                .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 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 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_1 = nodes; _c < nodes_1.length; _c++) {
-            var node = nodes_1[_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.
-     */
-    Graph.prototype.uncache = function (keepKeys) {
-        var keysInUse = {};
-        this._addNewKeys(keysInUse, this._cachingFull$);
-        this._addNewKeys(keysInUse, this._cachingFill$);
-        this._addNewKeys(keysInUse, this._cachingTiles$);
-        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);
-        }
-        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$) {
-                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];
-            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])
-            .do(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];
-        })
-            .map(function (sequenceByKey) {
-            return _this;
-        })
-            .finally(function () {
-            if (sequenceKey in _this._cachingSequences$) {
-                delete _this._cachingSequences$[sequenceKey];
-            }
-            _this._changed$.next(_this);
-        })
-            .publish()
-            .refCount();
-        return this._cachingSequences$[sequenceKey];
-    };
-    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) {
-        for (var _i = 0, _a = this._cachedTiles[h].nodes; _i < _a.length; _i++) {
-            var node = _a[_i];
-            var key = node.key;
-            delete this._nodes[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];
-            }
-            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._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;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = Graph;
-
-},{"../Edge":218,"../Error":219,"../Graph":221,"rbush":24,"rxjs/Subject":33,"rxjs/add/observable/from":40,"rxjs/add/operator/catch":49,"rxjs/add/operator/do":56,"rxjs/add/operator/finally":59,"rxjs/add/operator/map":62,"rxjs/add/operator/publish":68}],291:[function(require,module,exports){
-/// <reference path="../../typings/index.d.ts" />
-"use strict";
-var geohash = require("latlon-geohash");
-var THREE = require("three");
-var Geo_1 = require("../Geo");
-var GeoHashDirections = (function () {
-    function GeoHashDirections() {
-    }
-    return GeoHashDirections;
-}());
-GeoHashDirections.n = "n";
-GeoHashDirections.nw = "nw";
-GeoHashDirections.w = "w";
-GeoHashDirections.sw = "sw";
-GeoHashDirections.s = "s";
-GeoHashDirections.se = "se";
-GeoHashDirections.e = "e";
-GeoHashDirections.ne = "ne";
-/**
- * @class GraphCalculator
- *
- * @classdesc Represents a calculator for graph entities.
- */
-var GraphCalculator = (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[GeoHashDirections.n]);
-        }
-        if (t && l) {
-            hs.push(neighbours[GeoHashDirections.nw]);
-        }
-        if (l) {
-            hs.push(neighbours[GeoHashDirections.w]);
-        }
-        if (l && b) {
-            hs.push(neighbours[GeoHashDirections.sw]);
-        }
-        if (b) {
-            hs.push(neighbours[GeoHashDirections.s]);
-        }
-        if (b && r) {
-            hs.push(neighbours[GeoHashDirections.se]);
-        }
-        if (r) {
-            hs.push(neighbours[GeoHashDirections.e]);
-        }
-        if (r && t) {
-            hs.push(neighbours[GeoHashDirections.ne]);
-        }
-        return hs;
-    };
-    /**
-     * 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;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = GraphCalculator;
-
-},{"../Geo":220,"latlon-geohash":20,"three":167}],292:[function(require,module,exports){
-"use strict";
-var Observable_1 = require("rxjs/Observable");
-var Subject_1 = require("rxjs/Subject");
-require("rxjs/add/operator/catch");
-require("rxjs/add/operator/concat");
-require("rxjs/add/operator/do");
-require("rxjs/add/operator/expand");
-require("rxjs/add/operator/finally");
-require("rxjs/add/operator/first");
-require("rxjs/add/operator/last");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/mergeMap");
-require("rxjs/add/operator/publishReplay");
-/**
- * @class GraphService
- *
- * @classdesc Represents a service for graph operations.
- */
-var GraphService = (function () {
-    /**
-     * Create a new graph service instance.
-     *
-     * @param {Graph} graph - Graph instance to be operated on.
-     */
-    function GraphService(graph, imageLoadingService) {
-        this._graph$ = Observable_1.Observable
-            .of(graph)
-            .concat(graph.changed$)
-            .publishReplay(1)
-            .refCount();
-        this._graph$.subscribe(function () { });
-        this._imageLoadingService = imageLoadingService;
-        this._firstGraphSubjects$ = [];
-        this._initializeCacheSubscriptions = [];
-        this._sequenceSubscriptions = [];
-        this._spatialSubscriptions = [];
-    }
-    /**
-     * 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 Subject_1.Subject();
-        this._firstGraphSubjects$.push(firstGraphSubject$);
-        var firstGraph$ = firstGraphSubject$
-            .publishReplay(1)
-            .refCount();
-        var node$ = firstGraph$
-            .map(function (graph) {
-            return graph.getNode(key);
-        })
-            .mergeMap(function (node) {
-            return node.assetsCached ?
-                Observable_1.Observable.of(node) :
-                node.cacheAssets$();
-        })
-            .publishReplay(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$
-            .first()
-            .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 Observable_1.Observable.of(graph);
-        })
-            .do(function (graph) {
-            if (!graph.hasInitializedCache(key)) {
-                graph.initializeCache(key);
-            }
-        })
-            .finally(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 sequenceSubscription = firstGraph$
-            .mergeMap(function (graph) {
-            if (graph.isCachingNodeSequence(key) || !graph.hasNodeSequence(key)) {
-                return graph.cacheNodeSequence$(key);
-            }
-            return Observable_1.Observable.of(graph);
-        })
-            .do(function (graph) {
-            if (!graph.getNode(key).sequenceEdges.cached) {
-                graph.cacheSequenceEdges(key);
-            }
-        })
-            .finally(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);
-        }
-        var spatialSubscription = firstGraph$
-            .expand(function (graph) {
-            if (graph.hasTiles(key)) {
-                return Observable_1.Observable.empty();
-            }
-            return Observable_1.Observable
-                .from(graph.cacheTiles$(key))
-                .mergeMap(function (graph$) {
-                return graph$
-                    .mergeMap(function (g) {
-                    if (g.isCachingTiles(key)) {
-                        return Observable_1.Observable.empty();
-                    }
-                    return Observable_1.Observable.of(g);
-                })
-                    .catch(function (error, caught$) {
-                    console.error("Failed to cache tile data (" + key + ").", error);
-                    return Observable_1.Observable.empty();
-                });
-            });
-        })
-            .last()
-            .mergeMap(function (graph) {
-            if (graph.hasSpatialArea(key)) {
-                return Observable_1.Observable.of(graph);
-            }
-            return Observable_1.Observable
-                .from(graph.cacheSpatialArea$(key))
-                .mergeMap(function (graph$) {
-                return graph$
-                    .catch(function (error, caught$) {
-                    console.error("Failed to cache spatial nodes (" + key + ").", error);
-                    return Observable_1.Observable.empty();
-                });
-            });
-        })
-            .last()
-            .mergeMap(function (graph) {
-            return graph.hasNodeSequence(key) ?
-                Observable_1.Observable.of(graph) :
-                graph.cacheNodeSequence$(key);
-        })
-            .do(function (graph) {
-            if (!graph.getNode(key).spatialEdges.cached) {
-                graph.cacheSpatialEdges(key);
-            }
-        })
-            .finally(function () {
-            if (spatialSubscription == null) {
-                return;
-            }
-            _this._removeFromArray(spatialSubscription, _this._spatialSubscriptions);
-        })
-            .subscribe(function (graph) { return; }, function (error) {
-            console.error("Failed to cache spatial edges (" + key + ").", error);
-        });
-        if (!spatialSubscription.closed) {
-            this._spatialSubscriptions.push(spatialSubscription);
-        }
-        return node$
-            .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$
-            .first()
-            .mergeMap(function (graph) {
-            if (graph.isCachingSequence(sequenceKey) || !graph.hasSequence(sequenceKey)) {
-                return graph.cacheSequence$(sequenceKey);
-            }
-            return Observable_1.Observable.of(graph);
-        })
-            .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$
-            .first()
-            .do(function (graph) {
-            graph.resetSpatialEdges();
-            graph.setFilter(filter);
-        });
-    };
-    /**
-     * 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$
-            .first()
-            .do(function (graph) {
-            graph.reset(keepKeys);
-        });
-    };
-    /**
-     * 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.
-     * @return {Observable<Graph>} Observable emitting a single item,
-     * the graph, when the graph has been uncached.
-     */
-    GraphService.prototype.uncache$ = function (keepKeys) {
-        return this._graph$
-            .first()
-            .do(function (graph) {
-            graph.uncache(keepKeys);
-        });
-    };
-    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;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = GraphService;
-
-},{"rxjs/Observable":28,"rxjs/Subject":33,"rxjs/add/operator/catch":49,"rxjs/add/operator/concat":51,"rxjs/add/operator/do":56,"rxjs/add/operator/expand":57,"rxjs/add/operator/finally":59,"rxjs/add/operator/first":60,"rxjs/add/operator/last":61,"rxjs/add/operator/map":62,"rxjs/add/operator/mergeMap":65,"rxjs/add/operator/publishReplay":69}],293:[function(require,module,exports){
-/// <reference path="../../typings/index.d.ts" />
-"use strict";
-var Subject_1 = require("rxjs/Subject");
-var ImageLoadingService = (function () {
-    function ImageLoadingService() {
-        this._loadnode$ = new Subject_1.Subject();
-        this._loadstatus$ = this._loadnode$
-            .scan(function (nodes, node) {
-            nodes[node.key] = node.loadStatus;
-            return nodes;
-        }, {})
-            .publishReplay(1)
-            .refCount();
-        this._loadstatus$.subscribe(function () { });
-    }
-    Object.defineProperty(ImageLoadingService.prototype, "loadnode$", {
-        get: function () {
-            return this._loadnode$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(ImageLoadingService.prototype, "loadstatus$", {
-        get: function () {
-            return this._loadstatus$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    return ImageLoadingService;
-}());
-exports.ImageLoadingService = ImageLoadingService;
-
-},{"rxjs/Subject":33}],294:[function(require,module,exports){
-/// <reference path="../../typings/index.d.ts" />
-"use strict";
-var Pbf = require("pbf");
-var MeshReader = (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":22}],295:[function(require,module,exports){
-"use strict";
-require("rxjs/add/observable/combineLatest");
-require("rxjs/add/operator/map");
-/**
- * @class Node
- *
- * @classdesc Represents a node in the navigation graph.
- */
-var Node = (function () {
-    /**
-     * Create a new node instance.
-     *
-     * @param {ICoreNode} coreNode - Raw core node data.
-     */
-    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.
-         */
-        get: function () {
-            return this._core != null &&
-                this._fill != null &&
-                this._cache != null &&
-                this._cache.image != null &&
-                this._cache.mesh != null;
-        },
-        enumerable: true,
-        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: true,
-        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.
-         */
-        get: function () {
-            return this._fill.cca != null ? this._fill.cca : this._fill.ca;
-        },
-        enumerable: true,
-        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: true,
-        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.
-         */
-        get: function () {
-            return this._fill.cca;
-        },
-        enumerable: true,
-        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: true,
-        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: true,
-        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.
-         */
-        get: function () {
-            return this._fill != null;
-        },
-        enumerable: true,
-        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: true,
-        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: true,
-        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: true,
-        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: true,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "key", {
-        /**
-         * Get key.
-         *
-         * @returns {string} Unique key of the node.
-         */
-        get: function () {
-            return this._core.key;
-        },
-        enumerable: true,
-        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: true,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "loadStatus", {
-        /**
-         * Get loadStatus.
-         *
-         * @returns {ILoadStatus} Value indicating the load status
-         * of the mesh and image.
-         */
-        get: function () {
-            return this._cache.loadStatus;
-        },
-        enumerable: true,
-        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: true,
-        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: true,
-        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: true,
-        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: true,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "orientation", {
-        /**
-         * Get orientation.
-         *
-         * @returns {number} EXIF orientation of original image.
-         */
-        get: function () {
-            return this._fill.orientation;
-        },
-        enumerable: true,
-        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: true,
-        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: true,
-        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: true,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "projectKey", {
-        /**
-         * Get projectKey.
-         *
-         * @returns {string} Unique key of the project to which
-         * the node belongs.
-         */
-        get: function () {
-            return this._fill.project != null ?
-                this._fill.project.key :
-                null;
-        },
-        enumerable: true,
-        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: true,
-        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: true,
-        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: true,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "sequenceEdges", {
-        /**
-         * Get sequenceEdges.
-         *
-         * @returns {IEdgeStatus} Value describing the status of the
-         * sequence edges.
-         */
-        get: function () {
-            return this._cache.sequenceEdges;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "sequenceEdges$", {
-        /**
-         * Get sequenceEdges$.
-         *
-         * @returns {Observable<IEdgeStatus>} Observable emitting
-         * values describing the status of the sequence edges.
-         */
-        get: function () {
-            return this._cache.sequenceEdges$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "spatialEdges", {
-        /**
-         * Get spatialEdges.
-         *
-         * @returns {IEdgeStatus} Value describing the status of the
-         * spatial edges.
-         */
-        get: function () {
-            return this._cache.spatialEdges;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "spatialEdges$", {
-        /**
-         * Get spatialEdges$.
-         *
-         * @returns {Observable<IEdgeStatus>} Observable emitting
-         * values describing the status of the spatial edges.
-         */
-        get: function () {
-            return this._cache.spatialEdges$;
-        },
-        enumerable: true,
-        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: true,
-        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: true,
-        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: true,
-        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.
-     */
-    Node.prototype.cacheAssets$ = function () {
-        var _this = this;
-        return this._cache.cacheAssets$(this.key, this.pano, this.merged)
-            .map(function (cache) {
-            return _this;
-        });
-    };
-    Node.prototype.cacheImage$ = function (imageSize) {
-        var _this = this;
-        return this._cache.cacheImage$(this.key, imageSize)
-            .map(function (cache) {
-            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.
-     */
-    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.
-     */
-    Node.prototype.cacheSpatialEdges = function (edges) {
-        this._cache.cacheSpatialEdges(edges);
-    };
-    /**
-     * Dispose the node.
-     *
-     * @description Disposes all cached assets.
-     */
-    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.
-     */
-    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.
-     */
-    Node.prototype.makeFull = function (fill) {
-        if (fill == null) {
-            throw new Error("Fill can not be null.");
-        }
-        this._fill = fill;
-    };
-    /**
-     * Reset the sequence edges.
-     */
-    Node.prototype.resetSequenceEdges = function () {
-        this._cache.resetSequenceEdges();
-    };
-    /**
-     * Reset the spatial edges.
-     */
-    Node.prototype.resetSpatialEdges = function () {
-        this._cache.resetSpatialEdges();
-    };
-    /**
-     * Clears the image and mesh assets, aborts
-     * any outstanding requests and resets edges.
-     */
-    Node.prototype.uncache = function () {
-        if (this._cache == null) {
-            return;
-        }
-        this._cache.dispose();
-        this._cache = null;
-    };
-    return Node;
-}());
-exports.Node = Node;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = Node;
-
-},{"rxjs/add/observable/combineLatest":37,"rxjs/add/operator/map":62}],296:[function(require,module,exports){
-(function (Buffer){
-"use strict";
-var Subject_1 = require("rxjs/Subject");
-var Observable_1 = require("rxjs/Observable");
-require("rxjs/add/observable/combineLatest");
-require("rxjs/add/operator/publishReplay");
-var Graph_1 = require("../Graph");
-var Utils_1 = require("../Utils");
-/**
- * @class NodeCache
- *
- * @classdesc Represents the cached properties of a node.
- */
-var NodeCache = (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._sequenceEdgesChanged$ = new Subject_1.Subject();
-        this._sequenceEdges$ = this._sequenceEdgesChanged$
-            .startWith(this._sequenceEdges)
-            .publishReplay(1)
-            .refCount();
-        this._sequenceEdgesSubscription = this._sequenceEdges$.subscribe(function () { });
-        this._spatialEdgesChanged$ = new Subject_1.Subject();
-        this._spatialEdges$ = this._spatialEdgesChanged$
-            .startWith(this._spatialEdges)
-            .publishReplay(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: true,
-        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: true,
-        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: true,
-        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: true,
-        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: true,
-        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: true,
-        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: true,
-        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$ = Observable_1.Observable
-            .combineLatest(this._cacheImage$(key, imageSize), this._cacheMesh$(key, merged), function (imageStatus, meshStatus) {
-            _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;
-        })
-            .finally(function () {
-            _this._cachingAssets$ = null;
-        })
-            .publishReplay(1)
-            .refCount();
-        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 Observable_1.Observable.of(this);
-        }
-        return this._cacheImage$(key, imageSize)
-            .first(function (status) {
-            return status.object != null;
-        })
-            .do(function (status) {
-            _this._disposeImage();
-            _this._image = status.object;
-        })
-            .map(function (imageStatus) {
-            return _this;
-        });
-    };
-    /**
-     * 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._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._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 Observable_1.Observable.create(function (subscriber) {
-            var xmlHTTP = new XMLHttpRequest();
-            xmlHTTP.open("GET", Utils_1.Urls.thumbnail(key, imageSize), 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 Observable_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;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = NodeCache;
-
-}).call(this,require("buffer").Buffer)
-
-},{"../Graph":221,"../Utils":226,"buffer":5,"rxjs/Observable":28,"rxjs/Subject":33,"rxjs/add/observable/combineLatest":37,"rxjs/add/operator/publishReplay":69}],297:[function(require,module,exports){
-/// <reference path="../../typings/index.d.ts" />
-"use strict";
-var _ = require("underscore");
-/**
- * @class Sequence
- *
- * @classdesc Represents a sequence of ordered nodes.
- */
-var Sequence = (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: true,
-        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: true,
-        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 = _.indexOf(this._keys, 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 = _.indexOf(this._keys, key);
-        if (i === 0 || i === -1) {
-            return null;
-        }
-        else {
-            return this._keys[i - 1];
-        }
-    };
-    return Sequence;
-}());
-exports.Sequence = Sequence;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = Sequence;
-
-},{"underscore":168}],298:[function(require,module,exports){
-/// <reference path="../../../typings/index.d.ts" />
-"use strict";
-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 = (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,
-                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 ||
-                !potentialEdge.sameMergeCC) {
-                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.
-     *
-     * @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.fullPano) {
-            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.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.
-     *
-     * @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.fullPano) {
-            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.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.
-     *
-     * @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.fullPano) {
-            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 pano and step edges for a pano node.
-     *
-     * @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 {
-                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;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = EdgeCalculator;
-
-},{"../../Edge":218,"../../Error":219,"../../Geo":220,"three":167}],299:[function(require,module,exports){
-"use strict";
-var EdgeCalculatorCoefficients = (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;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = EdgeCalculatorCoefficients;
-
-},{}],300:[function(require,module,exports){
-"use strict";
-var Edge_1 = require("../../Edge");
-var EdgeCalculatorDirections = (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":218}],301:[function(require,module,exports){
-"use strict";
-var EdgeCalculatorSettings = (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: true,
-        configurable: true
-    });
-    return EdgeCalculatorSettings;
-}());
-exports.EdgeCalculatorSettings = EdgeCalculatorSettings;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = EdgeCalculatorSettings;
-
-},{}],302:[function(require,module,exports){
-"use strict";
-/**
- * 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 = {}));
-;
-
-},{}],303:[function(require,module,exports){
-/// <reference path="../../typings/index.d.ts" />
-"use strict";
-var _ = require("underscore");
-var vd = require("virtual-dom");
-var Subject_1 = require("rxjs/Subject");
-require("rxjs/add/operator/combineLatest");
-require("rxjs/add/operator/distinctUntilChanged");
-require("rxjs/add/operator/filter");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/pluck");
-require("rxjs/add/operator/scan");
-var Render_1 = require("../Render");
-var DOMRenderer = (function () {
-    function DOMRenderer(element, renderService, currentFrame$) {
-        this._adaptiveOperation$ = new Subject_1.Subject();
-        this._render$ = new Subject_1.Subject();
-        this._renderAdaptive$ = new Subject_1.Subject();
-        this._renderService = renderService;
-        this._currentFrame$ = currentFrame$;
-        var rootNode = vd.create(vd.h("div.domRenderer", []));
-        element.appendChild(rootNode);
-        this._offset$ = this._adaptiveOperation$
-            .scan(function (adaptive, operation) {
-            return operation(adaptive);
-        }, {
-            elementHeight: element.offsetHeight,
-            elementWidth: element.offsetWidth,
-            imageAspect: 0,
-            renderMode: Render_1.RenderMode.Fill,
-        })
-            .filter(function (adaptive) {
-            return adaptive.imageAspect > 0 && adaptive.elementWidth > 0 && adaptive.elementHeight > 0;
-        })
-            .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$
-            .filter(function (frame) {
-            return frame.state.currentNode != null;
-        })
-            .distinctUntilChanged(function (k1, k2) {
-            return k1 === k2;
-        }, function (frame) {
-            return frame.state.currentNode.key;
-        })
-            .map(function (frame) {
-            return frame.state.currentTransform.basicAspect;
-        })
-            .map(function (aspect) {
-            return function (adaptive) {
-                adaptive.imageAspect = aspect;
-                return adaptive;
-            };
-        })
-            .subscribe(this._adaptiveOperation$);
-        this._renderAdaptive$
-            .scan(function (vNodeHashes, vNodeHash) {
-            if (vNodeHash.vnode == null) {
-                delete vNodeHashes[vNodeHash.name];
-            }
-            else {
-                vNodeHashes[vNodeHash.name] = vNodeHash.vnode;
-            }
-            return vNodeHashes;
-        }, {})
-            .combineLatest(this._offset$)
-            .map(function (vo) {
-            var vNodes = _.values(vo[0]);
-            var offset = vo[1];
-            var properties = {
-                style: {
-                    bottom: offset.bottom + "px",
-                    left: offset.left + "px",
-                    position: "absolute",
-                    right: offset.right + "px",
-                    top: offset.top + "px",
-                    zIndex: -1,
-                },
-            };
-            return {
-                name: "adaptiveDomRenderer",
-                vnode: vd.h("div.adaptiveDomRenderer", properties, vNodes),
-            };
-        })
-            .subscribe(this._render$);
-        this._vNode$ = this._render$
-            .scan(function (vNodeHashes, vNodeHash) {
-            if (vNodeHash.vnode == null) {
-                delete vNodeHashes[vNodeHash.name];
-            }
-            else {
-                vNodeHashes[vNodeHash.name] = vNodeHash.vnode;
-            }
-            return vNodeHashes;
-        }, {})
-            .map(function (vNodeHashes) {
-            var vNodes = _.values(vNodeHashes);
-            return vd.h("div.domRenderer", vNodes);
-        });
-        this._vPatch$ = this._vNode$
-            .scan(function (nodePatch, vNode) {
-            nodePatch.vpatch = vd.diff(nodePatch.vnode, vNode);
-            nodePatch.vnode = vNode;
-            return nodePatch;
-        }, { vnode: vd.h("div.domRenderer", []), vpatch: null })
-            .pluck("vpatch");
-        this._element$ = this._vPatch$
-            .scan(function (oldElement, vPatch) {
-            return vd.patch(oldElement, vPatch);
-        }, rootNode)
-            .publishReplay(1)
-            .refCount();
-        this._element$.subscribe(function () { });
-        this._renderService.size$
-            .map(function (size) {
-            return function (adaptive) {
-                adaptive.elementWidth = size.width;
-                adaptive.elementHeight = size.height;
-                return adaptive;
-            };
-        })
-            .subscribe(this._adaptiveOperation$);
-        this._renderService.renderMode$
-            .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: true,
-        configurable: true
-    });
-    Object.defineProperty(DOMRenderer.prototype, "render$", {
-        get: function () {
-            return this._render$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(DOMRenderer.prototype, "renderAdaptive$", {
-        get: function () {
-            return this._renderAdaptive$;
-        },
-        enumerable: true,
-        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;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = DOMRenderer;
-
-},{"../Render":223,"rxjs/Subject":33,"rxjs/add/operator/combineLatest":50,"rxjs/add/operator/distinctUntilChanged":55,"rxjs/add/operator/filter":58,"rxjs/add/operator/map":62,"rxjs/add/operator/pluck":67,"rxjs/add/operator/scan":70,"underscore":168,"virtual-dom":173}],304:[function(require,module,exports){
-"use strict";
-var GLRenderStage;
-(function (GLRenderStage) {
-    GLRenderStage[GLRenderStage["Background"] = 0] = "Background";
-    GLRenderStage[GLRenderStage["Foreground"] = 1] = "Foreground";
-})(GLRenderStage = exports.GLRenderStage || (exports.GLRenderStage = {}));
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = GLRenderStage;
-
-},{}],305:[function(require,module,exports){
-/// <reference path="../../typings/index.d.ts" />
-"use strict";
-var THREE = require("three");
-var Observable_1 = require("rxjs/Observable");
-var Subject_1 = require("rxjs/Subject");
-require("rxjs/add/observable/combineLatest");
-require("rxjs/add/operator/distinctUntilChanged");
-require("rxjs/add/operator/filter");
-require("rxjs/add/operator/first");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/merge");
-require("rxjs/add/operator/mergeMap");
-require("rxjs/add/operator/scan");
-require("rxjs/add/operator/share");
-require("rxjs/add/operator/startWith");
-var Render_1 = require("../Render");
-var GLRenderer = (function () {
-    function GLRenderer(renderService) {
-        var _this = this;
-        this._renderFrame$ = new Subject_1.Subject();
-        this._renderCameraOperation$ = new Subject_1.Subject();
-        this._render$ = new Subject_1.Subject();
-        this._clear$ = new Subject_1.Subject();
-        this._renderOperation$ = new Subject_1.Subject();
-        this._rendererOperation$ = new Subject_1.Subject();
-        this._eraserOperation$ = new Subject_1.Subject();
-        this._renderService = renderService;
-        this._renderer$ = this._rendererOperation$
-            .scan(function (renderer, operation) {
-            return operation(renderer);
-        }, { needsRender: false, renderer: null });
-        this._renderCollection$ = this._renderOperation$
-            .scan(function (hashes, operation) {
-            return operation(hashes);
-        }, {})
-            .share();
-        this._renderCamera$ = this._renderCameraOperation$
-            .scan(function (rc, operation) {
-            return operation(rc);
-        }, { frameId: -1, needsRender: false, perspective: null });
-        this._eraser$ = this._eraserOperation$
-            .startWith(function (eraser) {
-            return eraser;
-        })
-            .scan(function (eraser, operation) {
-            return operation(eraser);
-        }, { needsRender: false });
-        Observable_1.Observable
-            .combineLatest([this._renderer$, this._renderCollection$, this._renderCamera$, this._eraser$], function (renderer, hashes, rc, eraser) {
-            var renders = Object.keys(hashes)
-                .map(function (key) {
-                return hashes[key];
-            });
-            return { camera: rc, eraser: eraser, renderer: renderer, renders: renders };
-        })
-            .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;
-        })
-            .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$
-            .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$
-            .map(function (hash) {
-            return function (hashes) {
-                hashes[hash.name] = hash.render;
-                return hashes;
-            };
-        });
-        var clearHash$ = this._clear$
-            .map(function (name) {
-            return function (hashes) {
-                delete hashes[name];
-                return hashes;
-            };
-        });
-        Observable_1.Observable
-            .merge(renderHash$, clearHash$)
-            .subscribe(this._renderOperation$);
-        this._webGLRenderer$ = this._render$
-            .first()
-            .map(function (hash) {
-            var element = renderService.element;
-            var webGLRenderer = new THREE.WebGLRenderer();
-            webGLRenderer.setPixelRatio(window.devicePixelRatio);
-            webGLRenderer.setSize(element.offsetWidth, element.offsetHeight);
-            webGLRenderer.setClearColor(new THREE.Color(0x202020), 1.0);
-            webGLRenderer.autoClear = false;
-            webGLRenderer.sortObjects = false;
-            element.appendChild(webGLRenderer.domElement);
-            return webGLRenderer;
-        })
-            .publishReplay(1)
-            .refCount();
-        this._webGLRenderer$.subscribe(function () { });
-        var createRenderer$ = this._webGLRenderer$
-            .first()
-            .map(function (webGLRenderer) {
-            return function (renderer) {
-                renderer.needsRender = true;
-                renderer.renderer = webGLRenderer;
-                return renderer;
-            };
-        });
-        var resizeRenderer$ = this._renderService.size$
-            .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$
-            .map(function (name) {
-            return function (renderer) {
-                if (renderer.renderer == null) {
-                    return renderer;
-                }
-                renderer.needsRender = true;
-                return renderer;
-            };
-        });
-        Observable_1.Observable
-            .merge(createRenderer$, resizeRenderer$, clearRenderer$)
-            .subscribe(this._rendererOperation$);
-        var renderCollectionEmpty$ = this._renderCollection$
-            .filter(function (hashes) {
-            return Object.keys(hashes).length === 0;
-        })
-            .share();
-        renderCollectionEmpty$
-            .subscribe(function (hashes) {
-            if (_this._renderFrameSubscription == null) {
-                return;
-            }
-            _this._renderFrameSubscription.unsubscribe();
-            _this._renderFrameSubscription = null;
-            _this._renderFrameSubscribe();
-        });
-        renderCollectionEmpty$
-            .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: true,
-        configurable: true
-    });
-    Object.defineProperty(GLRenderer.prototype, "webGLRenderer$", {
-        get: function () {
-            return this._webGLRenderer$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    GLRenderer.prototype.clear = function (name) {
-        this._clear$.next(name);
-    };
-    GLRenderer.prototype._renderFrameSubscribe = function () {
-        var _this = this;
-        this._render$
-            .first()
-            .map(function (renderHash) {
-            return function (irc) {
-                irc.needsRender = true;
-                return irc;
-            };
-        })
-            .subscribe(function (operation) {
-            _this._renderCameraOperation$.next(operation);
-        });
-        this._renderFrameSubscription = this._render$
-            .first()
-            .mergeMap(function (hash) {
-            return _this._renderService.renderCameraFrame$;
-        })
-            .subscribe(this._renderFrame$);
-    };
-    return GLRenderer;
-}());
-exports.GLRenderer = GLRenderer;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = GLRenderer;
-
-},{"../Render":223,"rxjs/Observable":28,"rxjs/Subject":33,"rxjs/add/observable/combineLatest":37,"rxjs/add/operator/distinctUntilChanged":55,"rxjs/add/operator/filter":58,"rxjs/add/operator/first":60,"rxjs/add/operator/map":62,"rxjs/add/operator/merge":63,"rxjs/add/operator/mergeMap":65,"rxjs/add/operator/scan":70,"rxjs/add/operator/share":71,"rxjs/add/operator/startWith":75,"three":167}],306:[function(require,module,exports){
-/// <reference path="../../typings/index.d.ts" />
-"use strict";
-var THREE = require("three");
-var Geo_1 = require("../Geo");
-var Render_1 = require("../Render");
-var RenderCamera = (function () {
-    function RenderCamera(perspectiveCameraAspect, renderMode) {
-        this.alpha = -1;
-        this.zoom = 0;
-        this._frameId = -1;
-        this._changed = false;
-        this._changedForFrame = -1;
-        this.currentAspect = 1;
-        this.currentPano = false;
-        this.previousAspect = 1;
-        this.previousPano = false;
-        this.renderMode = renderMode;
-        this._spatial = new Geo_1.Spatial();
-        this._camera = new Geo_1.Camera();
-        this._perspective = new THREE.PerspectiveCamera(50, perspectiveCameraAspect, 0.4, 10000);
-        this._perspective.matrixAutoUpdate = false;
-        this._rotation = { phi: 0, theta: 0 };
-    }
-    Object.defineProperty(RenderCamera.prototype, "camera", {
-        get: function () {
-            return this._camera;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(RenderCamera.prototype, "changed", {
-        get: function () {
-            return this.frameId === this._changedForFrame;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(RenderCamera.prototype, "frameId", {
-        get: function () {
-            return this._frameId;
-        },
-        set: function (value) {
-            this._frameId = value;
-            if (this._changed) {
-                this._changed = false;
-                this._changedForFrame = value;
-            }
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(RenderCamera.prototype, "perspective", {
-        get: function () {
-            return this._perspective;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(RenderCamera.prototype, "rotation", {
-        get: function () {
-            return this._rotation;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    RenderCamera.prototype.updateProjection = function () {
-        var currentAspect = this._getAspect(this.currentAspect, this.currentPano, this.perspective.aspect);
-        var previousAspect = this._getAspect(this.previousAspect, this.previousPano, this.perspective.aspect);
-        var aspect = (1 - this.alpha) * previousAspect + this.alpha * currentAspect;
-        var verticalFov = this._getVerticalFov(aspect, this._camera.focal, this.zoom);
-        this._perspective.fov = verticalFov;
-        this._perspective.updateProjectionMatrix();
-        this._changed = true;
-    };
-    RenderCamera.prototype.updatePerspective = function (camera) {
-        this._perspective.up.copy(camera.up);
-        this._perspective.position.copy(camera.position);
-        this._perspective.lookAt(camera.lookat);
-        this._perspective.updateMatrix();
-        this._perspective.updateMatrixWorld(false);
-        this._changed = true;
-    };
-    RenderCamera.prototype.updateRotation = function (camera) {
-        this._rotation = this._getRotation(camera);
-    };
-    RenderCamera.prototype._getVerticalFov = function (aspect, focal, zoom) {
-        return 2 * Math.atan(0.5 / (Math.pow(2, zoom) * aspect * focal)) * 180 / Math.PI;
-    };
-    RenderCamera.prototype._getAspect = function (nodeAspect, pano, perspectiveCameraAspect) {
-        if (pano) {
-            return 1;
-        }
-        var coeff = Math.max(1, 1 / nodeAspect);
-        var usePerspective = this.renderMode === Render_1.RenderMode.Letterbox ?
-            nodeAspect > perspectiveCameraAspect :
-            nodeAspect < perspectiveCameraAspect;
-        var aspect = usePerspective ?
-            coeff * perspectiveCameraAspect :
-            coeff * nodeAspect;
-        return aspect;
-    };
-    RenderCamera.prototype._getRotation = function (camera) {
-        var direction = camera.lookat.clone().sub(camera.position);
-        var up = camera.up.clone();
-        var upProjection = direction.clone().dot(up);
-        var planeProjection = direction.clone().sub(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 RenderCamera;
-}());
-exports.RenderCamera = RenderCamera;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = RenderCamera;
-
-},{"../Geo":220,"../Render":223,"three":167}],307:[function(require,module,exports){
-"use strict";
-/**
- * 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 = {}));
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = RenderMode;
-
-},{}],308:[function(require,module,exports){
-/// <reference path="../../typings/index.d.ts" />
-"use strict";
-var Subject_1 = require("rxjs/Subject");
-var BehaviorSubject_1 = require("rxjs/BehaviorSubject");
-require("rxjs/add/observable/combineLatest");
-require("rxjs/add/operator/do");
-require("rxjs/add/operator/filter");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/publishReplay");
-require("rxjs/add/operator/scan");
-require("rxjs/add/operator/skip");
-require("rxjs/add/operator/startWith");
-require("rxjs/add/operator/withLatestFrom");
-var Geo_1 = require("../Geo");
-var Render_1 = require("../Render");
-var RenderService = (function () {
-    function RenderService(element, currentFrame$, renderMode) {
-        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 Subject_1.Subject();
-        this._renderCameraOperation$ = new Subject_1.Subject();
-        this._size$ =
-            new BehaviorSubject_1.BehaviorSubject({
-                height: this._element.offsetHeight,
-                width: this._element.offsetWidth,
-            });
-        this._resize$
-            .map(function () {
-            return { height: _this._element.offsetHeight, width: _this._element.offsetWidth };
-        })
-            .subscribe(this._size$);
-        this._renderMode$ = new BehaviorSubject_1.BehaviorSubject(renderMode);
-        this._renderCameraHolder$ = this._renderCameraOperation$
-            .startWith(function (rc) {
-            return rc;
-        })
-            .scan(function (rc, operation) {
-            return operation(rc);
-        }, new Render_1.RenderCamera(this._element.offsetWidth / this._element.offsetHeight, renderMode))
-            .publishReplay(1)
-            .refCount();
-        this._renderCameraFrame$ = this._currentFrame$
-            .withLatestFrom(this._renderCameraHolder$, function (frame, renderCamera) {
-            return [frame, renderCamera];
-        })
-            .do(function (args) {
-            var frame = args[0];
-            var rc = args[1];
-            var camera = frame.state.camera;
-            if (rc.alpha !== frame.state.alpha ||
-                rc.zoom !== frame.state.zoom ||
-                rc.camera.diff(camera) > 1e-9) {
-                var currentTransform = frame.state.currentTransform;
-                var previousTransform = frame.state.previousTransform != null ?
-                    frame.state.previousTransform :
-                    frame.state.currentTransform;
-                var previousNode = frame.state.previousNode != null ?
-                    frame.state.previousNode :
-                    frame.state.currentNode;
-                rc.currentAspect = currentTransform.basicAspect;
-                rc.currentPano = frame.state.currentNode.pano;
-                rc.previousAspect = previousTransform.basicAspect;
-                rc.previousPano = previousNode.pano;
-                rc.alpha = frame.state.alpha;
-                rc.zoom = frame.state.zoom;
-                rc.camera.copy(camera);
-                rc.updatePerspective(camera);
-                rc.updateRotation(camera);
-                rc.updateProjection();
-            }
-            rc.frameId = frame.id;
-        })
-            .map(function (args) {
-            return args[1];
-        })
-            .publishReplay(1)
-            .refCount();
-        this._renderCamera$ = this._renderCameraFrame$
-            .filter(function (rc) {
-            return rc.changed;
-        })
-            .publishReplay(1)
-            .refCount();
-        this._bearing$ = this._renderCamera$
-            .map(function (renderCamera) {
-            var bearing = _this._spatial.radToDeg(_this._spatial.azimuthalToBearing(renderCamera.rotation.phi));
-            return _this._spatial.wrap(bearing, 0, 360);
-        })
-            .publishReplay(1)
-            .refCount();
-        this._size$
-            .skip(1)
-            .map(function (size) {
-            return function (rc) {
-                rc.perspective.aspect = size.width / size.height;
-                rc.updateProjection();
-                return rc;
-            };
-        })
-            .subscribe(this._renderCameraOperation$);
-        this._renderMode$
-            .skip(1)
-            .map(function (rm) {
-            return function (rc) {
-                rc.renderMode = rm;
-                rc.updateProjection();
-                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: true,
-        configurable: true
-    });
-    Object.defineProperty(RenderService.prototype, "element", {
-        get: function () {
-            return this._element;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(RenderService.prototype, "resize$", {
-        get: function () {
-            return this._resize$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(RenderService.prototype, "size$", {
-        get: function () {
-            return this._size$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(RenderService.prototype, "renderMode$", {
-        get: function () {
-            return this._renderMode$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(RenderService.prototype, "renderCameraFrame$", {
-        get: function () {
-            return this._renderCameraFrame$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(RenderService.prototype, "renderCamera$", {
-        get: function () {
-            return this._renderCamera$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    return RenderService;
-}());
-exports.RenderService = RenderService;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = RenderService;
-
-},{"../Geo":220,"../Render":223,"rxjs/BehaviorSubject":25,"rxjs/Subject":33,"rxjs/add/observable/combineLatest":37,"rxjs/add/operator/do":56,"rxjs/add/operator/filter":58,"rxjs/add/operator/map":62,"rxjs/add/operator/publishReplay":69,"rxjs/add/operator/scan":70,"rxjs/add/operator/skip":72,"rxjs/add/operator/startWith":75,"rxjs/add/operator/withLatestFrom":80}],309:[function(require,module,exports){
-"use strict";
-var State;
-(function (State) {
-    State[State["Traversing"] = 0] = "Traversing";
-    State[State["Waiting"] = 1] = "Waiting";
-})(State = exports.State || (exports.State = {}));
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = State;
-
-},{}],310:[function(require,module,exports){
-"use strict";
-var State_1 = require("../State");
-var Geo_1 = require("../Geo");
-var StateContext = (function () {
-    function StateContext() {
-        this._state = new State_1.TraversingState({
-            alpha: 1,
-            camera: new Geo_1.Camera(),
-            currentIndex: -1,
-            reference: { alt: 0, lat: 0, lon: 0 },
-            trajectory: [],
-            zoom: 0,
-        });
-    }
-    StateContext.prototype.traverse = function () {
-        this._state = this._state.traverse();
-    };
-    StateContext.prototype.wait = function () {
-        this._state = this._state.wait();
-    };
-    Object.defineProperty(StateContext.prototype, "state", {
-        get: function () {
-            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;
-            }
-            throw new Error("Invalid state");
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateContext.prototype, "reference", {
-        get: function () {
-            return this._state.reference;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateContext.prototype, "alpha", {
-        get: function () {
-            return this._state.alpha;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateContext.prototype, "camera", {
-        get: function () {
-            return this._state.camera;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateContext.prototype, "zoom", {
-        get: function () {
-            return this._state.zoom;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateContext.prototype, "currentNode", {
-        get: function () {
-            return this._state.currentNode;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateContext.prototype, "previousNode", {
-        get: function () {
-            return this._state.previousNode;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateContext.prototype, "currentCamera", {
-        get: function () {
-            return this._state.currentCamera;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateContext.prototype, "currentTransform", {
-        get: function () {
-            return this._state.currentTransform;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateContext.prototype, "previousTransform", {
-        get: function () {
-            return this._state.previousTransform;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateContext.prototype, "trajectory", {
-        get: function () {
-            return this._state.trajectory;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateContext.prototype, "currentIndex", {
-        get: function () {
-            return this._state.currentIndex;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateContext.prototype, "lastNode", {
-        get: function () {
-            return this._state.trajectory[this._state.trajectory.length - 1];
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateContext.prototype, "nodesAhead", {
-        get: function () {
-            return this._state.trajectory.length - 1 - this._state.currentIndex;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateContext.prototype, "motionless", {
-        get: function () {
-            return this._state.motionless;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    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.rotateBasic = function (basicRotation) {
-        this._state.rotateBasic(basicRotation);
-    };
-    StateContext.prototype.rotateBasicUnbounded = function (basicRotation) {
-        this._state.rotateBasicUnbounded(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);
-    };
-    return StateContext;
-}());
-exports.StateContext = StateContext;
-
-},{"../Geo":220,"../State":224}],311:[function(require,module,exports){
-"use strict";
-var BehaviorSubject_1 = require("rxjs/BehaviorSubject");
-var Subject_1 = require("rxjs/Subject");
-var AnimationFrame_1 = require("rxjs/util/AnimationFrame");
-require("rxjs/add/operator/bufferCount");
-require("rxjs/add/operator/distinctUntilChanged");
-require("rxjs/add/operator/do");
-require("rxjs/add/operator/filter");
-require("rxjs/add/operator/first");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/pairwise");
-require("rxjs/add/operator/publishReplay");
-require("rxjs/add/operator/scan");
-require("rxjs/add/operator/startWith");
-require("rxjs/add/operator/switchMap");
-require("rxjs/add/operator/withLatestFrom");
-var State_1 = require("../State");
-var StateService = (function () {
-    function StateService() {
-        var _this = this;
-        this._appendNode$ = new Subject_1.Subject();
-        this._start$ = new Subject_1.Subject();
-        this._frame$ = new Subject_1.Subject();
-        this._fpsSampleRate = 30;
-        this._contextOperation$ = new BehaviorSubject_1.BehaviorSubject(function (context) {
-            return context;
-        });
-        this._context$ = this._contextOperation$
-            .scan(function (context, operation) {
-            return operation(context);
-        }, new State_1.StateContext())
-            .publishReplay(1)
-            .refCount();
-        this._state$ = this._context$
-            .map(function (context) {
-            return context.state;
-        })
-            .distinctUntilChanged()
-            .publishReplay(1)
-            .refCount();
-        this._fps$ = this._start$
-            .switchMap(function () {
-            return _this._frame$
-                .bufferCount(1, _this._fpsSampleRate)
-                .map(function (frameIds) {
-                return new Date().getTime();
-            })
-                .pairwise()
-                .map(function (times) {
-                return Math.max(20, 1000 * _this._fpsSampleRate / (times[1] - times[0]));
-            })
-                .startWith(60);
-        })
-            .share();
-        this._currentState$ = this._frame$
-            .withLatestFrom(this._fps$, this._context$, function (frameId, fps, context) {
-            return [frameId, fps, context];
-        })
-            .filter(function (fc) {
-            return fc[2].currentNode != null;
-        })
-            .do(function (fc) {
-            fc[2].update(fc[1]);
-        })
-            .map(function (fc) {
-            return { fps: fc[1], id: fc[0], state: fc[2] };
-        })
-            .share();
-        this._lastState$ = this._currentState$
-            .publishReplay(1)
-            .refCount();
-        var nodeChanged$ = this._currentState$
-            .distinctUntilChanged(undefined, function (f) {
-            return f.state.currentNode.key;
-        })
-            .publishReplay(1)
-            .refCount();
-        var nodeChangedSubject$ = new Subject_1.Subject();
-        nodeChanged$
-            .subscribe(nodeChangedSubject$);
-        this._currentKey$ = new BehaviorSubject_1.BehaviorSubject(null);
-        nodeChangedSubject$
-            .map(function (f) {
-            return f.state.currentNode.key;
-        })
-            .subscribe(this._currentKey$);
-        this._currentNode$ = nodeChangedSubject$
-            .map(function (f) {
-            return f.state.currentNode;
-        })
-            .publishReplay(1)
-            .refCount();
-        this._currentCamera$ = nodeChangedSubject$
-            .map(function (f) {
-            return f.state.currentCamera;
-        })
-            .publishReplay(1)
-            .refCount();
-        this._currentTransform$ = nodeChangedSubject$
-            .map(function (f) {
-            return f.state.currentTransform;
-        })
-            .publishReplay(1)
-            .refCount();
-        this._reference$ = nodeChangedSubject$
-            .map(function (f) {
-            return f.state.reference;
-        })
-            .distinctUntilChanged(function (r1, r2) {
-            return r1.lat === r2.lat && r1.lon === r2.lon;
-        }, function (reference) {
-            return { lat: reference.lat, lon: reference.lon };
-        })
-            .publishReplay(1)
-            .refCount();
-        this._currentNodeExternal$ = nodeChanged$
-            .map(function (f) {
-            return f.state.currentNode;
-        })
-            .publishReplay(1)
-            .refCount();
-        this._appendNode$
-            .map(function (node) {
-            return function (context) {
-                context.append([node]);
-                return context;
-            };
-        })
-            .subscribe(this._contextOperation$);
-        this._inMotionOperation$ = new Subject_1.Subject();
-        nodeChanged$
-            .map(function (frame) {
-            return true;
-        })
-            .subscribe(this._inMotionOperation$);
-        this._inMotionOperation$
-            .distinctUntilChanged()
-            .filter(function (moving) {
-            return moving;
-        })
-            .switchMap(function (moving) {
-            return _this._currentState$
-                .filter(function (frame) {
-                return frame.state.nodesAhead === 0;
-            })
-                .map(function (frame) {
-                return [frame.state.camera.clone(), frame.state.zoom];
-            })
-                .pairwise()
-                .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;
-            })
-                .first(function (changed) {
-                return !changed;
-            });
-        })
-            .subscribe(this._inMotionOperation$);
-        this._inMotion$ = this._inMotionOperation$
-            .distinctUntilChanged()
-            .publishReplay(1)
-            .refCount();
-        this._inTranslationOperation$ = new Subject_1.Subject();
-        nodeChanged$
-            .map(function (frame) {
-            return true;
-        })
-            .subscribe(this._inTranslationOperation$);
-        this._inTranslationOperation$
-            .distinctUntilChanged()
-            .filter(function (inTranslation) {
-            return inTranslation;
-        })
-            .switchMap(function (inTranslation) {
-            return _this._currentState$
-                .filter(function (frame) {
-                return frame.state.nodesAhead === 0;
-            })
-                .map(function (frame) {
-                return frame.state.camera.position.clone();
-            })
-                .pairwise()
-                .map(function (pair) {
-                return pair[0].distanceToSquared(pair[1]) !== 0;
-            })
-                .first(function (changed) {
-                return !changed;
-            });
-        })
-            .subscribe(this._inTranslationOperation$);
-        this._inTranslation$ = this._inTranslationOperation$
-            .distinctUntilChanged()
-            .publishReplay(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 AnimationFrame_1.RequestAnimationFrameDefinition(window);
-    }
-    Object.defineProperty(StateService.prototype, "currentState$", {
-        get: function () {
-            return this._currentState$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateService.prototype, "currentNode$", {
-        get: function () {
-            return this._currentNode$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateService.prototype, "currentKey$", {
-        get: function () {
-            return this._currentKey$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateService.prototype, "currentNodeExternal$", {
-        get: function () {
-            return this._currentNodeExternal$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateService.prototype, "currentCamera$", {
-        get: function () {
-            return this._currentCamera$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateService.prototype, "currentTransform$", {
-        get: function () {
-            return this._currentTransform$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateService.prototype, "state$", {
-        get: function () {
-            return this._state$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateService.prototype, "reference$", {
-        get: function () {
-            return this._reference$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateService.prototype, "inMotion$", {
-        get: function () {
-            return this._inMotion$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateService.prototype, "inTranslation$", {
-        get: function () {
-            return this._inTranslation$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateService.prototype, "appendNode$", {
-        get: function () {
-            return this._appendNode$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    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.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.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.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); });
-    };
-    /**
-     * 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$
-            .first()
-            .map(function (frame) {
-            return frame.state.getCenter();
-        });
-    };
-    StateService.prototype.getZoom = function () {
-        return this._lastState$
-            .first()
-            .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.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":224,"rxjs/BehaviorSubject":25,"rxjs/Subject":33,"rxjs/add/operator/bufferCount":48,"rxjs/add/operator/distinctUntilChanged":55,"rxjs/add/operator/do":56,"rxjs/add/operator/filter":58,"rxjs/add/operator/first":60,"rxjs/add/operator/map":62,"rxjs/add/operator/pairwise":66,"rxjs/add/operator/publishReplay":69,"rxjs/add/operator/scan":70,"rxjs/add/operator/startWith":75,"rxjs/add/operator/switchMap":76,"rxjs/add/operator/withLatestFrom":80,"rxjs/util/AnimationFrame":150}],312:[function(require,module,exports){
-/// <reference path="../../../typings/index.d.ts" />
-"use strict";
-var Error_1 = require("../../Error");
-var Geo_1 = require("../../Geo");
-var StateBase = (function () {
-    function StateBase(state) {
-        this._spatial = new Geo_1.Spatial();
-        this._geoCoords = new Geo_1.GeoCoords();
-        this._referenceThreshold = 0.01;
-        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);
-            var transform = new Geo_1.Transform(node, node.image, translation);
-            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: true,
-        configurable: true
-    });
-    Object.defineProperty(StateBase.prototype, "alpha", {
-        get: function () {
-            return this._getAlpha();
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateBase.prototype, "camera", {
-        get: function () {
-            return this._camera;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateBase.prototype, "zoom", {
-        get: function () {
-            return this._zoom;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateBase.prototype, "trajectory", {
-        get: function () {
-            return this._trajectory;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateBase.prototype, "currentIndex", {
-        get: function () {
-            return this._currentIndex;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateBase.prototype, "currentNode", {
-        get: function () {
-            return this._currentNode;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateBase.prototype, "previousNode", {
-        get: function () {
-            return this._previousNode;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateBase.prototype, "currentCamera", {
-        get: function () {
-            return this._currentCamera;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateBase.prototype, "currentTransform", {
-        get: function () {
-            return this._trajectoryTransforms.length > 0 ?
-                this._trajectoryTransforms[this.currentIndex] : null;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateBase.prototype, "previousTransform", {
-        get: function () {
-            return this._trajectoryTransforms.length > 1 && this.currentIndex > 0 ?
-                this._trajectoryTransforms[this.currentIndex - 1] : null;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateBase.prototype, "motionless", {
-        get: function () {
-            return this._motionless;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    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._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._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);
-            var transform = new Geo_1.Transform(node, node.image, translation);
-            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);
-            var transform = new Geo_1.Transform(node, node.image, translation);
-            this._trajectoryTransforms.unshift(transform);
-            this._trajectoryCameras.unshift(new Geo_1.Camera(transform));
-        }
-    };
-    StateBase.prototype._nodeToTranslation = function (node) {
-        var C = this._geoCoords.geodeticToEnu(node.latLon.lat, node.latLon.lon, node.alt, this._reference.lat, this._reference.lon, this._reference.alt);
-        var RC = this._spatial.rotate(C, node.rotation);
-        return [-RC.x, -RC.y, -RC.z];
-    };
-    StateBase.prototype._sameConnectedComponent = function () {
-        var current = this._currentNode;
-        var previous = this._previousNode;
-        if (!current ||
-            !current.mergeCC ||
-            !previous ||
-            !previous.mergeCC) {
-            return true;
-        }
-        return 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":219,"../../Geo":220}],313:[function(require,module,exports){
-/// <reference path="../../../typings/index.d.ts" />
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var THREE = require("three");
-var UnitBezier = require("unitbezier");
-var State_1 = require("../../State");
-var RotationDelta = (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: true,
-        configurable: true
-    });
-    Object.defineProperty(RotationDelta.prototype, "theta", {
-        get: function () {
-            return this._theta;
-        },
-        set: function (value) {
-            this._theta = value;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(RotationDelta.prototype, "isZero", {
-        get: function () {
-            return this._phi === 0 && this._theta === 0;
-        },
-        enumerable: true,
-        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;
-}());
-var TraversingState = (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._animationSpeed = 0.025;
-        _this._unitBezier = new UnitBezier(0.74, 0.67, 0.38, 0.96);
-        _this._useBezier = false;
-        _this._rotationDelta = new 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;
-    }
-    TraversingState.prototype.traverse = function () {
-        throw new Error("Not implemented");
-    };
-    TraversingState.prototype.wait = function () {
-        return new State_1.WaitingState(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.move = function (delta) {
-        throw new Error("Not implemented");
-    };
-    TraversingState.prototype.moveTo = function (delta) {
-        throw new Error("Not implemented");
-    };
-    TraversingState.prototype.rotate = function (rotationDelta) {
-        if (this._currentNode == null) {
-            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 RotationDelta(rotationDelta.phi, rotationDelta.theta);
-        }
-    };
-    TraversingState.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();
-        }
-    };
-    TraversingState.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();
-        }
-    };
-    TraversingState.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);
-    };
-    TraversingState.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));
-    };
-    TraversingState.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);
-    };
-    TraversingState.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;
-    };
-    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 + 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._previousCamera);
-            this._applyRotation(this._currentCamera);
-        }
-        this._updateRotationBasic();
-        if (this._basicRotation[0] !== 0 || this._basicRotation[1] !== 0) {
-            this._applyRotationBasic();
-        }
-        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();
-    };
-    TraversingState.prototype._applyRotation = function (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 += this._rotationDelta.phi;
-        var theta = Math.atan2(Math.sqrt(offset.x * offset.x + offset.y * offset.y), offset.z);
-        theta += this._rotationDelta.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));
-    };
-    TraversingState.prototype._applyRotationBasic = function () {
-        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] + this._basicRotation[0], 0, 1);
-            currentBasic[1] = this._spatial.clamp(currentBasic[1] + this._basicRotation[1], 0.05, 0.95);
-        }
-        else if (currentGPano != null &&
-            currentTransform.gpano.CroppedAreaImageWidthPixels === currentTransform.gpano.FullPanoWidthPixels) {
-            currentBasic[0] = this._spatial.wrap(currentBasic[0] + this._basicRotation[0], 0, 1);
-            currentBasic[1] = this._spatial.clamp(currentBasic[1] + this._basicRotation[1], 0, 1);
-        }
-        else {
-            currentBasic[0] = this._spatial.clamp(currentBasic[0] + this._basicRotation[0], 0, 1);
-            currentBasic[1] = this._spatial.clamp(currentBasic[1] + this._basicRotation[1], 0, 1);
-        }
-        if (previousNode.fullPano) {
-            previousBasic[0] = this._spatial.wrap(previousBasic[0] + this._basicRotation[0], 0, 1);
-            previousBasic[1] = this._spatial.clamp(previousBasic[1] + this._basicRotation[1], 0.05, 0.95);
-        }
-        else if (previousGPano != null &&
-            previousTransform.gpano.CroppedAreaImageWidthPixels === previousTransform.gpano.FullPanoWidthPixels) {
-            previousBasic[0] = this._spatial.wrap(previousBasic[0] + this._basicRotation[0], 0, 1);
-            previousBasic[1] = this._spatial.clamp(previousBasic[1] + this._basicRotation[1], 0, 1);
-        }
-        else {
-            previousBasic[0] = this._spatial.clamp(previousBasic[0] + this._basicRotation[0], 0, 1);
-            previousBasic[1] = this._spatial.clamp(currentBasic[1] + this._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);
-    };
-    TraversingState.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);
-        }
-    };
-    TraversingState.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);
-        }
-    };
-    TraversingState.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;
-        }
-        this._rotationDelta.multiply(this._rotationAcceleration);
-        this._rotationDelta.threshold(this._rotationThreshold);
-    };
-    TraversingState.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];
-        }
-    };
-    TraversingState.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];
-        }
-    };
-    TraversingState.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;
-    };
-    TraversingState.prototype._setDesiredZoom = function () {
-        this._desiredZoom =
-            this._currentNode.fullPano || this._previousNode == null ?
-                this._zoom : 0;
-    };
-    return TraversingState;
-}(State_1.StateBase));
-exports.TraversingState = TraversingState;
-
-},{"../../State":224,"three":167,"unitbezier":169}],314:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var State_1 = require("../../State");
-var WaitingState = (function (_super) {
-    __extends(WaitingState, _super);
-    function WaitingState(state) {
-        var _this = _super.call(this, state) || this;
-        _this._adjustCameras();
-        _this._motionless = _this._motionlessTransition();
-        return _this;
-    }
-    WaitingState.prototype.traverse = function () {
-        return new State_1.TraversingState(this);
-    };
-    WaitingState.prototype.wait = function () {
-        throw new Error("Not implemented");
-    };
-    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.rotate = function (delta) { return; };
-    WaitingState.prototype.rotateBasic = function (basicRotation) { return; };
-    WaitingState.prototype.rotateBasicUnbounded = function (basicRotation) { return; };
-    WaitingState.prototype.rotateToBasic = function (basic) { return; };
-    WaitingState.prototype.zoomIn = function (delta, reference) { return; };
-    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.setCenter = function (center) { return; };
-    WaitingState.prototype.setZoom = function (zoom) { return; };
-    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;
-
-},{"../../State":224}],315:[function(require,module,exports){
-"use strict";
-var Observable_1 = require("rxjs/Observable");
-/**
- * @class ImageTileLoader
- *
- * @classdesc Represents a loader of image tiles.
- */
-var ImageTileLoader = (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 [Observable_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;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = ImageTileLoader;
-
-},{"rxjs/Observable":28}],316:[function(require,module,exports){
-"use strict";
-/**
- * @class ImageTileStore
- *
- * @classdesc Represents a store for image tiles.
- */
-var ImageTileStore = (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;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = ImageTileStore;
-
-},{}],317:[function(require,module,exports){
-/// <reference path="../../typings/index.d.ts" />
-"use strict";
-var Geo_1 = require("../Geo");
-/**
- * @class RegionOfInterestCalculator
- *
- * @classdesc Represents a calculator for regions of interest.
- */
-var RegionOfInterestCalculator = (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 canvasPoints = this._canvasBoundaryPoints(4);
-        var bbox = this._canvasPointsBoundingBox(canvasPoints, renderCamera, transform);
-        this._clipBoundingBox(bbox);
-        var centralPixel = [
-            [0.5 - 0.5 / size.width, 0.5 - 0.5 / size.height],
-            [0.5 + 0.5 / size.width, 0.5 - 0.5 / size.height],
-            [0.5 + 0.5 / size.width, 0.5 + 0.5 / size.height],
-            [0.5 - 0.5 / size.width, 0.5 + 0.5 / size.height],
-        ];
-        var cpbox = this._canvasPointsBoundingBox(centralPixel, renderCamera, transform);
-        return {
-            bbox: bbox,
-            pixelHeight: cpbox.maxY - cpbox.minY,
-            pixelWidth: cpbox.maxX - cpbox.minX + (cpbox.minX < cpbox.maxX ? 0 : 1),
-        };
-    };
-    RegionOfInterestCalculator.prototype._canvasBoundaryPoints = function (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;
-    };
-    RegionOfInterestCalculator.prototype._canvasPointsBoundingBox = function (canvasPoints, renderCamera, transform) {
-        var _this = this;
-        var basicPoints = canvasPoints.map(function (point) {
-            return _this._viewportCoords
-                .canvasToBasic(point[0], point[1], 1, 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;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = RegionOfInterestCalculator;
-
-},{"../Geo":220}],318:[function(require,module,exports){
-/// <reference path="../../typings/index.d.ts" />
-"use strict";
-var THREE = require("three");
-var Subject_1 = require("rxjs/Subject");
-/**
- * @class TextureProvider
- *
- * @classdesc Represents a provider of textures.
- */
-var TextureProvider = (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 Subject_1.Subject();
-        this._createdSubject$ = new Subject_1.Subject();
-        this._created$ = this._createdSubject$
-            .publishReplay(1)
-            .refCount();
-        this._createdSubscription = this._created$.subscribe(function () { });
-        this._hasSubject$ = new Subject_1.Subject();
-        this._has$ = this._hasSubject$
-            .startWith(false)
-            .publishReplay(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: true,
-        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: true,
-        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: true,
-        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: true,
-        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: true,
-        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 () {
-        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.round(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(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);
-    };
-    /**
-     * 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(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(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);
-        this._renderer.render(scene, this._camera, this._renderTarget);
-        this._renderer.setRenderTarget(undefined);
-        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(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 {Arrary<number>} tile - The tile coordinates.
-     */
-    TextureProvider.prototype._tileKey = function (tile) {
-        return tile[0] + "-" + tile[1];
-    };
-    return TextureProvider;
-}());
-exports.TextureProvider = TextureProvider;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = TextureProvider;
-
-},{"rxjs/Subject":33,"three":167}],319:[function(require,module,exports){
-"use strict";
-var EventEmitter = (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;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = EventEmitter;
-
-},{}],320:[function(require,module,exports){
-"use strict";
-var Viewer_1 = require("../Viewer");
-var Settings = (function () {
-    function Settings() {
-    }
-    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;
-    };
-    Object.defineProperty(Settings, "baseImageSize", {
-        get: function () {
-            return Settings._baseImageSize;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Settings, "basePanoramaSize", {
-        get: function () {
-            return Settings._basePanoramaSize;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Settings, "maxImageSize", {
-        get: function () {
-            return Settings._maxImageSize;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    return Settings;
-}());
-exports.Settings = Settings;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = Settings;
-
-},{"../Viewer":227}],321:[function(require,module,exports){
-"use strict";
-var Urls = (function () {
-    function Urls() {
-    }
-    Object.defineProperty(Urls, "tileScheme", {
-        get: function () {
-            return "https";
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Urls, "tileDomain", {
-        get: function () {
-            return "d2qb1440i7l50o.cloudfront.net";
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Urls, "origin", {
-        get: function () {
-            return "mapillary.webgl";
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Urls.thumbnail = function (key, size) {
-        return "https://d1cuyjsrcm0gby.cloudfront.net/" + key + "/thumb-" + size + ".jpg?origin=" + this.origin;
-    };
-    Urls.falcorModel = function (clientId) {
-        return "https://a.mapillary.com/v3/model.json?client_id=" + clientId;
-    };
-    Urls.protoMesh = function (key) {
-        return "https://d1brzeo354iq2l.cloudfront.net/v2/mesh/" + key;
-    };
-    return Urls;
-}());
-exports.Urls = Urls;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = Urls;
-
-},{}],322:[function(require,module,exports){
-"use strict";
-require("rxjs/add/operator/bufferCount");
-require("rxjs/add/operator/delay");
-require("rxjs/add/operator/distinctUntilChanged");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/switchMap");
-var CacheService = (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: true,
-        configurable: true
-    });
-    CacheService.prototype.start = function () {
-        var _this = this;
-        if (this._started) {
-            return;
-        }
-        this._uncacheSubscription = this._stateService.currentState$
-            .distinctUntilChanged(undefined, function (frame) {
-            return frame.state.currentNode.key;
-        })
-            .map(function (frame) {
-            return frame.state.trajectory
-                .map(function (n) {
-                return n.key;
-            });
-        })
-            .bufferCount(1, 5)
-            .switchMap(function (keepKeysBuffer) {
-            var keepKeys = keepKeysBuffer[0];
-            return _this._graphService.uncache$(keepKeys);
-        })
-            .subscribe(function () { });
-        this._started = true;
-    };
-    CacheService.prototype.stop = function () {
-        if (!this._started) {
-            return;
-        }
-        this._uncacheSubscription.unsubscribe();
-        this._uncacheSubscription = null;
-        this._started = false;
-    };
-    return CacheService;
-}());
-exports.CacheService = CacheService;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = CacheService;
-
-},{"rxjs/add/operator/bufferCount":48,"rxjs/add/operator/delay":53,"rxjs/add/operator/distinctUntilChanged":55,"rxjs/add/operator/map":62,"rxjs/add/operator/switchMap":76}],323:[function(require,module,exports){
-"use strict";
-var Component_1 = require("../Component");
-var ComponentController = (function () {
-    function ComponentController(container, navigator, key, options) {
-        var _this = this;
-        this._container = container;
-        this._navigator = navigator;
-        this._options = options != null ? options : {};
-        this._key = key;
-        this._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$
-                .first(function (k) {
-                return k != null;
-            })
-                .subscribe(function (k) {
-                _this._key = k;
-                _this._componentService.deactivateCover();
-                _this._coverComponent.configure({ key: _this._key, loading: false, visible: false });
-                _this._subscribeCoverComponent();
-                _this._navigator.stateService.start();
-            });
-        }
-    }
-    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({ loading: false, visible: true });
-    };
-    ComponentController.prototype.deactivate = function (name) {
-        this._componentService.deactivate(name);
-    };
-    ComponentController.prototype.deactivateCover = function () {
-        this._coverComponent.configure({ loading: true, visible: true });
-    };
-    ComponentController.prototype.resize = function () {
-        this._componentService.resize();
-    };
-    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.route, "route");
-        this._uFalse(options.slider, "slider");
-        this._uFalse(options.stats, "stats");
-        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");
-    };
-    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._subscribeCoverComponent = function () {
-        var _this = this;
-        this._coverComponent.configuration$.subscribe(function (conf) {
-            if (conf.loading) {
-                _this._navigator.stateService.currentKey$
-                    .first()
-                    .switchMap(function (key) {
-                    return key == null || key !== conf.key ?
-                        _this._navigator.moveToKey$(conf.key) :
-                        _this._navigator.stateService.currentNode$
-                            .first();
-                })
-                    .subscribe(function (node) {
-                    _this._navigator.stateService.start();
-                    _this._coverComponent.configure({ loading: false, visible: false });
-                    _this._componentService.deactivateCover();
-                }, function (error) {
-                    console.error("Failed to deactivate cover.", error);
-                    _this._coverComponent.configure({ loading: false, visible: true });
-                });
-            }
-            else if (conf.visible) {
-                _this._navigator.stateService.stop();
-                _this._componentService.activateCover();
-            }
-        });
-    };
-    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":217}],324:[function(require,module,exports){
-"use strict";
-var Render_1 = require("../Render");
-var Viewer_1 = require("../Viewer");
-var Container = (function () {
-    function Container(id, stateService, options) {
-        this.id = id;
-        this.element = document.getElementById(id);
-        this.element.classList.add("mapillary-js");
-        this.renderService = new Render_1.RenderService(this.element, stateService.currentState$, options.renderMode);
-        this.glRenderer = new Render_1.GLRenderer(this.renderService);
-        this.domRenderer = new Render_1.DOMRenderer(this.element, this.renderService, stateService.currentState$);
-        this.mouseService = new Viewer_1.MouseService(this.element);
-        this.touchService = new Viewer_1.TouchService(this.element);
-        this.spriteService = new Viewer_1.SpriteService(options.sprite);
-    }
-    return Container;
-}());
-exports.Container = Container;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = Container;
-
-},{"../Render":223,"../Viewer":227}],325:[function(require,module,exports){
-"use strict";
-var Observable_1 = require("rxjs/Observable");
-require("rxjs/add/observable/combineLatest");
-require("rxjs/add/operator/distinctUntilChanged");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/throttleTime");
-var Viewer_1 = require("../Viewer");
-var EventLauncher = (function () {
-    function EventLauncher(eventEmitter, navigator, container) {
-        var _this = this;
-        this._container = container;
-        this._eventEmitter = eventEmitter;
-        this._navigator = navigator;
-        this._loadingSubscription = this._navigator.loadingService.loading$
-            .subscribe(function (loading) {
-            _this._eventEmitter.fire(Viewer_1.Viewer.loadingchanged, loading);
-        });
-        this._currentNodeSubscription = this._navigator.stateService.currentNodeExternal$
-            .subscribe(function (node) {
-            _this._eventEmitter.fire(Viewer_1.Viewer.nodechanged, node);
-        });
-        this._sequenceEdgesSubscription = this._navigator.stateService.currentNodeExternal$
-            .switchMap(function (node) {
-            return node.sequenceEdges$;
-        })
-            .subscribe(function (status) {
-            _this._eventEmitter.fire(Viewer_1.Viewer.sequenceedgeschanged, status);
-        });
-        this._spatialEdgesSubscription = this._navigator.stateService.currentNodeExternal$
-            .switchMap(function (node) {
-            return node.spatialEdges$;
-        })
-            .subscribe(function (status) {
-            _this._eventEmitter.fire(Viewer_1.Viewer.spatialedgeschanged, status);
-        });
-        this._moveSubscription = Observable_1.Observable
-            .combineLatest(this._navigator.stateService.inMotion$, this._container.mouseService.active$, this._container.touchService.active$)
-            .map(function (values) {
-            return values[0] || values[1] || values[2];
-        })
-            .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$
-            .throttleTime(100)
-            .distinctUntilChanged(function (b1, b2) {
-            return Math.abs(b2 - b1) < 1;
-        })
-            .subscribe(function (bearing) {
-            _this._eventEmitter.fire(Viewer_1.Viewer.bearingchanged, bearing);
-        });
-    }
-    EventLauncher.prototype.dispose = function () {
-        this._bearingSubscription.unsubscribe();
-        this._loadingSubscription.unsubscribe();
-        this._currentNodeSubscription.unsubscribe();
-        this._moveSubscription.unsubscribe();
-        this._sequenceEdgesSubscription.unsubscribe();
-        this._spatialEdgesSubscription.unsubscribe();
-    };
-    return EventLauncher;
-}());
-exports.EventLauncher = EventLauncher;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = EventLauncher;
-
-},{"../Viewer":227,"rxjs/Observable":28,"rxjs/add/observable/combineLatest":37,"rxjs/add/operator/distinctUntilChanged":55,"rxjs/add/operator/map":62,"rxjs/add/operator/throttleTime":79}],326:[function(require,module,exports){
-"use strict";
-/**
- * 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(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).mapillary={})}(this,(function(e){"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 t=function(e,i){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i])})(e,i)};function i(e,i){if("function"!=typeof i&&null!==i)throw new TypeError("Class extends value "+String(i)+" is not a constructor or null");function n(){this.constructor=e}t(e,i),e.prototype=null===i?Object.create(i):(n.prototype=i.prototype,new n)}function n(e,t,i,n){return new(i||(i=Promise))((function(r,s){function a(e){try{h(n.next(e))}catch(e){s(e)}}function o(e){try{h(n.throw(e))}catch(e){s(e)}}function h(e){var t;e.done?r(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(a,o)}h((n=n.apply(e,t||[])).next())}))}function r(e,t){var i,n,r,s,a={label:0,sent:function(){if(1&r[0])throw r[1];return r[1]},trys:[],ops:[]};return s={next:o(0),throw:o(1),return:o(2)},"function"==typeof Symbol&&(s[Symbol.iterator]=function(){return this}),s;function o(s){return function(o){return function(s){if(i)throw new TypeError("Generator is already executing.");for(;a;)try{if(i=1,n&&(r=2&s[0]?n.return:s[0]?n.throw||((r=n.return)&&r.call(n),0):n.next)&&!(r=r.call(n,s[1])).done)return r;switch(n=0,r&&(s=[2&s[0],r.value]),s[0]){case 0:case 1:r=s;break;case 4:return a.label++,{value:s[1],done:!1};case 5:a.label++,n=s[1],s=[0];continue;case 7:s=a.ops.pop(),a.trys.pop();continue;default:if(!(r=a.trys,(r=r.length>0&&r[r.length-1])||6!==s[0]&&2!==s[0])){a=0;continue}if(3===s[0]&&(!r||s[1]>r[0]&&s[1]<r[3])){a.label=s[1];break}if(6===s[0]&&a.label<r[1]){a.label=r[1],r=s;break}if(r&&a.label<r[2]){a.label=r[2],a.ops.push(s);break}r[2]&&a.ops.pop(),a.trys.pop();continue}s=t.call(e,a)}catch(e){s=[6,e],n=0}finally{i=r=0}if(5&s[0])throw s[1];return{value:s[0]?s[1]:void 0,done:!0}}([s,o])}}}function s(e){var t="function"==typeof Symbol&&Symbol.iterator,i=t&&e[t],n=0;if(i)return i.call(e);if(e&&"number"==typeof e.length)return{next:function(){return e&&n>=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function a(e,t){var i="function"==typeof Symbol&&e[Symbol.iterator];if(!i)return e;var n,r,s=i.call(e),a=[];try{for(;(void 0===t||t-- >0)&&!(n=s.next()).done;)a.push(n.value)}catch(e){r={error:e}}finally{try{n&&!n.done&&(i=s.return)&&i.call(s)}finally{if(r)throw r.error}}return a}function o(e,t){for(var i=0,n=t.length,r=e.length;i<n;i++,r++)e[r]=t[i];return e}function h(e){return this instanceof h?(this.v=e,this):new h(e)}function c(e,t,i){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var n,r=i.apply(e,t||[]),s=[];return n={},a("next"),a("throw"),a("return"),n[Symbol.asyncIterator]=function(){return this},n;function a(e){r[e]&&(n[e]=function(t){return new Promise((function(i,n){s.push([e,t,i,n])>1||o(e,t)}))})}function o(e,t){try{(i=r[e](t)).value instanceof h?Promise.resolve(i.value.v).then(c,l):u(s[0][2],i)}catch(e){u(s[0][3],e)}var i}function c(e){o("next",e)}function l(e){o("throw",e)}function u(e,t){e(t),s.shift(),s.length&&o(s[0][0],s[0][1])}}function l(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t,i=e[Symbol.asyncIterator];return i?i.call(e):(e=s(e),t={},n("next"),n("throw"),n("return"),t[Symbol.asyncIterator]=function(){return this},t);function n(i){t[i]=e[i]&&function(t){return new Promise((function(n,r){(function(e,t,i,n){Promise.resolve(n).then((function(t){e({value:t,done:i})}),t)})(n,r,(t=e[i](t)).done,t.value)}))}}}function u(e){return"function"==typeof e}function d(e){var t=e((function(e){Error.call(e),e.stack=(new Error).stack}));return t.prototype=Object.create(Error.prototype),t.prototype.constructor=t,t}var p=d((function(e){return function(t){e(this),this.message=t?t.length+" errors occurred during unsubscription:\n"+t.map((function(e,t){return t+1+") "+e.toString()})).join("\n  "):"",this.name="UnsubscriptionError",this.errors=t}}));function m(e,t){if(e){var i=e.indexOf(t);0<=i&&e.splice(i,1)}}var f=function(){function e(e){this.initialTeardown=e,this.closed=!1,this._parentage=null,this._teardowns=null}return e.prototype.unsubscribe=function(){var e,t,i,n,r;if(!this.closed){this.closed=!0;var h=this._parentage;if(h)if(this._parentage=null,Array.isArray(h))try{for(var c=s(h),l=c.next();!l.done;l=c.next()){l.value.remove(this)}}catch(t){e={error:t}}finally{try{l&&!l.done&&(t=c.return)&&t.call(c)}finally{if(e)throw e.error}}else h.remove(this);var d=this.initialTeardown;if(u(d))try{d()}catch(e){r=e instanceof p?e.errors:[e]}var m=this._teardowns;if(m){this._teardowns=null;try{for(var f=s(m),g=f.next();!g.done;g=f.next()){var _=g.value;try{v(_)}catch(e){r=null!=r?r:[],e instanceof p?r=o(o([],a(r)),a(e.errors)):r.push(e)}}}catch(e){i={error:e}}finally{try{g&&!g.done&&(n=f.return)&&n.call(f)}finally{if(i)throw i.error}}}if(r)throw new p(r)}},e.prototype.add=function(t){var i;if(t&&t!==this)if(this.closed)v(t);else{if(t instanceof e){if(t.closed||t._hasParent(this))return;t._addParent(this)}(this._teardowns=null!==(i=this._teardowns)&&void 0!==i?i:[]).push(t)}},e.prototype._hasParent=function(e){var t=this._parentage;return t===e||Array.isArray(t)&&t.includes(e)},e.prototype._addParent=function(e){var t=this._parentage;this._parentage=Array.isArray(t)?(t.push(e),t):t?[t,e]:e},e.prototype._removeParent=function(e){var t=this._parentage;t===e?this._parentage=null:Array.isArray(t)&&m(t,e)},e.prototype.remove=function(t){var i=this._teardowns;i&&m(i,t),t instanceof e&&t._removeParent(this)},e.EMPTY=function(){var t=new e;return t.closed=!0,t}(),e}(),g=f.EMPTY;function _(e){return e instanceof f||e&&"closed"in e&&u(e.remove)&&u(e.add)&&u(e.unsubscribe)}function v(e){u(e)?e():e.unsubscribe()}var y={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1},b={setTimeout:function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var i=b.delegate;return((null==i?void 0:i.setTimeout)||setTimeout).apply(void 0,o([],a(e)))},clearTimeout:function(e){var t=b.delegate;return((null==t?void 0:t.clearTimeout)||clearTimeout)(e)},delegate:void 0};function x(e){b.setTimeout((function(){throw e}))}function w(){}var M=S("C",void 0,void 0);function S(e,t,i){return{kind:e,value:t,error:i}}var T=null;function C(e){if(y.useDeprecatedSynchronousErrorHandling){var t=!T;if(t&&(T={errorThrown:!1,error:null}),e(),t){var i=T,n=i.errorThrown,r=i.error;if(T=null,n)throw r}}else e()}var E=function(e){function t(t){var i=e.call(this)||this;return i.isStopped=!1,t?(i.destination=t,_(t)&&t.add(i)):i.destination=L,i}return i(t,e),t.create=function(e,t,i){return new A(e,t,i)},t.prototype.next=function(e){this.isStopped?P(function(e){return S("N",e,void 0)}(e),this):this._next(e)},t.prototype.error=function(e){this.isStopped?P(S("E",void 0,e),this):(this.isStopped=!0,this._error(e))},t.prototype.complete=function(){this.isStopped?P(M,this):(this.isStopped=!0,this._complete())},t.prototype.unsubscribe=function(){this.closed||(this.isStopped=!0,e.prototype.unsubscribe.call(this),this.destination=null)},t.prototype._next=function(e){this.destination.next(e)},t.prototype._error=function(e){try{this.destination.error(e)}finally{this.unsubscribe()}},t.prototype._complete=function(){try{this.destination.complete()}finally{this.unsubscribe()}},t}(f),A=function(e){function t(t,i,n){var r,s=e.call(this)||this;if(u(t))r=t;else if(t){var a;r=t.next,i=t.error,n=t.complete,s&&y.useDeprecatedNextContext?(a=Object.create(t)).unsubscribe=function(){return s.unsubscribe()}:a=t,r=null==r?void 0:r.bind(a),i=null==i?void 0:i.bind(a),n=null==n?void 0:n.bind(a)}return s.destination={next:r?I(r):w,error:I(null!=i?i:R),complete:n?I(n):w},s}return i(t,e),t}(E);function I(e,t){return function(){for(var t=[],i=0;i<arguments.length;i++)t[i]=arguments[i];try{e.apply(void 0,o([],a(t)))}catch(e){x(e)}}}function R(e){throw e}function P(e,t){var i=y.onStoppedNotification;i&&b.setTimeout((function(){return i(e,t)}))}var L={closed:!0,next:w,error:R,complete:w},D="function"==typeof Symbol&&Symbol.observable||"@@observable";function N(e){return e}function $(e){return 0===e.length?N:1===e.length?e[0]:function(t){return e.reduce((function(e,t){return t(e)}),t)}}var k=function(){function e(e){e&&(this._subscribe=e)}return e.prototype.lift=function(t){var i=new e;return i.source=this,i.operator=t,i},e.prototype.subscribe=function(e,t,i){var n,r=this,s=(n=e)&&n instanceof E||function(e){return e&&u(e.next)&&u(e.error)&&u(e.complete)}(n)&&_(n)?e:new A(e,t,i);return C((function(){var e=r,t=e.operator,i=e.source;s.add(t?t.call(s,i):i?r._subscribe(s):r._trySubscribe(s))})),s},e.prototype._trySubscribe=function(e){try{return this._subscribe(e)}catch(t){e.error(t)}},e.prototype.forEach=function(e,t){var i=this;return new(t=O(t))((function(t,n){var r;r=i.subscribe((function(t){try{e(t)}catch(e){n(e),null==r||r.unsubscribe()}}),n,t)}))},e.prototype._subscribe=function(e){var t;return null===(t=this.source)||void 0===t?void 0:t.subscribe(e)},e.prototype[D]=function(){return this},e.prototype.pipe=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return $(e)(this)},e.prototype.toPromise=function(e){var t=this;return new(e=O(e))((function(e,i){var n;t.subscribe((function(e){return n=e}),(function(e){return i(e)}),(function(){return e(n)}))}))},e.create=function(t){return new e(t)},e}();function O(e){var t;return null!==(t=null!=e?e:y.Promise)&&void 0!==t?t:Promise}function z(e){return u(null==e?void 0:e.lift)}function F(e){return function(t){if(z(t))return t.lift((function(t){try{return e(t,this)}catch(e){this.error(e)}}));throw new TypeError("Unable to lift unknown Observable type")}}var B=function(e){function t(t,i,n,r,s){var a=e.call(this,t)||this;return a.onFinalize=s,a._next=i?function(e){try{i(e)}catch(e){t.error(e)}}:e.prototype._next,a._error=r?function(e){try{r(e)}catch(e){t.error(e)}finally{this.unsubscribe()}}:e.prototype._error,a._complete=n?function(){try{n()}catch(e){t.error(e)}finally{this.unsubscribe()}}:e.prototype._complete,a}return i(t,e),t.prototype.unsubscribe=function(){var t,i=this.closed;e.prototype.unsubscribe.call(this),!i&&(null===(t=this.onFinalize)||void 0===t||t.call(this))},t}(E);function U(){return F((function(e,t){var i=null;e._refCount++;var n=new B(t,void 0,void 0,void 0,(function(){if(!e||e._refCount<=0||0<--e._refCount)i=null;else{var n=e._connection,r=i;i=null,!n||r&&n!==r||n.unsubscribe(),t.unsubscribe()}}));e.subscribe(n),n.closed||(i=e.connect())}))}var V=function(e){function t(t,i){var n=e.call(this)||this;return n.source=t,n.subjectFactory=i,n._subject=null,n._refCount=0,n._connection=null,z(t)&&(n.lift=t.lift),n}return i(t,e),t.prototype._subscribe=function(e){return this.getSubject().subscribe(e)},t.prototype.getSubject=function(){var e=this._subject;return e&&!e.isStopped||(this._subject=this.subjectFactory()),this._subject},t.prototype._teardown=function(){this._refCount=0;var e=this._connection;this._subject=this._connection=null,null==e||e.unsubscribe()},t.prototype.connect=function(){var e=this,t=this._connection;if(!t){t=this._connection=new f;var i=this.getSubject();t.add(this.source.subscribe(new B(i,void 0,(function(){e._teardown(),i.complete()}),(function(t){e._teardown(),i.error(t)}),(function(){return e._teardown()})))),t.closed&&(this._connection=null,t=f.EMPTY)}return t},t.prototype.refCount=function(){return U()(this)},t}(k),H=d((function(e){return function(){e(this),this.name="ObjectUnsubscribedError",this.message="object unsubscribed"}})),j=function(e){function t(){var t=e.call(this)||this;return t.closed=!1,t.observers=[],t.isStopped=!1,t.hasError=!1,t.thrownError=null,t}return i(t,e),t.prototype.lift=function(e){var t=new G(this,this);return t.operator=e,t},t.prototype._throwIfClosed=function(){if(this.closed)throw new H},t.prototype.next=function(e){var t=this;C((function(){var i,n;if(t._throwIfClosed(),!t.isStopped){var r=t.observers.slice();try{for(var a=s(r),o=a.next();!o.done;o=a.next()){o.value.next(e)}}catch(e){i={error:e}}finally{try{o&&!o.done&&(n=a.return)&&n.call(a)}finally{if(i)throw i.error}}}}))},t.prototype.error=function(e){var t=this;C((function(){if(t._throwIfClosed(),!t.isStopped){t.hasError=t.isStopped=!0,t.thrownError=e;for(var i=t.observers;i.length;)i.shift().error(e)}}))},t.prototype.complete=function(){var e=this;C((function(){if(e._throwIfClosed(),!e.isStopped){e.isStopped=!0;for(var t=e.observers;t.length;)t.shift().complete()}}))},t.prototype.unsubscribe=function(){this.isStopped=this.closed=!0,this.observers=null},Object.defineProperty(t.prototype,"observed",{get:function(){var e;return(null===(e=this.observers)||void 0===e?void 0:e.length)>0},enumerable:!1,configurable:!0}),t.prototype._trySubscribe=function(t){return this._throwIfClosed(),e.prototype._trySubscribe.call(this,t)},t.prototype._subscribe=function(e){return this._throwIfClosed(),this._checkFinalizedStatuses(e),this._innerSubscribe(e)},t.prototype._innerSubscribe=function(e){var t=this,i=t.hasError,n=t.isStopped,r=t.observers;return i||n?g:(r.push(e),new f((function(){return m(r,e)})))},t.prototype._checkFinalizedStatuses=function(e){var t=this,i=t.hasError,n=t.thrownError,r=t.isStopped;i?e.error(n):r&&e.complete()},t.prototype.asObservable=function(){var e=new k;return e.source=this,e},t.create=function(e,t){return new G(e,t)},t}(k),G=function(e){function t(t,i){var n=e.call(this)||this;return n.destination=t,n.source=i,n}return i(t,e),t.prototype.next=function(e){var t,i;null===(i=null===(t=this.destination)||void 0===t?void 0:t.next)||void 0===i||i.call(t,e)},t.prototype.error=function(e){var t,i;null===(i=null===(t=this.destination)||void 0===t?void 0:t.error)||void 0===i||i.call(t,e)},t.prototype.complete=function(){var e,t;null===(t=null===(e=this.destination)||void 0===e?void 0:e.complete)||void 0===t||t.call(e)},t.prototype._subscribe=function(e){var t,i;return null!==(i=null===(t=this.source)||void 0===t?void 0:t.subscribe(e))&&void 0!==i?i:g},t}(j),W=function(e){function t(t){var i=e.call(this)||this;return i._value=t,i}return i(t,e),Object.defineProperty(t.prototype,"value",{get:function(){return this.getValue()},enumerable:!1,configurable:!0}),t.prototype._subscribe=function(t){var i=e.prototype._subscribe.call(this,t);return!i.closed&&t.next(this._value),i},t.prototype.getValue=function(){var e=this,t=e.hasError,i=e.thrownError,n=e._value;if(t)throw i;return this._throwIfClosed(),n},t.prototype.next=function(t){e.prototype.next.call(this,this._value=t)},t}(j),q={now:function(){return(q.delegate||Date).now()},delegate:void 0},X=function(e){function t(t,i,n){void 0===t&&(t=1/0),void 0===i&&(i=1/0),void 0===n&&(n=q);var r=e.call(this)||this;return r._bufferSize=t,r._windowTime=i,r._timestampProvider=n,r._buffer=[],r._infiniteTimeWindow=!0,r._infiniteTimeWindow=i===1/0,r._bufferSize=Math.max(1,t),r._windowTime=Math.max(1,i),r}return i(t,e),t.prototype.next=function(t){var i=this,n=i.isStopped,r=i._buffer,s=i._infiniteTimeWindow,a=i._timestampProvider,o=i._windowTime;n||(r.push(t),!s&&r.push(a.now()+o)),this._trimBuffer(),e.prototype.next.call(this,t)},t.prototype._subscribe=function(e){this._throwIfClosed(),this._trimBuffer();for(var t=this._innerSubscribe(e),i=this._infiniteTimeWindow,n=this._buffer.slice(),r=0;r<n.length&&!e.closed;r+=i?1:2)e.next(n[r]);return this._checkFinalizedStatuses(e),t},t.prototype._trimBuffer=function(){var e=this,t=e._bufferSize,i=e._timestampProvider,n=e._buffer,r=e._infiniteTimeWindow,s=(r?1:2)*t;if(t<1/0&&s<n.length&&n.splice(0,n.length-s),!r){for(var a=i.now(),o=0,h=1;h<n.length&&n[h]<=a;h+=2)o=h;o&&n.splice(0,o+1)}},t}(j),Z=function(e){function t(t,i){return e.call(this)||this}return i(t,e),t.prototype.schedule=function(e,t){return this},t}(f),Y={setInterval:function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var i=Y.delegate;return((null==i?void 0:i.setInterval)||setInterval).apply(void 0,o([],a(e)))},clearInterval:function(e){var t=Y.delegate;return((null==t?void 0:t.clearInterval)||clearInterval)(e)},delegate:void 0},J=function(e){function t(t,i){var n=e.call(this,t,i)||this;return n.scheduler=t,n.work=i,n.pending=!1,n}return i(t,e),t.prototype.schedule=function(e,t){if(void 0===t&&(t=0),this.closed)return this;this.state=e;var i=this.id,n=this.scheduler;return null!=i&&(this.id=this.recycleAsyncId(n,i,t)),this.pending=!0,this.delay=t,this.id=this.id||this.requestAsyncId(n,this.id,t),this},t.prototype.requestAsyncId=function(e,t,i){return void 0===i&&(i=0),Y.setInterval(e.flush.bind(e,this),i)},t.prototype.recycleAsyncId=function(e,t,i){if(void 0===i&&(i=0),null!=i&&this.delay===i&&!1===this.pending)return t;Y.clearInterval(t)},t.prototype.execute=function(e,t){if(this.closed)return new Error("executing a cancelled action");this.pending=!1;var i=this._execute(e,t);if(i)return i;!1===this.pending&&null!=this.id&&(this.id=this.recycleAsyncId(this.scheduler,this.id,null))},t.prototype._execute=function(e,t){var i,n=!1;try{this.work(e)}catch(e){n=!0,i=!!e&&e||new Error(e)}if(n)return this.unsubscribe(),i},t.prototype.unsubscribe=function(){if(!this.closed){var t=this.id,i=this.scheduler,n=i.actions;this.work=this.state=this.scheduler=null,this.pending=!1,m(n,this),null!=t&&(this.id=this.recycleAsyncId(i,t,null)),this.delay=null,e.prototype.unsubscribe.call(this)}},t}(Z),K=function(){function e(t,i){void 0===i&&(i=e.now),this.schedulerActionCtor=t,this.now=i}return e.prototype.schedule=function(e,t,i){return void 0===t&&(t=0),new this.schedulerActionCtor(this,e).schedule(i,t)},e.now=q.now,e}(),Q=new(function(e){function t(t,i){void 0===i&&(i=K.now);var n=e.call(this,t,i)||this;return n.actions=[],n._active=!1,n._scheduled=void 0,n}return i(t,e),t.prototype.flush=function(e){var t=this.actions;if(this._active)t.push(e);else{var i;this._active=!0;do{if(i=e.execute(e.state,e.delay))break}while(e=t.shift());if(this._active=!1,i){for(;e=t.shift();)e.unsubscribe();throw i}}},t}(K))(J),ee=Q,te=new k((function(e){return e.complete()}));function ie(e){return e?function(e){return new k((function(t){return e.schedule((function(){return t.complete()}))}))}(e):te}function ne(e,t){return new k((function(i){var n=0;return t.schedule((function(){n===e.length?i.complete():(i.next(e[n++]),i.closed||this.schedule())}))}))}var re=function(e){return e&&"number"==typeof e.length&&"function"!=typeof e};function se(e){return u(null==e?void 0:e.then)}var ae="function"==typeof Symbol&&Symbol.iterator?Symbol.iterator:"@@iterator";function oe(e,t,i,n){void 0===n&&(n=0);var r=t.schedule((function(){try{i.call(this)}catch(t){e.error(t)}}),n);return e.add(r),r}function he(e,t){if(!e)throw new Error("Iterable cannot be null");return new k((function(i){var n=new f;return n.add(t.schedule((function(){var r=e[Symbol.asyncIterator]();n.add(t.schedule((function(){var e=this;r.next().then((function(t){t.done?i.complete():(i.next(t.value),e.schedule())}))})))}))),n}))}function ce(e){return u(e[D])}function le(e){return u(null==e?void 0:e[ae])}function ue(e){return Symbol.asyncIterator&&u(null==e?void 0:e[Symbol.asyncIterator])}function de(e){return new TypeError("You provided "+(null!==e&&"object"==typeof e?"an invalid object":"'"+e+"'")+" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.")}function pe(e){return c(this,arguments,(function(){var t,i,n;return r(this,(function(r){switch(r.label){case 0:t=e.getReader(),r.label=1;case 1:r.trys.push([1,,9,10]),r.label=2;case 2:return[4,h(t.read())];case 3:return i=r.sent(),n=i.value,i.done?[4,h(void 0)]:[3,5];case 4:return[2,r.sent()];case 5:return[4,h(n)];case 6:return[4,r.sent()];case 7:return r.sent(),[3,2];case 8:return[3,10];case 9:return t.releaseLock(),[7];case 10:return[2]}}))}))}function me(e){return u(null==e?void 0:e.getReader)}function fe(e,t){if(null!=e){if(ce(e))return function(e,t){return new k((function(i){var n=new f;return n.add(t.schedule((function(){var r=e[D]();n.add(r.subscribe({next:function(e){n.add(t.schedule((function(){return i.next(e)})))},error:function(e){n.add(t.schedule((function(){return i.error(e)})))},complete:function(){n.add(t.schedule((function(){return i.complete()})))}}))}))),n}))}(e,t);if(re(e))return ne(e,t);if(se(e))return function(e,t){return new k((function(i){return t.schedule((function(){return e.then((function(e){i.add(t.schedule((function(){i.next(e),i.add(t.schedule((function(){return i.complete()})))})))}),(function(e){i.add(t.schedule((function(){return i.error(e)})))}))}))}))}(e,t);if(ue(e))return he(e,t);if(le(e))return function(e,t){return new k((function(i){var n;return i.add(t.schedule((function(){n=e[ae](),oe(i,t,(function(){var e=n.next(),t=e.value;e.done?i.complete():(i.next(t),this.schedule())}))}))),function(){return u(null==n?void 0:n.return)&&n.return()}}))}(e,t);if(me(e))return function(e,t){return he(pe(e),t)}(e,t)}throw de(e)}function ge(e,t){return t?fe(e,t):_e(e)}function _e(e){if(e instanceof k)return e;if(null!=e){if(ce(e))return n=e,new k((function(e){var t=n[D]();if(u(t.subscribe))return t.subscribe(e);throw new TypeError("Provided object does not correctly implement Symbol.observable")}));if(re(e))return ve(e);if(se(e))return i=e,new k((function(e){i.then((function(t){e.closed||(e.next(t),e.complete())}),(function(t){return e.error(t)})).then(null,x)}));if(ue(e))return ye(e);if(le(e))return t=e,new k((function(e){var i,n;try{for(var r=s(t),a=r.next();!a.done;a=r.next()){var o=a.value;if(e.next(o),e.closed)return}}catch(e){i={error:e}}finally{try{a&&!a.done&&(n=r.return)&&n.call(r)}finally{if(i)throw i.error}}e.complete()}));if(me(e))return ye(pe(e))}var t,i,n;throw de(e)}function ve(e){return new k((function(t){for(var i=0;i<e.length&&!t.closed;i++)t.next(e[i]);t.complete()}))}function ye(e){return new k((function(t){(function(e,t){var i,s,a,o;return n(this,void 0,void 0,(function(){var n,h;return r(this,(function(r){switch(r.label){case 0:r.trys.push([0,5,6,11]),i=l(e),r.label=1;case 1:return[4,i.next()];case 2:if((s=r.sent()).done)return[3,4];if(n=s.value,t.next(n),t.closed)return[2];r.label=3;case 3:return[3,1];case 4:return[3,11];case 5:return h=r.sent(),a={error:h},[3,11];case 6:return r.trys.push([6,,9,10]),s&&!s.done&&(o=i.return)?[4,o.call(i)]:[3,8];case 7:r.sent(),r.label=8;case 8:return[3,10];case 9:if(a)throw a.error;return[7];case 10:return[7];case 11:return t.complete(),[2]}}))}))})(e,t).catch((function(e){return t.error(e)}))}))}function be(e,t){return t?ne(e,t):ve(e)}function xe(e){return e&&u(e.schedule)}function we(e){return e[e.length-1]}function Me(e){return u(we(e))?e.pop():void 0}function Se(e){return xe(we(e))?e.pop():void 0}function Te(e,t){return"number"==typeof we(e)?e.pop():t}function Ce(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var i=Se(e);return i?ne(e,i):be(e)}function Ee(e,t){var i=u(e)?e:function(){return e},n=function(e){return e.error(i())};return new k(t?function(e){return t.schedule(n,0,e)}:n)}var Ae=d((function(e){return function(){e(this),this.name="EmptyError",this.message="no elements in sequence"}}));function Ie(e){return e instanceof Date&&!isNaN(e)}var Re=d((function(e){return function(t){void 0===t&&(t=null),e(this),this.message="Timeout has occurred",this.name="TimeoutError",this.info=t}}));function Pe(e,t){var i=Ie(e)?{first:e}:"number"==typeof e?{each:e}:e,n=i.first,r=i.each,s=i.with,a=void 0===s?Le:s,o=i.scheduler,h=void 0===o?null!=t?t:Q:o,c=i.meta,l=void 0===c?null:c;if(null==n&&null==r)throw new TypeError("No timeout provided.");return F((function(e,t){var i,s,o=null,c=0,u=function(e){s=oe(t,h,(function(){i.unsubscribe(),_e(a({meta:l,lastValue:o,seen:c})).subscribe(t)}),e)};i=e.subscribe(new B(t,(function(e){null==s||s.unsubscribe(),c++,t.next(o=e),r>0&&u(r)}),void 0,void 0,(function(){(null==s?void 0:s.closed)||null==s||s.unsubscribe(),o=null}))),u(null!=n?"number"==typeof n?n:+n-h.now():r)}))}function Le(e){throw new Re(e)}function De(e,t){return F((function(i,n){var r=0;i.subscribe(new B(n,(function(i){n.next(e.call(t,i,r++))})))}))}var Ne=Array.isArray;function $e(e){return De((function(t){return function(e,t){return Ne(t)?e.apply(void 0,o([],a(t))):e(t)}(e,t)}))}var ke=Array.isArray,Oe=Object.getPrototypeOf,ze=Object.prototype,Fe=Object.keys;function Be(e){if(1===e.length){var t=e[0];if(ke(t))return{args:t,keys:null};if((n=t)&&"object"==typeof n&&Oe(n)===ze){var i=Fe(t);return{args:i.map((function(e){return t[e]})),keys:i}}}var n;return{args:e,keys:null}}function Ue(e,t){return e.reduce((function(e,i,n){return e[i]=t[n],e}),{})}function Ve(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var i=Se(e),n=Me(e),r=Be(e),s=r.args,a=r.keys;if(0===s.length)return ge([],i);var o=new k(He(s,i,a?function(e){return Ue(a,e)}:N));return n?o.pipe($e(n)):o}function He(e,t,i){return void 0===i&&(i=N),function(n){je(t,(function(){for(var r=e.length,s=new Array(r),a=r,o=r,h=function(r){je(t,(function(){var h=ge(e[r],t),c=!1;h.subscribe(new B(n,(function(e){s[r]=e,c||(c=!0,o--),o||n.next(i(s.slice()))}),(function(){--a||n.complete()})))}),n)},c=0;c<r;c++)h(c)}),n)}}function je(e,t,i){e?i.add(e.schedule(t)):t()}function Ge(e,t,i,n,r,s,a,o){var h=[],c=0,l=0,u=!1,d=function(){!u||h.length||c||t.complete()},p=function(e){return c<n?m(e):h.push(e)},m=function(e){s&&t.next(e),c++;var o=!1;_e(i(e,l++)).subscribe(new B(t,(function(e){null==r||r(e),s?p(e):t.next(e)}),(function(){o=!0}),void 0,(function(){if(o)try{c--;for(var e=function(){var e=h.shift();a?t.add(a.schedule((function(){return m(e)}))):m(e)};h.length&&c<n;)e();d()}catch(e){t.error(e)}})))};return e.subscribe(new B(t,p,(function(){u=!0,d()}))),function(){null==o||o()}}function We(e,t,i){return void 0===i&&(i=1/0),u(t)?We((function(i,n){return De((function(e,r){return t(i,e,n,r)}))(_e(e(i,n)))}),i):("number"==typeof t&&(i=t),F((function(t,n){return Ge(t,n,e,i)})))}function qe(e){return void 0===e&&(e=1/0),We(N,e)}function Xe(){return qe(1)}function Ze(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return Xe()(be(e,Se(e)))}var Ye=["addListener","removeListener"],Je=["addEventListener","removeEventListener"],Ke=["on","off"];function Qe(e,t,i,n){if(u(i)&&(n=i,i=void 0),n)return Qe(e,t,i).pipe($e(n));var r=a(function(e){return u(e.addEventListener)&&u(e.removeEventListener)}(e)?Je.map((function(n){return function(r){return e[n](t,r,i)}})):function(e){return u(e.addListener)&&u(e.removeListener)}(e)?Ye.map(et(e,t)):function(e){return u(e.on)&&u(e.off)}(e)?Ke.map(et(e,t)):[],2),s=r[0],o=r[1];if(!s&&re(e))return We((function(e){return Qe(e,t,i)}))(be(e));if(!s)throw new TypeError("Invalid event target");return new k((function(e){var t=function(){for(var t=[],i=0;i<arguments.length;i++)t[i]=arguments[i];return e.next(1<t.length?t:t[0])};return s(t),function(){return o(t)}}))}function et(e,t){return function(i){return function(n){return e[i](t,n)}}}function tt(e,t,i){void 0===e&&(e=0),void 0===i&&(i=ee);var n=-1;return null!=t&&(xe(t)?i=t:n=t),new k((function(t){var r=Ie(e)?+e-i.now():e;r<0&&(r=0);var s=0;return i.schedule((function(){t.closed||(t.next(s++),0<=n?this.schedule(void 0,n):t.complete())}),r)}))}function it(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var i=Se(e),n=Te(e,1/0),r=e;return r.length?1===r.length?_e(r[0]):qe(n)(be(r,i)):te}var nt=Array.isArray;function rt(e){return 1===e.length&&nt(e[0])?e[0]:e}function st(e,t){return F((function(i,n){var r=0;i.subscribe(new B(n,(function(i){return e.call(t,i,r++)&&n.next(i)})))}))}function at(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var i=Me(e),n=rt(e);return n.length?new k((function(e){var t=n.map((function(){return[]})),r=n.map((function(){return!1}));e.add((function(){t=r=null}));for(var s=function(s){_e(n[s]).subscribe(new B(e,(function(n){if(t[s].push(n),t.every((function(e){return e.length}))){var h=t.map((function(e){return e.shift()}));e.next(i?i.apply(void 0,o([],a(h))):h),t.some((function(e,t){return!e.length&&r[t]}))&&e.complete()}}),(function(){r[s]=!0,!t[s].length&&e.complete()})))},h=0;!e.closed&&h<n.length;h++)s(h);return function(){t=r=null}})):te}function ot(e,t){return void 0===t&&(t=ee),i=function(){return tt(e,t)},F((function(e,t){var n=!1,r=null,s=null,a=!1,o=function(){if(null==s||s.unsubscribe(),s=null,n){n=!1;var e=r;r=null,t.next(e)}a&&t.complete()},h=function(){s=null,a&&t.complete()};e.subscribe(new B(t,(function(e){n=!0,r=e,s||_e(i(e)).subscribe(s=new B(t,o,h))}),(function(){a=!0,(!n||!s||s.closed)&&t.complete()})))}));var i}function ht(e,t){return void 0===t&&(t=null),t=null!=t?t:e,F((function(i,n){var r=[],a=0;i.subscribe(new B(n,(function(i){var o,h,c,l,u=null;a++%t==0&&r.push([]);try{for(var d=s(r),p=d.next();!p.done;p=d.next()){(_=p.value).push(i),e<=_.length&&(u=null!=u?u:[]).push(_)}}catch(e){o={error:e}}finally{try{p&&!p.done&&(h=d.return)&&h.call(d)}finally{if(o)throw o.error}}if(u)try{for(var f=s(u),g=f.next();!g.done;g=f.next()){var _=g.value;m(r,_),n.next(_)}}catch(e){c={error:e}}finally{try{g&&!g.done&&(l=f.return)&&l.call(f)}finally{if(c)throw c.error}}}),(function(){var e,t;try{for(var i=s(r),a=i.next();!a.done;a=i.next()){var o=a.value;n.next(o)}}catch(t){e={error:t}}finally{try{a&&!a.done&&(t=i.return)&&t.call(i)}finally{if(e)throw e.error}}n.complete()}),void 0,(function(){r=null})))}))}function ct(e){return F((function(t,i){var n,r=null,s=!1;r=t.subscribe(new B(i,void 0,void 0,(function(a){n=_e(e(a,ct(e)(t))),r?(r.unsubscribe(),r=null,n.subscribe(i)):s=!0}))),s&&(r.unsubscribe(),r=null,n.subscribe(i))}))}function lt(e,t,i,n,r){return function(s,a){var o=i,h=t,c=0;s.subscribe(new B(a,(function(t){var i=c++;h=o?e(h,t,i):(o=!0,t),n&&a.next(h)}),r&&function(){o&&a.next(h),a.complete()}))}}function ut(e,t){return F(lt(e,t,arguments.length>=2,!1,!0))}function dt(e,t){return u(t)?We(e,t,1):We(e,1)}var pt={connector:function(){return new j}};function mt(e,t){void 0===t&&(t=pt);var i=t.connector;return F((function(t,n){var r,s=i();ge(e((r=s,new k((function(e){return r.subscribe(e)}))))).subscribe(n),n.add(t.subscribe(s))}))}function ft(e,t){return void 0===t&&(t=Q),F((function(i,n){var r=null,s=null,a=null,o=function(){if(r){r.unsubscribe(),r=null;var e=s;s=null,n.next(e)}};function h(){var i=a+e,s=t.now();if(s<i)return r=this.schedule(void 0,i-s),void n.add(r);o()}i.subscribe(new B(n,(function(i){s=i,a=t.now(),r||(r=t.schedule(h,e),n.add(r))}),(function(){o(),n.complete()}),void 0,(function(){s=r=null})))}))}function gt(e){return F((function(t,i){var n=!1;t.subscribe(new B(i,(function(e){n=!0,i.next(e)}),(function(){n||i.next(e),i.complete()})))}))}function _t(e){return e<=0?function(){return te}:F((function(t,i){var n=0;t.subscribe(new B(i,(function(t){++n<=e&&(i.next(t),e<=n&&i.complete())})))}))}function vt(e,t){return void 0===t&&(t=N),e=null!=e?e:yt,F((function(i,n){var r,s=!0;i.subscribe(new B(n,(function(i){var a=t(i);!s&&e(r,a)||(s=!1,r=a,n.next(i))})))}))}function yt(e,t){return e===t}function bt(e){return void 0===e&&(e=xt),F((function(t,i){var n=!1;t.subscribe(new B(i,(function(e){n=!0,i.next(e)}),(function(){return n?i.complete():i.error(e())})))}))}function xt(){return new Ae}function wt(e,t,i){return void 0===t&&(t=1/0),t=(t||0)<1?1/0:t,F((function(n,r){return Ge(n,r,e,t,void 0,!0,i)}))}function Mt(e){return F((function(t,i){try{t.subscribe(i)}finally{i.add(e)}}))}function St(e,t){var i=arguments.length>=2;return function(n){return n.pipe(e?st((function(t,i){return e(t,i,n)})):N,_t(1),i?gt(t):bt((function(){return new Ae})))}}function Tt(e){return e<=0?function(){return te}:F((function(t,i){var n=[];t.subscribe(new B(i,(function(t){n.push(t),e<n.length&&n.shift()}),(function(){var e,t;try{for(var r=s(n),a=r.next();!a.done;a=r.next()){var o=a.value;i.next(o)}}catch(t){e={error:t}}finally{try{a&&!a.done&&(t=r.return)&&t.call(r)}finally{if(e)throw e.error}}i.complete()}),void 0,(function(){n=null})))}))}function Ct(e,t){var i=arguments.length>=2;return function(n){return n.pipe(e?st((function(t,i){return e(t,i,n)})):N,Tt(1),i?gt(t):bt((function(){return new Ae})))}}function Et(e,t){var i=u(e)?e:function(){return e};return u(t)?mt(t,{connector:i}):function(e){return new V(e,i)}}function At(){return F((function(e,t){var i,n=!1;e.subscribe(new B(t,(function(e){var r=i;i=e,n&&t.next([r,e]),n=!0})))}))}function It(e){return e?function(t){return mt(e)(t)}:function(e){return Et(new j)(e)}}function Rt(e,t,i,n){i&&!u(i)&&(n=i);var r=u(i)?i:void 0;return function(i){return Et(new X(e,t,n),r)(i)}}function Pt(e){var t;void 0===e&&(e=1/0);var i=(t=e&&"object"==typeof e?e:{count:e}).count,n=void 0===i?1/0:i,r=t.delay,s=t.resetOnSuccess,a=void 0!==s&&s;return n<=0?N:F((function(e,t){var i,s=0,o=function(){var h=!1;i=e.subscribe(new B(t,(function(e){a&&(s=0),t.next(e)}),void 0,(function(e){if(s++<n){var a=function(){i?(i.unsubscribe(),i=null,o()):h=!0};if(null!=r){var c="number"==typeof r?tt(r):_e(r(e,s)),l=new B(t,(function(){l.unsubscribe(),a()}),(function(){t.complete()}));c.subscribe(l)}else a()}else t.error(e)}))),h&&(i.unsubscribe(),i=null,o())};o()}))}function Lt(e,t){return F(lt(e,t,arguments.length>=2,!0))}function Dt(e){void 0===e&&(e={});var t=e.connector,i=void 0===t?function(){return new j}:t,n=e.resetOnError,r=void 0===n||n,s=e.resetOnComplete,a=void 0===s||s,o=e.resetOnRefCountZero,h=void 0===o||o;return function(e){var t=null,n=null,s=null,o=0,c=!1,l=!1,u=function(){null==n||n.unsubscribe(),n=null},d=function(){u(),t=s=null,c=l=!1},p=function(){var e=t;d(),null==e||e.unsubscribe()};return F((function(e,m){o++,l||c||u();var f=s=null!=s?s:i();m.add((function(){0!==--o||l||c||(n=Nt(p,h))})),f.subscribe(m),t||(t=new A({next:function(e){return f.next(e)},error:function(e){l=!0,u(),n=Nt(d,r,e),f.error(e)},complete:function(){c=!0,u(),n=Nt(d,a),f.complete()}}),ge(e).subscribe(t))}))(e)}}function Nt(e,t){for(var i=[],n=2;n<arguments.length;n++)i[n-2]=arguments[n];return!0===t?(e(),null):!1===t?null:t.apply(void 0,o([],a(i))).pipe(_t(1)).subscribe((function(){return e()}))}function $t(e){return st((function(t,i){return e<=i}))}function kt(e){return F((function(t,i){var n=!1,r=0;t.subscribe(new B(i,(function(t){return(n||(n=!e(t,r++)))&&i.next(t)})))}))}function Ot(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var i=Se(e);return F((function(t,n){(i?Ze(e,t,i):Ze(e,t)).subscribe(n)}))}function zt(e,t){return F((function(i,n){var r=null,s=0,a=!1,o=function(){return a&&!r&&n.complete()};i.subscribe(new B(n,(function(i){null==r||r.unsubscribe();var a=0,h=s++;_e(e(i,h)).subscribe(r=new B(n,(function(e){return n.next(t?t(i,e,h,a++):e)}),(function(){r=null,o()})))}),(function(){a=!0,o()})))}))}function Ft(e){return F((function(t,i){_e(e).subscribe(new B(i,(function(){return i.complete()}),w)),!i.closed&&t.subscribe(i)}))}function Bt(e,t){return void 0===t&&(t=!1),F((function(i,n){var r=0;i.subscribe(new B(n,(function(i){var s=e(i,r++);(s||t)&&n.next(i),!s&&n.complete()})))}))}function Ut(e,t,i){var n=u(e)||t||i?{next:e,error:t,complete:i}:e;return n?F((function(e,t){var i;null===(i=n.subscribe)||void 0===i||i.call(n);var r=!0;e.subscribe(new B(t,(function(e){var i;null===(i=n.next)||void 0===i||i.call(n,e),t.next(e)}),(function(){var e;r=!1,null===(e=n.complete)||void 0===e||e.call(n),t.complete()}),(function(e){var i;r=!1,null===(i=n.error)||void 0===i||i.call(n,e),t.error(e)}),(function(){var e,t;r&&(null===(e=n.unsubscribe)||void 0===e||e.call(n)),null===(t=n.finalize)||void 0===t||t.call(n)})))})):N}function Vt(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var i=Me(e);return F((function(t,n){for(var r=e.length,s=new Array(r),h=e.map((function(){return!1})),c=!1,l=function(t){_e(e[t]).subscribe(new B(n,(function(e){s[t]=e,c||h[t]||(h[t]=!0,(c=h.every(N))&&(h=null))}),w))},u=0;u<r;u++)l(u);t.subscribe(new B(n,(function(e){if(c){var t=o([e],a(s));n.next(i?i.apply(void 0,o([],a(t))):t)}})))}))}class Ht{createFilter(e){return new Function("node","return "+this._compile(e)+";")}_compile(e){if(null==e||e.length<=1)return"true";const t=e[0];return"("+("=="===t?this._compileComparisonOp("===",e[1],e[2],!1):"!="===t?this._compileComparisonOp("!==",e[1],e[2],!1):">"===t||">="===t||"<"===t||"<="===t?this._compileComparisonOp(t,e[1],e[2],!0):"in"===t?this._compileInOp(e[1],e.slice(2)):"!in"===t?this._compileNegation(this._compileInOp(e[1],e.slice(2))):"all"===t?this._compileLogicalOp(e.slice(1),"&&"):"true")+")"}_compare(e,t){return e<t?-1:e>t?1:0}_compileComparisonOp(e,t,i,n){const r=this._compilePropertyReference(t),s=JSON.stringify(i);return(n?"typeof "+r+"===typeof "+s+"&&":"")+r+e+s}_compileInOp(e,t){const i=this._compare;return JSON.stringify(t.sort(i))+".indexOf("+this._compilePropertyReference(e)+")!==-1"}_compileLogicalOp(e,t){const i=this._compile.bind(this);return e.map(i).join(t)}_compileNegation(e){return"!("+e+")"}_compilePropertyReference(e){return"node["+JSON.stringify(e)+"]"}}
+/**
+     * @license
+     * Copyright 2010-2021 Three.js Authors
+     * SPDX-License-Identifier: MIT
+     */const jt=100,Gt=301,Wt=302,qt=306,Xt=1e3,Zt=1001,Yt=1002,Jt=1003,Kt=1006,Qt=1008,ei=1009,ti=1012,ii=1014,ni=1015,ri=1016,si=1020,ai=1022,oi=1023,hi=1026,ci=1027,li=2300,ui=2301,di=2302,pi=2400,mi=2401,fi=2402,gi=2500,_i=3e3,vi=3001,yi=3007,bi=3002,xi=7680,wi=35044,Mi=35048,Si="300 es";class Ti{addEventListener(e,t){void 0===this._listeners&&(this._listeners={});const i=this._listeners;void 0===i[e]&&(i[e]=[]),-1===i[e].indexOf(t)&&i[e].push(t)}hasEventListener(e,t){if(void 0===this._listeners)return!1;const i=this._listeners;return void 0!==i[e]&&-1!==i[e].indexOf(t)}removeEventListener(e,t){if(void 0===this._listeners)return;const i=this._listeners[e];if(void 0!==i){const e=i.indexOf(t);-1!==e&&i.splice(e,1)}}dispatchEvent(e){if(void 0===this._listeners)return;const t=this._listeners[e.type];if(void 0!==t){e.target=this;const i=t.slice(0);for(let t=0,n=i.length;t<n;t++)i[t].call(this,e);e.target=null}}}let Ci=1234567;const Ei=Math.PI/180,Ai=180/Math.PI,Ii=[];for(let e=0;e<256;e++)Ii[e]=(e<16?"0":"")+e.toString(16);const Ri="undefined"!=typeof crypto&&"randomUUID"in crypto;function Pi(){if(Ri)return crypto.randomUUID().toUpperCase();const e=4294967295*Math.random()|0,t=4294967295*Math.random()|0,i=4294967295*Math.random()|0,n=4294967295*Math.random()|0;return(Ii[255&e]+Ii[e>>8&255]+Ii[e>>16&255]+Ii[e>>24&255]+"-"+Ii[255&t]+Ii[t>>8&255]+"-"+Ii[t>>16&15|64]+Ii[t>>24&255]+"-"+Ii[63&i|128]+Ii[i>>8&255]+"-"+Ii[i>>16&255]+Ii[i>>24&255]+Ii[255&n]+Ii[n>>8&255]+Ii[n>>16&255]+Ii[n>>24&255]).toUpperCase()}function Li(e,t,i){return Math.max(t,Math.min(i,e))}function Di(e,t){return(e%t+t)%t}function Ni(e,t,i){return(1-i)*e+i*t}function $i(e){return 0==(e&e-1)&&0!==e}function ki(e){return Math.pow(2,Math.floor(Math.log(e)/Math.LN2))}var Oi=Object.freeze({__proto__:null,DEG2RAD:Ei,RAD2DEG:Ai,generateUUID:Pi,clamp:Li,euclideanModulo:Di,mapLinear:function(e,t,i,n,r){return n+(e-t)*(r-n)/(i-t)},inverseLerp:function(e,t,i){return e!==t?(i-e)/(t-e):0},lerp:Ni,damp:function(e,t,i,n){return Ni(e,t,1-Math.exp(-i*n))},pingpong:function(e,t=1){return t-Math.abs(Di(e,2*t)-t)},smoothstep:function(e,t,i){return e<=t?0:e>=i?1:(e=(e-t)/(i-t))*e*(3-2*e)},smootherstep:function(e,t,i){return e<=t?0:e>=i?1:(e=(e-t)/(i-t))*e*e*(e*(6*e-15)+10)},randInt:function(e,t){return e+Math.floor(Math.random()*(t-e+1))},randFloat:function(e,t){return e+Math.random()*(t-e)},randFloatSpread:function(e){return e*(.5-Math.random())},seededRandom:function(e){return void 0!==e&&(Ci=e%2147483647),Ci=16807*Ci%2147483647,(Ci-1)/2147483646},degToRad:function(e){return e*Ei},radToDeg:function(e){return e*Ai},isPowerOfTwo:$i,ceilPowerOfTwo:function(e){return Math.pow(2,Math.ceil(Math.log(e)/Math.LN2))},floorPowerOfTwo:ki,setQuaternionFromProperEuler:function(e,t,i,n,r){const s=Math.cos,a=Math.sin,o=s(i/2),h=a(i/2),c=s((t+n)/2),l=a((t+n)/2),u=s((t-n)/2),d=a((t-n)/2),p=s((n-t)/2),m=a((n-t)/2);switch(r){case"XYX":e.set(o*l,h*u,h*d,o*c);break;case"YZY":e.set(h*d,o*l,h*u,o*c);break;case"ZXZ":e.set(h*u,h*d,o*l,o*c);break;case"XZX":e.set(o*l,h*m,h*p,o*c);break;case"YXY":e.set(h*p,o*l,h*m,o*c);break;case"ZYZ":e.set(h*m,h*p,o*l,o*c);break;default:console.warn("THREE.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: "+r)}}});class zi{constructor(e=0,t=0){this.x=e,this.y=t}get width(){return this.x}set width(e){this.x=e}get height(){return this.y}set height(e){this.y=e}set(e,t){return this.x=e,this.y=t,this}setScalar(e){return this.x=e,this.y=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setComponent(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;default:throw new Error("index is out of range: "+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;default:throw new Error("index is out of range: "+e)}}clone(){return new this.constructor(this.x,this.y)}copy(e){return this.x=e.x,this.y=e.y,this}add(e,t){return void 0!==t?(console.warn("THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(e,t)):(this.x+=e.x,this.y+=e.y,this)}addScalar(e){return this.x+=e,this.y+=e,this}addVectors(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this}addScaledVector(e,t){return this.x+=e.x*t,this.y+=e.y*t,this}sub(e,t){return void 0!==t?(console.warn("THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(e,t)):(this.x-=e.x,this.y-=e.y,this)}subScalar(e){return this.x-=e,this.y-=e,this}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this}multiply(e){return this.x*=e.x,this.y*=e.y,this}multiplyScalar(e){return this.x*=e,this.y*=e,this}divide(e){return this.x/=e.x,this.y/=e.y,this}divideScalar(e){return this.multiplyScalar(1/e)}applyMatrix3(e){const t=this.x,i=this.y,n=e.elements;return this.x=n[0]*t+n[3]*i+n[6],this.y=n[1]*t+n[4]*i+n[7],this}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this}clamp(e,t){return this.x=Math.max(e.x,Math.min(t.x,this.x)),this.y=Math.max(e.y,Math.min(t.y,this.y)),this}clampScalar(e,t){return this.x=Math.max(e,Math.min(t,this.x)),this.y=Math.max(e,Math.min(t,this.y)),this}clampLength(e,t){const i=this.length();return this.divideScalar(i||1).multiplyScalar(Math.max(e,Math.min(t,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(e){return this.x*e.x+this.y*e.y}cross(e){return this.x*e.y-this.y*e.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(e){return Math.sqrt(this.distanceToSquared(e))}distanceToSquared(e){const t=this.x-e.x,i=this.y-e.y;return t*t+i*i}manhattanDistanceTo(e){return Math.abs(this.x-e.x)+Math.abs(this.y-e.y)}setLength(e){return this.normalize().multiplyScalar(e)}lerp(e,t){return this.x+=(e.x-this.x)*t,this.y+=(e.y-this.y)*t,this}lerpVectors(e,t,i){return this.x=e.x+(t.x-e.x)*i,this.y=e.y+(t.y-e.y)*i,this}equals(e){return e.x===this.x&&e.y===this.y}fromArray(e,t=0){return this.x=e[t],this.y=e[t+1],this}toArray(e=[],t=0){return e[t]=this.x,e[t+1]=this.y,e}fromBufferAttribute(e,t,i){return void 0!==i&&console.warn("THREE.Vector2: offset has been removed from .fromBufferAttribute()."),this.x=e.getX(t),this.y=e.getY(t),this}rotateAround(e,t){const i=Math.cos(t),n=Math.sin(t),r=this.x-e.x,s=this.y-e.y;return this.x=r*i-s*n+e.x,this.y=r*n+s*i+e.y,this}random(){return this.x=Math.random(),this.y=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y}}zi.prototype.isVector2=!0;class Fi{constructor(){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(e,t,i,n,r,s,a,o,h){const c=this.elements;return c[0]=e,c[1]=n,c[2]=a,c[3]=t,c[4]=r,c[5]=o,c[6]=i,c[7]=s,c[8]=h,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(e){const t=this.elements,i=e.elements;return t[0]=i[0],t[1]=i[1],t[2]=i[2],t[3]=i[3],t[4]=i[4],t[5]=i[5],t[6]=i[6],t[7]=i[7],t[8]=i[8],this}extractBasis(e,t,i){return e.setFromMatrix3Column(this,0),t.setFromMatrix3Column(this,1),i.setFromMatrix3Column(this,2),this}setFromMatrix4(e){const t=e.elements;return this.set(t[0],t[4],t[8],t[1],t[5],t[9],t[2],t[6],t[10]),this}multiply(e){return this.multiplyMatrices(this,e)}premultiply(e){return this.multiplyMatrices(e,this)}multiplyMatrices(e,t){const i=e.elements,n=t.elements,r=this.elements,s=i[0],a=i[3],o=i[6],h=i[1],c=i[4],l=i[7],u=i[2],d=i[5],p=i[8],m=n[0],f=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*m+a*_+o*b,r[3]=s*f+a*v+o*x,r[6]=s*g+a*y+o*w,r[1]=h*m+c*_+l*b,r[4]=h*f+c*v+l*x,r[7]=h*g+c*y+l*w,r[2]=u*m+d*_+p*b,r[5]=u*f+d*v+p*x,r[8]=u*g+d*y+p*w,this}multiplyScalar(e){const t=this.elements;return t[0]*=e,t[3]*=e,t[6]*=e,t[1]*=e,t[4]*=e,t[7]*=e,t[2]*=e,t[5]*=e,t[8]*=e,this}determinant(){const e=this.elements,t=e[0],i=e[1],n=e[2],r=e[3],s=e[4],a=e[5],o=e[6],h=e[7],c=e[8];return t*s*c-t*a*h-i*r*c+i*a*o+n*r*h-n*s*o}invert(){const e=this.elements,t=e[0],i=e[1],n=e[2],r=e[3],s=e[4],a=e[5],o=e[6],h=e[7],c=e[8],l=c*s-a*h,u=a*o-c*r,d=h*r-s*o,p=t*l+i*u+n*d;if(0===p)return this.set(0,0,0,0,0,0,0,0,0);const m=1/p;return e[0]=l*m,e[1]=(n*h-c*i)*m,e[2]=(a*i-n*s)*m,e[3]=u*m,e[4]=(c*t-n*o)*m,e[5]=(n*r-a*t)*m,e[6]=d*m,e[7]=(i*o-h*t)*m,e[8]=(s*t-i*r)*m,this}transpose(){let e;const t=this.elements;return e=t[1],t[1]=t[3],t[3]=e,e=t[2],t[2]=t[6],t[6]=e,e=t[5],t[5]=t[7],t[7]=e,this}getNormalMatrix(e){return this.setFromMatrix4(e).invert().transpose()}transposeIntoArray(e){const t=this.elements;return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],this}setUvTransform(e,t,i,n,r,s,a){const o=Math.cos(r),h=Math.sin(r);return this.set(i*o,i*h,-i*(o*s+h*a)+s+e,-n*h,n*o,-n*(-h*s+o*a)+a+t,0,0,1),this}scale(e,t){const i=this.elements;return i[0]*=e,i[3]*=e,i[6]*=e,i[1]*=t,i[4]*=t,i[7]*=t,this}rotate(e){const t=Math.cos(e),i=Math.sin(e),n=this.elements,r=n[0],s=n[3],a=n[6],o=n[1],h=n[4],c=n[7];return n[0]=t*r+i*o,n[3]=t*s+i*h,n[6]=t*a+i*c,n[1]=-i*r+t*o,n[4]=-i*s+t*h,n[7]=-i*a+t*c,this}translate(e,t){const i=this.elements;return i[0]+=e*i[2],i[3]+=e*i[5],i[6]+=e*i[8],i[1]+=t*i[2],i[4]+=t*i[5],i[7]+=t*i[8],this}equals(e){const t=this.elements,i=e.elements;for(let e=0;e<9;e++)if(t[e]!==i[e])return!1;return!0}fromArray(e,t=0){for(let i=0;i<9;i++)this.elements[i]=e[i+t];return this}toArray(e=[],t=0){const i=this.elements;return e[t]=i[0],e[t+1]=i[1],e[t+2]=i[2],e[t+3]=i[3],e[t+4]=i[4],e[t+5]=i[5],e[t+6]=i[6],e[t+7]=i[7],e[t+8]=i[8],e}clone(){return(new this.constructor).fromArray(this.elements)}}function Bi(e){if(0===e.length)return-1/0;let t=e[0];for(let i=1,n=e.length;i<n;++i)e[i]>t&&(t=e[i]);return t}function Ui(e){return document.createElementNS("http://www.w3.org/1999/xhtml",e)}function Vi(e,t=0){let i=3735928559^t,n=1103547991^t;for(let t,r=0;r<e.length;r++)t=e.charCodeAt(r),i=Math.imul(i^t,2654435761),n=Math.imul(n^t,1597334677);return i=Math.imul(i^i>>>16,2246822507)^Math.imul(n^n>>>13,3266489909),n=Math.imul(n^n>>>16,2246822507)^Math.imul(i^i>>>13,3266489909),4294967296*(2097151&n)+(i>>>0)}let Hi;Fi.prototype.isMatrix3=!0;class ji{static getDataURL(e){if(/^data:/i.test(e.src))return e.src;if("undefined"==typeof HTMLCanvasElement)return e.src;let t;if(e instanceof HTMLCanvasElement)t=e;else{void 0===Hi&&(Hi=Ui("canvas")),Hi.width=e.width,Hi.height=e.height;const i=Hi.getContext("2d");e instanceof ImageData?i.putImageData(e,0,0):i.drawImage(e,0,0,e.width,e.height),t=Hi}return t.width>2048||t.height>2048?(console.warn("THREE.ImageUtils.getDataURL: Image converted to jpg for performance reasons",e),t.toDataURL("image/jpeg",.6)):t.toDataURL("image/png")}}let Gi=0;class Wi extends Ti{constructor(e=Wi.DEFAULT_IMAGE,t=Wi.DEFAULT_MAPPING,i=1001,n=1001,r=1006,s=1008,a=1023,o=1009,h=1,c=3e3){super(),Object.defineProperty(this,"id",{value:Gi++}),this.uuid=Pi(),this.name="",this.image=e,this.mipmaps=[],this.mapping=t,this.wrapS=i,this.wrapT=n,this.magFilter=r,this.minFilter=s,this.anisotropy=h,this.format=a,this.internalFormat=null,this.type=o,this.offset=new zi(0,0),this.repeat=new zi(1,1),this.center=new zi(0,0),this.rotation=0,this.matrixAutoUpdate=!0,this.matrix=new Fi,this.generateMipmaps=!0,this.premultiplyAlpha=!1,this.flipY=!0,this.unpackAlignment=4,this.encoding=c,this.userData={},this.version=0,this.onUpdate=null,this.isRenderTargetTexture=!1}updateMatrix(){this.matrix.setUvTransform(this.offset.x,this.offset.y,this.repeat.x,this.repeat.y,this.rotation,this.center.x,this.center.y)}clone(){return(new this.constructor).copy(this)}copy(e){return this.name=e.name,this.image=e.image,this.mipmaps=e.mipmaps.slice(0),this.mapping=e.mapping,this.wrapS=e.wrapS,this.wrapT=e.wrapT,this.magFilter=e.magFilter,this.minFilter=e.minFilter,this.anisotropy=e.anisotropy,this.format=e.format,this.internalFormat=e.internalFormat,this.type=e.type,this.offset.copy(e.offset),this.repeat.copy(e.repeat),this.center.copy(e.center),this.rotation=e.rotation,this.matrixAutoUpdate=e.matrixAutoUpdate,this.matrix.copy(e.matrix),this.generateMipmaps=e.generateMipmaps,this.premultiplyAlpha=e.premultiplyAlpha,this.flipY=e.flipY,this.unpackAlignment=e.unpackAlignment,this.encoding=e.encoding,this.userData=JSON.parse(JSON.stringify(e.userData)),this}toJSON(e){const t=void 0===e||"string"==typeof e;if(!t&&void 0!==e.textures[this.uuid])return e.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=Pi()),!t&&void 0===e.images[n.uuid]){let t;if(Array.isArray(n)){t=[];for(let e=0,i=n.length;e<i;e++)n[e].isDataTexture?t.push(qi(n[e].image)):t.push(qi(n[e]))}else t=qi(n);e.images[n.uuid]={uuid:n.uuid,url:t}}i.image=n.uuid}return"{}"!==JSON.stringify(this.userData)&&(i.userData=this.userData),t||(e.textures[this.uuid]=i),i}dispose(){this.dispatchEvent({type:"dispose"})}transformUv(e){if(300!==this.mapping)return e;if(e.applyMatrix3(this.matrix),e.x<0||e.x>1)switch(this.wrapS){case Xt:e.x=e.x-Math.floor(e.x);break;case Zt:e.x=e.x<0?0:1;break;case Yt:1===Math.abs(Math.floor(e.x)%2)?e.x=Math.ceil(e.x)-e.x:e.x=e.x-Math.floor(e.x)}if(e.y<0||e.y>1)switch(this.wrapT){case Xt:e.y=e.y-Math.floor(e.y);break;case Zt:e.y=e.y<0?0:1;break;case Yt:1===Math.abs(Math.floor(e.y)%2)?e.y=Math.ceil(e.y)-e.y:e.y=e.y-Math.floor(e.y)}return this.flipY&&(e.y=1-e.y),e}set needsUpdate(e){!0===e&&this.version++}}function qi(e){return"undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap?ji.getDataURL(e):e.data?{data:Array.prototype.slice.call(e.data),width:e.width,height:e.height,type:e.data.constructor.name}:(console.warn("THREE.Texture: Unable to serialize Texture."),{})}Wi.DEFAULT_IMAGE=void 0,Wi.DEFAULT_MAPPING=300,Wi.prototype.isTexture=!0;class Xi{constructor(e=0,t=0,i=0,n=1){this.x=e,this.y=t,this.z=i,this.w=n}get width(){return this.z}set width(e){this.z=e}get height(){return this.w}set height(e){this.w=e}set(e,t,i,n){return this.x=e,this.y=t,this.z=i,this.w=n,this}setScalar(e){return this.x=e,this.y=e,this.z=e,this.w=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setZ(e){return this.z=e,this}setW(e){return this.w=e,this}setComponent(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;case 2:this.z=t;break;case 3:this.w=t;break;default:throw new Error("index is out of range: "+e)}return this}getComponent(e){switch(e){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: "+e)}}clone(){return new this.constructor(this.x,this.y,this.z,this.w)}copy(e){return this.x=e.x,this.y=e.y,this.z=e.z,this.w=void 0!==e.w?e.w:1,this}add(e,t){return void 0!==t?(console.warn("THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(e,t)):(this.x+=e.x,this.y+=e.y,this.z+=e.z,this.w+=e.w,this)}addScalar(e){return this.x+=e,this.y+=e,this.z+=e,this.w+=e,this}addVectors(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this.z=e.z+t.z,this.w=e.w+t.w,this}addScaledVector(e,t){return this.x+=e.x*t,this.y+=e.y*t,this.z+=e.z*t,this.w+=e.w*t,this}sub(e,t){return void 0!==t?(console.warn("THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(e,t)):(this.x-=e.x,this.y-=e.y,this.z-=e.z,this.w-=e.w,this)}subScalar(e){return this.x-=e,this.y-=e,this.z-=e,this.w-=e,this}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this.z=e.z-t.z,this.w=e.w-t.w,this}multiply(e){return this.x*=e.x,this.y*=e.y,this.z*=e.z,this.w*=e.w,this}multiplyScalar(e){return this.x*=e,this.y*=e,this.z*=e,this.w*=e,this}applyMatrix4(e){const t=this.x,i=this.y,n=this.z,r=this.w,s=e.elements;return this.x=s[0]*t+s[4]*i+s[8]*n+s[12]*r,this.y=s[1]*t+s[5]*i+s[9]*n+s[13]*r,this.z=s[2]*t+s[6]*i+s[10]*n+s[14]*r,this.w=s[3]*t+s[7]*i+s[11]*n+s[15]*r,this}divideScalar(e){return this.multiplyScalar(1/e)}setAxisAngleFromQuaternion(e){this.w=2*Math.acos(e.w);const t=Math.sqrt(1-e.w*e.w);return t<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=e.x/t,this.y=e.y/t,this.z=e.z/t),this}setAxisAngleFromRotationMatrix(e){let t,i,n,r;const s=.01,a=.1,o=e.elements,h=o[0],c=o[4],l=o[8],u=o[1],d=o[5],p=o[9],m=o[2],f=o[6],g=o[10];if(Math.abs(c-u)<s&&Math.abs(l-m)<s&&Math.abs(p-f)<s){if(Math.abs(c+u)<a&&Math.abs(l+m)<a&&Math.abs(p+f)<a&&Math.abs(h+d+g-3)<a)return this.set(1,0,0,0),this;t=Math.PI;const e=(h+1)/2,o=(d+1)/2,_=(g+1)/2,v=(c+u)/4,y=(l+m)/4,b=(p+f)/4;return e>o&&e>_?e<s?(i=0,n=.707106781,r=.707106781):(i=Math.sqrt(e),n=v/i,r=y/i):o>_?o<s?(i=.707106781,n=0,r=.707106781):(n=Math.sqrt(o),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,t),this}let _=Math.sqrt((f-p)*(f-p)+(l-m)*(l-m)+(u-c)*(u-c));return Math.abs(_)<.001&&(_=1),this.x=(f-p)/_,this.y=(l-m)/_,this.z=(u-c)/_,this.w=Math.acos((h+d+g-1)/2),this}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this.z=Math.min(this.z,e.z),this.w=Math.min(this.w,e.w),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this.z=Math.max(this.z,e.z),this.w=Math.max(this.w,e.w),this}clamp(e,t){return this.x=Math.max(e.x,Math.min(t.x,this.x)),this.y=Math.max(e.y,Math.min(t.y,this.y)),this.z=Math.max(e.z,Math.min(t.z,this.z)),this.w=Math.max(e.w,Math.min(t.w,this.w)),this}clampScalar(e,t){return this.x=Math.max(e,Math.min(t,this.x)),this.y=Math.max(e,Math.min(t,this.y)),this.z=Math.max(e,Math.min(t,this.z)),this.w=Math.max(e,Math.min(t,this.w)),this}clampLength(e,t){const i=this.length();return this.divideScalar(i||1).multiplyScalar(Math.max(e,Math.min(t,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(e){return this.x*e.x+this.y*e.y+this.z*e.z+this.w*e.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(e){return this.normalize().multiplyScalar(e)}lerp(e,t){return this.x+=(e.x-this.x)*t,this.y+=(e.y-this.y)*t,this.z+=(e.z-this.z)*t,this.w+=(e.w-this.w)*t,this}lerpVectors(e,t,i){return this.x=e.x+(t.x-e.x)*i,this.y=e.y+(t.y-e.y)*i,this.z=e.z+(t.z-e.z)*i,this.w=e.w+(t.w-e.w)*i,this}equals(e){return e.x===this.x&&e.y===this.y&&e.z===this.z&&e.w===this.w}fromArray(e,t=0){return this.x=e[t],this.y=e[t+1],this.z=e[t+2],this.w=e[t+3],this}toArray(e=[],t=0){return e[t]=this.x,e[t+1]=this.y,e[t+2]=this.z,e[t+3]=this.w,e}fromBufferAttribute(e,t,i){return void 0!==i&&console.warn("THREE.Vector4: offset has been removed from .fromBufferAttribute()."),this.x=e.getX(t),this.y=e.getY(t),this.z=e.getZ(t),this.w=e.getW(t),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this.w=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z,yield this.w}}Xi.prototype.isVector4=!0;class Zi extends Ti{constructor(e,t,i={}){super(),this.width=e,this.height=t,this.depth=1,this.scissor=new Xi(0,0,e,t),this.scissorTest=!1,this.viewport=new Xi(0,0,e,t),this.texture=new Wi(void 0,i.mapping,i.wrapS,i.wrapT,i.magFilter,i.minFilter,i.format,i.type,i.anisotropy,i.encoding),this.texture.isRenderTargetTexture=!0,this.texture.image={width:e,height:t,depth:1},this.texture.generateMipmaps=void 0!==i.generateMipmaps&&i.generateMipmaps,this.texture.internalFormat=void 0!==i.internalFormat?i.internalFormat:null,this.texture.minFilter=void 0!==i.minFilter?i.minFilter:Kt,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}setTexture(e){e.image={width:this.width,height:this.height,depth:this.depth},this.texture=e}setSize(e,t,i=1){this.width===e&&this.height===t&&this.depth===i||(this.width=e,this.height=t,this.depth=i,this.texture.image.width=e,this.texture.image.height=t,this.texture.image.depth=i,this.dispose()),this.viewport.set(0,0,e,t),this.scissor.set(0,0,e,t)}clone(){return(new this.constructor).copy(this)}copy(e){return this.width=e.width,this.height=e.height,this.depth=e.depth,this.viewport.copy(e.viewport),this.texture=e.texture.clone(),this.texture.image={...this.texture.image},this.depthBuffer=e.depthBuffer,this.stencilBuffer=e.stencilBuffer,this.depthTexture=e.depthTexture,this}dispose(){this.dispatchEvent({type:"dispose"})}}Zi.prototype.isWebGLRenderTarget=!0;(class extends Zi{constructor(e,t,i){super(e,t);const n=this.texture;this.texture=[];for(let e=0;e<i;e++)this.texture[e]=n.clone()}setSize(e,t,i=1){if(this.width!==e||this.height!==t||this.depth!==i){this.width=e,this.height=t,this.depth=i;for(let n=0,r=this.texture.length;n<r;n++)this.texture[n].image.width=e,this.texture[n].image.height=t,this.texture[n].image.depth=i;this.dispose()}return this.viewport.set(0,0,e,t),this.scissor.set(0,0,e,t),this}copy(e){this.dispose(),this.width=e.width,this.height=e.height,this.depth=e.depth,this.viewport.set(0,0,this.width,this.height),this.scissor.set(0,0,this.width,this.height),this.depthBuffer=e.depthBuffer,this.stencilBuffer=e.stencilBuffer,this.depthTexture=e.depthTexture,this.texture.length=0;for(let t=0,i=e.texture.length;t<i;t++)this.texture[t]=e.texture[t].clone();return this}}).prototype.isWebGLMultipleRenderTargets=!0;class Yi extends Zi{constructor(e,t,i){super(e,t,i),this.samples=4}copy(e){return super.copy.call(this,e),this.samples=e.samples,this}}Yi.prototype.isWebGLMultisampleRenderTarget=!0;class Ji{constructor(e=0,t=0,i=0,n=1){this._x=e,this._y=t,this._z=i,this._w=n}static slerp(e,t,i,n){return console.warn("THREE.Quaternion: Static .slerp() has been deprecated. Use qm.slerpQuaternions( qa, qb, t ) instead."),i.slerpQuaternions(e,t,n)}static slerpFlat(e,t,i,n,r,s,a){let o=i[n+0],h=i[n+1],c=i[n+2],l=i[n+3];const u=r[s+0],d=r[s+1],p=r[s+2],m=r[s+3];if(0===a)return e[t+0]=o,e[t+1]=h,e[t+2]=c,void(e[t+3]=l);if(1===a)return e[t+0]=u,e[t+1]=d,e[t+2]=p,void(e[t+3]=m);if(l!==m||o!==u||h!==d||c!==p){let e=1-a;const t=o*u+h*d+c*p+l*m,i=t>=0?1:-1,n=1-t*t;if(n>Number.EPSILON){const r=Math.sqrt(n),s=Math.atan2(r,t*i);e=Math.sin(e*s)/r,a=Math.sin(a*s)/r}const r=a*i;if(o=o*e+u*r,h=h*e+d*r,c=c*e+p*r,l=l*e+m*r,e===1-a){const e=1/Math.sqrt(o*o+h*h+c*c+l*l);o*=e,h*=e,c*=e,l*=e}}e[t]=o,e[t+1]=h,e[t+2]=c,e[t+3]=l}static multiplyQuaternionsFlat(e,t,i,n,r,s){const a=i[n],o=i[n+1],h=i[n+2],c=i[n+3],l=r[s],u=r[s+1],d=r[s+2],p=r[s+3];return e[t]=a*p+c*l+o*d-h*u,e[t+1]=o*p+c*u+h*l-a*d,e[t+2]=h*p+c*d+a*u-o*l,e[t+3]=c*p-a*l-o*u-h*d,e}get x(){return this._x}set x(e){this._x=e,this._onChangeCallback()}get y(){return this._y}set y(e){this._y=e,this._onChangeCallback()}get z(){return this._z}set z(e){this._z=e,this._onChangeCallback()}get w(){return this._w}set w(e){this._w=e,this._onChangeCallback()}set(e,t,i,n){return this._x=e,this._y=t,this._z=i,this._w=n,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._w)}copy(e){return this._x=e.x,this._y=e.y,this._z=e.z,this._w=e.w,this._onChangeCallback(),this}setFromEuler(e,t){if(!e||!e.isEuler)throw new Error("THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.");const i=e._x,n=e._y,r=e._z,s=e._order,a=Math.cos,o=Math.sin,h=a(i/2),c=a(n/2),l=a(r/2),u=o(i/2),d=o(n/2),p=o(r/2);switch(s){case"XYZ":this._x=u*c*l+h*d*p,this._y=h*d*l-u*c*p,this._z=h*c*p+u*d*l,this._w=h*c*l-u*d*p;break;case"YXZ":this._x=u*c*l+h*d*p,this._y=h*d*l-u*c*p,this._z=h*c*p-u*d*l,this._w=h*c*l+u*d*p;break;case"ZXY":this._x=u*c*l-h*d*p,this._y=h*d*l+u*c*p,this._z=h*c*p+u*d*l,this._w=h*c*l-u*d*p;break;case"ZYX":this._x=u*c*l-h*d*p,this._y=h*d*l+u*c*p,this._z=h*c*p-u*d*l,this._w=h*c*l+u*d*p;break;case"YZX":this._x=u*c*l+h*d*p,this._y=h*d*l+u*c*p,this._z=h*c*p-u*d*l,this._w=h*c*l-u*d*p;break;case"XZY":this._x=u*c*l-h*d*p,this._y=h*d*l-u*c*p,this._z=h*c*p+u*d*l,this._w=h*c*l+u*d*p;break;default:console.warn("THREE.Quaternion: .setFromEuler() encountered an unknown order: "+s)}return!1!==t&&this._onChangeCallback(),this}setFromAxisAngle(e,t){const i=t/2,n=Math.sin(i);return this._x=e.x*n,this._y=e.y*n,this._z=e.z*n,this._w=Math.cos(i),this._onChangeCallback(),this}setFromRotationMatrix(e){const t=e.elements,i=t[0],n=t[4],r=t[8],s=t[1],a=t[5],o=t[9],h=t[2],c=t[6],l=t[10],u=i+a+l;if(u>0){const e=.5/Math.sqrt(u+1);this._w=.25/e,this._x=(c-o)*e,this._y=(r-h)*e,this._z=(s-n)*e}else if(i>a&&i>l){const e=2*Math.sqrt(1+i-a-l);this._w=(c-o)/e,this._x=.25*e,this._y=(n+s)/e,this._z=(r+h)/e}else if(a>l){const e=2*Math.sqrt(1+a-i-l);this._w=(r-h)/e,this._x=(n+s)/e,this._y=.25*e,this._z=(o+c)/e}else{const e=2*Math.sqrt(1+l-i-a);this._w=(s-n)/e,this._x=(r+h)/e,this._y=(o+c)/e,this._z=.25*e}return this._onChangeCallback(),this}setFromUnitVectors(e,t){let i=e.dot(t)+1;return i<Number.EPSILON?(i=0,Math.abs(e.x)>Math.abs(e.z)?(this._x=-e.y,this._y=e.x,this._z=0,this._w=i):(this._x=0,this._y=-e.z,this._z=e.y,this._w=i)):(this._x=e.y*t.z-e.z*t.y,this._y=e.z*t.x-e.x*t.z,this._z=e.x*t.y-e.y*t.x,this._w=i),this.normalize()}angleTo(e){return 2*Math.acos(Math.abs(Li(this.dot(e),-1,1)))}rotateTowards(e,t){const i=this.angleTo(e);if(0===i)return this;const n=Math.min(1,t/i);return this.slerp(e,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(e){return this._x*e._x+this._y*e._y+this._z*e._z+this._w*e._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 e=this.length();return 0===e?(this._x=0,this._y=0,this._z=0,this._w=1):(e=1/e,this._x=this._x*e,this._y=this._y*e,this._z=this._z*e,this._w=this._w*e),this._onChangeCallback(),this}multiply(e,t){return void 0!==t?(console.warn("THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead."),this.multiplyQuaternions(e,t)):this.multiplyQuaternions(this,e)}premultiply(e){return this.multiplyQuaternions(e,this)}multiplyQuaternions(e,t){const i=e._x,n=e._y,r=e._z,s=e._w,a=t._x,o=t._y,h=t._z,c=t._w;return this._x=i*c+s*a+n*h-r*o,this._y=n*c+s*o+r*a-i*h,this._z=r*c+s*h+i*o-n*a,this._w=s*c-i*a-n*o-r*h,this._onChangeCallback(),this}slerp(e,t){if(0===t)return this;if(1===t)return this.copy(e);const i=this._x,n=this._y,r=this._z,s=this._w;let a=s*e._w+i*e._x+n*e._y+r*e._z;if(a<0?(this._w=-e._w,this._x=-e._x,this._y=-e._y,this._z=-e._z,a=-a):this.copy(e),a>=1)return this._w=s,this._x=i,this._y=n,this._z=r,this;const o=1-a*a;if(o<=Number.EPSILON){const e=1-t;return this._w=e*s+t*this._w,this._x=e*i+t*this._x,this._y=e*n+t*this._y,this._z=e*r+t*this._z,this.normalize(),this._onChangeCallback(),this}const h=Math.sqrt(o),c=Math.atan2(h,a),l=Math.sin((1-t)*c)/h,u=Math.sin(t*c)/h;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}slerpQuaternions(e,t,i){this.copy(e).slerp(t,i)}random(){const e=Math.random(),t=Math.sqrt(1-e),i=Math.sqrt(e),n=2*Math.PI*Math.random(),r=2*Math.PI*Math.random();return this.set(t*Math.cos(n),i*Math.sin(r),i*Math.cos(r),t*Math.sin(n))}equals(e){return e._x===this._x&&e._y===this._y&&e._z===this._z&&e._w===this._w}fromArray(e,t=0){return this._x=e[t],this._y=e[t+1],this._z=e[t+2],this._w=e[t+3],this._onChangeCallback(),this}toArray(e=[],t=0){return e[t]=this._x,e[t+1]=this._y,e[t+2]=this._z,e[t+3]=this._w,e}fromBufferAttribute(e,t){return this._x=e.getX(t),this._y=e.getY(t),this._z=e.getZ(t),this._w=e.getW(t),this}_onChange(e){return this._onChangeCallback=e,this}_onChangeCallback(){}}Ji.prototype.isQuaternion=!0;class Ki{constructor(e=0,t=0,i=0){this.x=e,this.y=t,this.z=i}set(e,t,i){return void 0===i&&(i=this.z),this.x=e,this.y=t,this.z=i,this}setScalar(e){return this.x=e,this.y=e,this.z=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setZ(e){return this.z=e,this}setComponent(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;case 2:this.z=t;break;default:throw new Error("index is out of range: "+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+e)}}clone(){return new this.constructor(this.x,this.y,this.z)}copy(e){return this.x=e.x,this.y=e.y,this.z=e.z,this}add(e,t){return void 0!==t?(console.warn("THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(e,t)):(this.x+=e.x,this.y+=e.y,this.z+=e.z,this)}addScalar(e){return this.x+=e,this.y+=e,this.z+=e,this}addVectors(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this.z=e.z+t.z,this}addScaledVector(e,t){return this.x+=e.x*t,this.y+=e.y*t,this.z+=e.z*t,this}sub(e,t){return void 0!==t?(console.warn("THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(e,t)):(this.x-=e.x,this.y-=e.y,this.z-=e.z,this)}subScalar(e){return this.x-=e,this.y-=e,this.z-=e,this}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this.z=e.z-t.z,this}multiply(e,t){return void 0!==t?(console.warn("THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead."),this.multiplyVectors(e,t)):(this.x*=e.x,this.y*=e.y,this.z*=e.z,this)}multiplyScalar(e){return this.x*=e,this.y*=e,this.z*=e,this}multiplyVectors(e,t){return this.x=e.x*t.x,this.y=e.y*t.y,this.z=e.z*t.z,this}applyEuler(e){return e&&e.isEuler||console.error("THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order."),this.applyQuaternion(en.setFromEuler(e))}applyAxisAngle(e,t){return this.applyQuaternion(en.setFromAxisAngle(e,t))}applyMatrix3(e){const t=this.x,i=this.y,n=this.z,r=e.elements;return this.x=r[0]*t+r[3]*i+r[6]*n,this.y=r[1]*t+r[4]*i+r[7]*n,this.z=r[2]*t+r[5]*i+r[8]*n,this}applyNormalMatrix(e){return this.applyMatrix3(e).normalize()}applyMatrix4(e){const t=this.x,i=this.y,n=this.z,r=e.elements,s=1/(r[3]*t+r[7]*i+r[11]*n+r[15]);return this.x=(r[0]*t+r[4]*i+r[8]*n+r[12])*s,this.y=(r[1]*t+r[5]*i+r[9]*n+r[13])*s,this.z=(r[2]*t+r[6]*i+r[10]*n+r[14])*s,this}applyQuaternion(e){const t=this.x,i=this.y,n=this.z,r=e.x,s=e.y,a=e.z,o=e.w,h=o*t+s*n-a*i,c=o*i+a*t-r*n,l=o*n+r*i-s*t,u=-r*t-s*i-a*n;return this.x=h*o+u*-r+c*-a-l*-s,this.y=c*o+u*-s+l*-r-h*-a,this.z=l*o+u*-a+h*-s-c*-r,this}project(e){return this.applyMatrix4(e.matrixWorldInverse).applyMatrix4(e.projectionMatrix)}unproject(e){return this.applyMatrix4(e.projectionMatrixInverse).applyMatrix4(e.matrixWorld)}transformDirection(e){const t=this.x,i=this.y,n=this.z,r=e.elements;return this.x=r[0]*t+r[4]*i+r[8]*n,this.y=r[1]*t+r[5]*i+r[9]*n,this.z=r[2]*t+r[6]*i+r[10]*n,this.normalize()}divide(e){return this.x/=e.x,this.y/=e.y,this.z/=e.z,this}divideScalar(e){return this.multiplyScalar(1/e)}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this.z=Math.min(this.z,e.z),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this.z=Math.max(this.z,e.z),this}clamp(e,t){return this.x=Math.max(e.x,Math.min(t.x,this.x)),this.y=Math.max(e.y,Math.min(t.y,this.y)),this.z=Math.max(e.z,Math.min(t.z,this.z)),this}clampScalar(e,t){return this.x=Math.max(e,Math.min(t,this.x)),this.y=Math.max(e,Math.min(t,this.y)),this.z=Math.max(e,Math.min(t,this.z)),this}clampLength(e,t){const i=this.length();return this.divideScalar(i||1).multiplyScalar(Math.max(e,Math.min(t,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(e){return this.x*e.x+this.y*e.y+this.z*e.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(e){return this.normalize().multiplyScalar(e)}lerp(e,t){return this.x+=(e.x-this.x)*t,this.y+=(e.y-this.y)*t,this.z+=(e.z-this.z)*t,this}lerpVectors(e,t,i){return this.x=e.x+(t.x-e.x)*i,this.y=e.y+(t.y-e.y)*i,this.z=e.z+(t.z-e.z)*i,this}cross(e,t){return void 0!==t?(console.warn("THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead."),this.crossVectors(e,t)):this.crossVectors(this,e)}crossVectors(e,t){const i=e.x,n=e.y,r=e.z,s=t.x,a=t.y,o=t.z;return this.x=n*o-r*a,this.y=r*s-i*o,this.z=i*a-n*s,this}projectOnVector(e){const t=e.lengthSq();if(0===t)return this.set(0,0,0);const i=e.dot(this)/t;return this.copy(e).multiplyScalar(i)}projectOnPlane(e){return Qi.copy(this).projectOnVector(e),this.sub(Qi)}reflect(e){return this.sub(Qi.copy(e).multiplyScalar(2*this.dot(e)))}angleTo(e){const t=Math.sqrt(this.lengthSq()*e.lengthSq());if(0===t)return Math.PI/2;const i=this.dot(e)/t;return Math.acos(Li(i,-1,1))}distanceTo(e){return Math.sqrt(this.distanceToSquared(e))}distanceToSquared(e){const t=this.x-e.x,i=this.y-e.y,n=this.z-e.z;return t*t+i*i+n*n}manhattanDistanceTo(e){return Math.abs(this.x-e.x)+Math.abs(this.y-e.y)+Math.abs(this.z-e.z)}setFromSpherical(e){return this.setFromSphericalCoords(e.radius,e.phi,e.theta)}setFromSphericalCoords(e,t,i){const n=Math.sin(t)*e;return this.x=n*Math.sin(i),this.y=Math.cos(t)*e,this.z=n*Math.cos(i),this}setFromCylindrical(e){return this.setFromCylindricalCoords(e.radius,e.theta,e.y)}setFromCylindricalCoords(e,t,i){return this.x=e*Math.sin(t),this.y=i,this.z=e*Math.cos(t),this}setFromMatrixPosition(e){const t=e.elements;return this.x=t[12],this.y=t[13],this.z=t[14],this}setFromMatrixScale(e){const t=this.setFromMatrixColumn(e,0).length(),i=this.setFromMatrixColumn(e,1).length(),n=this.setFromMatrixColumn(e,2).length();return this.x=t,this.y=i,this.z=n,this}setFromMatrixColumn(e,t){return this.fromArray(e.elements,4*t)}setFromMatrix3Column(e,t){return this.fromArray(e.elements,3*t)}equals(e){return e.x===this.x&&e.y===this.y&&e.z===this.z}fromArray(e,t=0){return this.x=e[t],this.y=e[t+1],this.z=e[t+2],this}toArray(e=[],t=0){return e[t]=this.x,e[t+1]=this.y,e[t+2]=this.z,e}fromBufferAttribute(e,t,i){return void 0!==i&&console.warn("THREE.Vector3: offset has been removed from .fromBufferAttribute()."),this.x=e.getX(t),this.y=e.getY(t),this.z=e.getZ(t),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this}randomDirection(){const e=2*(Math.random()-.5),t=Math.random()*Math.PI*2,i=Math.sqrt(1-e**2);return this.x=i*Math.cos(t),this.y=i*Math.sin(t),this.z=e,this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z}}Ki.prototype.isVector3=!0;const Qi=new Ki,en=new Ji;class tn{constructor(e=new Ki(1/0,1/0,1/0),t=new Ki(-1/0,-1/0,-1/0)){this.min=e,this.max=t}set(e,t){return this.min.copy(e),this.max.copy(t),this}setFromArray(e){let t=1/0,i=1/0,n=1/0,r=-1/0,s=-1/0,a=-1/0;for(let o=0,h=e.length;o<h;o+=3){const h=e[o],c=e[o+1],l=e[o+2];h<t&&(t=h),c<i&&(i=c),l<n&&(n=l),h>r&&(r=h),c>s&&(s=c),l>a&&(a=l)}return this.min.set(t,i,n),this.max.set(r,s,a),this}setFromBufferAttribute(e){let t=1/0,i=1/0,n=1/0,r=-1/0,s=-1/0,a=-1/0;for(let o=0,h=e.count;o<h;o++){const h=e.getX(o),c=e.getY(o),l=e.getZ(o);h<t&&(t=h),c<i&&(i=c),l<n&&(n=l),h>r&&(r=h),c>s&&(s=c),l>a&&(a=l)}return this.min.set(t,i,n),this.max.set(r,s,a),this}setFromPoints(e){this.makeEmpty();for(let t=0,i=e.length;t<i;t++)this.expandByPoint(e[t]);return this}setFromCenterAndSize(e,t){const i=rn.copy(t).multiplyScalar(.5);return this.min.copy(e).sub(i),this.max.copy(e).add(i),this}setFromObject(e){return this.makeEmpty(),this.expandByObject(e)}clone(){return(new this.constructor).copy(this)}copy(e){return this.min.copy(e.min),this.max.copy(e.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(e){return this.isEmpty()?e.set(0,0,0):e.addVectors(this.min,this.max).multiplyScalar(.5)}getSize(e){return this.isEmpty()?e.set(0,0,0):e.subVectors(this.max,this.min)}expandByPoint(e){return this.min.min(e),this.max.max(e),this}expandByVector(e){return this.min.sub(e),this.max.add(e),this}expandByScalar(e){return this.min.addScalar(-e),this.max.addScalar(e),this}expandByObject(e){e.updateWorldMatrix(!1,!1);const t=e.geometry;void 0!==t&&(null===t.boundingBox&&t.computeBoundingBox(),sn.copy(t.boundingBox),sn.applyMatrix4(e.matrixWorld),this.union(sn));const i=e.children;for(let e=0,t=i.length;e<t;e++)this.expandByObject(i[e]);return this}containsPoint(e){return!(e.x<this.min.x||e.x>this.max.x||e.y<this.min.y||e.y>this.max.y||e.z<this.min.z||e.z>this.max.z)}containsBox(e){return this.min.x<=e.min.x&&e.max.x<=this.max.x&&this.min.y<=e.min.y&&e.max.y<=this.max.y&&this.min.z<=e.min.z&&e.max.z<=this.max.z}getParameter(e,t){return t.set((e.x-this.min.x)/(this.max.x-this.min.x),(e.y-this.min.y)/(this.max.y-this.min.y),(e.z-this.min.z)/(this.max.z-this.min.z))}intersectsBox(e){return!(e.max.x<this.min.x||e.min.x>this.max.x||e.max.y<this.min.y||e.min.y>this.max.y||e.max.z<this.min.z||e.min.z>this.max.z)}intersectsSphere(e){return this.clampPoint(e.center,rn),rn.distanceToSquared(e.center)<=e.radius*e.radius}intersectsPlane(e){let t,i;return e.normal.x>0?(t=e.normal.x*this.min.x,i=e.normal.x*this.max.x):(t=e.normal.x*this.max.x,i=e.normal.x*this.min.x),e.normal.y>0?(t+=e.normal.y*this.min.y,i+=e.normal.y*this.max.y):(t+=e.normal.y*this.max.y,i+=e.normal.y*this.min.y),e.normal.z>0?(t+=e.normal.z*this.min.z,i+=e.normal.z*this.max.z):(t+=e.normal.z*this.max.z,i+=e.normal.z*this.min.z),t<=-e.constant&&i>=-e.constant}intersectsTriangle(e){if(this.isEmpty())return!1;this.getCenter(dn),pn.subVectors(this.max,dn),an.subVectors(e.a,dn),on.subVectors(e.b,dn),hn.subVectors(e.c,dn),cn.subVectors(on,an),ln.subVectors(hn,on),un.subVectors(an,hn);let t=[0,-cn.z,cn.y,0,-ln.z,ln.y,0,-un.z,un.y,cn.z,0,-cn.x,ln.z,0,-ln.x,un.z,0,-un.x,-cn.y,cn.x,0,-ln.y,ln.x,0,-un.y,un.x,0];return!!gn(t,an,on,hn,pn)&&(t=[1,0,0,0,1,0,0,0,1],!!gn(t,an,on,hn,pn)&&(mn.crossVectors(cn,ln),t=[mn.x,mn.y,mn.z],gn(t,an,on,hn,pn)))}clampPoint(e,t){return t.copy(e).clamp(this.min,this.max)}distanceToPoint(e){return rn.copy(e).clamp(this.min,this.max).sub(e).length()}getBoundingSphere(e){return this.getCenter(e.center),e.radius=.5*this.getSize(rn).length(),e}intersect(e){return this.min.max(e.min),this.max.min(e.max),this.isEmpty()&&this.makeEmpty(),this}union(e){return this.min.min(e.min),this.max.max(e.max),this}applyMatrix4(e){return this.isEmpty()||(nn[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(e),nn[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(e),nn[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(e),nn[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(e),nn[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(e),nn[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(e),nn[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(e),nn[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(e),this.setFromPoints(nn)),this}translate(e){return this.min.add(e),this.max.add(e),this}equals(e){return e.min.equals(this.min)&&e.max.equals(this.max)}}tn.prototype.isBox3=!0;const nn=[new Ki,new Ki,new Ki,new Ki,new Ki,new Ki,new Ki,new Ki],rn=new Ki,sn=new tn,an=new Ki,on=new Ki,hn=new Ki,cn=new Ki,ln=new Ki,un=new Ki,dn=new Ki,pn=new Ki,mn=new Ki,fn=new Ki;function gn(e,t,i,n,r){for(let s=0,a=e.length-3;s<=a;s+=3){fn.fromArray(e,s);const a=r.x*Math.abs(fn.x)+r.y*Math.abs(fn.y)+r.z*Math.abs(fn.z),o=t.dot(fn),h=i.dot(fn),c=n.dot(fn);if(Math.max(-Math.max(o,h,c),Math.min(o,h,c))>a)return!1}return!0}const _n=new tn,vn=new Ki,yn=new Ki,bn=new Ki;class xn{constructor(e=new Ki,t=-1){this.center=e,this.radius=t}set(e,t){return this.center.copy(e),this.radius=t,this}setFromPoints(e,t){const i=this.center;void 0!==t?i.copy(t):_n.setFromPoints(e).getCenter(i);let n=0;for(let t=0,r=e.length;t<r;t++)n=Math.max(n,i.distanceToSquared(e[t]));return this.radius=Math.sqrt(n),this}copy(e){return this.center.copy(e.center),this.radius=e.radius,this}isEmpty(){return this.radius<0}makeEmpty(){return this.center.set(0,0,0),this.radius=-1,this}containsPoint(e){return e.distanceToSquared(this.center)<=this.radius*this.radius}distanceToPoint(e){return e.distanceTo(this.center)-this.radius}intersectsSphere(e){const t=this.radius+e.radius;return e.center.distanceToSquared(this.center)<=t*t}intersectsBox(e){return e.intersectsSphere(this)}intersectsPlane(e){return Math.abs(e.distanceToPoint(this.center))<=this.radius}clampPoint(e,t){const i=this.center.distanceToSquared(e);return t.copy(e),i>this.radius*this.radius&&(t.sub(this.center).normalize(),t.multiplyScalar(this.radius).add(this.center)),t}getBoundingBox(e){return this.isEmpty()?(e.makeEmpty(),e):(e.set(this.center,this.center),e.expandByScalar(this.radius),e)}applyMatrix4(e){return this.center.applyMatrix4(e),this.radius=this.radius*e.getMaxScaleOnAxis(),this}translate(e){return this.center.add(e),this}expandByPoint(e){bn.subVectors(e,this.center);const t=bn.lengthSq();if(t>this.radius*this.radius){const e=Math.sqrt(t),i=.5*(e-this.radius);this.center.add(bn.multiplyScalar(i/e)),this.radius+=i}return this}union(e){return yn.subVectors(e.center,this.center).normalize().multiplyScalar(e.radius),this.expandByPoint(vn.copy(e.center).add(yn)),this.expandByPoint(vn.copy(e.center).sub(yn)),this}equals(e){return e.center.equals(this.center)&&e.radius===this.radius}clone(){return(new this.constructor).copy(this)}}const wn=new Ki,Mn=new Ki,Sn=new Ki,Tn=new Ki,Cn=new Ki,En=new Ki,An=new Ki;class In{constructor(e=new Ki,t=new Ki(0,0,-1)){this.origin=e,this.direction=t}set(e,t){return this.origin.copy(e),this.direction.copy(t),this}copy(e){return this.origin.copy(e.origin),this.direction.copy(e.direction),this}at(e,t){return t.copy(this.direction).multiplyScalar(e).add(this.origin)}lookAt(e){return this.direction.copy(e).sub(this.origin).normalize(),this}recast(e){return this.origin.copy(this.at(e,wn)),this}closestPointToPoint(e,t){t.subVectors(e,this.origin);const i=t.dot(this.direction);return i<0?t.copy(this.origin):t.copy(this.direction).multiplyScalar(i).add(this.origin)}distanceToPoint(e){return Math.sqrt(this.distanceSqToPoint(e))}distanceSqToPoint(e){const t=wn.subVectors(e,this.origin).dot(this.direction);return t<0?this.origin.distanceToSquared(e):(wn.copy(this.direction).multiplyScalar(t).add(this.origin),wn.distanceToSquared(e))}distanceSqToSegment(e,t,i,n){Mn.copy(e).add(t).multiplyScalar(.5),Sn.copy(t).sub(e).normalize(),Tn.copy(this.origin).sub(Mn);const r=.5*e.distanceTo(t),s=-this.direction.dot(Sn),a=Tn.dot(this.direction),o=-Tn.dot(Sn),h=Tn.lengthSq(),c=Math.abs(1-s*s);let l,u,d,p;if(c>0)if(l=s*o-a,u=s*a-o,p=r*c,l>=0)if(u>=-p)if(u<=p){const e=1/c;l*=e,u*=e,d=l*(l+s*u+2*a)+u*(s*l+u+2*o)+h}else u=r,l=Math.max(0,-(s*u+a)),d=-l*l+u*(u+2*o)+h;else u=-r,l=Math.max(0,-(s*u+a)),d=-l*l+u*(u+2*o)+h;else u<=-p?(l=Math.max(0,-(-s*r+a)),u=l>0?-r:Math.min(Math.max(-r,-o),r),d=-l*l+u*(u+2*o)+h):u<=p?(l=0,u=Math.min(Math.max(-r,-o),r),d=u*(u+2*o)+h):(l=Math.max(0,-(s*r+a)),u=l>0?r:Math.min(Math.max(-r,-o),r),d=-l*l+u*(u+2*o)+h);else u=s>0?-r:r,l=Math.max(0,-(s*u+a)),d=-l*l+u*(u+2*o)+h;return i&&i.copy(this.direction).multiplyScalar(l).add(this.origin),n&&n.copy(Sn).multiplyScalar(u).add(Mn),d}intersectSphere(e,t){wn.subVectors(e.center,this.origin);const i=wn.dot(this.direction),n=wn.dot(wn)-i*i,r=e.radius*e.radius;if(n>r)return null;const s=Math.sqrt(r-n),a=i-s,o=i+s;return a<0&&o<0?null:a<0?this.at(o,t):this.at(a,t)}intersectsSphere(e){return this.distanceSqToPoint(e.center)<=e.radius*e.radius}distanceToPlane(e){const t=e.normal.dot(this.direction);if(0===t)return 0===e.distanceToPoint(this.origin)?0:null;const i=-(this.origin.dot(e.normal)+e.constant)/t;return i>=0?i:null}intersectPlane(e,t){const i=this.distanceToPlane(e);return null===i?null:this.at(i,t)}intersectsPlane(e){const t=e.distanceToPoint(this.origin);if(0===t)return!0;return e.normal.dot(this.direction)*t<0}intersectBox(e,t){let i,n,r,s,a,o;const h=1/this.direction.x,c=1/this.direction.y,l=1/this.direction.z,u=this.origin;return h>=0?(i=(e.min.x-u.x)*h,n=(e.max.x-u.x)*h):(i=(e.max.x-u.x)*h,n=(e.min.x-u.x)*h),c>=0?(r=(e.min.y-u.y)*c,s=(e.max.y-u.y)*c):(r=(e.max.y-u.y)*c,s=(e.min.y-u.y)*c),i>s||r>n?null:((r>i||i!=i)&&(i=r),(s<n||n!=n)&&(n=s),l>=0?(a=(e.min.z-u.z)*l,o=(e.max.z-u.z)*l):(a=(e.max.z-u.z)*l,o=(e.min.z-u.z)*l),i>o||a>n?null:((a>i||i!=i)&&(i=a),(o<n||n!=n)&&(n=o),n<0?null:this.at(i>=0?i:n,t)))}intersectsBox(e){return null!==this.intersectBox(e,wn)}intersectTriangle(e,t,i,n,r){Cn.subVectors(t,e),En.subVectors(i,e),An.crossVectors(Cn,En);let s,a=this.direction.dot(An);if(a>0){if(n)return null;s=1}else{if(!(a<0))return null;s=-1,a=-a}Tn.subVectors(this.origin,e);const o=s*this.direction.dot(En.crossVectors(Tn,En));if(o<0)return null;const h=s*this.direction.dot(Cn.cross(Tn));if(h<0)return null;if(o+h>a)return null;const c=-s*Tn.dot(An);return c<0?null:this.at(c/a,r)}applyMatrix4(e){return this.origin.applyMatrix4(e),this.direction.transformDirection(e),this}equals(e){return e.origin.equals(this.origin)&&e.direction.equals(this.direction)}clone(){return(new this.constructor).copy(this)}}class Rn{constructor(){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(e,t,i,n,r,s,a,o,h,c,l,u,d,p,m,f){const g=this.elements;return g[0]=e,g[4]=t,g[8]=i,g[12]=n,g[1]=r,g[5]=s,g[9]=a,g[13]=o,g[2]=h,g[6]=c,g[10]=l,g[14]=u,g[3]=d,g[7]=p,g[11]=m,g[15]=f,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 Rn).fromArray(this.elements)}copy(e){const t=this.elements,i=e.elements;return t[0]=i[0],t[1]=i[1],t[2]=i[2],t[3]=i[3],t[4]=i[4],t[5]=i[5],t[6]=i[6],t[7]=i[7],t[8]=i[8],t[9]=i[9],t[10]=i[10],t[11]=i[11],t[12]=i[12],t[13]=i[13],t[14]=i[14],t[15]=i[15],this}copyPosition(e){const t=this.elements,i=e.elements;return t[12]=i[12],t[13]=i[13],t[14]=i[14],this}setFromMatrix3(e){const t=e.elements;return this.set(t[0],t[3],t[6],0,t[1],t[4],t[7],0,t[2],t[5],t[8],0,0,0,0,1),this}extractBasis(e,t,i){return e.setFromMatrixColumn(this,0),t.setFromMatrixColumn(this,1),i.setFromMatrixColumn(this,2),this}makeBasis(e,t,i){return this.set(e.x,t.x,i.x,0,e.y,t.y,i.y,0,e.z,t.z,i.z,0,0,0,0,1),this}extractRotation(e){const t=this.elements,i=e.elements,n=1/Pn.setFromMatrixColumn(e,0).length(),r=1/Pn.setFromMatrixColumn(e,1).length(),s=1/Pn.setFromMatrixColumn(e,2).length();return t[0]=i[0]*n,t[1]=i[1]*n,t[2]=i[2]*n,t[3]=0,t[4]=i[4]*r,t[5]=i[5]*r,t[6]=i[6]*r,t[7]=0,t[8]=i[8]*s,t[9]=i[9]*s,t[10]=i[10]*s,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,this}makeRotationFromEuler(e){e&&e.isEuler||console.error("THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.");const t=this.elements,i=e.x,n=e.y,r=e.z,s=Math.cos(i),a=Math.sin(i),o=Math.cos(n),h=Math.sin(n),c=Math.cos(r),l=Math.sin(r);if("XYZ"===e.order){const e=s*c,i=s*l,n=a*c,r=a*l;t[0]=o*c,t[4]=-o*l,t[8]=h,t[1]=i+n*h,t[5]=e-r*h,t[9]=-a*o,t[2]=r-e*h,t[6]=n+i*h,t[10]=s*o}else if("YXZ"===e.order){const e=o*c,i=o*l,n=h*c,r=h*l;t[0]=e+r*a,t[4]=n*a-i,t[8]=s*h,t[1]=s*l,t[5]=s*c,t[9]=-a,t[2]=i*a-n,t[6]=r+e*a,t[10]=s*o}else if("ZXY"===e.order){const e=o*c,i=o*l,n=h*c,r=h*l;t[0]=e-r*a,t[4]=-s*l,t[8]=n+i*a,t[1]=i+n*a,t[5]=s*c,t[9]=r-e*a,t[2]=-s*h,t[6]=a,t[10]=s*o}else if("ZYX"===e.order){const e=s*c,i=s*l,n=a*c,r=a*l;t[0]=o*c,t[4]=n*h-i,t[8]=e*h+r,t[1]=o*l,t[5]=r*h+e,t[9]=i*h-n,t[2]=-h,t[6]=a*o,t[10]=s*o}else if("YZX"===e.order){const e=s*o,i=s*h,n=a*o,r=a*h;t[0]=o*c,t[4]=r-e*l,t[8]=n*l+i,t[1]=l,t[5]=s*c,t[9]=-a*c,t[2]=-h*c,t[6]=i*l+n,t[10]=e-r*l}else if("XZY"===e.order){const e=s*o,i=s*h,n=a*o,r=a*h;t[0]=o*c,t[4]=-l,t[8]=h*c,t[1]=e*l+r,t[5]=s*c,t[9]=i*l-n,t[2]=n*l-i,t[6]=a*c,t[10]=r*l+e}return t[3]=0,t[7]=0,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,this}makeRotationFromQuaternion(e){return this.compose(Dn,e,Nn)}lookAt(e,t,i){const n=this.elements;return On.subVectors(e,t),0===On.lengthSq()&&(On.z=1),On.normalize(),$n.crossVectors(i,On),0===$n.lengthSq()&&(1===Math.abs(i.z)?On.x+=1e-4:On.z+=1e-4,On.normalize(),$n.crossVectors(i,On)),$n.normalize(),kn.crossVectors(On,$n),n[0]=$n.x,n[4]=kn.x,n[8]=On.x,n[1]=$n.y,n[5]=kn.y,n[9]=On.y,n[2]=$n.z,n[6]=kn.z,n[10]=On.z,this}multiply(e,t){return void 0!==t?(console.warn("THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead."),this.multiplyMatrices(e,t)):this.multiplyMatrices(this,e)}premultiply(e){return this.multiplyMatrices(e,this)}multiplyMatrices(e,t){const i=e.elements,n=t.elements,r=this.elements,s=i[0],a=i[4],o=i[8],h=i[12],c=i[1],l=i[5],u=i[9],d=i[13],p=i[2],m=i[6],f=i[10],g=i[14],_=i[3],v=i[7],y=i[11],b=i[15],x=n[0],w=n[4],M=n[8],S=n[12],T=n[1],C=n[5],E=n[9],A=n[13],I=n[2],R=n[6],P=n[10],L=n[14],D=n[3],N=n[7],$=n[11],k=n[15];return r[0]=s*x+a*T+o*I+h*D,r[4]=s*w+a*C+o*R+h*N,r[8]=s*M+a*E+o*P+h*$,r[12]=s*S+a*A+o*L+h*k,r[1]=c*x+l*T+u*I+d*D,r[5]=c*w+l*C+u*R+d*N,r[9]=c*M+l*E+u*P+d*$,r[13]=c*S+l*A+u*L+d*k,r[2]=p*x+m*T+f*I+g*D,r[6]=p*w+m*C+f*R+g*N,r[10]=p*M+m*E+f*P+g*$,r[14]=p*S+m*A+f*L+g*k,r[3]=_*x+v*T+y*I+b*D,r[7]=_*w+v*C+y*R+b*N,r[11]=_*M+v*E+y*P+b*$,r[15]=_*S+v*A+y*L+b*k,this}multiplyScalar(e){const t=this.elements;return t[0]*=e,t[4]*=e,t[8]*=e,t[12]*=e,t[1]*=e,t[5]*=e,t[9]*=e,t[13]*=e,t[2]*=e,t[6]*=e,t[10]*=e,t[14]*=e,t[3]*=e,t[7]*=e,t[11]*=e,t[15]*=e,this}determinant(){const e=this.elements,t=e[0],i=e[4],n=e[8],r=e[12],s=e[1],a=e[5],o=e[9],h=e[13],c=e[2],l=e[6],u=e[10],d=e[14];return e[3]*(+r*o*l-n*h*l-r*a*u+i*h*u+n*a*d-i*o*d)+e[7]*(+t*o*d-t*h*u+r*s*u-n*s*d+n*h*c-r*o*c)+e[11]*(+t*h*l-t*a*d-r*s*l+i*s*d+r*a*c-i*h*c)+e[15]*(-n*a*c-t*o*l+t*a*u+n*s*l-i*s*u+i*o*c)}transpose(){const e=this.elements;let t;return t=e[1],e[1]=e[4],e[4]=t,t=e[2],e[2]=e[8],e[8]=t,t=e[6],e[6]=e[9],e[9]=t,t=e[3],e[3]=e[12],e[12]=t,t=e[7],e[7]=e[13],e[13]=t,t=e[11],e[11]=e[14],e[14]=t,this}setPosition(e,t,i){const n=this.elements;return e.isVector3?(n[12]=e.x,n[13]=e.y,n[14]=e.z):(n[12]=e,n[13]=t,n[14]=i),this}invert(){const e=this.elements,t=e[0],i=e[1],n=e[2],r=e[3],s=e[4],a=e[5],o=e[6],h=e[7],c=e[8],l=e[9],u=e[10],d=e[11],p=e[12],m=e[13],f=e[14],g=e[15],_=l*f*h-m*u*h+m*o*d-a*f*d-l*o*g+a*u*g,v=p*u*h-c*f*h-p*o*d+s*f*d+c*o*g-s*u*g,y=c*m*h-p*l*h+p*a*d-s*m*d-c*a*g+s*l*g,b=p*l*o-c*m*o-p*a*u+s*m*u+c*a*f-s*l*f,x=t*_+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 e[0]=_*w,e[1]=(m*u*r-l*f*r-m*n*d+i*f*d+l*n*g-i*u*g)*w,e[2]=(a*f*r-m*o*r+m*n*h-i*f*h-a*n*g+i*o*g)*w,e[3]=(l*o*r-a*u*r-l*n*h+i*u*h+a*n*d-i*o*d)*w,e[4]=v*w,e[5]=(c*f*r-p*u*r+p*n*d-t*f*d-c*n*g+t*u*g)*w,e[6]=(p*o*r-s*f*r-p*n*h+t*f*h+s*n*g-t*o*g)*w,e[7]=(s*u*r-c*o*r+c*n*h-t*u*h-s*n*d+t*o*d)*w,e[8]=y*w,e[9]=(p*l*r-c*m*r-p*i*d+t*m*d+c*i*g-t*l*g)*w,e[10]=(s*m*r-p*a*r+p*i*h-t*m*h-s*i*g+t*a*g)*w,e[11]=(c*a*r-s*l*r-c*i*h+t*l*h+s*i*d-t*a*d)*w,e[12]=b*w,e[13]=(c*m*n-p*l*n+p*i*u-t*m*u-c*i*f+t*l*f)*w,e[14]=(p*a*n-s*m*n-p*i*o+t*m*o+s*i*f-t*a*f)*w,e[15]=(s*l*n-c*a*n+c*i*o-t*l*o-s*i*u+t*a*u)*w,this}scale(e){const t=this.elements,i=e.x,n=e.y,r=e.z;return t[0]*=i,t[4]*=n,t[8]*=r,t[1]*=i,t[5]*=n,t[9]*=r,t[2]*=i,t[6]*=n,t[10]*=r,t[3]*=i,t[7]*=n,t[11]*=r,this}getMaxScaleOnAxis(){const e=this.elements,t=e[0]*e[0]+e[1]*e[1]+e[2]*e[2],i=e[4]*e[4]+e[5]*e[5]+e[6]*e[6],n=e[8]*e[8]+e[9]*e[9]+e[10]*e[10];return Math.sqrt(Math.max(t,i,n))}makeTranslation(e,t,i){return this.set(1,0,0,e,0,1,0,t,0,0,1,i,0,0,0,1),this}makeRotationX(e){const t=Math.cos(e),i=Math.sin(e);return this.set(1,0,0,0,0,t,-i,0,0,i,t,0,0,0,0,1),this}makeRotationY(e){const t=Math.cos(e),i=Math.sin(e);return this.set(t,0,i,0,0,1,0,0,-i,0,t,0,0,0,0,1),this}makeRotationZ(e){const t=Math.cos(e),i=Math.sin(e);return this.set(t,-i,0,0,i,t,0,0,0,0,1,0,0,0,0,1),this}makeRotationAxis(e,t){const i=Math.cos(t),n=Math.sin(t),r=1-i,s=e.x,a=e.y,o=e.z,h=r*s,c=r*a;return this.set(h*s+i,h*a-n*o,h*o+n*a,0,h*a+n*o,c*a+i,c*o-n*s,0,h*o-n*a,c*o+n*s,r*o*o+i,0,0,0,0,1),this}makeScale(e,t,i){return this.set(e,0,0,0,0,t,0,0,0,0,i,0,0,0,0,1),this}makeShear(e,t,i,n,r,s){return this.set(1,i,r,0,e,1,s,0,t,n,1,0,0,0,0,1),this}compose(e,t,i){const n=this.elements,r=t._x,s=t._y,a=t._z,o=t._w,h=r+r,c=s+s,l=a+a,u=r*h,d=r*c,p=r*l,m=s*c,f=s*l,g=a*l,_=o*h,v=o*c,y=o*l,b=i.x,x=i.y,w=i.z;return n[0]=(1-(m+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]=(f+_)*x,n[7]=0,n[8]=(p+v)*w,n[9]=(f-_)*w,n[10]=(1-(u+m))*w,n[11]=0,n[12]=e.x,n[13]=e.y,n[14]=e.z,n[15]=1,this}decompose(e,t,i){const n=this.elements;let r=Pn.set(n[0],n[1],n[2]).length();const s=Pn.set(n[4],n[5],n[6]).length(),a=Pn.set(n[8],n[9],n[10]).length();this.determinant()<0&&(r=-r),e.x=n[12],e.y=n[13],e.z=n[14],Ln.copy(this);const o=1/r,h=1/s,c=1/a;return Ln.elements[0]*=o,Ln.elements[1]*=o,Ln.elements[2]*=o,Ln.elements[4]*=h,Ln.elements[5]*=h,Ln.elements[6]*=h,Ln.elements[8]*=c,Ln.elements[9]*=c,Ln.elements[10]*=c,t.setFromRotationMatrix(Ln),i.x=r,i.y=s,i.z=a,this}makePerspective(e,t,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 a=this.elements,o=2*r/(t-e),h=2*r/(i-n),c=(t+e)/(t-e),l=(i+n)/(i-n),u=-(s+r)/(s-r),d=-2*s*r/(s-r);return a[0]=o,a[4]=0,a[8]=c,a[12]=0,a[1]=0,a[5]=h,a[9]=l,a[13]=0,a[2]=0,a[6]=0,a[10]=u,a[14]=d,a[3]=0,a[7]=0,a[11]=-1,a[15]=0,this}makeOrthographic(e,t,i,n,r,s){const a=this.elements,o=1/(t-e),h=1/(i-n),c=1/(s-r),l=(t+e)*o,u=(i+n)*h,d=(s+r)*c;return a[0]=2*o,a[4]=0,a[8]=0,a[12]=-l,a[1]=0,a[5]=2*h,a[9]=0,a[13]=-u,a[2]=0,a[6]=0,a[10]=-2*c,a[14]=-d,a[3]=0,a[7]=0,a[11]=0,a[15]=1,this}equals(e){const t=this.elements,i=e.elements;for(let e=0;e<16;e++)if(t[e]!==i[e])return!1;return!0}fromArray(e,t=0){for(let i=0;i<16;i++)this.elements[i]=e[i+t];return this}toArray(e=[],t=0){const i=this.elements;return e[t]=i[0],e[t+1]=i[1],e[t+2]=i[2],e[t+3]=i[3],e[t+4]=i[4],e[t+5]=i[5],e[t+6]=i[6],e[t+7]=i[7],e[t+8]=i[8],e[t+9]=i[9],e[t+10]=i[10],e[t+11]=i[11],e[t+12]=i[12],e[t+13]=i[13],e[t+14]=i[14],e[t+15]=i[15],e}}Rn.prototype.isMatrix4=!0;const Pn=new Ki,Ln=new Rn,Dn=new Ki(0,0,0),Nn=new Ki(1,1,1),$n=new Ki,kn=new Ki,On=new Ki,zn=new Rn,Fn=new Ji;class Bn{constructor(e=0,t=0,i=0,n=Bn.DefaultOrder){this._x=e,this._y=t,this._z=i,this._order=n}get x(){return this._x}set x(e){this._x=e,this._onChangeCallback()}get y(){return this._y}set y(e){this._y=e,this._onChangeCallback()}get z(){return this._z}set z(e){this._z=e,this._onChangeCallback()}get order(){return this._order}set order(e){this._order=e,this._onChangeCallback()}set(e,t,i,n=this._order){return this._x=e,this._y=t,this._z=i,this._order=n,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._order)}copy(e){return this._x=e._x,this._y=e._y,this._z=e._z,this._order=e._order,this._onChangeCallback(),this}setFromRotationMatrix(e,t=this._order,i=!0){const n=e.elements,r=n[0],s=n[4],a=n[8],o=n[1],h=n[5],c=n[9],l=n[2],u=n[6],d=n[10];switch(t){case"XYZ":this._y=Math.asin(Li(a,-1,1)),Math.abs(a)<.9999999?(this._x=Math.atan2(-c,d),this._z=Math.atan2(-s,r)):(this._x=Math.atan2(u,h),this._z=0);break;case"YXZ":this._x=Math.asin(-Li(c,-1,1)),Math.abs(c)<.9999999?(this._y=Math.atan2(a,d),this._z=Math.atan2(o,h)):(this._y=Math.atan2(-l,r),this._z=0);break;case"ZXY":this._x=Math.asin(Li(u,-1,1)),Math.abs(u)<.9999999?(this._y=Math.atan2(-l,d),this._z=Math.atan2(-s,h)):(this._y=0,this._z=Math.atan2(o,r));break;case"ZYX":this._y=Math.asin(-Li(l,-1,1)),Math.abs(l)<.9999999?(this._x=Math.atan2(u,d),this._z=Math.atan2(o,r)):(this._x=0,this._z=Math.atan2(-s,h));break;case"YZX":this._z=Math.asin(Li(o,-1,1)),Math.abs(o)<.9999999?(this._x=Math.atan2(-c,h),this._y=Math.atan2(-l,r)):(this._x=0,this._y=Math.atan2(a,d));break;case"XZY":this._z=Math.asin(-Li(s,-1,1)),Math.abs(s)<.9999999?(this._x=Math.atan2(u,h),this._y=Math.atan2(a,r)):(this._x=Math.atan2(-c,d),this._y=0);break;default:console.warn("THREE.Euler: .setFromRotationMatrix() encountered an unknown order: "+t)}return this._order=t,!0===i&&this._onChangeCallback(),this}setFromQuaternion(e,t,i){return zn.makeRotationFromQuaternion(e),this.setFromRotationMatrix(zn,t,i)}setFromVector3(e,t=this._order){return this.set(e.x,e.y,e.z,t)}reorder(e){return Fn.setFromEuler(this),this.setFromQuaternion(Fn,e)}equals(e){return e._x===this._x&&e._y===this._y&&e._z===this._z&&e._order===this._order}fromArray(e){return this._x=e[0],this._y=e[1],this._z=e[2],void 0!==e[3]&&(this._order=e[3]),this._onChangeCallback(),this}toArray(e=[],t=0){return e[t]=this._x,e[t+1]=this._y,e[t+2]=this._z,e[t+3]=this._order,e}toVector3(e){return e?e.set(this._x,this._y,this._z):new Ki(this._x,this._y,this._z)}_onChange(e){return this._onChangeCallback=e,this}_onChangeCallback(){}}Bn.prototype.isEuler=!0,Bn.DefaultOrder="XYZ",Bn.RotationOrders=["XYZ","YZX","ZXY","XZY","YXZ","ZYX"];class Un{constructor(){this.mask=1}set(e){this.mask=1<<e|0}enable(e){this.mask|=1<<e|0}enableAll(){this.mask=-1}toggle(e){this.mask^=1<<e|0}disable(e){this.mask&=~(1<<e|0)}disableAll(){this.mask=0}test(e){return 0!=(this.mask&e.mask)}}let Vn=0;const Hn=new Ki,jn=new Ji,Gn=new Rn,Wn=new Ki,qn=new Ki,Xn=new Ki,Zn=new Ji,Yn=new Ki(1,0,0),Jn=new Ki(0,1,0),Kn=new Ki(0,0,1),Qn={type:"added"},er={type:"removed"};class tr extends Ti{constructor(){super(),Object.defineProperty(this,"id",{value:Vn++}),this.uuid=Pi(),this.name="",this.type="Object3D",this.parent=null,this.children=[],this.up=tr.DefaultUp.clone();const e=new Ki,t=new Bn,i=new Ji,n=new Ki(1,1,1);t._onChange((function(){i.setFromEuler(t,!1)})),i._onChange((function(){t.setFromQuaternion(i,void 0,!1)})),Object.defineProperties(this,{position:{configurable:!0,enumerable:!0,value:e},rotation:{configurable:!0,enumerable:!0,value:t},quaternion:{configurable:!0,enumerable:!0,value:i},scale:{configurable:!0,enumerable:!0,value:n},modelViewMatrix:{value:new Rn},normalMatrix:{value:new Fi}}),this.matrix=new Rn,this.matrixWorld=new Rn,this.matrixAutoUpdate=tr.DefaultMatrixAutoUpdate,this.matrixWorldNeedsUpdate=!1,this.layers=new Un,this.visible=!0,this.castShadow=!1,this.receiveShadow=!1,this.frustumCulled=!0,this.renderOrder=0,this.animations=[],this.userData={}}onBeforeRender(){}onAfterRender(){}applyMatrix4(e){this.matrixAutoUpdate&&this.updateMatrix(),this.matrix.premultiply(e),this.matrix.decompose(this.position,this.quaternion,this.scale)}applyQuaternion(e){return this.quaternion.premultiply(e),this}setRotationFromAxisAngle(e,t){this.quaternion.setFromAxisAngle(e,t)}setRotationFromEuler(e){this.quaternion.setFromEuler(e,!0)}setRotationFromMatrix(e){this.quaternion.setFromRotationMatrix(e)}setRotationFromQuaternion(e){this.quaternion.copy(e)}rotateOnAxis(e,t){return jn.setFromAxisAngle(e,t),this.quaternion.multiply(jn),this}rotateOnWorldAxis(e,t){return jn.setFromAxisAngle(e,t),this.quaternion.premultiply(jn),this}rotateX(e){return this.rotateOnAxis(Yn,e)}rotateY(e){return this.rotateOnAxis(Jn,e)}rotateZ(e){return this.rotateOnAxis(Kn,e)}translateOnAxis(e,t){return Hn.copy(e).applyQuaternion(this.quaternion),this.position.add(Hn.multiplyScalar(t)),this}translateX(e){return this.translateOnAxis(Yn,e)}translateY(e){return this.translateOnAxis(Jn,e)}translateZ(e){return this.translateOnAxis(Kn,e)}localToWorld(e){return e.applyMatrix4(this.matrixWorld)}worldToLocal(e){return e.applyMatrix4(Gn.copy(this.matrixWorld).invert())}lookAt(e,t,i){e.isVector3?Wn.copy(e):Wn.set(e,t,i);const n=this.parent;this.updateWorldMatrix(!0,!1),qn.setFromMatrixPosition(this.matrixWorld),this.isCamera||this.isLight?Gn.lookAt(qn,Wn,this.up):Gn.lookAt(Wn,qn,this.up),this.quaternion.setFromRotationMatrix(Gn),n&&(Gn.extractRotation(n.matrixWorld),jn.setFromRotationMatrix(Gn),this.quaternion.premultiply(jn.invert()))}add(e){if(arguments.length>1){for(let e=0;e<arguments.length;e++)this.add(arguments[e]);return this}return e===this?(console.error("THREE.Object3D.add: object can't be added as a child of itself.",e),this):(e&&e.isObject3D?(null!==e.parent&&e.parent.remove(e),e.parent=this,this.children.push(e),e.dispatchEvent(Qn)):console.error("THREE.Object3D.add: object not an instance of THREE.Object3D.",e),this)}remove(e){if(arguments.length>1){for(let e=0;e<arguments.length;e++)this.remove(arguments[e]);return this}const t=this.children.indexOf(e);return-1!==t&&(e.parent=null,this.children.splice(t,1),e.dispatchEvent(er)),this}removeFromParent(){const e=this.parent;return null!==e&&e.remove(this),this}clear(){for(let e=0;e<this.children.length;e++){const t=this.children[e];t.parent=null,t.dispatchEvent(er)}return this.children.length=0,this}attach(e){return this.updateWorldMatrix(!0,!1),Gn.copy(this.matrixWorld).invert(),null!==e.parent&&(e.parent.updateWorldMatrix(!0,!1),Gn.multiply(e.parent.matrixWorld)),e.applyMatrix4(Gn),this.add(e),e.updateWorldMatrix(!1,!0),this}getObjectById(e){return this.getObjectByProperty("id",e)}getObjectByName(e){return this.getObjectByProperty("name",e)}getObjectByProperty(e,t){if(this[e]===t)return this;for(let i=0,n=this.children.length;i<n;i++){const n=this.children[i].getObjectByProperty(e,t);if(void 0!==n)return n}}getWorldPosition(e){return this.updateWorldMatrix(!0,!1),e.setFromMatrixPosition(this.matrixWorld)}getWorldQuaternion(e){return this.updateWorldMatrix(!0,!1),this.matrixWorld.decompose(qn,e,Xn),e}getWorldScale(e){return this.updateWorldMatrix(!0,!1),this.matrixWorld.decompose(qn,Zn,e),e}getWorldDirection(e){this.updateWorldMatrix(!0,!1);const t=this.matrixWorld.elements;return e.set(t[8],t[9],t[10]).normalize()}raycast(){}traverse(e){e(this);const t=this.children;for(let i=0,n=t.length;i<n;i++)t[i].traverse(e)}traverseVisible(e){if(!1===this.visible)return;e(this);const t=this.children;for(let i=0,n=t.length;i<n;i++)t[i].traverseVisible(e)}traverseAncestors(e){const t=this.parent;null!==t&&(e(t),t.traverseAncestors(e))}updateMatrix(){this.matrix.compose(this.position,this.quaternion,this.scale),this.matrixWorldNeedsUpdate=!0}updateMatrixWorld(e){this.matrixAutoUpdate&&this.updateMatrix(),(this.matrixWorldNeedsUpdate||e)&&(null===this.parent?this.matrixWorld.copy(this.matrix):this.matrixWorld.multiplyMatrices(this.parent.matrixWorld,this.matrix),this.matrixWorldNeedsUpdate=!1,e=!0);const t=this.children;for(let i=0,n=t.length;i<n;i++)t[i].updateMatrixWorld(e)}updateWorldMatrix(e,t){const i=this.parent;if(!0===e&&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===t){const e=this.children;for(let t=0,i=e.length;t<i;t++)e[t].updateWorldMatrix(!1,!0)}}toJSON(e){const t=void 0===e||"string"==typeof e,i={};t&&(e={geometries:{},materials:{},textures:{},images:{},shapes:{},skeletons:{},animations:{}},i.metadata={version:4.5,type:"Object",generator:"Object3D.toJSON"});const n={};function r(t,i){return void 0===t[i.uuid]&&(t[i.uuid]=i.toJSON(e)),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(),null!==this.instanceColor&&(n.instanceColor=this.instanceColor.toJSON())),this.isScene)this.background&&(this.background.isColor?n.background=this.background.toJSON():this.background.isTexture&&(n.background=this.background.toJSON(e).uuid)),this.environment&&this.environment.isTexture&&(n.environment=this.environment.toJSON(e).uuid);else if(this.isMesh||this.isLine||this.isPoints){n.geometry=r(e.geometries,this.geometry);const t=this.geometry.parameters;if(void 0!==t&&void 0!==t.shapes){const i=t.shapes;if(Array.isArray(i))for(let t=0,n=i.length;t<n;t++){const n=i[t];r(e.shapes,n)}else r(e.shapes,i)}}if(this.isSkinnedMesh&&(n.bindMode=this.bindMode,n.bindMatrix=this.bindMatrix.toArray(),void 0!==this.skeleton&&(r(e.skeletons,this.skeleton),n.skeleton=this.skeleton.uuid)),void 0!==this.material)if(Array.isArray(this.material)){const t=[];for(let i=0,n=this.material.length;i<n;i++)t.push(r(e.materials,this.material[i]));n.material=t}else n.material=r(e.materials,this.material);if(this.children.length>0){n.children=[];for(let t=0;t<this.children.length;t++)n.children.push(this.children[t].toJSON(e).object)}if(this.animations.length>0){n.animations=[];for(let t=0;t<this.animations.length;t++){const i=this.animations[t];n.animations.push(r(e.animations,i))}}if(t){const t=s(e.geometries),n=s(e.materials),r=s(e.textures),a=s(e.images),o=s(e.shapes),h=s(e.skeletons),c=s(e.animations);t.length>0&&(i.geometries=t),n.length>0&&(i.materials=n),r.length>0&&(i.textures=r),a.length>0&&(i.images=a),o.length>0&&(i.shapes=o),h.length>0&&(i.skeletons=h),c.length>0&&(i.animations=c)}return i.object=n,i;function s(e){const t=[];for(const i in e){const n=e[i];delete n.metadata,t.push(n)}return t}}clone(e){return(new this.constructor).copy(this,e)}copy(e,t=!0){if(this.name=e.name,this.up.copy(e.up),this.position.copy(e.position),this.rotation.order=e.rotation.order,this.quaternion.copy(e.quaternion),this.scale.copy(e.scale),this.matrix.copy(e.matrix),this.matrixWorld.copy(e.matrixWorld),this.matrixAutoUpdate=e.matrixAutoUpdate,this.matrixWorldNeedsUpdate=e.matrixWorldNeedsUpdate,this.layers.mask=e.layers.mask,this.visible=e.visible,this.castShadow=e.castShadow,this.receiveShadow=e.receiveShadow,this.frustumCulled=e.frustumCulled,this.renderOrder=e.renderOrder,this.userData=JSON.parse(JSON.stringify(e.userData)),!0===t)for(let t=0;t<e.children.length;t++){const i=e.children[t];this.add(i.clone())}return this}}tr.DefaultUp=new Ki(0,1,0),tr.DefaultMatrixAutoUpdate=!0,tr.prototype.isObject3D=!0;const ir=new Ki,nr=new Ki,rr=new Ki,sr=new Ki,ar=new Ki,or=new Ki,hr=new Ki,cr=new Ki,lr=new Ki,ur=new Ki;class dr{constructor(e=new Ki,t=new Ki,i=new Ki){this.a=e,this.b=t,this.c=i}static getNormal(e,t,i,n){n.subVectors(i,t),ir.subVectors(e,t),n.cross(ir);const r=n.lengthSq();return r>0?n.multiplyScalar(1/Math.sqrt(r)):n.set(0,0,0)}static getBarycoord(e,t,i,n,r){ir.subVectors(n,t),nr.subVectors(i,t),rr.subVectors(e,t);const s=ir.dot(ir),a=ir.dot(nr),o=ir.dot(rr),h=nr.dot(nr),c=nr.dot(rr),l=s*h-a*a;if(0===l)return r.set(-2,-1,-1);const u=1/l,d=(h*o-a*c)*u,p=(s*c-a*o)*u;return r.set(1-d-p,p,d)}static containsPoint(e,t,i,n){return this.getBarycoord(e,t,i,n,sr),sr.x>=0&&sr.y>=0&&sr.x+sr.y<=1}static getUV(e,t,i,n,r,s,a,o){return this.getBarycoord(e,t,i,n,sr),o.set(0,0),o.addScaledVector(r,sr.x),o.addScaledVector(s,sr.y),o.addScaledVector(a,sr.z),o}static isFrontFacing(e,t,i,n){return ir.subVectors(i,t),nr.subVectors(e,t),ir.cross(nr).dot(n)<0}set(e,t,i){return this.a.copy(e),this.b.copy(t),this.c.copy(i),this}setFromPointsAndIndices(e,t,i,n){return this.a.copy(e[t]),this.b.copy(e[i]),this.c.copy(e[n]),this}setFromAttributeAndIndices(e,t,i,n){return this.a.fromBufferAttribute(e,t),this.b.fromBufferAttribute(e,i),this.c.fromBufferAttribute(e,n),this}clone(){return(new this.constructor).copy(this)}copy(e){return this.a.copy(e.a),this.b.copy(e.b),this.c.copy(e.c),this}getArea(){return ir.subVectors(this.c,this.b),nr.subVectors(this.a,this.b),.5*ir.cross(nr).length()}getMidpoint(e){return e.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)}getNormal(e){return dr.getNormal(this.a,this.b,this.c,e)}getPlane(e){return e.setFromCoplanarPoints(this.a,this.b,this.c)}getBarycoord(e,t){return dr.getBarycoord(e,this.a,this.b,this.c,t)}getUV(e,t,i,n,r){return dr.getUV(e,this.a,this.b,this.c,t,i,n,r)}containsPoint(e){return dr.containsPoint(e,this.a,this.b,this.c)}isFrontFacing(e){return dr.isFrontFacing(this.a,this.b,this.c,e)}intersectsBox(e){return e.intersectsTriangle(this)}closestPointToPoint(e,t){const i=this.a,n=this.b,r=this.c;let s,a;ar.subVectors(n,i),or.subVectors(r,i),cr.subVectors(e,i);const o=ar.dot(cr),h=or.dot(cr);if(o<=0&&h<=0)return t.copy(i);lr.subVectors(e,n);const c=ar.dot(lr),l=or.dot(lr);if(c>=0&&l<=c)return t.copy(n);const u=o*l-c*h;if(u<=0&&o>=0&&c<=0)return s=o/(o-c),t.copy(i).addScaledVector(ar,s);ur.subVectors(e,r);const d=ar.dot(ur),p=or.dot(ur);if(p>=0&&d<=p)return t.copy(r);const m=d*h-o*p;if(m<=0&&h>=0&&p<=0)return a=h/(h-p),t.copy(i).addScaledVector(or,a);const f=c*p-d*l;if(f<=0&&l-c>=0&&d-p>=0)return hr.subVectors(r,n),a=(l-c)/(l-c+(d-p)),t.copy(n).addScaledVector(hr,a);const g=1/(f+m+u);return s=m*g,a=u*g,t.copy(i).addScaledVector(ar,s).addScaledVector(or,a)}equals(e){return e.a.equals(this.a)&&e.b.equals(this.b)&&e.c.equals(this.c)}}let pr=0;class mr extends Ti{constructor(){super(),Object.defineProperty(this,"id",{value:pr++}),this.uuid=Pi(),this.name="",this.type="Material",this.fog=!0,this.blending=1,this.side=0,this.vertexColors=!1,this.opacity=1,this.format=oi,this.transparent=!1,this.blendSrc=204,this.blendDst=205,this.blendEquation=jt,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=xi,this.stencilZFail=xi,this.stencilZPass=xi,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.alphaToCoverage=!1,this.premultipliedAlpha=!1,this.visible=!0,this.toneMapped=!0,this.userData={},this.version=0,this._alphaTest=0}get alphaTest(){return this._alphaTest}set alphaTest(e){this._alphaTest>0!=e>0&&this.version++,this._alphaTest=e}onBuild(){}onBeforeRender(){}onBeforeCompile(){}customProgramCacheKey(){return this.onBeforeCompile.toString()}setValues(e){if(void 0!==e)for(const t in e){const i=e[t];if(void 0===i){console.warn("THREE.Material: '"+t+"' parameter is undefined.");continue}if("shading"===t){console.warn("THREE."+this.type+": .shading has been removed. Use the boolean .flatShading instead."),this.flatShading=1===i;continue}const n=this[t];void 0!==n?n&&n.isColor?n.set(i):n&&n.isVector3&&i&&i.isVector3?n.copy(i):this[t]=i:console.warn("THREE."+this.type+": '"+t+"' is not a property of this material.")}}toJSON(e){const t=void 0===e||"string"==typeof e;t&&(e={textures:{},images:{}});const i={metadata:{version:4.5,type:"Material",generator:"Material.toJSON"}};function n(e){const t=[];for(const i in e){const n=e[i];delete n.metadata,t.push(n)}return t}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),void 0!==this.sheen&&(i.sheen=this.sheen),this.sheenColor&&this.sheenColor.isColor&&(i.sheenColor=this.sheenColor.getHex()),void 0!==this.sheenRoughness&&(i.sheenRoughness=this.sheenRoughness),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.specularIntensity&&(i.specularIntensity=this.specularIntensity),this.specularColor&&this.specularColor.isColor&&(i.specularColor=this.specularColor.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(e).uuid),this.clearcoatRoughnessMap&&this.clearcoatRoughnessMap.isTexture&&(i.clearcoatRoughnessMap=this.clearcoatRoughnessMap.toJSON(e).uuid),this.clearcoatNormalMap&&this.clearcoatNormalMap.isTexture&&(i.clearcoatNormalMap=this.clearcoatNormalMap.toJSON(e).uuid,i.clearcoatNormalScale=this.clearcoatNormalScale.toArray()),this.map&&this.map.isTexture&&(i.map=this.map.toJSON(e).uuid),this.matcap&&this.matcap.isTexture&&(i.matcap=this.matcap.toJSON(e).uuid),this.alphaMap&&this.alphaMap.isTexture&&(i.alphaMap=this.alphaMap.toJSON(e).uuid),this.lightMap&&this.lightMap.isTexture&&(i.lightMap=this.lightMap.toJSON(e).uuid,i.lightMapIntensity=this.lightMapIntensity),this.aoMap&&this.aoMap.isTexture&&(i.aoMap=this.aoMap.toJSON(e).uuid,i.aoMapIntensity=this.aoMapIntensity),this.bumpMap&&this.bumpMap.isTexture&&(i.bumpMap=this.bumpMap.toJSON(e).uuid,i.bumpScale=this.bumpScale),this.normalMap&&this.normalMap.isTexture&&(i.normalMap=this.normalMap.toJSON(e).uuid,i.normalMapType=this.normalMapType,i.normalScale=this.normalScale.toArray()),this.displacementMap&&this.displacementMap.isTexture&&(i.displacementMap=this.displacementMap.toJSON(e).uuid,i.displacementScale=this.displacementScale,i.displacementBias=this.displacementBias),this.roughnessMap&&this.roughnessMap.isTexture&&(i.roughnessMap=this.roughnessMap.toJSON(e).uuid),this.metalnessMap&&this.metalnessMap.isTexture&&(i.metalnessMap=this.metalnessMap.toJSON(e).uuid),this.emissiveMap&&this.emissiveMap.isTexture&&(i.emissiveMap=this.emissiveMap.toJSON(e).uuid),this.specularMap&&this.specularMap.isTexture&&(i.specularMap=this.specularMap.toJSON(e).uuid),this.specularIntensityMap&&this.specularIntensityMap.isTexture&&(i.specularIntensityMap=this.specularIntensityMap.toJSON(e).uuid),this.specularColorMap&&this.specularColorMap.isTexture&&(i.specularColorMap=this.specularColorMap.toJSON(e).uuid),this.envMap&&this.envMap.isTexture&&(i.envMap=this.envMap.toJSON(e).uuid,void 0!==this.combine&&(i.combine=this.combine)),void 0!==this.envMapIntensity&&(i.envMapIntensity=this.envMapIntensity),void 0!==this.reflectivity&&(i.reflectivity=this.reflectivity),void 0!==this.refractionRatio&&(i.refractionRatio=this.refractionRatio),this.gradientMap&&this.gradientMap.isTexture&&(i.gradientMap=this.gradientMap.toJSON(e).uuid),void 0!==this.transmission&&(i.transmission=this.transmission),this.transmissionMap&&this.transmissionMap.isTexture&&(i.transmissionMap=this.transmissionMap.toJSON(e).uuid),void 0!==this.thickness&&(i.thickness=this.thickness),this.thicknessMap&&this.thicknessMap.isTexture&&(i.thicknessMap=this.thicknessMap.toJSON(e).uuid),void 0!==this.attenuationDistance&&(i.attenuationDistance=this.attenuationDistance),void 0!==this.attenuationColor&&(i.attenuationColor=this.attenuationColor.getHex()),void 0!==this.size&&(i.size=this.size),null!==this.shadowSide&&(i.shadowSide=this.shadowSide),void 0!==this.sizeAttenuation&&(i.sizeAttenuation=this.sizeAttenuation),1!==this.blending&&(i.blending=this.blending),0!==this.side&&(i.side=this.side),this.vertexColors&&(i.vertexColors=!0),this.opacity<1&&(i.opacity=this.opacity),this.format!==oi&&(i.format=this.format),!0===this.transparent&&(i.transparent=this.transparent),i.depthFunc=this.depthFunc,i.depthTest=this.depthTest,i.depthWrite=this.depthWrite,i.colorWrite=this.colorWrite,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.alphaToCoverage&&(i.alphaToCoverage=this.alphaToCoverage),!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.flatShading&&(i.flatShading=this.flatShading),!1===this.visible&&(i.visible=!1),!1===this.toneMapped&&(i.toneMapped=!1),"{}"!==JSON.stringify(this.userData)&&(i.userData=this.userData),t){const t=n(e.textures),r=n(e.images);t.length>0&&(i.textures=t),r.length>0&&(i.images=r)}return i}clone(){return(new this.constructor).copy(this)}copy(e){this.name=e.name,this.fog=e.fog,this.blending=e.blending,this.side=e.side,this.vertexColors=e.vertexColors,this.opacity=e.opacity,this.format=e.format,this.transparent=e.transparent,this.blendSrc=e.blendSrc,this.blendDst=e.blendDst,this.blendEquation=e.blendEquation,this.blendSrcAlpha=e.blendSrcAlpha,this.blendDstAlpha=e.blendDstAlpha,this.blendEquationAlpha=e.blendEquationAlpha,this.depthFunc=e.depthFunc,this.depthTest=e.depthTest,this.depthWrite=e.depthWrite,this.stencilWriteMask=e.stencilWriteMask,this.stencilFunc=e.stencilFunc,this.stencilRef=e.stencilRef,this.stencilFuncMask=e.stencilFuncMask,this.stencilFail=e.stencilFail,this.stencilZFail=e.stencilZFail,this.stencilZPass=e.stencilZPass,this.stencilWrite=e.stencilWrite;const t=e.clippingPlanes;let i=null;if(null!==t){const e=t.length;i=new Array(e);for(let n=0;n!==e;++n)i[n]=t[n].clone()}return this.clippingPlanes=i,this.clipIntersection=e.clipIntersection,this.clipShadows=e.clipShadows,this.shadowSide=e.shadowSide,this.colorWrite=e.colorWrite,this.precision=e.precision,this.polygonOffset=e.polygonOffset,this.polygonOffsetFactor=e.polygonOffsetFactor,this.polygonOffsetUnits=e.polygonOffsetUnits,this.dithering=e.dithering,this.alphaTest=e.alphaTest,this.alphaToCoverage=e.alphaToCoverage,this.premultipliedAlpha=e.premultipliedAlpha,this.visible=e.visible,this.toneMapped=e.toneMapped,this.userData=JSON.parse(JSON.stringify(e.userData)),this}dispose(){this.dispatchEvent({type:"dispose"})}set needsUpdate(e){!0===e&&this.version++}}mr.prototype.isMaterial=!0;const fr={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},gr={h:0,s:0,l:0},_r={h:0,s:0,l:0};function vr(e,t,i){return i<0&&(i+=1),i>1&&(i-=1),i<1/6?e+6*(t-e)*i:i<.5?t:i<2/3?e+6*(t-e)*(2/3-i):e}function yr(e){return e<.04045?.0773993808*e:Math.pow(.9478672986*e+.0521327014,2.4)}function br(e){return e<.0031308?12.92*e:1.055*Math.pow(e,.41666)-.055}class xr{constructor(e,t,i){return void 0===t&&void 0===i?this.set(e):this.setRGB(e,t,i)}set(e){return e&&e.isColor?this.copy(e):"number"==typeof e?this.setHex(e):"string"==typeof e&&this.setStyle(e),this}setScalar(e){return this.r=e,this.g=e,this.b=e,this}setHex(e){return e=Math.floor(e),this.r=(e>>16&255)/255,this.g=(e>>8&255)/255,this.b=(255&e)/255,this}setRGB(e,t,i){return this.r=e,this.g=t,this.b=i,this}setHSL(e,t,i){if(e=Di(e,1),t=Li(t,0,1),i=Li(i,0,1),0===t)this.r=this.g=this.b=i;else{const n=i<=.5?i*(1+t):i+t-i*t,r=2*i-n;this.r=vr(r,n,e+1/3),this.g=vr(r,n,e),this.b=vr(r,n,e-1/3)}return this}setStyle(e){function t(t){void 0!==t&&parseFloat(t)<1&&console.warn("THREE.Color: Alpha component of "+e+" will be ignored.")}let i;if(i=/^((?:rgb|hsl)a?)\(([^\)]*)\)/.exec(e)){let e;const n=i[1],r=i[2];switch(n){case"rgb":case"rgba":if(e=/^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(r))return this.r=Math.min(255,parseInt(e[1],10))/255,this.g=Math.min(255,parseInt(e[2],10))/255,this.b=Math.min(255,parseInt(e[3],10))/255,t(e[4]),this;if(e=/^\s*(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(r))return this.r=Math.min(100,parseInt(e[1],10))/100,this.g=Math.min(100,parseInt(e[2],10))/100,this.b=Math.min(100,parseInt(e[3],10))/100,t(e[4]),this;break;case"hsl":case"hsla":if(e=/^\s*(\d*\.?\d+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(r)){const i=parseFloat(e[1])/360,n=parseInt(e[2],10)/100,r=parseInt(e[3],10)/100;return t(e[4]),this.setHSL(i,n,r)}}}else if(i=/^\#([A-Fa-f\d]+)$/.exec(e)){const e=i[1],t=e.length;if(3===t)return this.r=parseInt(e.charAt(0)+e.charAt(0),16)/255,this.g=parseInt(e.charAt(1)+e.charAt(1),16)/255,this.b=parseInt(e.charAt(2)+e.charAt(2),16)/255,this;if(6===t)return this.r=parseInt(e.charAt(0)+e.charAt(1),16)/255,this.g=parseInt(e.charAt(2)+e.charAt(3),16)/255,this.b=parseInt(e.charAt(4)+e.charAt(5),16)/255,this}return e&&e.length>0?this.setColorName(e):this}setColorName(e){const t=fr[e.toLowerCase()];return void 0!==t?this.setHex(t):console.warn("THREE.Color: Unknown color "+e),this}clone(){return new this.constructor(this.r,this.g,this.b)}copy(e){return this.r=e.r,this.g=e.g,this.b=e.b,this}copyGammaToLinear(e,t=2){return this.r=Math.pow(e.r,t),this.g=Math.pow(e.g,t),this.b=Math.pow(e.b,t),this}copyLinearToGamma(e,t=2){const i=t>0?1/t:1;return this.r=Math.pow(e.r,i),this.g=Math.pow(e.g,i),this.b=Math.pow(e.b,i),this}convertGammaToLinear(e){return this.copyGammaToLinear(this,e),this}convertLinearToGamma(e){return this.copyLinearToGamma(this,e),this}copySRGBToLinear(e){return this.r=yr(e.r),this.g=yr(e.g),this.b=yr(e.b),this}copyLinearToSRGB(e){return this.r=br(e.r),this.g=br(e.g),this.b=br(e.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(e){const t=this.r,i=this.g,n=this.b,r=Math.max(t,i,n),s=Math.min(t,i,n);let a,o;const h=(s+r)/2;if(s===r)a=0,o=0;else{const e=r-s;switch(o=h<=.5?e/(r+s):e/(2-r-s),r){case t:a=(i-n)/e+(i<n?6:0);break;case i:a=(n-t)/e+2;break;case n:a=(t-i)/e+4}a/=6}return e.h=a,e.s=o,e.l=h,e}getStyle(){return"rgb("+(255*this.r|0)+","+(255*this.g|0)+","+(255*this.b|0)+")"}offsetHSL(e,t,i){return this.getHSL(gr),gr.h+=e,gr.s+=t,gr.l+=i,this.setHSL(gr.h,gr.s,gr.l),this}add(e){return this.r+=e.r,this.g+=e.g,this.b+=e.b,this}addColors(e,t){return this.r=e.r+t.r,this.g=e.g+t.g,this.b=e.b+t.b,this}addScalar(e){return this.r+=e,this.g+=e,this.b+=e,this}sub(e){return this.r=Math.max(0,this.r-e.r),this.g=Math.max(0,this.g-e.g),this.b=Math.max(0,this.b-e.b),this}multiply(e){return this.r*=e.r,this.g*=e.g,this.b*=e.b,this}multiplyScalar(e){return this.r*=e,this.g*=e,this.b*=e,this}lerp(e,t){return this.r+=(e.r-this.r)*t,this.g+=(e.g-this.g)*t,this.b+=(e.b-this.b)*t,this}lerpColors(e,t,i){return this.r=e.r+(t.r-e.r)*i,this.g=e.g+(t.g-e.g)*i,this.b=e.b+(t.b-e.b)*i,this}lerpHSL(e,t){this.getHSL(gr),e.getHSL(_r);const i=Ni(gr.h,_r.h,t),n=Ni(gr.s,_r.s,t),r=Ni(gr.l,_r.l,t);return this.setHSL(i,n,r),this}equals(e){return e.r===this.r&&e.g===this.g&&e.b===this.b}fromArray(e,t=0){return this.r=e[t],this.g=e[t+1],this.b=e[t+2],this}toArray(e=[],t=0){return e[t]=this.r,e[t+1]=this.g,e[t+2]=this.b,e}fromBufferAttribute(e,t){return this.r=e.getX(t),this.g=e.getY(t),this.b=e.getZ(t),!0===e.normalized&&(this.r/=255,this.g/=255,this.b/=255),this}toJSON(){return this.getHex()}}xr.NAMES=fr,xr.prototype.isColor=!0,xr.prototype.r=1,xr.prototype.g=1,xr.prototype.b=1;class wr extends mr{constructor(e){super(),this.type="MeshBasicMaterial",this.color=new xr(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.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.map=e.map,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.specularMap=e.specularMap,this.alphaMap=e.alphaMap,this.envMap=e.envMap,this.combine=e.combine,this.reflectivity=e.reflectivity,this.refractionRatio=e.refractionRatio,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this}}wr.prototype.isMeshBasicMaterial=!0;const Mr=new Ki,Sr=new zi;class Tr{constructor(e,t,i){if(Array.isArray(e))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.name="",this.array=e,this.itemSize=t,this.count=void 0!==e?e.length/t:0,this.normalized=!0===i,this.usage=wi,this.updateRange={offset:0,count:-1},this.version=0}onUploadCallback(){}set needsUpdate(e){!0===e&&this.version++}setUsage(e){return this.usage=e,this}copy(e){return this.name=e.name,this.array=new e.array.constructor(e.array),this.itemSize=e.itemSize,this.count=e.count,this.normalized=e.normalized,this.usage=e.usage,this}copyAt(e,t,i){e*=this.itemSize,i*=t.itemSize;for(let n=0,r=this.itemSize;n<r;n++)this.array[e+n]=t.array[i+n];return this}copyArray(e){return this.array.set(e),this}copyColorsArray(e){const t=this.array;let i=0;for(let n=0,r=e.length;n<r;n++){let r=e[n];void 0===r&&(console.warn("THREE.BufferAttribute.copyColorsArray(): color is undefined",n),r=new xr),t[i++]=r.r,t[i++]=r.g,t[i++]=r.b}return this}copyVector2sArray(e){const t=this.array;let i=0;for(let n=0,r=e.length;n<r;n++){let r=e[n];void 0===r&&(console.warn("THREE.BufferAttribute.copyVector2sArray(): vector is undefined",n),r=new zi),t[i++]=r.x,t[i++]=r.y}return this}copyVector3sArray(e){const t=this.array;let i=0;for(let n=0,r=e.length;n<r;n++){let r=e[n];void 0===r&&(console.warn("THREE.BufferAttribute.copyVector3sArray(): vector is undefined",n),r=new Ki),t[i++]=r.x,t[i++]=r.y,t[i++]=r.z}return this}copyVector4sArray(e){const t=this.array;let i=0;for(let n=0,r=e.length;n<r;n++){let r=e[n];void 0===r&&(console.warn("THREE.BufferAttribute.copyVector4sArray(): vector is undefined",n),r=new Xi),t[i++]=r.x,t[i++]=r.y,t[i++]=r.z,t[i++]=r.w}return this}applyMatrix3(e){if(2===this.itemSize)for(let t=0,i=this.count;t<i;t++)Sr.fromBufferAttribute(this,t),Sr.applyMatrix3(e),this.setXY(t,Sr.x,Sr.y);else if(3===this.itemSize)for(let t=0,i=this.count;t<i;t++)Mr.fromBufferAttribute(this,t),Mr.applyMatrix3(e),this.setXYZ(t,Mr.x,Mr.y,Mr.z);return this}applyMatrix4(e){for(let t=0,i=this.count;t<i;t++)Mr.x=this.getX(t),Mr.y=this.getY(t),Mr.z=this.getZ(t),Mr.applyMatrix4(e),this.setXYZ(t,Mr.x,Mr.y,Mr.z);return this}applyNormalMatrix(e){for(let t=0,i=this.count;t<i;t++)Mr.x=this.getX(t),Mr.y=this.getY(t),Mr.z=this.getZ(t),Mr.applyNormalMatrix(e),this.setXYZ(t,Mr.x,Mr.y,Mr.z);return this}transformDirection(e){for(let t=0,i=this.count;t<i;t++)Mr.x=this.getX(t),Mr.y=this.getY(t),Mr.z=this.getZ(t),Mr.transformDirection(e),this.setXYZ(t,Mr.x,Mr.y,Mr.z);return this}set(e,t=0){return this.array.set(e,t),this}getX(e){return this.array[e*this.itemSize]}setX(e,t){return this.array[e*this.itemSize]=t,this}getY(e){return this.array[e*this.itemSize+1]}setY(e,t){return this.array[e*this.itemSize+1]=t,this}getZ(e){return this.array[e*this.itemSize+2]}setZ(e,t){return this.array[e*this.itemSize+2]=t,this}getW(e){return this.array[e*this.itemSize+3]}setW(e,t){return this.array[e*this.itemSize+3]=t,this}setXY(e,t,i){return e*=this.itemSize,this.array[e+0]=t,this.array[e+1]=i,this}setXYZ(e,t,i,n){return e*=this.itemSize,this.array[e+0]=t,this.array[e+1]=i,this.array[e+2]=n,this}setXYZW(e,t,i,n,r){return e*=this.itemSize,this.array[e+0]=t,this.array[e+1]=i,this.array[e+2]=n,this.array[e+3]=r,this}onUpload(e){return this.onUploadCallback=e,this}clone(){return new this.constructor(this.array,this.itemSize).copy(this)}toJSON(){const e={itemSize:this.itemSize,type:this.array.constructor.name,array:Array.prototype.slice.call(this.array),normalized:this.normalized};return""!==this.name&&(e.name=this.name),this.usage!==wi&&(e.usage=this.usage),0===this.updateRange.offset&&-1===this.updateRange.count||(e.updateRange=this.updateRange),e}}Tr.prototype.isBufferAttribute=!0;class Cr extends Tr{constructor(e,t,i){super(new Uint16Array(e),t,i)}}class Er extends Tr{constructor(e,t,i){super(new Uint32Array(e),t,i)}}(class extends Tr{constructor(e,t,i){super(new Uint16Array(e),t,i)}}).prototype.isFloat16BufferAttribute=!0;class Ar extends Tr{constructor(e,t,i){super(new Float32Array(e),t,i)}}let Ir=0;const Rr=new Rn,Pr=new tr,Lr=new Ki,Dr=new tn,Nr=new tn,$r=new Ki;class kr extends Ti{constructor(){super(),Object.defineProperty(this,"id",{value:Ir++}),this.uuid=Pi(),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={}}getIndex(){return this.index}setIndex(e){return Array.isArray(e)?this.index=new(Bi(e)>65535?Er:Cr)(e,1):this.index=e,this}getAttribute(e){return this.attributes[e]}setAttribute(e,t){return this.attributes[e]=t,this}deleteAttribute(e){return delete this.attributes[e],this}hasAttribute(e){return void 0!==this.attributes[e]}addGroup(e,t,i=0){this.groups.push({start:e,count:t,materialIndex:i})}clearGroups(){this.groups=[]}setDrawRange(e,t){this.drawRange.start=e,this.drawRange.count=t}applyMatrix4(e){const t=this.attributes.position;void 0!==t&&(t.applyMatrix4(e),t.needsUpdate=!0);const i=this.attributes.normal;if(void 0!==i){const t=(new Fi).getNormalMatrix(e);i.applyNormalMatrix(t),i.needsUpdate=!0}const n=this.attributes.tangent;return void 0!==n&&(n.transformDirection(e),n.needsUpdate=!0),null!==this.boundingBox&&this.computeBoundingBox(),null!==this.boundingSphere&&this.computeBoundingSphere(),this}applyQuaternion(e){return Rr.makeRotationFromQuaternion(e),this.applyMatrix4(Rr),this}rotateX(e){return Rr.makeRotationX(e),this.applyMatrix4(Rr),this}rotateY(e){return Rr.makeRotationY(e),this.applyMatrix4(Rr),this}rotateZ(e){return Rr.makeRotationZ(e),this.applyMatrix4(Rr),this}translate(e,t,i){return Rr.makeTranslation(e,t,i),this.applyMatrix4(Rr),this}scale(e,t,i){return Rr.makeScale(e,t,i),this.applyMatrix4(Rr),this}lookAt(e){return Pr.lookAt(e),Pr.updateMatrix(),this.applyMatrix4(Pr.matrix),this}center(){return this.computeBoundingBox(),this.boundingBox.getCenter(Lr).negate(),this.translate(Lr.x,Lr.y,Lr.z),this}setFromPoints(e){const t=[];for(let i=0,n=e.length;i<n;i++){const n=e[i];t.push(n.x,n.y,n.z||0)}return this.setAttribute("position",new Ar(t,3)),this}computeBoundingBox(){null===this.boundingBox&&(this.boundingBox=new tn);const e=this.attributes.position,t=this.morphAttributes.position;if(e&&e.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 Ki(-1/0,-1/0,-1/0),new Ki(1/0,1/0,1/0));if(void 0!==e){if(this.boundingBox.setFromBufferAttribute(e),t)for(let e=0,i=t.length;e<i;e++){const i=t[e];Dr.setFromBufferAttribute(i),this.morphTargetsRelative?($r.addVectors(this.boundingBox.min,Dr.min),this.boundingBox.expandByPoint($r),$r.addVectors(this.boundingBox.max,Dr.max),this.boundingBox.expandByPoint($r)):(this.boundingBox.expandByPoint(Dr.min),this.boundingBox.expandByPoint(Dr.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(){null===this.boundingSphere&&(this.boundingSphere=new xn);const e=this.attributes.position,t=this.morphAttributes.position;if(e&&e.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 Ki,1/0);if(e){const i=this.boundingSphere.center;if(Dr.setFromBufferAttribute(e),t)for(let e=0,i=t.length;e<i;e++){const i=t[e];Nr.setFromBufferAttribute(i),this.morphTargetsRelative?($r.addVectors(Dr.min,Nr.min),Dr.expandByPoint($r),$r.addVectors(Dr.max,Nr.max),Dr.expandByPoint($r)):(Dr.expandByPoint(Nr.min),Dr.expandByPoint(Nr.max))}Dr.getCenter(i);let n=0;for(let t=0,r=e.count;t<r;t++)$r.fromBufferAttribute(e,t),n=Math.max(n,i.distanceToSquared($r));if(t)for(let r=0,s=t.length;r<s;r++){const s=t[r],a=this.morphTargetsRelative;for(let t=0,r=s.count;t<r;t++)$r.fromBufferAttribute(s,t),a&&(Lr.fromBufferAttribute(e,t),$r.add(Lr)),n=Math.max(n,i.distanceToSquared($r))}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)}}computeTangents(){const e=this.index,t=this.attributes;if(null===e||void 0===t.position||void 0===t.normal||void 0===t.uv)return void console.error("THREE.BufferGeometry: .computeTangents() failed. Missing required attributes (index, position, normal or uv)");const i=e.array,n=t.position.array,r=t.normal.array,s=t.uv.array,a=n.length/3;void 0===t.tangent&&this.setAttribute("tangent",new Tr(new Float32Array(4*a),4));const o=t.tangent.array,h=[],c=[];for(let e=0;e<a;e++)h[e]=new Ki,c[e]=new Ki;const l=new Ki,u=new Ki,d=new Ki,p=new zi,m=new zi,f=new zi,g=new Ki,_=new Ki;function v(e,t,i){l.fromArray(n,3*e),u.fromArray(n,3*t),d.fromArray(n,3*i),p.fromArray(s,2*e),m.fromArray(s,2*t),f.fromArray(s,2*i),u.sub(l),d.sub(l),m.sub(p),f.sub(p);const r=1/(m.x*f.y-f.x*m.y);isFinite(r)&&(g.copy(u).multiplyScalar(f.y).addScaledVector(d,-m.y).multiplyScalar(r),_.copy(d).multiplyScalar(m.x).addScaledVector(u,-f.x).multiplyScalar(r),h[e].add(g),h[t].add(g),h[i].add(g),c[e].add(_),c[t].add(_),c[i].add(_))}let y=this.groups;0===y.length&&(y=[{start:0,count:i.length}]);for(let e=0,t=y.length;e<t;++e){const t=y[e],n=t.start;for(let e=n,r=n+t.count;e<r;e+=3)v(i[e+0],i[e+1],i[e+2])}const b=new Ki,x=new Ki,w=new Ki,M=new Ki;function S(e){w.fromArray(r,3*e),M.copy(w);const t=h[e];b.copy(t),b.sub(w.multiplyScalar(w.dot(t))).normalize(),x.crossVectors(M,t);const i=x.dot(c[e])<0?-1:1;o[4*e]=b.x,o[4*e+1]=b.y,o[4*e+2]=b.z,o[4*e+3]=i}for(let e=0,t=y.length;e<t;++e){const t=y[e],n=t.start;for(let e=n,r=n+t.count;e<r;e+=3)S(i[e+0]),S(i[e+1]),S(i[e+2])}}computeVertexNormals(){const e=this.index,t=this.getAttribute("position");if(void 0!==t){let i=this.getAttribute("normal");if(void 0===i)i=new Tr(new Float32Array(3*t.count),3),this.setAttribute("normal",i);else for(let e=0,t=i.count;e<t;e++)i.setXYZ(e,0,0,0);const n=new Ki,r=new Ki,s=new Ki,a=new Ki,o=new Ki,h=new Ki,c=new Ki,l=new Ki;if(e)for(let u=0,d=e.count;u<d;u+=3){const d=e.getX(u+0),p=e.getX(u+1),m=e.getX(u+2);n.fromBufferAttribute(t,d),r.fromBufferAttribute(t,p),s.fromBufferAttribute(t,m),c.subVectors(s,r),l.subVectors(n,r),c.cross(l),a.fromBufferAttribute(i,d),o.fromBufferAttribute(i,p),h.fromBufferAttribute(i,m),a.add(c),o.add(c),h.add(c),i.setXYZ(d,a.x,a.y,a.z),i.setXYZ(p,o.x,o.y,o.z),i.setXYZ(m,h.x,h.y,h.z)}else for(let e=0,a=t.count;e<a;e+=3)n.fromBufferAttribute(t,e+0),r.fromBufferAttribute(t,e+1),s.fromBufferAttribute(t,e+2),c.subVectors(s,r),l.subVectors(n,r),c.cross(l),i.setXYZ(e+0,c.x,c.y,c.z),i.setXYZ(e+1,c.x,c.y,c.z),i.setXYZ(e+2,c.x,c.y,c.z);this.normalizeNormals(),i.needsUpdate=!0}}merge(e,t){if(!e||!e.isBufferGeometry)return void console.error("THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.",e);void 0===t&&(t=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===e.attributes[n])continue;const r=i[n].array,s=e.attributes[n],a=s.array,o=s.itemSize*t,h=Math.min(a.length,r.length-o);for(let e=0,t=o;e<h;e++,t++)r[t]=a[e]}return this}normalizeNormals(){const e=this.attributes.normal;for(let t=0,i=e.count;t<i;t++)$r.fromBufferAttribute(e,t),$r.normalize(),e.setXYZ(t,$r.x,$r.y,$r.z)}toNonIndexed(){function e(e,t){const i=e.array,n=e.itemSize,r=e.normalized,s=new i.constructor(t.length*n);let a=0,o=0;for(let r=0,h=t.length;r<h;r++){a=e.isInterleavedBufferAttribute?t[r]*e.data.stride+e.offset:t[r]*n;for(let e=0;e<n;e++)s[o++]=i[a++]}return new Tr(s,n,r)}if(null===this.index)return console.warn("THREE.BufferGeometry.toNonIndexed(): BufferGeometry is already non-indexed."),this;const t=new kr,i=this.index.array,n=this.attributes;for(const r in n){const s=e(n[r],i);t.setAttribute(r,s)}const r=this.morphAttributes;for(const n in r){const s=[],a=r[n];for(let t=0,n=a.length;t<n;t++){const n=e(a[t],i);s.push(n)}t.morphAttributes[n]=s}t.morphTargetsRelative=this.morphTargetsRelative;const s=this.groups;for(let e=0,i=s.length;e<i;e++){const i=s[e];t.addGroup(i.start,i.count,i.materialIndex)}return t}toJSON(){const e={metadata:{version:4.5,type:"BufferGeometry",generator:"BufferGeometry.toJSON"}};if(e.uuid=this.uuid,e.type=this.type,""!==this.name&&(e.name=this.name),Object.keys(this.userData).length>0&&(e.userData=this.userData),void 0!==this.parameters){const t=this.parameters;for(const i in t)void 0!==t[i]&&(e[i]=t[i]);return e}e.data={attributes:{}};const t=this.index;null!==t&&(e.data.index={type:t.array.constructor.name,array:Array.prototype.slice.call(t.array)});const i=this.attributes;for(const t in i){const n=i[t];e.data.attributes[t]=n.toJSON(e.data)}const n={};let r=!1;for(const t in this.morphAttributes){const i=this.morphAttributes[t],s=[];for(let t=0,n=i.length;t<n;t++){const n=i[t];s.push(n.toJSON(e.data))}s.length>0&&(n[t]=s,r=!0)}r&&(e.data.morphAttributes=n,e.data.morphTargetsRelative=this.morphTargetsRelative);const s=this.groups;s.length>0&&(e.data.groups=JSON.parse(JSON.stringify(s)));const a=this.boundingSphere;return null!==a&&(e.data.boundingSphere={center:a.center.toArray(),radius:a.radius}),e}clone(){return(new this.constructor).copy(this)}copy(e){this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingBox=null,this.boundingSphere=null;const t={};this.name=e.name;const i=e.index;null!==i&&this.setIndex(i.clone(t));const n=e.attributes;for(const e in n){const i=n[e];this.setAttribute(e,i.clone(t))}const r=e.morphAttributes;for(const e in r){const i=[],n=r[e];for(let e=0,r=n.length;e<r;e++)i.push(n[e].clone(t));this.morphAttributes[e]=i}this.morphTargetsRelative=e.morphTargetsRelative;const s=e.groups;for(let e=0,t=s.length;e<t;e++){const t=s[e];this.addGroup(t.start,t.count,t.materialIndex)}const a=e.boundingBox;null!==a&&(this.boundingBox=a.clone());const o=e.boundingSphere;return null!==o&&(this.boundingSphere=o.clone()),this.drawRange.start=e.drawRange.start,this.drawRange.count=e.drawRange.count,this.userData=e.userData,void 0!==e.parameters&&(this.parameters=Object.assign({},e.parameters)),this}dispose(){this.dispatchEvent({type:"dispose"})}}kr.prototype.isBufferGeometry=!0;const Or=new Rn,zr=new In,Fr=new xn,Br=new Ki,Ur=new Ki,Vr=new Ki,Hr=new Ki,jr=new Ki,Gr=new Ki,Wr=new Ki,qr=new Ki,Xr=new Ki,Zr=new zi,Yr=new zi,Jr=new zi,Kr=new Ki,Qr=new Ki;class es extends tr{constructor(e=new kr,t=new wr){super(),this.type="Mesh",this.geometry=e,this.material=t,this.updateMorphTargets()}copy(e){return super.copy(e),void 0!==e.morphTargetInfluences&&(this.morphTargetInfluences=e.morphTargetInfluences.slice()),void 0!==e.morphTargetDictionary&&(this.morphTargetDictionary=Object.assign({},e.morphTargetDictionary)),this.material=e.material,this.geometry=e.geometry,this}updateMorphTargets(){const e=this.geometry;if(e.isBufferGeometry){const t=e.morphAttributes,i=Object.keys(t);if(i.length>0){const e=t[i[0]];if(void 0!==e){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let t=0,i=e.length;t<i;t++){const i=e[t].name||String(t);this.morphTargetInfluences.push(0),this.morphTargetDictionary[i]=t}}}}else{const t=e.morphTargets;void 0!==t&&t.length>0&&console.error("THREE.Mesh.updateMorphTargets() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.")}}raycast(e,t){const i=this.geometry,n=this.material,r=this.matrixWorld;if(void 0===n)return;if(null===i.boundingSphere&&i.computeBoundingSphere(),Fr.copy(i.boundingSphere),Fr.applyMatrix4(r),!1===e.ray.intersectsSphere(Fr))return;if(Or.copy(r).invert(),zr.copy(e.ray).applyMatrix4(Or),null!==i.boundingBox&&!1===zr.intersectsBox(i.boundingBox))return;let s;if(i.isBufferGeometry){const r=i.index,a=i.attributes.position,o=i.morphAttributes.position,h=i.morphTargetsRelative,c=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],m=n[p.materialIndex];for(let i=Math.max(p.start,d.start),n=Math.min(r.count,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=ts(this,m,e,zr,a,o,h,c,l,n,u,d),s&&(s.faceIndex=Math.floor(i/3),s.face.materialIndex=p.materialIndex,t.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=ts(this,n,e,zr,a,o,h,c,l,u,d,p),s&&(s.faceIndex=Math.floor(i/3),t.push(s))}}else if(void 0!==a)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(a.count,Math.min(r.start+r.count,d.start+d.count));i<n;i+=3){s=ts(this,p,e,zr,a,o,h,c,l,i,i+1,i+2),s&&(s.faceIndex=Math.floor(i/3),s.face.materialIndex=r.materialIndex,t.push(s))}}else{for(let i=Math.max(0,d.start),r=Math.min(a.count,d.start+d.count);i<r;i+=3){s=ts(this,n,e,zr,a,o,h,c,l,i,i+1,i+2),s&&(s.faceIndex=Math.floor(i/3),t.push(s))}}}else i.isGeometry&&console.error("THREE.Mesh.raycast() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.")}}function ts(e,t,i,n,r,s,a,o,h,c,l,u){Br.fromBufferAttribute(r,c),Ur.fromBufferAttribute(r,l),Vr.fromBufferAttribute(r,u);const d=e.morphTargetInfluences;if(s&&d){Wr.set(0,0,0),qr.set(0,0,0),Xr.set(0,0,0);for(let e=0,t=s.length;e<t;e++){const t=d[e],i=s[e];0!==t&&(Hr.fromBufferAttribute(i,c),jr.fromBufferAttribute(i,l),Gr.fromBufferAttribute(i,u),a?(Wr.addScaledVector(Hr,t),qr.addScaledVector(jr,t),Xr.addScaledVector(Gr,t)):(Wr.addScaledVector(Hr.sub(Br),t),qr.addScaledVector(jr.sub(Ur),t),Xr.addScaledVector(Gr.sub(Vr),t)))}Br.add(Wr),Ur.add(qr),Vr.add(Xr)}e.isSkinnedMesh&&(e.boneTransform(c,Br),e.boneTransform(l,Ur),e.boneTransform(u,Vr));const p=function(e,t,i,n,r,s,a,o){let h;if(h=1===t.side?n.intersectTriangle(a,s,r,!0,o):n.intersectTriangle(r,s,a,2!==t.side,o),null===h)return null;Qr.copy(o),Qr.applyMatrix4(e.matrixWorld);const c=i.ray.origin.distanceTo(Qr);return c<i.near||c>i.far?null:{distance:c,point:Qr.clone(),object:e}}(e,t,i,n,Br,Ur,Vr,Kr);if(p){o&&(Zr.fromBufferAttribute(o,c),Yr.fromBufferAttribute(o,l),Jr.fromBufferAttribute(o,u),p.uv=dr.getUV(Kr,Br,Ur,Vr,Zr,Yr,Jr,new zi)),h&&(Zr.fromBufferAttribute(h,c),Yr.fromBufferAttribute(h,l),Jr.fromBufferAttribute(h,u),p.uv2=dr.getUV(Kr,Br,Ur,Vr,Zr,Yr,Jr,new zi));const e={a:c,b:l,c:u,normal:new Ki,materialIndex:0};dr.getNormal(Br,Ur,Vr,e.normal),p.face=e}return p}es.prototype.isMesh=!0;class is extends kr{constructor(e=1,t=1,i=1,n=1,r=1,s=1){super(),this.type="BoxGeometry",this.parameters={width:e,height:t,depth:i,widthSegments:n,heightSegments:r,depthSegments:s};const a=this;n=Math.floor(n),r=Math.floor(r),s=Math.floor(s);const o=[],h=[],c=[],l=[];let u=0,d=0;function p(e,t,i,n,r,s,p,m,f,g,_){const v=s/f,y=p/g,b=s/2,x=p/2,w=m/2,M=f+1,S=g+1;let T=0,C=0;const E=new Ki;for(let s=0;s<S;s++){const a=s*y-x;for(let o=0;o<M;o++){const u=o*v-b;E[e]=u*n,E[t]=a*r,E[i]=w,h.push(E.x,E.y,E.z),E[e]=0,E[t]=0,E[i]=m>0?1:-1,c.push(E.x,E.y,E.z),l.push(o/f),l.push(1-s/g),T+=1}}for(let e=0;e<g;e++)for(let t=0;t<f;t++){const i=u+t+M*e,n=u+t+M*(e+1),r=u+(t+1)+M*(e+1),s=u+(t+1)+M*e;o.push(i,n,s),o.push(n,r,s),C+=6}a.addGroup(d,C,_),d+=C,u+=T}p("z","y","x",-1,-1,i,t,e,s,r,0),p("z","y","x",1,-1,i,t,-e,s,r,1),p("x","z","y",1,1,e,i,t,n,s,2),p("x","z","y",1,-1,e,i,-t,n,s,3),p("x","y","z",1,-1,e,t,i,n,r,4),p("x","y","z",-1,-1,e,t,-i,n,r,5),this.setIndex(o),this.setAttribute("position",new Ar(h,3)),this.setAttribute("normal",new Ar(c,3)),this.setAttribute("uv",new Ar(l,2))}static fromJSON(e){return new is(e.width,e.height,e.depth,e.widthSegments,e.heightSegments,e.depthSegments)}}function ns(e){const t={};for(const i in e){t[i]={};for(const n in e[i]){const r=e[i][n];r&&(r.isColor||r.isMatrix3||r.isMatrix4||r.isVector2||r.isVector3||r.isVector4||r.isTexture||r.isQuaternion)?t[i][n]=r.clone():Array.isArray(r)?t[i][n]=r.slice():t[i][n]=r}}return t}function rs(e){const t={};for(let i=0;i<e.length;i++){const n=ns(e[i]);for(const e in n)t[e]=n[e]}return t}const ss={clone:ns,merge:rs};class as extends mr{constructor(e){super(),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.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!==e&&(void 0!==e.attributes&&console.error("THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead."),this.setValues(e))}copy(e){return super.copy(e),this.fragmentShader=e.fragmentShader,this.vertexShader=e.vertexShader,this.uniforms=ns(e.uniforms),this.defines=Object.assign({},e.defines),this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.lights=e.lights,this.clipping=e.clipping,this.extensions=Object.assign({},e.extensions),this.glslVersion=e.glslVersion,this}toJSON(e){const t=super.toJSON(e);t.glslVersion=this.glslVersion,t.uniforms={};for(const i in this.uniforms){const n=this.uniforms[i].value;n&&n.isTexture?t.uniforms[i]={type:"t",value:n.toJSON(e).uuid}:n&&n.isColor?t.uniforms[i]={type:"c",value:n.getHex()}:n&&n.isVector2?t.uniforms[i]={type:"v2",value:n.toArray()}:n&&n.isVector3?t.uniforms[i]={type:"v3",value:n.toArray()}:n&&n.isVector4?t.uniforms[i]={type:"v4",value:n.toArray()}:n&&n.isMatrix3?t.uniforms[i]={type:"m3",value:n.toArray()}:n&&n.isMatrix4?t.uniforms[i]={type:"m4",value:n.toArray()}:t.uniforms[i]={value:n}}Object.keys(this.defines).length>0&&(t.defines=this.defines),t.vertexShader=this.vertexShader,t.fragmentShader=this.fragmentShader;const i={};for(const e in this.extensions)!0===this.extensions[e]&&(i[e]=!0);return Object.keys(i).length>0&&(t.extensions=i),t}}as.prototype.isShaderMaterial=!0;class os extends tr{constructor(){super(),this.type="Camera",this.matrixWorldInverse=new Rn,this.projectionMatrix=new Rn,this.projectionMatrixInverse=new Rn}copy(e,t){return super.copy(e,t),this.matrixWorldInverse.copy(e.matrixWorldInverse),this.projectionMatrix.copy(e.projectionMatrix),this.projectionMatrixInverse.copy(e.projectionMatrixInverse),this}getWorldDirection(e){this.updateWorldMatrix(!0,!1);const t=this.matrixWorld.elements;return e.set(-t[8],-t[9],-t[10]).normalize()}updateMatrixWorld(e){super.updateMatrixWorld(e),this.matrixWorldInverse.copy(this.matrixWorld).invert()}updateWorldMatrix(e,t){super.updateWorldMatrix(e,t),this.matrixWorldInverse.copy(this.matrixWorld).invert()}clone(){return(new this.constructor).copy(this)}}os.prototype.isCamera=!0;class hs extends os{constructor(e=50,t=1,i=.1,n=2e3){super(),this.type="PerspectiveCamera",this.fov=e,this.zoom=1,this.near=i,this.far=n,this.focus=10,this.aspect=t,this.view=null,this.filmGauge=35,this.filmOffset=0,this.updateProjectionMatrix()}copy(e,t){return super.copy(e,t),this.fov=e.fov,this.zoom=e.zoom,this.near=e.near,this.far=e.far,this.focus=e.focus,this.aspect=e.aspect,this.view=null===e.view?null:Object.assign({},e.view),this.filmGauge=e.filmGauge,this.filmOffset=e.filmOffset,this}setFocalLength(e){const t=.5*this.getFilmHeight()/e;this.fov=2*Ai*Math.atan(t),this.updateProjectionMatrix()}getFocalLength(){const e=Math.tan(.5*Ei*this.fov);return.5*this.getFilmHeight()/e}getEffectiveFOV(){return 2*Ai*Math.atan(Math.tan(.5*Ei*this.fov)/this.zoom)}getFilmWidth(){return this.filmGauge*Math.min(this.aspect,1)}getFilmHeight(){return this.filmGauge/Math.max(this.aspect,1)}setViewOffset(e,t,i,n,r,s){this.aspect=e/t,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=e,this.view.fullHeight=t,this.view.offsetX=i,this.view.offsetY=n,this.view.width=r,this.view.height=s,this.updateProjectionMatrix()}clearViewOffset(){null!==this.view&&(this.view.enabled=!1),this.updateProjectionMatrix()}updateProjectionMatrix(){const e=this.near;let t=e*Math.tan(.5*Ei*this.fov)/this.zoom,i=2*t,n=this.aspect*i,r=-.5*n;const s=this.view;if(null!==this.view&&this.view.enabled){const e=s.fullWidth,a=s.fullHeight;r+=s.offsetX*n/e,t-=s.offsetY*i/a,n*=s.width/e,i*=s.height/a}const a=this.filmOffset;0!==a&&(r+=e*a/this.getFilmWidth()),this.projectionMatrix.makePerspective(r,r+n,t,t-i,e,this.far),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()}toJSON(e){const t=super.toJSON(e);return t.object.fov=this.fov,t.object.zoom=this.zoom,t.object.near=this.near,t.object.far=this.far,t.object.focus=this.focus,t.object.aspect=this.aspect,null!==this.view&&(t.object.view=Object.assign({},this.view)),t.object.filmGauge=this.filmGauge,t.object.filmOffset=this.filmOffset,t}}hs.prototype.isPerspectiveCamera=!0;const cs=90;class ls extends tr{constructor(e,t,i){if(super(),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 hs(cs,1,e,t);n.layers=this.layers,n.up.set(0,-1,0),n.lookAt(new Ki(1,0,0)),this.add(n);const r=new hs(cs,1,e,t);r.layers=this.layers,r.up.set(0,-1,0),r.lookAt(new Ki(-1,0,0)),this.add(r);const s=new hs(cs,1,e,t);s.layers=this.layers,s.up.set(0,0,1),s.lookAt(new Ki(0,1,0)),this.add(s);const a=new hs(cs,1,e,t);a.layers=this.layers,a.up.set(0,0,-1),a.lookAt(new Ki(0,-1,0)),this.add(a);const o=new hs(cs,1,e,t);o.layers=this.layers,o.up.set(0,-1,0),o.lookAt(new Ki(0,0,1)),this.add(o);const h=new hs(cs,1,e,t);h.layers=this.layers,h.up.set(0,-1,0),h.lookAt(new Ki(0,0,-1)),this.add(h)}update(e,t){null===this.parent&&this.updateMatrixWorld();const i=this.renderTarget,[n,r,s,a,o,h]=this.children,c=e.xr.enabled,l=e.getRenderTarget();e.xr.enabled=!1;const u=i.texture.generateMipmaps;i.texture.generateMipmaps=!1,e.setRenderTarget(i,0),e.render(t,n),e.setRenderTarget(i,1),e.render(t,r),e.setRenderTarget(i,2),e.render(t,s),e.setRenderTarget(i,3),e.render(t,a),e.setRenderTarget(i,4),e.render(t,o),i.texture.generateMipmaps=u,e.setRenderTarget(i,5),e.render(t,h),e.setRenderTarget(l),e.xr.enabled=c}}class us extends Wi{constructor(e,t,i,n,r,s,a,o,h,c){super(e=void 0!==e?e:[],t=void 0!==t?t:Gt,i,n,r,s,a,o,h,c),this.flipY=!1}get images(){return this.image}set images(e){this.image=e}}us.prototype.isCubeTexture=!0;class ds extends Zi{constructor(e,t,i){Number.isInteger(t)&&(console.warn("THREE.WebGLCubeRenderTarget: constructor signature is now WebGLCubeRenderTarget( size, options )"),t=i),super(e,e,t),t=t||{},this.texture=new us(void 0,t.mapping,t.wrapS,t.wrapT,t.magFilter,t.minFilter,t.format,t.type,t.anisotropy,t.encoding),this.texture.isRenderTargetTexture=!0,this.texture.generateMipmaps=void 0!==t.generateMipmaps&&t.generateMipmaps,this.texture.minFilter=void 0!==t.minFilter?t.minFilter:Kt,this.texture._needsFlipEnvMap=!1}fromEquirectangularTexture(e,t){this.texture.type=t.type,this.texture.format=oi,this.texture.encoding=t.encoding,this.texture.generateMipmaps=t.generateMipmaps,this.texture.minFilter=t.minFilter,this.texture.magFilter=t.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 is(5,5,5),r=new as({name:"CubemapFromEquirect",uniforms:ns(i.uniforms),vertexShader:i.vertexShader,fragmentShader:i.fragmentShader,side:1,blending:0});r.uniforms.tEquirect.value=t;const s=new es(n,r),a=t.minFilter;t.minFilter===Qt&&(t.minFilter=Kt);return new ls(1,10,this).update(e,s),t.minFilter=a,s.geometry.dispose(),s.material.dispose(),this}clear(e,t,i,n){const r=e.getRenderTarget();for(let r=0;r<6;r++)e.setRenderTarget(this,r),e.clear(t,i,n);e.setRenderTarget(r)}}ds.prototype.isWebGLCubeRenderTarget=!0;const ps=new Ki,ms=new Ki,fs=new Fi;class gs{constructor(e=new Ki(1,0,0),t=0){this.normal=e,this.constant=t}set(e,t){return this.normal.copy(e),this.constant=t,this}setComponents(e,t,i,n){return this.normal.set(e,t,i),this.constant=n,this}setFromNormalAndCoplanarPoint(e,t){return this.normal.copy(e),this.constant=-t.dot(this.normal),this}setFromCoplanarPoints(e,t,i){const n=ps.subVectors(i,t).cross(ms.subVectors(e,t)).normalize();return this.setFromNormalAndCoplanarPoint(n,e),this}copy(e){return this.normal.copy(e.normal),this.constant=e.constant,this}normalize(){const e=1/this.normal.length();return this.normal.multiplyScalar(e),this.constant*=e,this}negate(){return this.constant*=-1,this.normal.negate(),this}distanceToPoint(e){return this.normal.dot(e)+this.constant}distanceToSphere(e){return this.distanceToPoint(e.center)-e.radius}projectPoint(e,t){return t.copy(this.normal).multiplyScalar(-this.distanceToPoint(e)).add(e)}intersectLine(e,t){const i=e.delta(ps),n=this.normal.dot(i);if(0===n)return 0===this.distanceToPoint(e.start)?t.copy(e.start):null;const r=-(e.start.dot(this.normal)+this.constant)/n;return r<0||r>1?null:t.copy(i).multiplyScalar(r).add(e.start)}intersectsLine(e){const t=this.distanceToPoint(e.start),i=this.distanceToPoint(e.end);return t<0&&i>0||i<0&&t>0}intersectsBox(e){return e.intersectsPlane(this)}intersectsSphere(e){return e.intersectsPlane(this)}coplanarPoint(e){return e.copy(this.normal).multiplyScalar(-this.constant)}applyMatrix4(e,t){const i=t||fs.getNormalMatrix(e),n=this.coplanarPoint(ps).applyMatrix4(e),r=this.normal.applyMatrix3(i).normalize();return this.constant=-n.dot(r),this}translate(e){return this.constant-=e.dot(this.normal),this}equals(e){return e.normal.equals(this.normal)&&e.constant===this.constant}clone(){return(new this.constructor).copy(this)}}gs.prototype.isPlane=!0;const _s=new xn,vs=new Ki;class ys{constructor(e=new gs,t=new gs,i=new gs,n=new gs,r=new gs,s=new gs){this.planes=[e,t,i,n,r,s]}set(e,t,i,n,r,s){const a=this.planes;return a[0].copy(e),a[1].copy(t),a[2].copy(i),a[3].copy(n),a[4].copy(r),a[5].copy(s),this}copy(e){const t=this.planes;for(let i=0;i<6;i++)t[i].copy(e.planes[i]);return this}setFromProjectionMatrix(e){const t=this.planes,i=e.elements,n=i[0],r=i[1],s=i[2],a=i[3],o=i[4],h=i[5],c=i[6],l=i[7],u=i[8],d=i[9],p=i[10],m=i[11],f=i[12],g=i[13],_=i[14],v=i[15];return t[0].setComponents(a-n,l-o,m-u,v-f).normalize(),t[1].setComponents(a+n,l+o,m+u,v+f).normalize(),t[2].setComponents(a+r,l+h,m+d,v+g).normalize(),t[3].setComponents(a-r,l-h,m-d,v-g).normalize(),t[4].setComponents(a-s,l-c,m-p,v-_).normalize(),t[5].setComponents(a+s,l+c,m+p,v+_).normalize(),this}intersectsObject(e){const t=e.geometry;return null===t.boundingSphere&&t.computeBoundingSphere(),_s.copy(t.boundingSphere).applyMatrix4(e.matrixWorld),this.intersectsSphere(_s)}intersectsSprite(e){return _s.center.set(0,0,0),_s.radius=.7071067811865476,_s.applyMatrix4(e.matrixWorld),this.intersectsSphere(_s)}intersectsSphere(e){const t=this.planes,i=e.center,n=-e.radius;for(let e=0;e<6;e++){if(t[e].distanceToPoint(i)<n)return!1}return!0}intersectsBox(e){const t=this.planes;for(let i=0;i<6;i++){const n=t[i];if(vs.x=n.normal.x>0?e.max.x:e.min.x,vs.y=n.normal.y>0?e.max.y:e.min.y,vs.z=n.normal.z>0?e.max.z:e.min.z,n.distanceToPoint(vs)<0)return!1}return!0}containsPoint(e){const t=this.planes;for(let i=0;i<6;i++)if(t[i].distanceToPoint(e)<0)return!1;return!0}clone(){return(new this.constructor).copy(this)}}function bs(){let e=null,t=!1,i=null,n=null;function r(t,s){i(t,s),n=e.requestAnimationFrame(r)}return{start:function(){!0!==t&&null!==i&&(n=e.requestAnimationFrame(r),t=!0)},stop:function(){e.cancelAnimationFrame(n),t=!1},setAnimationLoop:function(e){i=e},setContext:function(t){e=t}}}function xs(e,t){const i=t.isWebGL2,n=new WeakMap;return{get:function(e){return e.isInterleavedBufferAttribute&&(e=e.data),n.get(e)},remove:function(t){t.isInterleavedBufferAttribute&&(t=t.data);const i=n.get(t);i&&(e.deleteBuffer(i.buffer),n.delete(t))},update:function(t,r){if(t.isGLBufferAttribute){const e=n.get(t);return void((!e||e.version<t.version)&&n.set(t,{buffer:t.buffer,type:t.type,bytesPerElement:t.elementSize,version:t.version}))}t.isInterleavedBufferAttribute&&(t=t.data);const s=n.get(t);void 0===s?n.set(t,function(t,n){const r=t.array,s=t.usage,a=e.createBuffer();e.bindBuffer(n,a),e.bufferData(n,r,s),t.onUploadCallback();let o=5126;return r instanceof Float32Array?o=5126:r instanceof Float64Array?console.warn("THREE.WebGLAttributes: Unsupported data buffer format: Float64Array."):r instanceof Uint16Array?t.isFloat16BufferAttribute?i?o=5131:console.warn("THREE.WebGLAttributes: Usage of Float16BufferAttribute requires WebGL2."):o=5123:r instanceof Int16Array?o=5122:r instanceof Uint32Array?o=5125:r instanceof Int32Array?o=5124:r instanceof Int8Array?o=5120:(r instanceof Uint8Array||r instanceof Uint8ClampedArray)&&(o=5121),{buffer:a,type:o,bytesPerElement:r.BYTES_PER_ELEMENT,version:t.version}}(t,r)):s.version<t.version&&(!function(t,n,r){const s=n.array,a=n.updateRange;e.bindBuffer(r,t),-1===a.count?e.bufferSubData(r,0,s):(i?e.bufferSubData(r,a.offset*s.BYTES_PER_ELEMENT,s,a.offset,a.count):e.bufferSubData(r,a.offset*s.BYTES_PER_ELEMENT,s.subarray(a.offset,a.offset+a.count)),a.count=-1)}(s.buffer,t,r),s.version=t.version)}}}class ws extends kr{constructor(e=1,t=1,i=1,n=1){super(),this.type="PlaneGeometry",this.parameters={width:e,height:t,widthSegments:i,heightSegments:n};const r=e/2,s=t/2,a=Math.floor(i),o=Math.floor(n),h=a+1,c=o+1,l=e/a,u=t/o,d=[],p=[],m=[],f=[];for(let e=0;e<c;e++){const t=e*u-s;for(let i=0;i<h;i++){const n=i*l-r;p.push(n,-t,0),m.push(0,0,1),f.push(i/a),f.push(1-e/o)}}for(let e=0;e<o;e++)for(let t=0;t<a;t++){const i=t+h*e,n=t+h*(e+1),r=t+1+h*(e+1),s=t+1+h*e;d.push(i,n,s),d.push(n,r,s)}this.setIndex(d),this.setAttribute("position",new Ar(p,3)),this.setAttribute("normal",new Ar(m,3)),this.setAttribute("uv",new Ar(f,2))}static fromJSON(e){return new ws(e.width,e.height,e.widthSegments,e.heightSegments)}}const Ms={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 USE_ALPHATEST\n\tif ( diffuseColor.a < alphaTest ) discard;\n#endif",alphatest_pars_fragment:"#ifdef USE_ALPHATEST\n\tuniform float alphaTest;\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.roughness );\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:"vec3 BRDF_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 f0, const in float f90, const in float dotVH ) {\n\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\n\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\n}\nfloat V_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_GGX( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in vec3 f0, const in float f90, const in float roughness ) {\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\tvec3 F = F_Schlick( f0, f90, dotVH );\n\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\tfloat D = D_GGX( alpha, dotNH );\n\treturn F * ( V * 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}\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_BlinnPhong( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float shininess ) {\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, 1.0, dotVH );\n\tfloat G = G_BlinnPhong_Implicit( );\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\treturn F * ( G * D );\n}\n#if defined( USE_SHEEN )\nfloat D_Charlie( float roughness, float dotNH ) {\n\tfloat alpha = pow2( roughness );\n\tfloat invAlpha = 1.0 / alpha;\n\tfloat cos2h = dotNH * dotNH;\n\tfloat sin2h = max( 1.0 - cos2h, 0.0078125 );\n\treturn ( 2.0 + invAlpha ) * pow( sin2h, invAlpha * 0.5 ) / ( 2.0 * PI );\n}\nfloat V_Neubelt( float dotNV, float dotNL ) {\n\treturn saturate( 1.0 / ( 4.0 * ( dotNL + dotNV - dotNL * dotNV ) ) );\n}\nvec3 BRDF_Sheen( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, vec3 sheenColor, const in float sheenRoughness ) {\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat D = D_Charlie( sheenRoughness, dotNH );\n\tfloat V = V_Neubelt( dotNV, dotNL );\n\treturn sheenColor * ( D * V );\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, float faceDirection ) {\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 ) * faceDirection;\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:"#if defined( USE_COLOR_ALPHA )\n\tdiffuseColor *= vColor;\n#elif defined( USE_COLOR )\n\tdiffuseColor.rgb *= vColor;\n#endif",color_pars_fragment:"#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#elif defined( USE_COLOR )\n\tvarying vec3 vColor;\n#endif",color_pars_vertex:"#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\n\tvarying vec3 vColor;\n#endif",color_vertex:"#if defined( USE_COLOR_ALPHA )\n\tvColor = vec4( 1.0 );\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\n\tvColor = vec3( 1.0 );\n#endif\n#ifdef USE_COLOR\n\tvColor *= color;\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 max3( const in vec3 v ) { return max( max( v.x, v.y ), v.z ); }\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 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 USE_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}\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\tenvColor = envMapTexelToLinear( envColor );\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#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 getIBLIrradiance( const in vec3 normal ) {\n\t\t#if defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, worldNormal, 1.0 );\n\t\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t\t#else\n\t\t\treturn vec3( 0.0 );\n\t\t#endif\n\t}\n\tvec3 getIBLRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness ) {\n\t\t#if defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 reflectVec;\n\t\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\t\treflectVec = reflect( - viewDir, normal );\n\t\t\t\treflectVec = normalize( mix( reflectVec, normal, roughness * roughness) );\n\t\t\t#else\n\t\t\t\treflectVec = refract( - viewDir, normal, refractionRatio );\n\t\t\t#endif\n\t\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, reflectVec, roughness );\n\t\t\treturn envMapColor.rgb * envMapIntensity;\n\t\t#else\n\t\t\treturn vec3( 0.0 );\n\t\t#endif\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\tvFogDepth = - mvPosition.z;\n#endif",fog_pars_vertex:"#ifdef USE_FOG\n\tvarying float vFogDepth;\n#endif",fog_fragment:"#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * vFogDepth * vFogDepth );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, vFogDepth );\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 vFogDepth;\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\tvec3 lightMapIrradiance = lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tlightMapIrradiance *= PI;\n\t#endif\n\treflectedLight.indirectDiffuse += lightMapIrradiance;\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.normal );\n#ifdef DOUBLE_SIDED\n\tvIndirectBack += getAmbientLightIrradiance( ambientLightColor );\n\tvIndirectBack += getLightProbeIrradiance( lightProbe, backGeometry.normal );\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\tgetPointLightInfo( pointLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = 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\tgetSpotLightInfo( spotLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = 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\tgetDirectionalLightInfo( directionalLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = 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.normal );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvIndirectBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry.normal );\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 vec3 normal ) {\n\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\n\treturn irradiance;\n}\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\treturn irradiance;\n}\nfloat getDistanceAttenuation( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n\t#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\t\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\t\tif ( cutoffDistance > 0.0 ) {\n\t\t\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t\t}\n\t\treturn distanceFalloff;\n\t#else\n\t\tif ( cutoffDistance > 0.0 && decayExponent > 0.0 ) {\n\t\t\treturn pow( saturate( - lightDistance / cutoffDistance + 1.0 ), decayExponent );\n\t\t}\n\t\treturn 1.0;\n\t#endif\n}\nfloat getSpotAttenuation( const in float coneCosine, const in float penumbraCosine, const in float angleCosine ) {\n\treturn smoothstep( coneCosine, penumbraCosine, angleCosine );\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 getDirectionalLightInfo( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight light ) {\n\t\tlight.color = directionalLight.color;\n\t\tlight.direction = directionalLight.direction;\n\t\tlight.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 getPointLightInfo( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight light ) {\n\t\tvec3 lVector = pointLight.position - geometry.position;\n\t\tlight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tlight.color = pointLight.color;\n\t\tlight.color *= getDistanceAttenuation( lightDistance, pointLight.distance, pointLight.decay );\n\t\tlight.visible = ( light.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 getSpotLightInfo( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight light ) {\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\t\tlight.direction = normalize( lVector );\n\t\tfloat angleCos = dot( light.direction, spotLight.direction );\n\t\tfloat spotAttenuation = getSpotAttenuation( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\tif ( spotAttenuation > 0.0 ) {\n\t\t\tfloat lightDistance = length( lVector );\n\t\t\tlight.color = spotLight.color * spotAttenuation;\n\t\t\tlight.color *= getDistanceAttenuation( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tlight.visible = ( light.color != vec3( 0.0 ) );\n\t\t} else {\n\t\t\tlight.color = vec3( 0.0 );\n\t\t\tlight.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 vec3 normal ) {\n\t\tfloat dotNL = dot( normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\treturn irradiance;\n\t}\n#endif",lights_toon_fragment:"ToonMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;",lights_toon_pars_fragment:"varying vec3 vViewPosition;\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\treflectedLight.directDiffuse += irradiance * BRDF_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_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;\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\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_BlinnPhong( directLight.direction, geometry.viewDir, geometry.normal, 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_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.roughness = max( roughnessFactor, 0.0525 );material.roughness += geometryRoughness;\nmaterial.roughness = min( material.roughness, 1.0 );\n#ifdef IOR\n\t#ifdef SPECULAR\n\t\tfloat specularIntensityFactor = specularIntensity;\n\t\tvec3 specularColorFactor = specularColor;\n\t\t#ifdef USE_SPECULARINTENSITYMAP\n\t\t\tspecularIntensityFactor *= texture2D( specularIntensityMap, vUv ).a;\n\t\t#endif\n\t\t#ifdef USE_SPECULARCOLORMAP\n\t\t\tspecularColorFactor *= specularColorMapTexelToLinear( texture2D( specularColorMap, vUv ) ).rgb;\n\t\t#endif\n\t\tmaterial.specularF90 = mix( specularIntensityFactor, 1.0, metalnessFactor );\n\t#else\n\t\tfloat specularIntensityFactor = 1.0;\n\t\tvec3 specularColorFactor = vec3( 1.0 );\n\t\tmaterial.specularF90 = 1.0;\n\t#endif\n\tmaterial.specularColor = mix( min( pow2( ( ior - 1.0 ) / ( ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor, diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( 0.04 ), diffuseColor.rgb, metalnessFactor );\n\tmaterial.specularF90 = 1.0;\n#endif\n#ifdef USE_CLEARCOAT\n\tmaterial.clearcoat = clearcoat;\n\tmaterial.clearcoatRoughness = clearcoatRoughness;\n\tmaterial.clearcoatF0 = vec3( 0.04 );\n\tmaterial.clearcoatF90 = 1.0;\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 = sheenColor;\n\t#ifdef USE_SHEENCOLORMAP\n\t\tmaterial.sheenColor *= sheenColorMapTexelToLinear( texture2D( sheenColorMap, vUv ) ).rgb;\n\t#endif\n\tmaterial.sheenRoughness = clamp( sheenRoughness, 0.07, 1.0 );\n\t#ifdef USE_SHEENROUGHNESSMAP\n\t\tmaterial.sheenRoughness *= texture2D( sheenRoughnessMap, vUv ).a;\n\t#endif\n#endif",lights_physical_pars_fragment:"struct PhysicalMaterial {\n\tvec3 diffuseColor;\n\tfloat roughness;\n\tvec3 specularColor;\n\tfloat specularF90;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat clearcoat;\n\t\tfloat clearcoatRoughness;\n\t\tvec3 clearcoatF0;\n\t\tfloat clearcoatF90;\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tvec3 sheenColor;\n\t\tfloat sheenRoughness;\n\t#endif\n};\nvec3 clearcoatSpecular = vec3( 0.0 );\nvec2 DFGApprox( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\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\tvec2 fab = vec2( - 1.04, 1.04 ) * a004 + r.zw;\n\treturn fab;\n}\nvec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) {\n\tvec2 fab = DFGApprox( normal, viewDir, roughness );\n\treturn specularColor * fab.x + specularF90 * fab.y;\n}\nvoid computeMultiscattering( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n\tvec2 fab = DFGApprox( normal, viewDir, roughness );\n\tvec3 FssEss = specularColor * fab.x + specularF90 * fab.y;\n\tfloat Ess = fab.x + fab.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}\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.roughness;\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#ifdef USE_CLEARCOAT\n\t\tfloat dotNLcc = saturate( dot( geometry.clearcoatNormal, directLight.direction ) );\n\t\tvec3 ccIrradiance = dotNLcc * directLight.color;\n\t\tclearcoatSpecular += ccIrradiance * BRDF_GGX( directLight.direction, geometry.viewDir, geometry.clearcoatNormal, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\n\t#endif\n\t#ifdef USE_SHEEN\n\t\treflectedLight.directSpecular += irradiance * BRDF_Sheen( directLight.direction, geometry.viewDir, geometry.normal, material.sheenColor, material.sheenRoughness );\n\t#endif\n\treflectedLight.directSpecular += irradiance * BRDF_GGX( directLight.direction, geometry.viewDir, geometry.normal, material.specularColor, material.specularF90, material.roughness );\n\treflectedLight.directDiffuse += irradiance * BRDF_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_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 USE_CLEARCOAT\n\t\tclearcoatSpecular += clearcoatRadiance * EnvironmentBRDF( geometry.clearcoatNormal, geometry.viewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\n\t#endif\n\tvec3 singleScattering = vec3( 0.0 );\n\tvec3 multiScattering = vec3( 0.0 );\n\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n\tcomputeMultiscattering( geometry.normal, geometry.viewDir, material.specularColor, material.specularF90, material.roughness, singleScattering, multiScattering );\n\tvec3 diffuse = material.diffuseColor * ( 1.0 - ( singleScattering + multiScattering ) );\n\treflectedLight.indirectSpecular += 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 USE_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\tgetPointLightInfo( 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\tgetSpotLightInfo( 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\tgetDirectionalLightInfo( 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.normal );\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.normal );\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 += getIBLIrradiance( geometry.normal );\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tradiance += getIBLRadiance( geometry.viewDir, geometry.normal, material.roughness );\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatRadiance += getIBLRadiance( geometry.viewDir, geometry.clearcoatNormal, material.clearcoatRoughness );\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\t#ifdef MORPHTARGETS_TEXTURE\n\t\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\t\tif ( morphTargetInfluences[ i ] > 0.0 ) objectNormal += getMorph( gl_VertexID, i, 1, 2 ) * morphTargetInfluences[ i ];\n\t\t}\n\t#else\n\t\tobjectNormal += morphNormal0 * morphTargetInfluences[ 0 ];\n\t\tobjectNormal += morphNormal1 * morphTargetInfluences[ 1 ];\n\t\tobjectNormal += morphNormal2 * morphTargetInfluences[ 2 ];\n\t\tobjectNormal += morphNormal3 * morphTargetInfluences[ 3 ];\n\t#endif\n#endif",morphtarget_pars_vertex:"#ifdef USE_MORPHTARGETS\n\tuniform float morphTargetBaseInfluence;\n\t#ifdef MORPHTARGETS_TEXTURE\n\t\tuniform float morphTargetInfluences[ MORPHTARGETS_COUNT ];\n\t\tuniform sampler2DArray morphTargetsTexture;\n\t\tuniform vec2 morphTargetsTextureSize;\n\t\tvec3 getMorph( const in int vertexIndex, const in int morphTargetIndex, const in int offset, const in int stride ) {\n\t\t\tfloat texelIndex = float( vertexIndex * stride + offset );\n\t\t\tfloat y = floor( texelIndex / morphTargetsTextureSize.x );\n\t\t\tfloat x = texelIndex - y * morphTargetsTextureSize.x;\n\t\t\tvec3 morphUV = vec3( ( x + 0.5 ) / morphTargetsTextureSize.x, y / morphTargetsTextureSize.y, morphTargetIndex );\n\t\t\treturn texture( morphTargetsTexture, morphUV ).xyz;\n\t\t}\n\t#else\n\t\t#ifndef USE_MORPHNORMALS\n\t\t\tuniform float morphTargetInfluences[ 8 ];\n\t\t#else\n\t\t\tuniform float morphTargetInfluences[ 4 ];\n\t\t#endif\n\t#endif\n#endif",morphtarget_vertex:"#ifdef USE_MORPHTARGETS\n\ttransformed *= morphTargetBaseInfluence;\n\t#ifdef MORPHTARGETS_TEXTURE\n\t\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\t\t#ifndef USE_MORPHNORMALS\n\t\t\t\tif ( morphTargetInfluences[ i ] > 0.0 ) transformed += getMorph( gl_VertexID, i, 0, 1 ) * morphTargetInfluences[ i ];\n\t\t\t#else\n\t\t\t\tif ( morphTargetInfluences[ i ] > 0.0 ) transformed += getMorph( gl_VertexID, i, 0, 2 ) * morphTargetInfluences[ i ];\n\t\t\t#endif\n\t\t}\n\t#else\n\t\ttransformed += morphTarget0 * morphTargetInfluences[ 0 ];\n\t\ttransformed += morphTarget1 * morphTargetInfluences[ 1 ];\n\t\ttransformed += morphTarget2 * morphTargetInfluences[ 2 ];\n\t\ttransformed += morphTarget3 * morphTargetInfluences[ 3 ];\n\t\t#ifndef USE_MORPHNORMALS\n\t\t\ttransformed += morphTarget4 * morphTargetInfluences[ 4 ];\n\t\t\ttransformed += morphTarget5 * morphTargetInfluences[ 5 ];\n\t\t\ttransformed += morphTarget6 * morphTargetInfluences[ 6 ];\n\t\t\ttransformed += morphTarget7 * morphTargetInfluences[ 7 ];\n\t\t#endif\n\t#endif\n#endif",normal_fragment_begin:"float faceDirection = gl_FrontFacing ? 1.0 : - 1.0;\n#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 * faceDirection;\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 * faceDirection;\n\t\t\tbitangent = bitangent * faceDirection;\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 * faceDirection;\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, faceDirection );\n\t#endif\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd(), faceDirection );\n#endif",normal_pars_fragment:"#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",normal_pars_vertex:"#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",normal_vertex:"#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",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, float faceDirection ) {\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\tvec3 N = surf_norm;\n\t\tvec3 q1perp = cross( q1, N );\n\t\tvec3 q0perp = cross( N, q0 );\n\t\tvec3 T = q1perp * st0.x + q0perp * st1.x;\n\t\tvec3 B = q1perp * st0.y + q0perp * st1.y;\n\t\tfloat det = max( dot( T, T ), dot( B, B ) );\n\t\tfloat scale = ( det == 0.0 ) ? 0.0 : faceDirection * inversesqrt( det );\n\t\treturn normalize( T * ( mapN.x * scale ) + B * ( mapN.y * scale ) + N * mapN.z );\n\t}\n#endif",clearcoat_normal_fragment_begin:"#ifdef USE_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, faceDirection );\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",output_fragment:"#ifdef OPAQUE\ndiffuseColor.a = 1.0;\n#endif\n#ifdef USE_TRANSMISSION\ndiffuseColor.a *= transmissionAlpha + 0.1;\n#endif\ngl_FragColor = vec4( outgoingLight, diffuseColor.a );",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; }",transmission_fragment:"#ifdef USE_TRANSMISSION\n\tfloat transmissionAlpha = 1.0;\n\tfloat transmissionFactor = transmission;\n\tfloat thicknessFactor = thickness;\n\t#ifdef USE_TRANSMISSIONMAP\n\t\ttransmissionFactor *= texture2D( transmissionMap, vUv ).r;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tthicknessFactor *= texture2D( thicknessMap, vUv ).g;\n\t#endif\n\tvec3 pos = vWorldPosition;\n\tvec3 v = normalize( cameraPosition - pos );\n\tvec3 n = inverseTransformDirection( normal, viewMatrix );\n\tvec4 transmission = getIBLVolumeRefraction(\n\t\tn, v, roughnessFactor, material.diffuseColor, material.specularColor, material.specularF90,\n\t\tpos, modelMatrix, viewMatrix, projectionMatrix, ior, thicknessFactor,\n\t\tattenuationColor, attenuationDistance );\n\ttotalDiffuse = mix( totalDiffuse, transmission.rgb, transmissionFactor );\n\ttransmissionAlpha = mix( transmissionAlpha, transmission.a, transmissionFactor );\n#endif",transmission_pars_fragment:"#ifdef USE_TRANSMISSION\n\tuniform float transmission;\n\tuniform float thickness;\n\tuniform float attenuationDistance;\n\tuniform vec3 attenuationColor;\n\t#ifdef USE_TRANSMISSIONMAP\n\t\tuniform sampler2D transmissionMap;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tuniform sampler2D thicknessMap;\n\t#endif\n\tuniform vec2 transmissionSamplerSize;\n\tuniform sampler2D transmissionSamplerMap;\n\tuniform mat4 modelMatrix;\n\tuniform mat4 projectionMatrix;\n\tvarying vec3 vWorldPosition;\n\tvec3 getVolumeTransmissionRay( vec3 n, vec3 v, float thickness, float ior, mat4 modelMatrix ) {\n\t\tvec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior );\n\t\tvec3 modelScale;\n\t\tmodelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) );\n\t\tmodelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) );\n\t\tmodelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) );\n\t\treturn normalize( refractionVector ) * thickness * modelScale;\n\t}\n\tfloat applyIorToRoughness( float roughness, float ior ) {\n\t\treturn roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 );\n\t}\n\tvec4 getTransmissionSample( vec2 fragCoord, float roughness, float ior ) {\n\t\tfloat framebufferLod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );\n\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\treturn texture2DLodEXT( transmissionSamplerMap, fragCoord.xy, framebufferLod );\n\t\t#else\n\t\t\treturn texture2D( transmissionSamplerMap, fragCoord.xy, framebufferLod );\n\t\t#endif\n\t}\n\tvec3 applyVolumeAttenuation( vec3 radiance, float transmissionDistance, vec3 attenuationColor, float attenuationDistance ) {\n\t\tif ( attenuationDistance == 0.0 ) {\n\t\t\treturn radiance;\n\t\t} else {\n\t\t\tvec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;\n\t\t\tvec3 transmittance = exp( - attenuationCoefficient * transmissionDistance );\t\t\treturn transmittance * radiance;\n\t\t}\n\t}\n\tvec4 getIBLVolumeRefraction( vec3 n, vec3 v, float roughness, vec3 diffuseColor, vec3 specularColor, float specularF90,\n\t\tvec3 position, mat4 modelMatrix, mat4 viewMatrix, mat4 projMatrix, float ior, float thickness,\n\t\tvec3 attenuationColor, float attenuationDistance ) {\n\t\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );\n\t\tvec3 refractedRayExit = position + transmissionRay;\n\t\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n\t\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\n\t\trefractionCoords += 1.0;\n\t\trefractionCoords /= 2.0;\n\t\tvec4 transmittedLight = getTransmissionSample( refractionCoords, roughness, ior );\n\t\tvec3 attenuatedColor = applyVolumeAttenuation( transmittedLight.rgb, length( transmissionRay ), attenuationColor, attenuationDistance );\n\t\tvec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );\n\t\treturn vec4( ( 1.0 - F ) * attenuatedColor * diffuseColor, transmittedLight.a );\n\t}\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 ) || defined ( USE_TRANSMISSION )\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_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}",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}",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}",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}",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}",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 <alphatest_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}",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}",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 <alphatest_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}",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}",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}",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}",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\t#include <output_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_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#if defined ( USE_ENVMAP ) || defined ( USE_SKINNING )\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinbase_vertex>\n\t\t#include <skinnormal_vertex>\n\t\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 <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <envmap_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 <alphatest_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\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\t#include <output_fragment>\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}",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 <alphatest_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_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_Lambert( diffuseColor.rgb ) * getShadowMask();\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include <envmap_fragment>\n\t#include <output_fragment>\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#include <common>\n#include <uv_pars_vertex>\n#include <color_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <fog_pars_vertex>\n#include <normal_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#include <normal_vertex>\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}",meshmatcap_frag:"#define MATCAP\nuniform vec3 diffuse;\nuniform float opacity;\nuniform sampler2D matcap;\nvarying vec3 vViewPosition;\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 <alphatest_pars_fragment>\n#include <fog_pars_fragment>\n#include <normal_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\t#include <output_fragment>\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}",meshnormal_vert:"#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <normal_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\t#include <normal_vertex>\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}",meshnormal_frag:"#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#include <packing>\n#include <uv_pars_fragment>\n#include <normal_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}",meshphong_vert:"#define PHONG\nvarying vec3 vViewPosition;\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 <normal_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 <normal_vertex>\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}",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 <alphatest_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 <normal_pars_fragment>\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\t#include <output_fragment>\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#ifdef USE_TRANSMISSION\n\tvarying vec3 vWorldPosition;\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 <normal_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 <normal_vertex>\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#ifdef USE_TRANSMISSION\n\tvWorldPosition = worldPosition.xyz;\n#endif\n}",meshphysical_frag:"#define STANDARD\n#ifdef PHYSICAL\n\t#define IOR\n\t#define SPECULAR\n#endif\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifdef IOR\n\tuniform float ior;\n#endif\n#ifdef SPECULAR\n\tuniform float specularIntensity;\n\tuniform vec3 specularColor;\n\t#ifdef USE_SPECULARINTENSITYMAP\n\t\tuniform sampler2D specularIntensityMap;\n\t#endif\n\t#ifdef USE_SPECULARCOLORMAP\n\t\tuniform sampler2D specularColorMap;\n\t#endif\n#endif\n#ifdef USE_CLEARCOAT\n\tuniform float clearcoat;\n\tuniform float clearcoatRoughness;\n#endif\n#ifdef USE_SHEEN\n\tuniform vec3 sheenColor;\n\tuniform float sheenRoughness;\n\t#ifdef USE_SHEENCOLORMAP\n\t\tuniform sampler2D sheenColorMap;\n\t#endif\n\t#ifdef USE_SHEENROUGHNESSMAP\n\t\tuniform sampler2D sheenRoughnessMap;\n\t#endif\n#endif\nvarying vec3 vViewPosition;\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 <alphatest_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 <normal_pars_fragment>\n#include <lights_physical_pars_fragment>\n#include <transmission_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 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;\n\tvec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular;\n\t#include <transmission_fragment>\n\tvec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat dotNVcc = saturate( dot( geometry.clearcoatNormal, geometry.viewDir ) );\n\t\tvec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc );\n\t\toutgoingLight = outgoingLight * ( 1.0 - clearcoat * Fcc ) + clearcoatSpecular * clearcoat;\n\t#endif\n\t#include <output_fragment>\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#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 <normal_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 <normal_vertex>\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}",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 <alphatest_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 <normal_pars_fragment>\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\t#include <output_fragment>\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}",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}",points_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include <common>\n#include <color_pars_fragment>\n#include <map_particle_pars_fragment>\n#include <alphatest_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\t#include <output_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n}",shadow_vert:"#include <common>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\nvoid main() {\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 <worldpos_vertex>\n\t#include <shadowmap_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}",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}",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 <alphatest_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\t#include <output_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}"},Ss={common:{diffuse:{value:new xr(16777215)},opacity:{value:1},map:{value:null},uvTransform:{value:new Fi},uv2Transform:{value:new Fi},alphaMap:{value:null},alphaTest:{value:0}},specularmap:{specularMap:{value:null}},envmap:{envMap:{value:null},flipEnvMap:{value:-1},reflectivity:{value:1},ior:{value:1.5},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 zi(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 xr(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 xr(16777215)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},alphaMap:{value:null},alphaTest:{value:0},uvTransform:{value:new Fi}},sprite:{diffuse:{value:new xr(16777215)},opacity:{value:1},center:{value:new zi(.5,.5)},rotation:{value:0},map:{value:null},alphaMap:{value:null},alphaTest:{value:0},uvTransform:{value:new Fi}}},Ts={basic:{uniforms:rs([Ss.common,Ss.specularmap,Ss.envmap,Ss.aomap,Ss.lightmap,Ss.fog]),vertexShader:Ms.meshbasic_vert,fragmentShader:Ms.meshbasic_frag},lambert:{uniforms:rs([Ss.common,Ss.specularmap,Ss.envmap,Ss.aomap,Ss.lightmap,Ss.emissivemap,Ss.fog,Ss.lights,{emissive:{value:new xr(0)}}]),vertexShader:Ms.meshlambert_vert,fragmentShader:Ms.meshlambert_frag},phong:{uniforms:rs([Ss.common,Ss.specularmap,Ss.envmap,Ss.aomap,Ss.lightmap,Ss.emissivemap,Ss.bumpmap,Ss.normalmap,Ss.displacementmap,Ss.fog,Ss.lights,{emissive:{value:new xr(0)},specular:{value:new xr(1118481)},shininess:{value:30}}]),vertexShader:Ms.meshphong_vert,fragmentShader:Ms.meshphong_frag},standard:{uniforms:rs([Ss.common,Ss.envmap,Ss.aomap,Ss.lightmap,Ss.emissivemap,Ss.bumpmap,Ss.normalmap,Ss.displacementmap,Ss.roughnessmap,Ss.metalnessmap,Ss.fog,Ss.lights,{emissive:{value:new xr(0)},roughness:{value:1},metalness:{value:0},envMapIntensity:{value:1}}]),vertexShader:Ms.meshphysical_vert,fragmentShader:Ms.meshphysical_frag},toon:{uniforms:rs([Ss.common,Ss.aomap,Ss.lightmap,Ss.emissivemap,Ss.bumpmap,Ss.normalmap,Ss.displacementmap,Ss.gradientmap,Ss.fog,Ss.lights,{emissive:{value:new xr(0)}}]),vertexShader:Ms.meshtoon_vert,fragmentShader:Ms.meshtoon_frag},matcap:{uniforms:rs([Ss.common,Ss.bumpmap,Ss.normalmap,Ss.displacementmap,Ss.fog,{matcap:{value:null}}]),vertexShader:Ms.meshmatcap_vert,fragmentShader:Ms.meshmatcap_frag},points:{uniforms:rs([Ss.points,Ss.fog]),vertexShader:Ms.points_vert,fragmentShader:Ms.points_frag},dashed:{uniforms:rs([Ss.common,Ss.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:Ms.linedashed_vert,fragmentShader:Ms.linedashed_frag},depth:{uniforms:rs([Ss.common,Ss.displacementmap]),vertexShader:Ms.depth_vert,fragmentShader:Ms.depth_frag},normal:{uniforms:rs([Ss.common,Ss.bumpmap,Ss.normalmap,Ss.displacementmap,{opacity:{value:1}}]),vertexShader:Ms.meshnormal_vert,fragmentShader:Ms.meshnormal_frag},sprite:{uniforms:rs([Ss.sprite,Ss.fog]),vertexShader:Ms.sprite_vert,fragmentShader:Ms.sprite_frag},background:{uniforms:{uvTransform:{value:new Fi},t2D:{value:null}},vertexShader:Ms.background_vert,fragmentShader:Ms.background_frag},cube:{uniforms:rs([Ss.envmap,{opacity:{value:1}}]),vertexShader:Ms.cube_vert,fragmentShader:Ms.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:Ms.equirect_vert,fragmentShader:Ms.equirect_frag},distanceRGBA:{uniforms:rs([Ss.common,Ss.displacementmap,{referencePosition:{value:new Ki},nearDistance:{value:1},farDistance:{value:1e3}}]),vertexShader:Ms.distanceRGBA_vert,fragmentShader:Ms.distanceRGBA_frag},shadow:{uniforms:rs([Ss.lights,Ss.fog,{color:{value:new xr(0)},opacity:{value:1}}]),vertexShader:Ms.shadow_vert,fragmentShader:Ms.shadow_frag}};function Cs(e,t,i,n,r){const s=new xr(0);let a,o,h=0,c=null,l=0,u=null;function d(e,t){i.buffers.color.setClear(e.r,e.g,e.b,t,r)}return{getClearColor:function(){return s},setClearColor:function(e,t=1){s.set(e),h=t,d(s,h)},getClearAlpha:function(){return h},setClearAlpha:function(e){h=e,d(s,h)},render:function(i,r){let p=!1,m=!0===r.isScene?r.background:null;m&&m.isTexture&&(m=t.get(m));const f=e.xr,g=f.getSession&&f.getSession();g&&"additive"===g.environmentBlendMode&&(m=null),null===m?d(s,h):m&&m.isColor&&(d(m,1),p=!0),(e.autoClear||p)&&e.clear(e.autoClearColor,e.autoClearDepth,e.autoClearStencil),m&&(m.isCubeTexture||m.mapping===qt)?(void 0===o&&(o=new es(new is(1,1,1),new as({name:"BackgroundCubeMaterial",uniforms:ns(Ts.cube.uniforms),vertexShader:Ts.cube.vertexShader,fragmentShader:Ts.cube.fragmentShader,side:1,depthTest:!1,depthWrite:!1,fog:!1})),o.geometry.deleteAttribute("normal"),o.geometry.deleteAttribute("uv"),o.onBeforeRender=function(e,t,i){this.matrixWorld.copyPosition(i.matrixWorld)},Object.defineProperty(o.material,"envMap",{get:function(){return this.uniforms.envMap.value}}),n.update(o)),o.material.uniforms.envMap.value=m,o.material.uniforms.flipEnvMap.value=m.isCubeTexture&&!1===m.isRenderTargetTexture?-1:1,c===m&&l===m.version&&u===e.toneMapping||(o.material.needsUpdate=!0,c=m,l=m.version,u=e.toneMapping),i.unshift(o,o.geometry,o.material,0,0,null)):m&&m.isTexture&&(void 0===a&&(a=new es(new ws(2,2),new as({name:"BackgroundMaterial",uniforms:ns(Ts.background.uniforms),vertexShader:Ts.background.vertexShader,fragmentShader:Ts.background.fragmentShader,side:0,depthTest:!1,depthWrite:!1,fog:!1})),a.geometry.deleteAttribute("normal"),Object.defineProperty(a.material,"map",{get:function(){return this.uniforms.t2D.value}}),n.update(a)),a.material.uniforms.t2D.value=m,!0===m.matrixAutoUpdate&&m.updateMatrix(),a.material.uniforms.uvTransform.value.copy(m.matrix),c===m&&l===m.version&&u===e.toneMapping||(a.material.needsUpdate=!0,c=m,l=m.version,u=e.toneMapping),i.unshift(a,a.geometry,a.material,0,0,null))}}}function Es(e,t,i,n){const r=e.getParameter(34921),s=n.isWebGL2?null:t.get("OES_vertex_array_object"),a=n.isWebGL2||null!==s,o={},h=d(null);let c=h;function l(t){return n.isWebGL2?e.bindVertexArray(t):s.bindVertexArrayOES(t)}function u(t){return n.isWebGL2?e.deleteVertexArray(t):s.deleteVertexArrayOES(t)}function d(e){const t=[],i=[],n=[];for(let e=0;e<r;e++)t[e]=0,i[e]=0,n[e]=0;return{geometry:null,program:null,wireframe:!1,newAttributes:t,enabledAttributes:i,attributeDivisors:n,object:e,attributes:{},index:null}}function p(){const e=c.newAttributes;for(let t=0,i=e.length;t<i;t++)e[t]=0}function m(e){f(e,0)}function f(i,r){const s=c.newAttributes,a=c.enabledAttributes,o=c.attributeDivisors;if(s[i]=1,0===a[i]&&(e.enableVertexAttribArray(i),a[i]=1),o[i]!==r){(n.isWebGL2?e:t.get("ANGLE_instanced_arrays"))[n.isWebGL2?"vertexAttribDivisor":"vertexAttribDivisorANGLE"](i,r),o[i]=r}}function g(){const t=c.newAttributes,i=c.enabledAttributes;for(let n=0,r=i.length;n<r;n++)i[n]!==t[n]&&(e.disableVertexAttribArray(n),i[n]=0)}function _(t,i,r,s,a,o){!0!==n.isWebGL2||5124!==r&&5125!==r?e.vertexAttribPointer(t,i,r,s,a,o):e.vertexAttribIPointer(t,i,r,a,o)}function v(){y(),c!==h&&(c=h,l(c.object))}function y(){h.geometry=null,h.program=null,h.wireframe=!1}return{setup:function(r,h,u,v,y){let b=!1;if(a){const t=function(t,i,r){const a=!0===r.wireframe;let h=o[t.id];void 0===h&&(h={},o[t.id]=h);let c=h[i.id];void 0===c&&(c={},h[i.id]=c);let l=c[a];void 0===l&&(l=d(n.isWebGL2?e.createVertexArray():s.createVertexArrayOES()),c[a]=l);return l}(v,u,h);c!==t&&(c=t,l(c.object)),b=function(e,t){const i=c.attributes,n=e.attributes;let r=0;for(const e in n){const t=i[e],s=n[e];if(void 0===t)return!0;if(t.attribute!==s)return!0;if(t.data!==s.data)return!0;r++}return c.attributesNum!==r||c.index!==t}(v,y),b&&function(e,t){const i={},n=e.attributes;let r=0;for(const e in n){const t=n[e],s={};s.attribute=t,t.data&&(s.data=t.data),i[e]=s,r++}c.attributes=i,c.attributesNum=r,c.index=t}(v,y)}else{const e=!0===h.wireframe;c.geometry===v.id&&c.program===u.id&&c.wireframe===e||(c.geometry=v.id,c.program=u.id,c.wireframe=e,b=!0)}!0===r.isInstancedMesh&&(b=!0),null!==y&&i.update(y,34963),b&&(!function(r,s,a,o){if(!1===n.isWebGL2&&(r.isInstancedMesh||o.isInstancedBufferGeometry)&&null===t.get("ANGLE_instanced_arrays"))return;p();const h=o.attributes,c=a.getAttributes(),l=s.defaultAttributeValues;for(const t in c){const n=c[t];if(n.location>=0){let s=h[t];if(void 0===s&&("instanceMatrix"===t&&r.instanceMatrix&&(s=r.instanceMatrix),"instanceColor"===t&&r.instanceColor&&(s=r.instanceColor)),void 0!==s){const t=s.normalized,a=s.itemSize,h=i.get(s);if(void 0===h)continue;const c=h.buffer,l=h.type,u=h.bytesPerElement;if(s.isInterleavedBufferAttribute){const i=s.data,h=i.stride,d=s.offset;if(i&&i.isInstancedInterleavedBuffer){for(let e=0;e<n.locationSize;e++)f(n.location+e,i.meshPerAttribute);!0!==r.isInstancedMesh&&void 0===o._maxInstanceCount&&(o._maxInstanceCount=i.meshPerAttribute*i.count)}else for(let e=0;e<n.locationSize;e++)m(n.location+e);e.bindBuffer(34962,c);for(let e=0;e<n.locationSize;e++)_(n.location+e,a/n.locationSize,l,t,h*u,(d+a/n.locationSize*e)*u)}else{if(s.isInstancedBufferAttribute){for(let e=0;e<n.locationSize;e++)f(n.location+e,s.meshPerAttribute);!0!==r.isInstancedMesh&&void 0===o._maxInstanceCount&&(o._maxInstanceCount=s.meshPerAttribute*s.count)}else for(let e=0;e<n.locationSize;e++)m(n.location+e);e.bindBuffer(34962,c);for(let e=0;e<n.locationSize;e++)_(n.location+e,a/n.locationSize,l,t,a*u,a/n.locationSize*e*u)}}else if(void 0!==l){const i=l[t];if(void 0!==i)switch(i.length){case 2:e.vertexAttrib2fv(n.location,i);break;case 3:e.vertexAttrib3fv(n.location,i);break;case 4:e.vertexAttrib4fv(n.location,i);break;default:e.vertexAttrib1fv(n.location,i)}}}}g()}(r,h,u,v),null!==y&&e.bindBuffer(34963,i.get(y).buffer))},reset:v,resetDefaultState:y,dispose:function(){v();for(const e in o){const t=o[e];for(const e in t){const i=t[e];for(const e in i)u(i[e].object),delete i[e];delete t[e]}delete o[e]}},releaseStatesOfGeometry:function(e){if(void 0===o[e.id])return;const t=o[e.id];for(const e in t){const i=t[e];for(const e in i)u(i[e].object),delete i[e];delete t[e]}delete o[e.id]},releaseStatesOfProgram:function(e){for(const t in o){const i=o[t];if(void 0===i[e.id])continue;const n=i[e.id];for(const e in n)u(n[e].object),delete n[e];delete i[e.id]}},initAttributes:p,enableAttribute:m,disableUnusedAttributes:g}}function As(e,t,i,n){const r=n.isWebGL2;let s;this.setMode=function(e){s=e},this.render=function(t,n){e.drawArrays(s,t,n),i.update(n,s,1)},this.renderInstances=function(n,a,o){if(0===o)return;let h,c;if(r)h=e,c="drawArraysInstanced";else if(h=t.get("ANGLE_instanced_arrays"),c="drawArraysInstancedANGLE",null===h)return void console.error("THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");h[c](s,n,a,o),i.update(a,s,o)}}function Is(e,t,i){let n;function r(t){if("highp"===t){if(e.getShaderPrecisionFormat(35633,36338).precision>0&&e.getShaderPrecisionFormat(35632,36338).precision>0)return"highp";t="mediump"}return"mediump"===t&&e.getShaderPrecisionFormat(35633,36337).precision>0&&e.getShaderPrecisionFormat(35632,36337).precision>0?"mediump":"lowp"}const s="undefined"!=typeof WebGL2RenderingContext&&e instanceof WebGL2RenderingContext||"undefined"!=typeof WebGL2ComputeRenderingContext&&e instanceof WebGL2ComputeRenderingContext;let a=void 0!==i.precision?i.precision:"highp";const o=r(a);o!==a&&(console.warn("THREE.WebGLRenderer:",a,"not supported, using",o,"instead."),a=o);const h=s||t.has("WEBGL_draw_buffers"),c=!0===i.logarithmicDepthBuffer,l=e.getParameter(34930),u=e.getParameter(35660),d=e.getParameter(3379),p=e.getParameter(34076),m=e.getParameter(34921),f=e.getParameter(36347),g=e.getParameter(36348),_=e.getParameter(36349),v=u>0,y=s||t.has("OES_texture_float");return{isWebGL2:s,drawBuffers:h,getMaxAnisotropy:function(){if(void 0!==n)return n;if(!0===t.has("EXT_texture_filter_anisotropic")){const i=t.get("EXT_texture_filter_anisotropic");n=e.getParameter(i.MAX_TEXTURE_MAX_ANISOTROPY_EXT)}else n=0;return n},getMaxPrecision:r,precision:a,logarithmicDepthBuffer:c,maxTextures:l,maxVertexTextures:u,maxTextureSize:d,maxCubemapSize:p,maxAttributes:m,maxVertexUniforms:f,maxVaryings:g,maxFragmentUniforms:_,vertexTextures:v,floatFragmentTextures:y,floatVertexTextures:v&&y,maxSamples:s?e.getParameter(36183):0}}function Rs(e){const t=this;let i=null,n=0,r=!1,s=!1;const a=new gs,o=new Fi,h={value:null,needsUpdate:!1};function c(){h.value!==i&&(h.value=i,h.needsUpdate=n>0),t.numPlanes=n,t.numIntersection=0}function l(e,i,n,r){const s=null!==e?e.length:0;let c=null;if(0!==s){if(c=h.value,!0!==r||null===c){const t=n+4*s,r=i.matrixWorldInverse;o.getNormalMatrix(r),(null===c||c.length<t)&&(c=new Float32Array(t));for(let t=0,i=n;t!==s;++t,i+=4)a.copy(e[t]).applyMatrix4(r,o),a.normal.toArray(c,i),c[i+3]=a.constant}h.value=c,h.needsUpdate=!0}return t.numPlanes=s,t.numIntersection=0,c}this.uniform=h,this.numPlanes=0,this.numIntersection=0,this.init=function(e,t,s){const a=0!==e.length||t||0!==n||r;return r=t,i=l(e,s,0),n=e.length,a},this.beginShadows=function(){s=!0,l(null)},this.endShadows=function(){s=!1,c()},this.setState=function(t,a,o){const u=t.clippingPlanes,d=t.clipIntersection,p=t.clipShadows,m=e.get(t);if(!r||null===u||0===u.length||s&&!p)s?l(null):c();else{const e=s?0:n,t=4*e;let r=m.clippingState||null;h.value=r,r=l(u,a,t,o);for(let e=0;e!==t;++e)r[e]=i[e];m.clippingState=r,this.numIntersection=d?this.numPlanes:0,this.numPlanes+=e}}}function Ps(e){let t=new WeakMap;function i(e,t){return 303===t?e.mapping=Gt:304===t&&(e.mapping=Wt),e}function n(e){const i=e.target;i.removeEventListener("dispose",n);const r=t.get(i);void 0!==r&&(t.delete(i),r.dispose())}return{get:function(r){if(r&&r.isTexture&&!1===r.isRenderTargetTexture){const s=r.mapping;if(303===s||304===s){if(t.has(r)){return i(t.get(r).texture,r.mapping)}{const s=r.image;if(s&&s.height>0){const a=e.getRenderTarget(),o=new ds(s.height/2);return o.fromEquirectangularTexture(e,r),t.set(r,o),e.setRenderTarget(a),r.addEventListener("dispose",n),i(o.texture,r.mapping)}return null}}}return r},dispose:function(){t=new WeakMap}}}Ts.physical={uniforms:rs([Ts.standard.uniforms,{clearcoat:{value:0},clearcoatMap:{value:null},clearcoatRoughness:{value:0},clearcoatRoughnessMap:{value:null},clearcoatNormalScale:{value:new zi(1,1)},clearcoatNormalMap:{value:null},sheen:{value:0},sheenColor:{value:new xr(0)},sheenColorMap:{value:null},sheenRoughness:{value:0},sheenRoughnessMap:{value:null},transmission:{value:0},transmissionMap:{value:null},transmissionSamplerSize:{value:new zi},transmissionSamplerMap:{value:null},thickness:{value:0},thicknessMap:{value:null},attenuationDistance:{value:0},attenuationColor:{value:new xr(0)},specularIntensity:{value:0},specularIntensityMap:{value:null},specularColor:{value:new xr(1,1,1)},specularColorMap:{value:null}}]),vertexShader:Ms.meshphysical_vert,fragmentShader:Ms.meshphysical_frag};class Ls extends os{constructor(e=-1,t=1,i=1,n=-1,r=.1,s=2e3){super(),this.type="OrthographicCamera",this.zoom=1,this.view=null,this.left=e,this.right=t,this.top=i,this.bottom=n,this.near=r,this.far=s,this.updateProjectionMatrix()}copy(e,t){return super.copy(e,t),this.left=e.left,this.right=e.right,this.top=e.top,this.bottom=e.bottom,this.near=e.near,this.far=e.far,this.zoom=e.zoom,this.view=null===e.view?null:Object.assign({},e.view),this}setViewOffset(e,t,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=e,this.view.fullHeight=t,this.view.offsetX=i,this.view.offsetY=n,this.view.width=r,this.view.height=s,this.updateProjectionMatrix()}clearViewOffset(){null!==this.view&&(this.view.enabled=!1),this.updateProjectionMatrix()}updateProjectionMatrix(){const e=(this.right-this.left)/(2*this.zoom),t=(this.top-this.bottom)/(2*this.zoom),i=(this.right+this.left)/2,n=(this.top+this.bottom)/2;let r=i-e,s=i+e,a=n+t,o=n-t;if(null!==this.view&&this.view.enabled){const e=(this.right-this.left)/this.view.fullWidth/this.zoom,t=(this.top-this.bottom)/this.view.fullHeight/this.zoom;r+=e*this.view.offsetX,s=r+e*this.view.width,a-=t*this.view.offsetY,o=a-t*this.view.height}this.projectionMatrix.makeOrthographic(r,s,a,o,this.near,this.far),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()}toJSON(e){const t=super.toJSON(e);return t.object.zoom=this.zoom,t.object.left=this.left,t.object.right=this.right,t.object.top=this.top,t.object.bottom=this.bottom,t.object.near=this.near,t.object.far=this.far,null!==this.view&&(t.object.view=Object.assign({},this.view)),t}}Ls.prototype.isOrthographicCamera=!0;class Ds extends as{constructor(e){super(e),this.type="RawShaderMaterial"}}Ds.prototype.isRawShaderMaterial=!0;const Ns=Math.pow(2,8),$s=[.125,.215,.35,.446,.526,.582],ks=5+$s.length,Os=20,zs={[_i]:0,[vi]:1,[bi]:2,3004:3,3005:4,3006:5,[yi]:6},Fs=new Ls,{_lodPlanes:Bs,_sizeLods:Us,_sigmas:Vs}=Ys(),Hs=new xr;let js=null;const Gs=(1+Math.sqrt(5))/2,Ws=1/Gs,qs=[new Ki(1,1,1),new Ki(-1,1,1),new Ki(1,1,-1),new Ki(-1,1,-1),new Ki(0,Gs,Ws),new Ki(0,Gs,-Ws),new Ki(Ws,0,Gs),new Ki(-Ws,0,Gs),new Ki(Gs,Ws,0),new Ki(-Gs,Ws,0)];class Xs{constructor(e){this._renderer=e,this._pingPongRenderTarget=null,this._blurMaterial=function(e){const t=new Float32Array(e),i=new Ki(0,1,0);return new Ds({name:"SphericalGaussianBlur",defines:{n:e},uniforms:{envMap:{value:null},samples:{value:1},weights:{value:t},latitudinal:{value:!1},dTheta:{value:0},mipInt:{value:0},poleAxis:{value:i},inputEncoding:{value:zs[3e3]},outputEncoding:{value:zs[3e3]}},vertexShader:ta(),fragmentShader:`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform int samples;\n\t\t\tuniform float weights[ n ];\n\t\t\tuniform bool latitudinal;\n\t\t\tuniform float dTheta;\n\t\t\tuniform float mipInt;\n\t\t\tuniform vec3 poleAxis;\n\n\t\t\t${ia()}\n\n\t\t\t#define ENVMAP_TYPE_CUBE_UV\n\t\t\t#include <cube_uv_reflection_fragment>\n\n\t\t\tvec3 getSample( float theta, vec3 axis ) {\n\n\t\t\t\tfloat cosTheta = cos( theta );\n\t\t\t\t// Rodrigues' axis-angle rotation\n\t\t\t\tvec3 sampleDirection = vOutputDirection * cosTheta\n\t\t\t\t\t+ cross( axis, vOutputDirection ) * sin( theta )\n\t\t\t\t\t+ axis * dot( axis, vOutputDirection ) * ( 1.0 - cosTheta );\n\n\t\t\t\treturn bilinearCubeUV( envMap, sampleDirection, mipInt );\n\n\t\t\t}\n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 axis = latitudinal ? poleAxis : cross( poleAxis, vOutputDirection );\n\n\t\t\t\tif ( all( equal( axis, vec3( 0.0 ) ) ) ) {\n\n\t\t\t\t\taxis = vec3( vOutputDirection.z, 0.0, - vOutputDirection.x );\n\n\t\t\t\t}\n\n\t\t\t\taxis = normalize( axis );\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t\t\t\tgl_FragColor.rgb += weights[ 0 ] * getSample( 0.0, axis );\n\n\t\t\t\tfor ( int i = 1; i < n; i++ ) {\n\n\t\t\t\t\tif ( i >= samples ) {\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfloat theta = dTheta * float( i );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( -1.0 * theta, axis );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( theta, axis );\n\n\t\t\t\t}\n\n\t\t\t\tgl_FragColor = linearToOutputTexel( gl_FragColor );\n\n\t\t\t}\n\t\t`,blending:0,depthTest:!1,depthWrite:!1})}(Os),this._equirectShader=null,this._cubemapShader=null,this._compileMaterial(this._blurMaterial)}fromScene(e,t=0,i=.1,n=100){js=this._renderer.getRenderTarget();const r=this._allocateTargets();return this._sceneToCubeUV(e,i,n,r),t>0&&this._blur(r,0,0,t),this._applyPMREM(r),this._cleanup(r),r}fromEquirectangular(e){return this._fromTexture(e)}fromCubemap(e){return this._fromTexture(e)}compileCubemapShader(){null===this._cubemapShader&&(this._cubemapShader=ea(),this._compileMaterial(this._cubemapShader))}compileEquirectangularShader(){null===this._equirectShader&&(this._equirectShader=Qs(),this._compileMaterial(this._equirectShader))}dispose(){this._blurMaterial.dispose(),null!==this._cubemapShader&&this._cubemapShader.dispose(),null!==this._equirectShader&&this._equirectShader.dispose();for(let e=0;e<Bs.length;e++)Bs[e].dispose()}_cleanup(e){this._pingPongRenderTarget.dispose(),this._renderer.setRenderTarget(js),e.scissorTest=!1,Ks(e,0,0,e.width,e.height)}_fromTexture(e){js=this._renderer.getRenderTarget();const t=this._allocateTargets(e);return this._textureToCubeUV(e,t),this._applyPMREM(t),this._cleanup(t),t}_allocateTargets(e){const t={magFilter:Jt,minFilter:Jt,generateMipmaps:!1,type:ei,format:1023,encoding:Zs(e)?e.encoding:bi,depthBuffer:!1},i=Js(t);return i.depthBuffer=!e,this._pingPongRenderTarget=Js(t),i}_compileMaterial(e){const t=new es(Bs[0],e);this._renderer.compile(t,Fs)}_sceneToCubeUV(e,t,i,n){const r=new hs(90,1,t,i),s=[1,-1,1,1,1,1],a=[1,1,1,-1,-1,-1],o=this._renderer,h=o.autoClear,c=o.outputEncoding,l=o.toneMapping;o.getClearColor(Hs),o.toneMapping=0,o.outputEncoding=_i,o.autoClear=!1;const u=new wr({name:"PMREM.Background",side:1,depthWrite:!1,depthTest:!1}),d=new es(new is,u);let p=!1;const m=e.background;m?m.isColor&&(u.color.copy(m),e.background=null,p=!0):(u.color.copy(Hs),p=!0);for(let t=0;t<6;t++){const i=t%3;0==i?(r.up.set(0,s[t],0),r.lookAt(a[t],0,0)):1==i?(r.up.set(0,0,s[t]),r.lookAt(0,a[t],0)):(r.up.set(0,s[t],0),r.lookAt(0,0,a[t])),Ks(n,i*Ns,t>2?Ns:0,Ns,Ns),o.setRenderTarget(n),p&&o.render(d,r),o.render(e,r)}d.geometry.dispose(),d.material.dispose(),o.toneMapping=l,o.outputEncoding=c,o.autoClear=h,e.background=m}_setEncoding(e,t){!0===this._renderer.capabilities.isWebGL2&&t.format===oi&&t.type===ei&&t.encoding===vi?e.value=zs[3e3]:e.value=zs[t.encoding]}_textureToCubeUV(e,t){const i=this._renderer,n=e.mapping===Gt||e.mapping===Wt;n?null==this._cubemapShader&&(this._cubemapShader=ea()):null==this._equirectShader&&(this._equirectShader=Qs());const r=n?this._cubemapShader:this._equirectShader,s=new es(Bs[0],r),a=r.uniforms;a.envMap.value=e,n||a.texelSize.value.set(1/e.image.width,1/e.image.height),this._setEncoding(a.inputEncoding,e),this._setEncoding(a.outputEncoding,t.texture),Ks(t,0,0,3*Ns,2*Ns),i.setRenderTarget(t),i.render(s,Fs)}_applyPMREM(e){const t=this._renderer,i=t.autoClear;t.autoClear=!1;for(let t=1;t<ks;t++){const i=Math.sqrt(Vs[t]*Vs[t]-Vs[t-1]*Vs[t-1]),n=qs[(t-1)%qs.length];this._blur(e,t-1,t,i,n)}t.autoClear=i}_blur(e,t,i,n,r){const s=this._pingPongRenderTarget;this._halfBlur(e,s,t,i,n,"latitudinal",r),this._halfBlur(s,e,i,i,n,"longitudinal",r)}_halfBlur(e,t,i,n,r,s,a){const o=this._renderer,h=this._blurMaterial;"latitudinal"!==s&&"longitudinal"!==s&&console.error("blur direction must be either latitudinal or longitudinal!");const c=new es(Bs[n],h),l=h.uniforms,u=Us[i]-1,d=isFinite(r)?Math.PI/(2*u):2*Math.PI/39,p=r/d,m=isFinite(r)?1+Math.floor(3*p):Os;m>Os&&console.warn(`sigmaRadians, ${r}, is too large and will clip, as it requested ${m} samples when the maximum is set to 20`);const f=[];let g=0;for(let e=0;e<Os;++e){const t=e/p,i=Math.exp(-t*t/2);f.push(i),0==e?g+=i:e<m&&(g+=2*i)}for(let e=0;e<f.length;e++)f[e]=f[e]/g;l.envMap.value=e.texture,l.samples.value=m,l.weights.value=f,l.latitudinal.value="latitudinal"===s,a&&(l.poleAxis.value=a),l.dTheta.value=d,l.mipInt.value=8-i,this._setEncoding(l.inputEncoding,e.texture),this._setEncoding(l.outputEncoding,e.texture);const _=Us[n];Ks(t,3*Math.max(0,Ns-2*_),(0===n?0:2*Ns)+2*_*(n>4?n-8+4:0),3*_,2*_),o.setRenderTarget(t),o.render(c,Fs)}}function Zs(e){return void 0!==e&&e.type===ei&&(e.encoding===_i||e.encoding===vi||e.encoding===yi)}function Ys(){const e=[],t=[],i=[];let n=8;for(let r=0;r<ks;r++){const s=Math.pow(2,n);t.push(s);let a=1/s;r>4?a=$s[r-8+4-1]:0==r&&(a=0),i.push(a);const o=1/(s-1),h=-o/2,c=1+o/2,l=[h,h,c,h,c,c,h,h,c,c,h,c],u=6,d=6,p=3,m=2,f=1,g=new Float32Array(p*d*u),_=new Float32Array(m*d*u),v=new Float32Array(f*d*u);for(let e=0;e<u;e++){const t=e%3*2/3-1,i=e>2?0:-1,n=[t,i,0,t+2/3,i,0,t+2/3,i+1,0,t,i,0,t+2/3,i+1,0,t,i+1,0];g.set(n,p*d*e),_.set(l,m*d*e);const r=[e,e,e,e,e,e];v.set(r,f*d*e)}const y=new kr;y.setAttribute("position",new Tr(g,p)),y.setAttribute("uv",new Tr(_,m)),y.setAttribute("faceIndex",new Tr(v,f)),e.push(y),n>4&&n--}return{_lodPlanes:e,_sizeLods:t,_sigmas:i}}function Js(e){const t=new Zi(3*Ns,3*Ns,e);return t.texture.mapping=qt,t.texture.name="PMREM.cubeUv",t.scissorTest=!0,t}function Ks(e,t,i,n,r){e.viewport.set(t,i,n,r),e.scissor.set(t,i,n,r)}function Qs(){const e=new zi(1,1);return new Ds({name:"EquirectangularToCubeUV",uniforms:{envMap:{value:null},texelSize:{value:e},inputEncoding:{value:zs[3e3]},outputEncoding:{value:zs[3e3]}},vertexShader:ta(),fragmentShader:`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform vec2 texelSize;\n\n\t\t\t${ia()}\n\n\t\t\t#include <common>\n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\n\t\t\t\tvec3 outputDirection = normalize( vOutputDirection );\n\t\t\t\tvec2 uv = equirectUv( outputDirection );\n\n\t\t\t\tvec2 f = fract( uv / texelSize - 0.5 );\n\t\t\t\tuv -= f * texelSize;\n\t\t\t\tvec3 tl = envMapTexelToLinear( texture2D ( envMap, uv ) ).rgb;\n\t\t\t\tuv.x += texelSize.x;\n\t\t\t\tvec3 tr = envMapTexelToLinear( texture2D ( envMap, uv ) ).rgb;\n\t\t\t\tuv.y += texelSize.y;\n\t\t\t\tvec3 br = envMapTexelToLinear( texture2D ( envMap, uv ) ).rgb;\n\t\t\t\tuv.x -= texelSize.x;\n\t\t\t\tvec3 bl = envMapTexelToLinear( texture2D ( envMap, uv ) ).rgb;\n\n\t\t\t\tvec3 tm = mix( tl, tr, f.x );\n\t\t\t\tvec3 bm = mix( bl, br, f.x );\n\t\t\t\tgl_FragColor.rgb = mix( tm, bm, f.y );\n\n\t\t\t\tgl_FragColor = linearToOutputTexel( gl_FragColor );\n\n\t\t\t}\n\t\t`,blending:0,depthTest:!1,depthWrite:!1})}function ea(){return new Ds({name:"CubemapToCubeUV",uniforms:{envMap:{value:null},inputEncoding:{value:zs[3e3]},outputEncoding:{value:zs[3e3]}},vertexShader:ta(),fragmentShader:`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform samplerCube envMap;\n\n\t\t\t${ia()}\n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t\t\t\tgl_FragColor.rgb = envMapTexelToLinear( textureCube( envMap, vec3( - vOutputDirection.x, vOutputDirection.yz ) ) ).rgb;\n\t\t\t\tgl_FragColor = linearToOutputTexel( gl_FragColor );\n\n\t\t\t}\n\t\t`,blending:0,depthTest:!1,depthWrite:!1})}function ta(){return"\n\n\t\tprecision mediump float;\n\t\tprecision mediump int;\n\n\t\tattribute vec3 position;\n\t\tattribute vec2 uv;\n\t\tattribute float faceIndex;\n\n\t\tvarying vec3 vOutputDirection;\n\n\t\t// RH coordinate system; PMREM face-indexing convention\n\t\tvec3 getDirection( vec2 uv, float face ) {\n\n\t\t\tuv = 2.0 * uv - 1.0;\n\n\t\t\tvec3 direction = vec3( uv, 1.0 );\n\n\t\t\tif ( face == 0.0 ) {\n\n\t\t\t\tdirection = direction.zyx; // ( 1, v, u ) pos x\n\n\t\t\t} else if ( face == 1.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xz *= -1.0; // ( -u, 1, -v ) pos y\n\n\t\t\t} else if ( face == 2.0 ) {\n\n\t\t\t\tdirection.x *= -1.0; // ( -u, v, 1 ) pos z\n\n\t\t\t} else if ( face == 3.0 ) {\n\n\t\t\t\tdirection = direction.zyx;\n\t\t\t\tdirection.xz *= -1.0; // ( -1, v, -u ) neg x\n\n\t\t\t} else if ( face == 4.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xy *= -1.0; // ( -u, -1, v ) neg y\n\n\t\t\t} else if ( face == 5.0 ) {\n\n\t\t\t\tdirection.z *= -1.0; // ( u, v, -1 ) neg z\n\n\t\t\t}\n\n\t\t\treturn direction;\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvOutputDirection = getDirection( uv, faceIndex );\n\t\t\tgl_Position = vec4( position, 1.0 );\n\n\t\t}\n\t"}function ia(){return"\n\n\t\tuniform int inputEncoding;\n\t\tuniform int outputEncoding;\n\n\t\t#include <encodings_pars_fragment>\n\n\t\tvec4 inputTexelToLinear( vec4 value ) {\n\n\t\t\tif ( inputEncoding == 0 ) {\n\n\t\t\t\treturn value;\n\n\t\t\t} else if ( inputEncoding == 1 ) {\n\n\t\t\t\treturn sRGBToLinear( value );\n\n\t\t\t} else if ( inputEncoding == 2 ) {\n\n\t\t\t\treturn RGBEToLinear( value );\n\n\t\t\t} else if ( inputEncoding == 3 ) {\n\n\t\t\t\treturn RGBMToLinear( value, 7.0 );\n\n\t\t\t} else if ( inputEncoding == 4 ) {\n\n\t\t\t\treturn RGBMToLinear( value, 16.0 );\n\n\t\t\t} else if ( inputEncoding == 5 ) {\n\n\t\t\t\treturn RGBDToLinear( value, 256.0 );\n\n\t\t\t} else {\n\n\t\t\t\treturn GammaToLinear( value, 2.2 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvec4 linearToOutputTexel( vec4 value ) {\n\n\t\t\tif ( outputEncoding == 0 ) {\n\n\t\t\t\treturn value;\n\n\t\t\t} else if ( outputEncoding == 1 ) {\n\n\t\t\t\treturn LinearTosRGB( value );\n\n\t\t\t} else if ( outputEncoding == 2 ) {\n\n\t\t\t\treturn LinearToRGBE( value );\n\n\t\t\t} else if ( outputEncoding == 3 ) {\n\n\t\t\t\treturn LinearToRGBM( value, 7.0 );\n\n\t\t\t} else if ( outputEncoding == 4 ) {\n\n\t\t\t\treturn LinearToRGBM( value, 16.0 );\n\n\t\t\t} else if ( outputEncoding == 5 ) {\n\n\t\t\t\treturn LinearToRGBD( value, 256.0 );\n\n\t\t\t} else {\n\n\t\t\t\treturn LinearToGamma( value, 2.2 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvec4 envMapTexelToLinear( vec4 color ) {\n\n\t\t\treturn inputTexelToLinear( color );\n\n\t\t}\n\t"}function na(e){let t=new WeakMap,i=null;function n(e){const i=e.target;i.removeEventListener("dispose",n);const r=t.get(i);void 0!==r&&(t.delete(i),r.dispose())}return{get:function(r){if(r&&r.isTexture&&!1===r.isRenderTargetTexture){const s=r.mapping,a=303===s||304===s,o=s===Gt||s===Wt;if(a||o){if(t.has(r))return t.get(r).texture;{const s=r.image;if(a&&s&&s.height>0||o&&s&&function(e){let t=0;const i=6;for(let n=0;n<i;n++)void 0!==e[n]&&t++;return t===i}(s)){const s=e.getRenderTarget();null===i&&(i=new Xs(e));const o=a?i.fromEquirectangular(r):i.fromCubemap(r);return t.set(r,o),e.setRenderTarget(s),r.addEventListener("dispose",n),o.texture}return null}}}return r},dispose:function(){t=new WeakMap,null!==i&&(i.dispose(),i=null)}}}function ra(e){const t={};function i(i){if(void 0!==t[i])return t[i];let n;switch(i){case"WEBGL_depth_texture":n=e.getExtension("WEBGL_depth_texture")||e.getExtension("MOZ_WEBGL_depth_texture")||e.getExtension("WEBKIT_WEBGL_depth_texture");break;case"EXT_texture_filter_anisotropic":n=e.getExtension("EXT_texture_filter_anisotropic")||e.getExtension("MOZ_EXT_texture_filter_anisotropic")||e.getExtension("WEBKIT_EXT_texture_filter_anisotropic");break;case"WEBGL_compressed_texture_s3tc":n=e.getExtension("WEBGL_compressed_texture_s3tc")||e.getExtension("MOZ_WEBGL_compressed_texture_s3tc")||e.getExtension("WEBKIT_WEBGL_compressed_texture_s3tc");break;case"WEBGL_compressed_texture_pvrtc":n=e.getExtension("WEBGL_compressed_texture_pvrtc")||e.getExtension("WEBKIT_WEBGL_compressed_texture_pvrtc");break;default:n=e.getExtension(i)}return t[i]=n,n}return{has:function(e){return null!==i(e)},init:function(e){e.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(e){const t=i(e);return null===t&&console.warn("THREE.WebGLRenderer: "+e+" extension not supported."),t}}}function sa(e,t,i,n){const r={},s=new WeakMap;function a(e){const o=e.target;null!==o.index&&t.remove(o.index);for(const e in o.attributes)t.remove(o.attributes[e]);o.removeEventListener("dispose",a),delete r[o.id];const h=s.get(o);h&&(t.remove(h),s.delete(o)),n.releaseStatesOfGeometry(o),!0===o.isInstancedBufferGeometry&&delete o._maxInstanceCount,i.memory.geometries--}function o(e){const i=[],n=e.index,r=e.attributes.position;let a=0;if(null!==n){const e=n.array;a=n.version;for(let t=0,n=e.length;t<n;t+=3){const n=e[t+0],r=e[t+1],s=e[t+2];i.push(n,r,r,s,s,n)}}else{const e=r.array;a=r.version;for(let t=0,n=e.length/3-1;t<n;t+=3){const e=t+0,n=t+1,r=t+2;i.push(e,n,n,r,r,e)}}const o=new(Bi(i)>65535?Er:Cr)(i,1);o.version=a;const h=s.get(e);h&&t.remove(h),s.set(e,o)}return{get:function(e,t){return!0===r[t.id]||(t.addEventListener("dispose",a),r[t.id]=!0,i.memory.geometries++),t},update:function(e){const i=e.attributes;for(const e in i)t.update(i[e],34962);const n=e.morphAttributes;for(const e in n){const i=n[e];for(let e=0,n=i.length;e<n;e++)t.update(i[e],34962)}},getWireframeAttribute:function(e){const t=s.get(e);if(t){const i=e.index;null!==i&&t.version<i.version&&o(e)}else o(e);return s.get(e)}}}function aa(e,t,i,n){const r=n.isWebGL2;let s,a,o;this.setMode=function(e){s=e},this.setIndex=function(e){a=e.type,o=e.bytesPerElement},this.render=function(t,n){e.drawElements(s,n,a,t*o),i.update(n,s,1)},this.renderInstances=function(n,h,c){if(0===c)return;let l,u;if(r)l=e,u="drawElementsInstanced";else if(l=t.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,h,a,n*o,c),i.update(h,s,c)}}function oa(e){const t={frame:0,calls:0,triangles:0,points:0,lines:0};return{memory:{geometries:0,textures:0},render:t,programs:null,autoReset:!0,reset:function(){t.frame++,t.calls=0,t.triangles=0,t.points=0,t.lines=0},update:function(e,i,n){switch(t.calls++,i){case 4:t.triangles+=n*(e/3);break;case 1:t.lines+=n*(e/2);break;case 3:t.lines+=n*(e-1);break;case 2:t.lines+=n*e;break;case 0:t.points+=n*e;break;default:console.error("THREE.WebGLInfo: Unknown draw mode:",i)}}}}class ha extends Wi{constructor(e=null,t=1,i=1,n=1){super(null),this.image={data:e,width:t,height:i,depth:n},this.magFilter=Jt,this.minFilter=Jt,this.wrapR=Zt,this.generateMipmaps=!1,this.flipY=!1,this.unpackAlignment=1,this.needsUpdate=!0}}function ca(e,t){return e[0]-t[0]}function la(e,t){return Math.abs(t[1])-Math.abs(e[1])}function ua(e,t){let i=1;const n=t.isInterleavedBufferAttribute?t.data.array:t.array;n instanceof Int8Array?i=127:n instanceof Int16Array?i=32767:n instanceof Int32Array?i=2147483647:console.error("THREE.WebGLMorphtargets: Unsupported morph attribute data type: ",n),e.divideScalar(i)}function da(e,t,i){const n={},r=new Float32Array(8),s=new WeakMap,a=new Ki,o=[];for(let e=0;e<8;e++)o[e]=[e,0];return{update:function(h,c,l,u){const d=h.morphTargetInfluences;if(!0===t.isWebGL2){const n=c.morphAttributes.position.length;let r=s.get(c);if(void 0===r||r.count!==n){void 0!==r&&r.texture.dispose();const e=void 0!==c.morphAttributes.normal,i=c.morphAttributes.position,o=c.morphAttributes.normal||[],h=!0===e?2:1;let l=c.attributes.position.count*h,u=1;l>t.maxTextureSize&&(u=Math.ceil(l/t.maxTextureSize),l=t.maxTextureSize);const d=new Float32Array(l*u*4*n),p=new ha(d,l,u,n);p.format=oi,p.type=ni;const m=4*h;for(let t=0;t<n;t++){const n=i[t],r=o[t],s=l*u*4*t;for(let t=0;t<n.count;t++){a.fromBufferAttribute(n,t),!0===n.normalized&&ua(a,n);const i=t*m;d[s+i+0]=a.x,d[s+i+1]=a.y,d[s+i+2]=a.z,d[s+i+3]=0,!0===e&&(a.fromBufferAttribute(r,t),!0===r.normalized&&ua(a,r),d[s+i+4]=a.x,d[s+i+5]=a.y,d[s+i+6]=a.z,d[s+i+7]=0)}}r={count:n,texture:p,size:new zi(l,u)},s.set(c,r)}let o=0;for(let e=0;e<d.length;e++)o+=d[e];const h=c.morphTargetsRelative?1:1-o;u.getUniforms().setValue(e,"morphTargetBaseInfluence",h),u.getUniforms().setValue(e,"morphTargetInfluences",d),u.getUniforms().setValue(e,"morphTargetsTexture",r.texture,i),u.getUniforms().setValue(e,"morphTargetsTextureSize",r.size)}else{const t=void 0===d?0:d.length;let i=n[c.id];if(void 0===i||i.length!==t){i=[];for(let e=0;e<t;e++)i[e]=[e,0];n[c.id]=i}for(let e=0;e<t;e++){const t=i[e];t[0]=e,t[1]=d[e]}i.sort(la);for(let e=0;e<8;e++)e<t&&i[e][1]?(o[e][0]=i[e][0],o[e][1]=i[e][1]):(o[e][0]=Number.MAX_SAFE_INTEGER,o[e][1]=0);o.sort(ca);const s=c.morphAttributes.position,a=c.morphAttributes.normal;let h=0;for(let e=0;e<8;e++){const t=o[e],i=t[0],n=t[1];i!==Number.MAX_SAFE_INTEGER&&n?(s&&c.getAttribute("morphTarget"+e)!==s[i]&&c.setAttribute("morphTarget"+e,s[i]),a&&c.getAttribute("morphNormal"+e)!==a[i]&&c.setAttribute("morphNormal"+e,a[i]),r[e]=n,h+=n):(s&&!0===c.hasAttribute("morphTarget"+e)&&c.deleteAttribute("morphTarget"+e),a&&!0===c.hasAttribute("morphNormal"+e)&&c.deleteAttribute("morphNormal"+e),r[e]=0)}const l=c.morphTargetsRelative?1:1-h;u.getUniforms().setValue(e,"morphTargetBaseInfluence",l),u.getUniforms().setValue(e,"morphTargetInfluences",r)}}}}function pa(e,t,i,n){let r=new WeakMap;function s(e){const t=e.target;t.removeEventListener("dispose",s),i.remove(t.instanceMatrix),null!==t.instanceColor&&i.remove(t.instanceColor)}return{update:function(e){const a=n.render.frame,o=e.geometry,h=t.get(e,o);return r.get(h)!==a&&(t.update(h),r.set(h,a)),e.isInstancedMesh&&(!1===e.hasEventListener("dispose",s)&&e.addEventListener("dispose",s),i.update(e.instanceMatrix,34962),null!==e.instanceColor&&i.update(e.instanceColor,34962)),h},dispose:function(){r=new WeakMap}}}ha.prototype.isDataTexture2DArray=!0;class ma extends Wi{constructor(e=null,t=1,i=1,n=1){super(null),this.image={data:e,width:t,height:i,depth:n},this.magFilter=Jt,this.minFilter=Jt,this.wrapR=Zt,this.generateMipmaps=!1,this.flipY=!1,this.unpackAlignment=1,this.needsUpdate=!0}}ma.prototype.isDataTexture3D=!0;const fa=new Wi,ga=new ha,_a=new ma,va=new us,ya=[],ba=[],xa=new Float32Array(16),wa=new Float32Array(9),Ma=new Float32Array(4);function Sa(e,t,i){const n=e[0];if(n<=0||n>0)return e;const r=t*i;let s=ya[r];if(void 0===s&&(s=new Float32Array(r),ya[r]=s),0!==t){n.toArray(s,0);for(let n=1,r=0;n!==t;++n)r+=i,e[n].toArray(s,r)}return s}function Ta(e,t){if(e.length!==t.length)return!1;for(let i=0,n=e.length;i<n;i++)if(e[i]!==t[i])return!1;return!0}function Ca(e,t){for(let i=0,n=t.length;i<n;i++)e[i]=t[i]}function Ea(e,t){let i=ba[t];void 0===i&&(i=new Int32Array(t),ba[t]=i);for(let n=0;n!==t;++n)i[n]=e.allocateTextureUnit();return i}function Aa(e,t){const i=this.cache;i[0]!==t&&(e.uniform1f(this.addr,t),i[0]=t)}function Ia(e,t){const i=this.cache;if(void 0!==t.x)i[0]===t.x&&i[1]===t.y||(e.uniform2f(this.addr,t.x,t.y),i[0]=t.x,i[1]=t.y);else{if(Ta(i,t))return;e.uniform2fv(this.addr,t),Ca(i,t)}}function Ra(e,t){const i=this.cache;if(void 0!==t.x)i[0]===t.x&&i[1]===t.y&&i[2]===t.z||(e.uniform3f(this.addr,t.x,t.y,t.z),i[0]=t.x,i[1]=t.y,i[2]=t.z);else if(void 0!==t.r)i[0]===t.r&&i[1]===t.g&&i[2]===t.b||(e.uniform3f(this.addr,t.r,t.g,t.b),i[0]=t.r,i[1]=t.g,i[2]=t.b);else{if(Ta(i,t))return;e.uniform3fv(this.addr,t),Ca(i,t)}}function Pa(e,t){const i=this.cache;if(void 0!==t.x)i[0]===t.x&&i[1]===t.y&&i[2]===t.z&&i[3]===t.w||(e.uniform4f(this.addr,t.x,t.y,t.z,t.w),i[0]=t.x,i[1]=t.y,i[2]=t.z,i[3]=t.w);else{if(Ta(i,t))return;e.uniform4fv(this.addr,t),Ca(i,t)}}function La(e,t){const i=this.cache,n=t.elements;if(void 0===n){if(Ta(i,t))return;e.uniformMatrix2fv(this.addr,!1,t),Ca(i,t)}else{if(Ta(i,n))return;Ma.set(n),e.uniformMatrix2fv(this.addr,!1,Ma),Ca(i,n)}}function Da(e,t){const i=this.cache,n=t.elements;if(void 0===n){if(Ta(i,t))return;e.uniformMatrix3fv(this.addr,!1,t),Ca(i,t)}else{if(Ta(i,n))return;wa.set(n),e.uniformMatrix3fv(this.addr,!1,wa),Ca(i,n)}}function Na(e,t){const i=this.cache,n=t.elements;if(void 0===n){if(Ta(i,t))return;e.uniformMatrix4fv(this.addr,!1,t),Ca(i,t)}else{if(Ta(i,n))return;xa.set(n),e.uniformMatrix4fv(this.addr,!1,xa),Ca(i,n)}}function $a(e,t){const i=this.cache;i[0]!==t&&(e.uniform1i(this.addr,t),i[0]=t)}function ka(e,t){const i=this.cache;Ta(i,t)||(e.uniform2iv(this.addr,t),Ca(i,t))}function Oa(e,t){const i=this.cache;Ta(i,t)||(e.uniform3iv(this.addr,t),Ca(i,t))}function za(e,t){const i=this.cache;Ta(i,t)||(e.uniform4iv(this.addr,t),Ca(i,t))}function Fa(e,t){const i=this.cache;i[0]!==t&&(e.uniform1ui(this.addr,t),i[0]=t)}function Ba(e,t){const i=this.cache;Ta(i,t)||(e.uniform2uiv(this.addr,t),Ca(i,t))}function Ua(e,t){const i=this.cache;Ta(i,t)||(e.uniform3uiv(this.addr,t),Ca(i,t))}function Va(e,t){const i=this.cache;Ta(i,t)||(e.uniform4uiv(this.addr,t),Ca(i,t))}function Ha(e,t,i){const n=this.cache,r=i.allocateTextureUnit();n[0]!==r&&(e.uniform1i(this.addr,r),n[0]=r),i.safeSetTexture2D(t||fa,r)}function ja(e,t,i){const n=this.cache,r=i.allocateTextureUnit();n[0]!==r&&(e.uniform1i(this.addr,r),n[0]=r),i.setTexture3D(t||_a,r)}function Ga(e,t,i){const n=this.cache,r=i.allocateTextureUnit();n[0]!==r&&(e.uniform1i(this.addr,r),n[0]=r),i.safeSetTextureCube(t||va,r)}function Wa(e,t,i){const n=this.cache,r=i.allocateTextureUnit();n[0]!==r&&(e.uniform1i(this.addr,r),n[0]=r),i.setTexture2DArray(t||ga,r)}function qa(e,t){e.uniform1fv(this.addr,t)}function Xa(e,t){const i=Sa(t,this.size,2);e.uniform2fv(this.addr,i)}function Za(e,t){const i=Sa(t,this.size,3);e.uniform3fv(this.addr,i)}function Ya(e,t){const i=Sa(t,this.size,4);e.uniform4fv(this.addr,i)}function Ja(e,t){const i=Sa(t,this.size,4);e.uniformMatrix2fv(this.addr,!1,i)}function Ka(e,t){const i=Sa(t,this.size,9);e.uniformMatrix3fv(this.addr,!1,i)}function Qa(e,t){const i=Sa(t,this.size,16);e.uniformMatrix4fv(this.addr,!1,i)}function eo(e,t){e.uniform1iv(this.addr,t)}function to(e,t){e.uniform2iv(this.addr,t)}function io(e,t){e.uniform3iv(this.addr,t)}function no(e,t){e.uniform4iv(this.addr,t)}function ro(e,t){e.uniform1uiv(this.addr,t)}function so(e,t){e.uniform2uiv(this.addr,t)}function ao(e,t){e.uniform3uiv(this.addr,t)}function oo(e,t){e.uniform4uiv(this.addr,t)}function ho(e,t,i){const n=t.length,r=Ea(i,n);e.uniform1iv(this.addr,r);for(let e=0;e!==n;++e)i.safeSetTexture2D(t[e]||fa,r[e])}function co(e,t,i){const n=t.length,r=Ea(i,n);e.uniform1iv(this.addr,r);for(let e=0;e!==n;++e)i.safeSetTextureCube(t[e]||va,r[e])}function lo(e,t,i){this.id=e,this.addr=i,this.cache=[],this.setValue=function(e){switch(e){case 5126:return Aa;case 35664:return Ia;case 35665:return Ra;case 35666:return Pa;case 35674:return La;case 35675:return Da;case 35676:return Na;case 5124:case 35670:return $a;case 35667:case 35671:return ka;case 35668:case 35672:return Oa;case 35669:case 35673:return za;case 5125:return Fa;case 36294:return Ba;case 36295:return Ua;case 36296:return Va;case 35678:case 36198:case 36298:case 36306:case 35682:return Ha;case 35679:case 36299:case 36307:return ja;case 35680:case 36300:case 36308:case 36293:return Ga;case 36289:case 36303:case 36311:case 36292:return Wa}}(t.type)}function uo(e,t,i){this.id=e,this.addr=i,this.cache=[],this.size=t.size,this.setValue=function(e){switch(e){case 5126:return qa;case 35664:return Xa;case 35665:return Za;case 35666:return Ya;case 35674:return Ja;case 35675:return Ka;case 35676:return Qa;case 5124:case 35670:return eo;case 35667:case 35671:return to;case 35668:case 35672:return io;case 35669:case 35673:return no;case 5125:return ro;case 36294:return so;case 36295:return ao;case 36296:return oo;case 35678:case 36198:case 36298:case 36306:case 35682:return ho;case 35680:case 36300:case 36308:case 36293:return co}}(t.type)}function po(e){this.id=e,this.seq=[],this.map={}}uo.prototype.updateCache=function(e){const t=this.cache;e instanceof Float32Array&&t.length!==e.length&&(this.cache=new Float32Array(e.length)),Ca(t,e)},po.prototype.setValue=function(e,t,i){const n=this.seq;for(let r=0,s=n.length;r!==s;++r){const s=n[r];s.setValue(e,t[s.id],i)}};const mo=/(\w+)(\])?(\[|\.)?/g;function fo(e,t){e.seq.push(t),e.map[t.id]=t}function go(e,t,i){const n=e.name,r=n.length;for(mo.lastIndex=0;;){const s=mo.exec(n),a=mo.lastIndex;let o=s[1];const h="]"===s[2],c=s[3];if(h&&(o|=0),void 0===c||"["===c&&a+2===r){fo(i,void 0===c?new lo(o,e,t):new uo(o,e,t));break}{let e=i.map[o];void 0===e&&(e=new po(o),fo(i,e)),i=e}}}function _o(e,t){this.seq=[],this.map={};const i=e.getProgramParameter(t,35718);for(let n=0;n<i;++n){const i=e.getActiveUniform(t,n);go(i,e.getUniformLocation(t,i.name),this)}}function vo(e,t,i){const n=e.createShader(t);return e.shaderSource(n,i),e.compileShader(n),n}_o.prototype.setValue=function(e,t,i,n){const r=this.map[t];void 0!==r&&r.setValue(e,i,n)},_o.prototype.setOptional=function(e,t,i){const n=t[i];void 0!==n&&this.setValue(e,i,n)},_o.upload=function(e,t,i,n){for(let r=0,s=t.length;r!==s;++r){const s=t[r],a=i[s.id];!1!==a.needsUpdate&&s.setValue(e,a.value,n)}},_o.seqWithValue=function(e,t){const i=[];for(let n=0,r=e.length;n!==r;++n){const r=e[n];r.id in t&&i.push(r)}return i};let yo=0;function bo(e){switch(e){case _i:return["Linear","( value )"];case vi:return["sRGB","( value )"];case bi: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 yi:return["Gamma","( value, float( GAMMA_FACTOR ) )"];case 3003:return["LogLuv","( value )"];default:return console.warn("THREE.WebGLProgram: Unsupported encoding:",e),["Linear","( value )"]}}function xo(e,t,i){const n=e.getShaderParameter(t,35713),r=e.getShaderInfoLog(t).trim();return n&&""===r?"":i.toUpperCase()+"\n\n"+r+"\n\n"+function(e){const t=e.split("\n");for(let e=0;e<t.length;e++)t[e]=e+1+": "+t[e];return t.join("\n")}(e.getShaderSource(t))}function wo(e,t){const i=bo(t);return"vec4 "+e+"( vec4 value ) { return "+i[0]+"ToLinear"+i[1]+"; }"}function Mo(e,t){const i=bo(t);return"vec4 "+e+"( vec4 value ) { return LinearTo"+i[0]+i[1]+"; }"}function So(e,t){let i;switch(t){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:",t),i="Linear"}return"vec3 "+e+"( vec3 color ) { return "+i+"ToneMapping( color ); }"}function To(e){return""!==e}function Co(e,t){return e.replace(/NUM_DIR_LIGHTS/g,t.numDirLights).replace(/NUM_SPOT_LIGHTS/g,t.numSpotLights).replace(/NUM_RECT_AREA_LIGHTS/g,t.numRectAreaLights).replace(/NUM_POINT_LIGHTS/g,t.numPointLights).replace(/NUM_HEMI_LIGHTS/g,t.numHemiLights).replace(/NUM_DIR_LIGHT_SHADOWS/g,t.numDirLightShadows).replace(/NUM_SPOT_LIGHT_SHADOWS/g,t.numSpotLightShadows).replace(/NUM_POINT_LIGHT_SHADOWS/g,t.numPointLightShadows)}function Eo(e,t){return e.replace(/NUM_CLIPPING_PLANES/g,t.numClippingPlanes).replace(/UNION_CLIPPING_PLANES/g,t.numClippingPlanes-t.numClipIntersection)}const Ao=/^[ \t]*#include +<([\w\d./]+)>/gm;function Io(e){return e.replace(Ao,Ro)}function Ro(e,t){const i=Ms[t];if(void 0===i)throw new Error("Can not resolve #include <"+t+">");return Io(i)}const Po=/#pragma unroll_loop[\s]+?for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g,Lo=/#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 Do(e){return e.replace(Lo,$o).replace(Po,No)}function No(e,t,i,n){return console.warn("WebGLProgram: #pragma unroll_loop shader syntax is deprecated. Please use #pragma unroll_loop_start syntax instead."),$o(e,t,i,n)}function $o(e,t,i,n){let r="";for(let e=parseInt(t);e<parseInt(i);e++)r+=n.replace(/\[\s*i\s*\]/g,"[ "+e+" ]").replace(/UNROLLED_LOOP_INDEX/g,e);return r}function ko(e){let t="precision "+e.precision+" float;\nprecision "+e.precision+" int;";return"highp"===e.precision?t+="\n#define HIGH_PRECISION":"mediump"===e.precision?t+="\n#define MEDIUM_PRECISION":"lowp"===e.precision&&(t+="\n#define LOW_PRECISION"),t}function Oo(e,t,i,n){const r=e.getContext(),s=i.defines;let a=i.vertexShader,o=i.fragmentShader;const h=function(e){let t="SHADOWMAP_TYPE_BASIC";return 1===e.shadowMapType?t="SHADOWMAP_TYPE_PCF":2===e.shadowMapType?t="SHADOWMAP_TYPE_PCF_SOFT":3===e.shadowMapType&&(t="SHADOWMAP_TYPE_VSM"),t}(i),c=function(e){let t="ENVMAP_TYPE_CUBE";if(e.envMap)switch(e.envMapMode){case Gt:case Wt:t="ENVMAP_TYPE_CUBE";break;case qt:case 307:t="ENVMAP_TYPE_CUBE_UV"}return t}(i),l=function(e){let t="ENVMAP_MODE_REFLECTION";if(e.envMap)switch(e.envMapMode){case Wt:case 307:t="ENVMAP_MODE_REFRACTION"}return t}(i),u=function(e){let t="ENVMAP_BLENDING_NONE";if(e.envMap)switch(e.combine){case 0:t="ENVMAP_BLENDING_MULTIPLY";break;case 1:t="ENVMAP_BLENDING_MIX";break;case 2:t="ENVMAP_BLENDING_ADD"}return t}(i),d=e.gammaFactor>0?e.gammaFactor:1,p=i.isWebGL2?"":function(e){return[e.extensionDerivatives||e.envMapCubeUV||e.bumpMap||e.tangentSpaceNormalMap||e.clearcoatNormalMap||e.flatShading||"physical"===e.shaderID?"#extension GL_OES_standard_derivatives : enable":"",(e.extensionFragDepth||e.logarithmicDepthBuffer)&&e.rendererExtensionFragDepth?"#extension GL_EXT_frag_depth : enable":"",e.extensionDrawBuffers&&e.rendererExtensionDrawBuffers?"#extension GL_EXT_draw_buffers : require":"",(e.extensionShaderTextureLOD||e.envMap||e.transmission)&&e.rendererExtensionShaderTextureLod?"#extension GL_EXT_shader_texture_lod : enable":""].filter(To).join("\n")}(i),m=function(e){const t=[];for(const i in e){const n=e[i];!1!==n&&t.push("#define "+i+" "+n)}return t.join("\n")}(s),f=r.createProgram();let g,_,v=i.glslVersion?"#version "+i.glslVersion+"\n":"";i.isRawShaderMaterial?(g=[m].filter(To).join("\n"),g.length>0&&(g+="\n"),_=[p,m].filter(To).join("\n"),_.length>0&&(_+="\n")):(g=[ko(i),"#define SHADER_NAME "+i.shaderName,m,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.specularIntensityMap?"#define USE_SPECULARINTENSITYMAP":"",i.specularColorMap?"#define USE_SPECULARCOLORMAP":"",i.roughnessMap?"#define USE_ROUGHNESSMAP":"",i.metalnessMap?"#define USE_METALNESSMAP":"",i.alphaMap?"#define USE_ALPHAMAP":"",i.transmission?"#define USE_TRANSMISSION":"",i.transmissionMap?"#define USE_TRANSMISSIONMAP":"",i.thicknessMap?"#define USE_THICKNESSMAP":"",i.sheenColorMap?"#define USE_SHEENCOLORMAP":"",i.sheenRoughnessMap?"#define USE_SHEENROUGHNESSMAP":"",i.vertexTangents?"#define USE_TANGENT":"",i.vertexColors?"#define USE_COLOR":"",i.vertexAlphas?"#define USE_COLOR_ALPHA":"",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.morphTargets&&i.isWebGL2?"#define MORPHTARGETS_TEXTURE":"",i.morphTargets&&i.isWebGL2?"#define MORPHTARGETS_COUNT "+i.morphTargetsCount:"",i.doubleSided?"#define DOUBLE_SIDED":"",i.flipSided?"#define FLIP_SIDED":"",i.shadowMapEnabled?"#define USE_SHADOWMAP":"",i.shadowMapEnabled?"#define "+h:"",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","#if defined( USE_COLOR_ALPHA )","\tattribute vec4 color;","#elif defined( USE_COLOR )","\tattribute vec3 color;","#endif","#if ( defined( USE_MORPHTARGETS ) && ! defined( MORPHTARGETS_TEXTURE ) )","\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(To).join("\n"),_=[p,ko(i),"#define SHADER_NAME "+i.shaderName,m,"#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 "+c:"",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.clearcoat?"#define USE_CLEARCOAT":"",i.clearcoatMap?"#define USE_CLEARCOATMAP":"",i.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",i.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",i.specularMap?"#define USE_SPECULARMAP":"",i.specularIntensityMap?"#define USE_SPECULARINTENSITYMAP":"",i.specularColorMap?"#define USE_SPECULARCOLORMAP":"",i.roughnessMap?"#define USE_ROUGHNESSMAP":"",i.metalnessMap?"#define USE_METALNESSMAP":"",i.alphaMap?"#define USE_ALPHAMAP":"",i.alphaTest?"#define USE_ALPHATEST":"",i.sheen?"#define USE_SHEEN":"",i.sheenColorMap?"#define USE_SHEENCOLORMAP":"",i.sheenRoughnessMap?"#define USE_SHEENROUGHNESSMAP":"",i.transmission?"#define USE_TRANSMISSION":"",i.transmissionMap?"#define USE_TRANSMISSIONMAP":"",i.thicknessMap?"#define USE_THICKNESSMAP":"",i.vertexTangents?"#define USE_TANGENT":"",i.vertexColors||i.instancingColor?"#define USE_COLOR":"",i.vertexAlphas?"#define USE_COLOR_ALPHA":"",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 "+h:"",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?Ms.tonemapping_pars_fragment:"",0!==i.toneMapping?So("toneMapping",i.toneMapping):"",i.dithering?"#define DITHERING":"",i.format===ai?"#define OPAQUE":"",Ms.encodings_pars_fragment,i.map?wo("mapTexelToLinear",i.mapEncoding):"",i.matcap?wo("matcapTexelToLinear",i.matcapEncoding):"",i.envMap?wo("envMapTexelToLinear",i.envMapEncoding):"",i.emissiveMap?wo("emissiveMapTexelToLinear",i.emissiveMapEncoding):"",i.specularColorMap?wo("specularColorMapTexelToLinear",i.specularColorMapEncoding):"",i.sheenColorMap?wo("sheenColorMapTexelToLinear",i.sheenColorMapEncoding):"",i.lightMap?wo("lightMapTexelToLinear",i.lightMapEncoding):"",Mo("linearToOutputTexel",i.outputEncoding),i.depthPacking?"#define DEPTH_PACKING "+i.depthPacking:"","\n"].filter(To).join("\n")),a=Io(a),a=Co(a,i),a=Eo(a,i),o=Io(o),o=Co(o,i),o=Eo(o,i),a=Do(a),o=Do(o),i.isWebGL2&&!0!==i.isRawShaderMaterial&&(v="#version 300 es\n",g=["precision mediump sampler2DArray;","#define attribute in","#define varying out","#define texture2D texture"].join("\n")+"\n"+g,_=["#define varying in",i.glslVersion===Si?"":"out highp vec4 pc_fragColor;",i.glslVersion===Si?"":"#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+_+o,b=vo(r,35633,v+g+a),x=vo(r,35632,y);if(r.attachShader(f,b),r.attachShader(f,x),void 0!==i.index0AttributeName?r.bindAttribLocation(f,0,i.index0AttributeName):!0===i.morphTargets&&r.bindAttribLocation(f,0,"position"),r.linkProgram(f),e.debug.checkShaderErrors){const e=r.getProgramInfoLog(f).trim(),t=r.getShaderInfoLog(b).trim(),i=r.getShaderInfoLog(x).trim();let n=!0,s=!0;if(!1===r.getProgramParameter(f,35714)){n=!1;const t=xo(r,b,"vertex"),i=xo(r,x,"fragment");console.error("THREE.WebGLProgram: Shader Error "+r.getError()+" - VALIDATE_STATUS "+r.getProgramParameter(f,35715)+"\n\nProgram Info Log: "+e+"\n"+t+"\n"+i)}else""!==e?console.warn("THREE.WebGLProgram: Program Info Log:",e):""!==t&&""!==i||(s=!1);s&&(this.diagnostics={runnable:n,programLog:e,vertexShader:{log:t,prefix:g},fragmentShader:{log:i,prefix:_}})}let w,M;return r.deleteShader(b),r.deleteShader(x),this.getUniforms=function(){return void 0===w&&(w=new _o(r,f)),w},this.getAttributes=function(){return void 0===M&&(M=function(e,t){const i={},n=e.getProgramParameter(t,35721);for(let r=0;r<n;r++){const n=e.getActiveAttrib(t,r),s=n.name;let a=1;35674===n.type&&(a=2),35675===n.type&&(a=3),35676===n.type&&(a=4),i[s]={type:n.type,location:e.getAttribLocation(t,s),locationSize:a}}return i}(r,f)),M},this.destroy=function(){n.releaseStatesOfProgram(this),r.deleteProgram(f),this.program=void 0},this.name=i.shaderName,this.id=yo++,this.cacheKey=t,this.usedTimes=1,this.program=f,this.vertexShader=b,this.fragmentShader=x,this}function zo(e,t,i,n,r,s,a){const o=[],h=r.isWebGL2,c=r.logarithmicDepthBuffer,l=r.floatVertexTextures,u=r.maxVertexUniforms,d=r.vertexTextures;let p=r.precision;const m={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","clearcoat","clearcoatMap","clearcoatRoughnessMap","clearcoatNormalMap","displacementMap","specularMap",,"roughnessMap","metalnessMap","gradientMap","alphaMap","alphaTest","combine","vertexColors","vertexAlphas","vertexTangents","vertexUvs","uvsVertexOnly","fog","useFog","fogExp2","flatShading","sizeAttenuation","logarithmicDepthBuffer","skinning","maxBones","useVertexTexture","morphTargets","morphNormals","morphTargetsCount","premultipliedAlpha","numDirLights","numPointLights","numSpotLights","numHemiLights","numRectAreaLights","numDirLightShadows","numPointLightShadows","numSpotLightShadows","shadowMapEnabled","shadowMapType","toneMapping","physicallyCorrectLights","doubleSided","flipSided","numClippingPlanes","numClipIntersection","depthPacking","dithering","format","specularIntensityMap","specularColorMap","specularColorMapEncoding","transmission","transmissionMap","thicknessMap","sheen","sheenColorMap","sheenColorMapEncoding","sheenRoughnessMap"];function g(e){let t;return e&&e.isTexture?t=e.encoding:e&&e.isWebGLRenderTarget?(console.warn("THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead."),t=e.texture.encoding):t=_i,h&&e&&e.isTexture&&e.format===oi&&e.type===ei&&e.encoding===vi&&(t=_i),t}return{getParameters:function(s,o,f,_,v){const y=_.fog,b=s.isMeshStandardMaterial?_.environment:null,x=(s.isMeshStandardMaterial?i:t).get(s.envMap||b),w=m[s.type],M=v.isSkinnedMesh?function(e){const t=e.skeleton.bones;if(l)return 1024;{const e=u,i=Math.floor((e-20)/4),n=Math.min(i,t.length);return n<t.length?(console.warn("THREE.WebGLRenderer: Skeleton has "+t.length+" bones. This GPU supports "+n+"."),0):n}}(v):0;let S,T;if(null!==s.precision&&(p=r.getMaxPrecision(s.precision),p!==s.precision&&console.warn("THREE.WebGLProgram.getParameters:",s.precision,"not supported, using",p,"instead.")),w){const e=Ts[w];S=e.vertexShader,T=e.fragmentShader}else S=s.vertexShader,T=s.fragmentShader;const C=e.getRenderTarget(),E=s.alphaTest>0,A=s.clearcoat>0;return{isWebGL2:h,shaderID:w,shaderName:s.type,vertexShader:S,fragmentShader:T,defines:s.defines,isRawShaderMaterial:!0===s.isRawShaderMaterial,glslVersion:s.glslVersion,precision:p,instancing:!0===v.isInstancedMesh,instancingColor:!0===v.isInstancedMesh&&null!==v.instanceColor,supportsVertexTextures:d,outputEncoding:null!==C?g(C.texture):e.outputEncoding,map:!!s.map,mapEncoding:g(s.map),matcap:!!s.matcap,matcapEncoding:g(s.matcap),envMap:!!x,envMapMode:x&&x.mapping,envMapEncoding:g(x),envMapCubeUV:!!x&&(x.mapping===qt||307===x.mapping),lightMap:!!s.lightMap,lightMapEncoding:g(s.lightMap),aoMap:!!s.aoMap,emissiveMap:!!s.emissiveMap,emissiveMapEncoding:g(s.emissiveMap),bumpMap:!!s.bumpMap,normalMap:!!s.normalMap,objectSpaceNormalMap:1===s.normalMapType,tangentSpaceNormalMap:0===s.normalMapType,clearcoat:A,clearcoatMap:A&&!!s.clearcoatMap,clearcoatRoughnessMap:A&&!!s.clearcoatRoughnessMap,clearcoatNormalMap:A&&!!s.clearcoatNormalMap,displacementMap:!!s.displacementMap,roughnessMap:!!s.roughnessMap,metalnessMap:!!s.metalnessMap,specularMap:!!s.specularMap,specularIntensityMap:!!s.specularIntensityMap,specularColorMap:!!s.specularColorMap,specularColorMapEncoding:g(s.specularColorMap),alphaMap:!!s.alphaMap,alphaTest:E,gradientMap:!!s.gradientMap,sheen:s.sheen>0,sheenColorMap:!!s.sheenColorMap,sheenColorMapEncoding:g(s.sheenColorMap),sheenRoughnessMap:!!s.sheenRoughnessMap,transmission:s.transmission>0,transmissionMap:!!s.transmissionMap,thicknessMap:!!s.thicknessMap,combine:s.combine,vertexTangents:!!s.normalMap&&!!v.geometry&&!!v.geometry.attributes.tangent,vertexColors:s.vertexColors,vertexAlphas:!0===s.vertexColors&&!!v.geometry&&!!v.geometry.attributes.color&&4===v.geometry.attributes.color.itemSize,vertexUvs:!!s.map||!!s.bumpMap||!!s.normalMap||!!s.specularMap||!!s.alphaMap||!!s.emissiveMap||!!s.roughnessMap||!!s.metalnessMap||!!s.clearcoatMap||!!s.clearcoatRoughnessMap||!!s.clearcoatNormalMap||!!s.displacementMap||!!s.transmissionMap||!!s.thicknessMap||!!s.specularIntensityMap||!!s.specularColorMap||!!s.sheenColorMap||s.sheenRoughnessMap,uvsVertexOnly:!(s.map||s.bumpMap||s.normalMap||s.specularMap||s.alphaMap||s.emissiveMap||s.roughnessMap||s.metalnessMap||s.clearcoatNormalMap||s.transmission>0||s.transmissionMap||s.thicknessMap||s.specularIntensityMap||s.specularColorMap||!!s.sheen>0||s.sheenColorMap||s.sheenRoughnessMap||!s.displacementMap),fog:!!y,useFog:s.fog,fogExp2:y&&y.isFogExp2,flatShading:!!s.flatShading,sizeAttenuation:s.sizeAttenuation,logarithmicDepthBuffer:c,skinning:!0===v.isSkinnedMesh&&M>0,maxBones:M,useVertexTexture:l,morphTargets:!!v.geometry&&!!v.geometry.morphAttributes.position,morphNormals:!!v.geometry&&!!v.geometry.morphAttributes.normal,morphTargetsCount:v.geometry&&v.geometry.morphAttributes.position?v.geometry.morphAttributes.position.length:0,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:a.numPlanes,numClipIntersection:a.numIntersection,format:s.format,dithering:s.dithering,shadowMapEnabled:e.shadowMap.enabled&&f.length>0,shadowMapType:e.shadowMap.type,toneMapping:s.toneMapped?e.toneMapping:0,physicallyCorrectLights:e.physicallyCorrectLights,premultipliedAlpha:s.premultipliedAlpha,doubleSided:2===s.side,flipSided:1===s.side,depthPacking:void 0!==s.depthPacking&&s.depthPacking,index0AttributeName:s.index0AttributeName,extensionDerivatives:s.extensions&&s.extensions.derivatives,extensionFragDepth:s.extensions&&s.extensions.fragDepth,extensionDrawBuffers:s.extensions&&s.extensions.drawBuffers,extensionShaderTextureLOD:s.extensions&&s.extensions.shaderTextureLOD,rendererExtensionFragDepth:h||n.has("EXT_frag_depth"),rendererExtensionDrawBuffers:h||n.has("WEBGL_draw_buffers"),rendererExtensionShaderTextureLod:h||n.has("EXT_shader_texture_lod"),customProgramCacheKey:s.customProgramCacheKey()}},getProgramCacheKey:function(t){const i=[];if(t.shaderID?i.push(t.shaderID):(i.push(Vi(t.fragmentShader)),i.push(Vi(t.vertexShader))),void 0!==t.defines)for(const e in t.defines)i.push(e),i.push(t.defines[e]);if(!1===t.isRawShaderMaterial){for(let e=0;e<f.length;e++)i.push(t[f[e]]);i.push(e.outputEncoding),i.push(e.gammaFactor)}return i.push(t.customProgramCacheKey),i.join()},getUniforms:function(e){const t=m[e.type];let i;if(t){const e=Ts[t];i=ss.clone(e.uniforms)}else i=e.uniforms;return i},acquireProgram:function(t,i){let n;for(let e=0,t=o.length;e<t;e++){const t=o[e];if(t.cacheKey===i){n=t,++n.usedTimes;break}}return void 0===n&&(n=new Oo(e,i,t,s),o.push(n)),n},releaseProgram:function(e){if(0==--e.usedTimes){const t=o.indexOf(e);o[t]=o[o.length-1],o.pop(),e.destroy()}},programs:o}}function Fo(){let e=new WeakMap;return{get:function(t){let i=e.get(t);return void 0===i&&(i={},e.set(t,i)),i},remove:function(t){e.delete(t)},update:function(t,i,n){e.get(t)[i]=n},dispose:function(){e=new WeakMap}}}function Bo(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.program!==t.program?e.program.id-t.program.id:e.material.id!==t.material.id?e.material.id-t.material.id:e.z!==t.z?e.z-t.z:e.id-t.id}function Uo(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.z!==t.z?t.z-e.z:e.id-t.id}function Vo(e){const t=[];let i=0;const n=[],r=[],s=[],a={id:-1};function o(n,r,s,o,h,c){let l=t[i];const u=e.get(s);return void 0===l?(l={id:n.id,object:n,geometry:r,material:s,program:u.program||a,groupOrder:o,renderOrder:n.renderOrder,z:h,group:c},t[i]=l):(l.id=n.id,l.object=n,l.geometry=r,l.material=s,l.program=u.program||a,l.groupOrder=o,l.renderOrder=n.renderOrder,l.z=h,l.group=c),i++,l}return{opaque:n,transmissive:r,transparent:s,init:function(){i=0,n.length=0,r.length=0,s.length=0},push:function(e,t,i,a,h,c){const l=o(e,t,i,a,h,c);i.transmission>0?r.push(l):!0===i.transparent?s.push(l):n.push(l)},unshift:function(e,t,i,a,h,c){const l=o(e,t,i,a,h,c);i.transmission>0?r.unshift(l):!0===i.transparent?s.unshift(l):n.unshift(l)},finish:function(){for(let e=i,n=t.length;e<n;e++){const i=t[e];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(e,t){n.length>1&&n.sort(e||Bo),r.length>1&&r.sort(t||Uo),s.length>1&&s.sort(t||Uo)}}}function Ho(e){let t=new WeakMap;return{get:function(i,n){let r;return!1===t.has(i)?(r=new Vo(e),t.set(i,[r])):n>=t.get(i).length?(r=new Vo(e),t.get(i).push(r)):r=t.get(i)[n],r},dispose:function(){t=new WeakMap}}}function jo(){const e={};return{get:function(t){if(void 0!==e[t.id])return e[t.id];let i;switch(t.type){case"DirectionalLight":i={direction:new Ki,color:new xr};break;case"SpotLight":i={position:new Ki,direction:new Ki,color:new xr,distance:0,coneCos:0,penumbraCos:0,decay:0};break;case"PointLight":i={position:new Ki,color:new xr,distance:0,decay:0};break;case"HemisphereLight":i={direction:new Ki,skyColor:new xr,groundColor:new xr};break;case"RectAreaLight":i={color:new xr,position:new Ki,halfWidth:new Ki,halfHeight:new Ki}}return e[t.id]=i,i}}}let Go=0;function Wo(e,t){return(t.castShadow?1:0)-(e.castShadow?1:0)}function qo(e,t){const i=new jo,n=function(){const e={};return{get:function(t){if(void 0!==e[t.id])return e[t.id];let i;switch(t.type){case"DirectionalLight":case"SpotLight":i={shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new zi};break;case"PointLight":i={shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new zi,shadowCameraNear:1,shadowCameraFar:1e3}}return e[t.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 e=0;e<9;e++)r.probe.push(new Ki);const s=new Ki,a=new Rn,o=new Rn;return{setup:function(s,a){let o=0,h=0,c=0;for(let e=0;e<9;e++)r.probe[e].set(0,0,0);let l=0,u=0,d=0,p=0,m=0,f=0,g=0,_=0;s.sort(Wo);const v=!0!==a?Math.PI:1;for(let e=0,t=s.length;e<t;e++){const t=s[e],a=t.color,y=t.intensity,b=t.distance,x=t.shadow&&t.shadow.map?t.shadow.map.texture:null;if(t.isAmbientLight)o+=a.r*y*v,h+=a.g*y*v,c+=a.b*y*v;else if(t.isLightProbe)for(let e=0;e<9;e++)r.probe[e].addScaledVector(t.sh.coefficients[e],y);else if(t.isDirectionalLight){const e=i.get(t);if(e.color.copy(t.color).multiplyScalar(t.intensity*v),t.castShadow){const e=t.shadow,i=n.get(t);i.shadowBias=e.bias,i.shadowNormalBias=e.normalBias,i.shadowRadius=e.radius,i.shadowMapSize=e.mapSize,r.directionalShadow[l]=i,r.directionalShadowMap[l]=x,r.directionalShadowMatrix[l]=t.shadow.matrix,f++}r.directional[l]=e,l++}else if(t.isSpotLight){const e=i.get(t);if(e.position.setFromMatrixPosition(t.matrixWorld),e.color.copy(a).multiplyScalar(y*v),e.distance=b,e.coneCos=Math.cos(t.angle),e.penumbraCos=Math.cos(t.angle*(1-t.penumbra)),e.decay=t.decay,t.castShadow){const e=t.shadow,i=n.get(t);i.shadowBias=e.bias,i.shadowNormalBias=e.normalBias,i.shadowRadius=e.radius,i.shadowMapSize=e.mapSize,r.spotShadow[d]=i,r.spotShadowMap[d]=x,r.spotShadowMatrix[d]=t.shadow.matrix,_++}r.spot[d]=e,d++}else if(t.isRectAreaLight){const e=i.get(t);e.color.copy(a).multiplyScalar(y),e.halfWidth.set(.5*t.width,0,0),e.halfHeight.set(0,.5*t.height,0),r.rectArea[p]=e,p++}else if(t.isPointLight){const e=i.get(t);if(e.color.copy(t.color).multiplyScalar(t.intensity*v),e.distance=t.distance,e.decay=t.decay,t.castShadow){const e=t.shadow,i=n.get(t);i.shadowBias=e.bias,i.shadowNormalBias=e.normalBias,i.shadowRadius=e.radius,i.shadowMapSize=e.mapSize,i.shadowCameraNear=e.camera.near,i.shadowCameraFar=e.camera.far,r.pointShadow[u]=i,r.pointShadowMap[u]=x,r.pointShadowMatrix[u]=t.shadow.matrix,g++}r.point[u]=e,u++}else if(t.isHemisphereLight){const e=i.get(t);e.skyColor.copy(t.color).multiplyScalar(y*v),e.groundColor.copy(t.groundColor).multiplyScalar(y*v),r.hemi[m]=e,m++}}p>0&&(t.isWebGL2||!0===e.has("OES_texture_float_linear")?(r.rectAreaLTC1=Ss.LTC_FLOAT_1,r.rectAreaLTC2=Ss.LTC_FLOAT_2):!0===e.has("OES_texture_half_float_linear")?(r.rectAreaLTC1=Ss.LTC_HALF_1,r.rectAreaLTC2=Ss.LTC_HALF_2):console.error("THREE.WebGLRenderer: Unable to use RectAreaLight. Missing WebGL extensions.")),r.ambient[0]=o,r.ambient[1]=h,r.ambient[2]=c;const y=r.hash;y.directionalLength===l&&y.pointLength===u&&y.spotLength===d&&y.rectAreaLength===p&&y.hemiLength===m&&y.numDirectionalShadows===f&&y.numPointShadows===g&&y.numSpotShadows===_||(r.directional.length=l,r.spot.length=d,r.rectArea.length=p,r.point.length=u,r.hemi.length=m,r.directionalShadow.length=f,r.directionalShadowMap.length=f,r.pointShadow.length=g,r.pointShadowMap.length=g,r.spotShadow.length=_,r.spotShadowMap.length=_,r.directionalShadowMatrix.length=f,r.pointShadowMatrix.length=g,r.spotShadowMatrix.length=_,y.directionalLength=l,y.pointLength=u,y.spotLength=d,y.rectAreaLength=p,y.hemiLength=m,y.numDirectionalShadows=f,y.numPointShadows=g,y.numSpotShadows=_,r.version=Go++)},setupView:function(e,t){let i=0,n=0,h=0,c=0,l=0;const u=t.matrixWorldInverse;for(let t=0,d=e.length;t<d;t++){const d=e[t];if(d.isDirectionalLight){const e=r.directional[i];e.direction.setFromMatrixPosition(d.matrixWorld),s.setFromMatrixPosition(d.target.matrixWorld),e.direction.sub(s),e.direction.transformDirection(u),i++}else if(d.isSpotLight){const e=r.spot[h];e.position.setFromMatrixPosition(d.matrixWorld),e.position.applyMatrix4(u),e.direction.setFromMatrixPosition(d.matrixWorld),s.setFromMatrixPosition(d.target.matrixWorld),e.direction.sub(s),e.direction.transformDirection(u),h++}else if(d.isRectAreaLight){const e=r.rectArea[c];e.position.setFromMatrixPosition(d.matrixWorld),e.position.applyMatrix4(u),o.identity(),a.copy(d.matrixWorld),a.premultiply(u),o.extractRotation(a),e.halfWidth.set(.5*d.width,0,0),e.halfHeight.set(0,.5*d.height,0),e.halfWidth.applyMatrix4(o),e.halfHeight.applyMatrix4(o),c++}else if(d.isPointLight){const e=r.point[n];e.position.setFromMatrixPosition(d.matrixWorld),e.position.applyMatrix4(u),n++}else if(d.isHemisphereLight){const e=r.hemi[l];e.direction.setFromMatrixPosition(d.matrixWorld),e.direction.transformDirection(u),e.direction.normalize(),l++}}},state:r}}function Xo(e,t){const i=new qo(e,t),n=[],r=[];return{init:function(){n.length=0,r.length=0},state:{lightsArray:n,shadowsArray:r,lights:i},setupLights:function(e){i.setup(n,e)},setupLightsView:function(e){i.setupView(n,e)},pushLight:function(e){n.push(e)},pushShadow:function(e){r.push(e)}}}function Zo(e,t){let i=new WeakMap;return{get:function(n,r=0){let s;return!1===i.has(n)?(s=new Xo(e,t),i.set(n,[s])):r>=i.get(n).length?(s=new Xo(e,t),i.get(n).push(s)):s=i.get(n)[r],s},dispose:function(){i=new WeakMap}}}class Yo extends mr{constructor(e){super(),this.type="MeshDepthMaterial",this.depthPacking=3200,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(e)}copy(e){return super.copy(e),this.depthPacking=e.depthPacking,this.map=e.map,this.alphaMap=e.alphaMap,this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this}}Yo.prototype.isMeshDepthMaterial=!0;class Jo extends mr{constructor(e){super(),this.type="MeshDistanceMaterial",this.referencePosition=new Ki,this.nearDistance=1,this.farDistance=1e3,this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.fog=!1,this.setValues(e)}copy(e){return super.copy(e),this.referencePosition.copy(e.referencePosition),this.nearDistance=e.nearDistance,this.farDistance=e.farDistance,this.map=e.map,this.alphaMap=e.alphaMap,this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this}}Jo.prototype.isMeshDistanceMaterial=!0;function Ko(e,t,i){let n=new ys;const r=new zi,s=new zi,a=new Xi,o=new Yo({depthPacking:3201}),h=new Jo,c={},l=i.maxTextureSize,u={0:1,1:0,2:2},d=new as({defines:{VSM_SAMPLES:8},uniforms:{shadow_pass:{value:null},resolution:{value:new zi},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\tconst float samples = float( VSM_SAMPLES );\n\tfloat mean = 0.0;\n\tfloat squared_mean = 0.0;\n\tfloat uvStride = samples <= 1.0 ? 0.0 : 2.0 / ( samples - 1.0 );\n\tfloat uvStart = samples <= 1.0 ? 0.0 : - 1.0;\n\tfor ( float i = 0.0; i < samples; i ++ ) {\n\t\tfloat uvOffset = uvStart + i * uvStride;\n\t\t#ifdef HORIZONTAL_PASS\n\t\t\tvec2 distribution = unpackRGBATo2Half( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 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, uvOffset ) * radius ) / resolution ) );\n\t\t\tmean += depth;\n\t\t\tsquared_mean += depth * depth;\n\t\t#endif\n\t}\n\tmean = mean / samples;\n\tsquared_mean = squared_mean / samples;\n\tfloat std_dev = sqrt( squared_mean - mean * mean );\n\tgl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) );\n}"}),p=d.clone();p.defines.HORIZONTAL_PASS=1;const m=new kr;m.setAttribute("position",new Tr(new Float32Array([-1,-1,.5,3,-1,.5,-1,3,.5]),3));const f=new es(m,d),g=this;function _(i,n){const r=t.update(f);d.defines.VSM_SAMPLES!==i.blurSamples&&(d.defines.VSM_SAMPLES=i.blurSamples,p.defines.VSM_SAMPLES=i.blurSamples,d.needsUpdate=!0,p.needsUpdate=!0),d.uniforms.shadow_pass.value=i.map.texture,d.uniforms.resolution.value=i.mapSize,d.uniforms.radius.value=i.radius,e.setRenderTarget(i.mapPass),e.clear(),e.renderBufferDirect(n,null,r,d,f,null),p.uniforms.shadow_pass.value=i.mapPass.texture,p.uniforms.resolution.value=i.mapSize,p.uniforms.radius.value=i.radius,e.setRenderTarget(i.map),e.clear(),e.renderBufferDirect(n,null,r,p,f,null)}function v(t,i,n,r,s,a,l){let d=null;const p=!0===r.isPointLight?t.customDistanceMaterial:t.customDepthMaterial;if(d=void 0!==p?p:!0===r.isPointLight?h:o,e.localClippingEnabled&&!0===n.clipShadows&&0!==n.clippingPlanes.length||n.displacementMap&&0!==n.displacementScale||n.alphaMap&&n.alphaTest>0){const e=d.uuid,t=n.uuid;let i=c[e];void 0===i&&(i={},c[e]=i);let r=i[t];void 0===r&&(r=d.clone(),i[t]=r),d=r}return d.visible=n.visible,d.wireframe=n.wireframe,d.side=3===l?null!==n.shadowSide?n.shadowSide:n.side:null!==n.shadowSide?n.shadowSide:u[n.side],d.alphaMap=n.alphaMap,d.alphaTest=n.alphaTest,d.clipShadows=n.clipShadows,d.clippingPlanes=n.clippingPlanes,d.clipIntersection=n.clipIntersection,d.displacementMap=n.displacementMap,d.displacementScale=n.displacementScale,d.displacementBias=n.displacementBias,d.wireframeLinewidth=n.wireframeLinewidth,d.linewidth=n.linewidth,!0===r.isPointLight&&!0===d.isMeshDistanceMaterial&&(d.referencePosition.setFromMatrixPosition(r.matrixWorld),d.nearDistance=s,d.farDistance=a),d}function y(i,r,s,a,o){if(!1===i.visible)return;if(i.layers.test(r.layers)&&(i.isMesh||i.isLine||i.isPoints)&&(i.castShadow||i.receiveShadow&&3===o)&&(!i.frustumCulled||n.intersectsObject(i))){i.modelViewMatrix.multiplyMatrices(s.matrixWorldInverse,i.matrixWorld);const n=t.update(i),r=i.material;if(Array.isArray(r)){const t=n.groups;for(let h=0,c=t.length;h<c;h++){const c=t[h],l=r[c.materialIndex];if(l&&l.visible){const t=v(i,0,l,a,s.near,s.far,o);e.renderBufferDirect(s,null,n,t,i,c)}}}else if(r.visible){const t=v(i,0,r,a,s.near,s.far,o);e.renderBufferDirect(s,null,n,t,i,null)}}const h=i.children;for(let e=0,t=h.length;e<t;e++)y(h[e],r,s,a,o)}this.enabled=!1,this.autoUpdate=!0,this.needsUpdate=!1,this.type=1,this.render=function(t,i,o){if(!1===g.enabled)return;if(!1===g.autoUpdate&&!1===g.needsUpdate)return;if(0===t.length)return;const h=e.getRenderTarget(),c=e.getActiveCubeFace(),u=e.getActiveMipmapLevel(),d=e.state;d.setBlending(0),d.buffers.color.setClear(1,1,1,1),d.buffers.depth.setTest(!0),d.setScissorTest(!1);for(let h=0,c=t.length;h<c;h++){const c=t[h],u=c.shadow;if(void 0===u){console.warn("THREE.WebGLShadowMap:",c,"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>l||r.y>l)&&(r.x>l&&(s.x=Math.floor(l/p.x),r.x=s.x*p.x,u.mapSize.x=s.x),r.y>l&&(s.y=Math.floor(l/p.y),r.y=s.y*p.y,u.mapSize.y=s.y)),null===u.map&&!u.isPointLightShadow&&3===this.type){const e={minFilter:Kt,magFilter:Kt,format:oi};u.map=new Zi(r.x,r.y,e),u.map.texture.name=c.name+".shadowMap",u.mapPass=new Zi(r.x,r.y,e),u.camera.updateProjectionMatrix()}if(null===u.map){const e={minFilter:Jt,magFilter:Jt,format:oi};u.map=new Zi(r.x,r.y,e),u.map.texture.name=c.name+".shadowMap",u.camera.updateProjectionMatrix()}e.setRenderTarget(u.map),e.clear();const m=u.getViewportCount();for(let e=0;e<m;e++){const t=u.getViewport(e);a.set(s.x*t.x,s.y*t.y,s.x*t.z,s.y*t.w),d.viewport(a),u.updateMatrices(c,e),n=u.getFrustum(),y(i,o,u.camera,c,this.type)}u.isPointLightShadow||3!==this.type||_(u,o),u.needsUpdate=!1}g.needsUpdate=!1,e.setRenderTarget(h,c,u)}}function Qo(e,t,i){const n=i.isWebGL2;const r=new function(){let t=!1;const i=new Xi;let n=null;const r=new Xi(0,0,0,0);return{setMask:function(i){n===i||t||(e.colorMask(i,i,i,i),n=i)},setLocked:function(e){t=e},setClear:function(t,n,s,a,o){!0===o&&(t*=a,n*=a,s*=a),i.set(t,n,s,a),!1===r.equals(i)&&(e.clearColor(t,n,s,a),r.copy(i))},reset:function(){t=!1,n=null,r.set(-1,0,0,0)}}},s=new function(){let t=!1,i=null,n=null,r=null;return{setTest:function(e){e?O(2929):z(2929)},setMask:function(n){i===n||t||(e.depthMask(n),i=n)},setFunc:function(t){if(n!==t){if(t)switch(t){case 0:e.depthFunc(512);break;case 1:e.depthFunc(519);break;case 2:e.depthFunc(513);break;case 3:e.depthFunc(515);break;case 4:e.depthFunc(514);break;case 5:e.depthFunc(518);break;case 6:e.depthFunc(516);break;case 7:e.depthFunc(517);break;default:e.depthFunc(515)}else e.depthFunc(515);n=t}},setLocked:function(e){t=e},setClear:function(t){r!==t&&(e.clearDepth(t),r=t)},reset:function(){t=!1,i=null,n=null,r=null}}},a=new function(){let t=!1,i=null,n=null,r=null,s=null,a=null,o=null,h=null,c=null;return{setTest:function(e){t||(e?O(2960):z(2960))},setMask:function(n){i===n||t||(e.stencilMask(n),i=n)},setFunc:function(t,i,a){n===t&&r===i&&s===a||(e.stencilFunc(t,i,a),n=t,r=i,s=a)},setOp:function(t,i,n){a===t&&o===i&&h===n||(e.stencilOp(t,i,n),a=t,o=i,h=n)},setLocked:function(e){t=e},setClear:function(t){c!==t&&(e.clearStencil(t),c=t)},reset:function(){t=!1,i=null,n=null,r=null,s=null,a=null,o=null,h=null,c=null}}};let o={},h=null,c={},l=null,u=!1,d=null,p=null,m=null,f=null,g=null,_=null,v=null,y=!1,b=null,x=null,w=null,M=null,S=null;const T=e.getParameter(35661);let C=!1,E=0;const A=e.getParameter(7938);-1!==A.indexOf("WebGL")?(E=parseFloat(/^WebGL (\d)/.exec(A)[1]),C=E>=1):-1!==A.indexOf("OpenGL ES")&&(E=parseFloat(/^OpenGL ES (\d)/.exec(A)[1]),C=E>=2);let I=null,R={};const P=e.getParameter(3088),L=e.getParameter(2978),D=(new Xi).fromArray(P),N=(new Xi).fromArray(L);function $(t,i,n){const r=new Uint8Array(4),s=e.createTexture();e.bindTexture(t,s),e.texParameteri(t,10241,9728),e.texParameteri(t,10240,9728);for(let t=0;t<n;t++)e.texImage2D(i+t,0,6408,1,1,0,6408,5121,r);return s}const k={};function O(t){!0!==o[t]&&(e.enable(t),o[t]=!0)}function z(t){!1!==o[t]&&(e.disable(t),o[t]=!1)}k[3553]=$(3553,3553,1),k[34067]=$(34067,34069,6),r.setClear(0,0,0,1),s.setClear(1),a.setClear(0),O(2929),s.setFunc(3),V(!1),H(1),O(2884),U(0);const F={[jt]:32774,101:32778,102:32779};if(n)F[103]=32775,F[104]=32776;else{const e=t.get("EXT_blend_minmax");null!==e&&(F[103]=e.MIN_EXT,F[104]=e.MAX_EXT)}const B={200:0,201:1,202:768,204:770,210:776,208:774,206:772,203:769,205:771,209:775,207:773};function U(t,i,n,r,s,a,o,h){if(0!==t){if(!1===u&&(O(3042),u=!0),5===t)s=s||i,a=a||n,o=o||r,i===p&&s===g||(e.blendEquationSeparate(F[i],F[s]),p=i,g=s),n===m&&r===f&&a===_&&o===v||(e.blendFuncSeparate(B[n],B[r],B[a],B[o]),m=n,f=r,_=a,v=o),d=t,y=null;else if(t!==d||h!==y){if(p===jt&&g===jt||(e.blendEquation(32774),p=jt,g=jt),h)switch(t){case 1:e.blendFuncSeparate(1,771,1,771);break;case 2:e.blendFunc(1,1);break;case 3:e.blendFuncSeparate(0,0,769,771);break;case 4:e.blendFuncSeparate(0,768,0,770);break;default:console.error("THREE.WebGLState: Invalid blending: ",t)}else switch(t){case 1:e.blendFuncSeparate(770,771,1,771);break;case 2:e.blendFunc(770,1);break;case 3:e.blendFunc(0,769);break;case 4:e.blendFunc(0,768);break;default:console.error("THREE.WebGLState: Invalid blending: ",t)}m=null,f=null,_=null,v=null,d=t,y=h}}else!0===u&&(z(3042),u=!1)}function V(t){b!==t&&(t?e.frontFace(2304):e.frontFace(2305),b=t)}function H(t){0!==t?(O(2884),t!==x&&(1===t?e.cullFace(1029):2===t?e.cullFace(1028):e.cullFace(1032))):z(2884),x=t}function j(t,i,n){t?(O(32823),M===i&&S===n||(e.polygonOffset(i,n),M=i,S=n)):z(32823)}function G(t){void 0===t&&(t=33984+T-1),I!==t&&(e.activeTexture(t),I=t)}return{buffers:{color:r,depth:s,stencil:a},enable:O,disable:z,bindFramebuffer:function(t,i){return null===i&&null!==h&&(i=h),c[t]!==i&&(e.bindFramebuffer(t,i),c[t]=i,n&&(36009===t&&(c[36160]=i),36160===t&&(c[36009]=i)),!0)},bindXRFramebuffer:function(t){t!==h&&(e.bindFramebuffer(36160,t),h=t)},useProgram:function(t){return l!==t&&(e.useProgram(t),l=t,!0)},setBlending:U,setMaterial:function(e,t){2===e.side?z(2884):O(2884);let i=1===e.side;t&&(i=!i),V(i),1===e.blending&&!1===e.transparent?U(0):U(e.blending,e.blendEquation,e.blendSrc,e.blendDst,e.blendEquationAlpha,e.blendSrcAlpha,e.blendDstAlpha,e.premultipliedAlpha),s.setFunc(e.depthFunc),s.setTest(e.depthTest),s.setMask(e.depthWrite),r.setMask(e.colorWrite);const n=e.stencilWrite;a.setTest(n),n&&(a.setMask(e.stencilWriteMask),a.setFunc(e.stencilFunc,e.stencilRef,e.stencilFuncMask),a.setOp(e.stencilFail,e.stencilZFail,e.stencilZPass)),j(e.polygonOffset,e.polygonOffsetFactor,e.polygonOffsetUnits),!0===e.alphaToCoverage?O(32926):z(32926)},setFlipSided:V,setCullFace:H,setLineWidth:function(t){t!==w&&(C&&e.lineWidth(t),w=t)},setPolygonOffset:j,setScissorTest:function(e){e?O(3089):z(3089)},activeTexture:G,bindTexture:function(t,i){null===I&&G();let n=R[I];void 0===n&&(n={type:void 0,texture:void 0},R[I]=n),n.type===t&&n.texture===i||(e.bindTexture(t,i||k[t]),n.type=t,n.texture=i)},unbindTexture:function(){const t=R[I];void 0!==t&&void 0!==t.type&&(e.bindTexture(t.type,null),t.type=void 0,t.texture=void 0)},compressedTexImage2D:function(){try{e.compressedTexImage2D.apply(e,arguments)}catch(e){console.error("THREE.WebGLState:",e)}},texImage2D:function(){try{e.texImage2D.apply(e,arguments)}catch(e){console.error("THREE.WebGLState:",e)}},texImage3D:function(){try{e.texImage3D.apply(e,arguments)}catch(e){console.error("THREE.WebGLState:",e)}},scissor:function(t){!1===D.equals(t)&&(e.scissor(t.x,t.y,t.z,t.w),D.copy(t))},viewport:function(t){!1===N.equals(t)&&(e.viewport(t.x,t.y,t.z,t.w),N.copy(t))},reset:function(){e.disable(3042),e.disable(2884),e.disable(2929),e.disable(32823),e.disable(3089),e.disable(2960),e.disable(32926),e.blendEquation(32774),e.blendFunc(1,0),e.blendFuncSeparate(1,0,1,0),e.colorMask(!0,!0,!0,!0),e.clearColor(0,0,0,0),e.depthMask(!0),e.depthFunc(513),e.clearDepth(1),e.stencilMask(4294967295),e.stencilFunc(519,0,4294967295),e.stencilOp(7680,7680,7680),e.clearStencil(0),e.cullFace(1029),e.frontFace(2305),e.polygonOffset(0,0),e.activeTexture(33984),e.bindFramebuffer(36160,null),!0===n&&(e.bindFramebuffer(36009,null),e.bindFramebuffer(36008,null)),e.useProgram(null),e.lineWidth(1),e.scissor(0,0,e.canvas.width,e.canvas.height),e.viewport(0,0,e.canvas.width,e.canvas.height),o={},I=null,R={},h=null,c={},l=null,u=!1,d=null,p=null,m=null,f=null,g=null,_=null,v=null,y=!1,b=null,x=null,w=null,M=null,S=null,D.set(0,0,e.canvas.width,e.canvas.height),N.set(0,0,e.canvas.width,e.canvas.height),r.reset(),s.reset(),a.reset()}}}function eh(e,t,i,n,r,s,a){const o=r.isWebGL2,h=r.maxTextures,c=r.maxCubemapSize,l=r.maxTextureSize,u=r.maxSamples,d=new WeakMap;let p,m=!1;try{m="undefined"!=typeof OffscreenCanvas&&null!==new OffscreenCanvas(1,1).getContext("2d")}catch(e){}function f(e,t){return m?new OffscreenCanvas(e,t):Ui("canvas")}function g(e,t,i,n){let r=1;if((e.width>n||e.height>n)&&(r=n/Math.max(e.width,e.height)),r<1||!0===t){if("undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap){const n=t?ki:Math.floor,s=n(r*e.width),a=n(r*e.height);void 0===p&&(p=f(s,a));const o=i?f(s,a):p;o.width=s,o.height=a;return o.getContext("2d").drawImage(e,0,0,s,a),console.warn("THREE.WebGLRenderer: Texture has been resized from ("+e.width+"x"+e.height+") to ("+s+"x"+a+")."),o}return"data"in e&&console.warn("THREE.WebGLRenderer: Image in DataTexture is too big ("+e.width+"x"+e.height+")."),e}return e}function _(e){return $i(e.width)&&$i(e.height)}function v(e,t){return e.generateMipmaps&&t&&e.minFilter!==Jt&&e.minFilter!==Kt}function y(t,i,r,s,a=1){e.generateMipmap(t);n.get(i).__maxMipLevel=Math.log2(Math.max(r,s,a))}function b(i,n,r,s){if(!1===o)return n;if(null!==i){if(void 0!==e[i])return e[i];console.warn("THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format '"+i+"'")}let a=n;return 6403===n&&(5126===r&&(a=33326),5131===r&&(a=33325),5121===r&&(a=33321)),6407===n&&(5126===r&&(a=34837),5131===r&&(a=34843),5121===r&&(a=32849)),6408===n&&(5126===r&&(a=34836),5131===r&&(a=34842),5121===r&&(a=s===vi?35907:32856)),33325!==a&&33326!==a&&34842!==a&&34836!==a||t.get("EXT_color_buffer_float"),a}function x(e){return e===Jt||1004===e||1005===e?9728:9729}function w(t){const i=t.target;i.removeEventListener("dispose",w),function(t){const i=n.get(t);if(void 0===i.__webglInit)return;e.deleteTexture(i.__webglTexture),n.remove(t)}(i),i.isVideoTexture&&d.delete(i),a.memory.textures--}function M(t){const i=t.target;i.removeEventListener("dispose",M),function(t){const i=t.texture,r=n.get(t),s=n.get(i);if(!t)return;void 0!==s.__webglTexture&&(e.deleteTexture(s.__webglTexture),a.memory.textures--);t.depthTexture&&t.depthTexture.dispose();if(t.isWebGLCubeRenderTarget)for(let t=0;t<6;t++)e.deleteFramebuffer(r.__webglFramebuffer[t]),r.__webglDepthbuffer&&e.deleteRenderbuffer(r.__webglDepthbuffer[t]);else e.deleteFramebuffer(r.__webglFramebuffer),r.__webglDepthbuffer&&e.deleteRenderbuffer(r.__webglDepthbuffer),r.__webglMultisampledFramebuffer&&e.deleteFramebuffer(r.__webglMultisampledFramebuffer),r.__webglColorRenderbuffer&&e.deleteRenderbuffer(r.__webglColorRenderbuffer),r.__webglDepthRenderbuffer&&e.deleteRenderbuffer(r.__webglDepthRenderbuffer);if(t.isWebGLMultipleRenderTargets)for(let t=0,r=i.length;t<r;t++){const r=n.get(i[t]);r.__webglTexture&&(e.deleteTexture(r.__webglTexture),a.memory.textures--),n.remove(i[t])}n.remove(i),n.remove(t)}(i)}let S=0;function T(e,t){const r=n.get(e);if(e.isVideoTexture&&function(e){const t=a.render.frame;d.get(e)!==t&&(d.set(e,t),e.update())}(e),e.version>0&&r.__version!==e.version){const i=e.image;if(void 0===i)console.warn("THREE.WebGLRenderer: Texture marked for update but image is undefined");else{if(!1!==i.complete)return void P(r,e,t);console.warn("THREE.WebGLRenderer: Texture marked for update but image is incomplete")}}i.activeTexture(33984+t),i.bindTexture(3553,r.__webglTexture)}function C(t,r){const a=n.get(t);t.version>0&&a.__version!==t.version?function(t,n,r){if(6!==n.image.length)return;R(t,n),i.activeTexture(33984+r),i.bindTexture(34067,t.__webglTexture),e.pixelStorei(37440,n.flipY),e.pixelStorei(37441,n.premultiplyAlpha),e.pixelStorei(3317,n.unpackAlignment),e.pixelStorei(37443,0);const a=n&&(n.isCompressedTexture||n.image[0].isCompressedTexture),h=n.image[0]&&n.image[0].isDataTexture,l=[];for(let e=0;e<6;e++)l[e]=a||h?h?n.image[e].image:n.image[e]:g(n.image[e],!1,!0,c);const u=l[0],d=_(u)||o,p=s.convert(n.format),m=s.convert(n.type),f=b(n.internalFormat,p,m,n.encoding);let x;if(I(34067,n,d),a){for(let e=0;e<6;e++){x=l[e].mipmaps;for(let t=0;t<x.length;t++){const r=x[t];n.format!==oi&&n.format!==ai?null!==p?i.compressedTexImage2D(34069+e,t,f,r.width,r.height,0,r.data):console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()"):i.texImage2D(34069+e,t,f,r.width,r.height,0,p,m,r.data)}}t.__maxMipLevel=x.length-1}else{x=n.mipmaps;for(let e=0;e<6;e++)if(h){i.texImage2D(34069+e,0,f,l[e].width,l[e].height,0,p,m,l[e].data);for(let t=0;t<x.length;t++){const n=x[t].image[e].image;i.texImage2D(34069+e,t+1,f,n.width,n.height,0,p,m,n.data)}}else{i.texImage2D(34069+e,0,f,p,m,l[e]);for(let t=0;t<x.length;t++){const n=x[t];i.texImage2D(34069+e,t+1,f,p,m,n.image[e])}}t.__maxMipLevel=x.length}v(n,d)&&y(34067,n,u.width,u.height);t.__version=n.version,n.onUpdate&&n.onUpdate(n)}(a,t,r):(i.activeTexture(33984+r),i.bindTexture(34067,a.__webglTexture))}const E={[Xt]:10497,[Zt]:33071,[Yt]:33648},A={[Jt]:9728,1004:9984,1005:9986,[Kt]:9729,1007:9985,[Qt]:9987};function I(i,s,a){if(a?(e.texParameteri(i,10242,E[s.wrapS]),e.texParameteri(i,10243,E[s.wrapT]),32879!==i&&35866!==i||e.texParameteri(i,32882,E[s.wrapR]),e.texParameteri(i,10240,A[s.magFilter]),e.texParameteri(i,10241,A[s.minFilter])):(e.texParameteri(i,10242,33071),e.texParameteri(i,10243,33071),32879!==i&&35866!==i||e.texParameteri(i,32882,33071),s.wrapS===Zt&&s.wrapT===Zt||console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping."),e.texParameteri(i,10240,x(s.magFilter)),e.texParameteri(i,10241,x(s.minFilter)),s.minFilter!==Jt&&s.minFilter!==Kt&&console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.")),!0===t.has("EXT_texture_filter_anisotropic")){const a=t.get("EXT_texture_filter_anisotropic");if(s.type===ni&&!1===t.has("OES_texture_float_linear"))return;if(!1===o&&s.type===ri&&!1===t.has("OES_texture_half_float_linear"))return;(s.anisotropy>1||n.get(s).__currentAnisotropy)&&(e.texParameterf(i,a.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(s.anisotropy,r.getMaxAnisotropy())),n.get(s).__currentAnisotropy=s.anisotropy)}}function R(t,i){void 0===t.__webglInit&&(t.__webglInit=!0,i.addEventListener("dispose",w),t.__webglTexture=e.createTexture(),a.memory.textures++)}function P(t,n,r){let a=3553;n.isDataTexture2DArray&&(a=35866),n.isDataTexture3D&&(a=32879),R(t,n),i.activeTexture(33984+r),i.bindTexture(a,t.__webglTexture),e.pixelStorei(37440,n.flipY),e.pixelStorei(37441,n.premultiplyAlpha),e.pixelStorei(3317,n.unpackAlignment),e.pixelStorei(37443,0);const h=function(e){return!o&&(e.wrapS!==Zt||e.wrapT!==Zt||e.minFilter!==Jt&&e.minFilter!==Kt)}(n)&&!1===_(n.image),c=g(n.image,h,!1,l),u=_(c)||o,d=s.convert(n.format);let p,m=s.convert(n.type),f=b(n.internalFormat,d,m,n.encoding);I(a,n,u);const x=n.mipmaps;if(n.isDepthTexture)f=6402,o?f=n.type===ni?36012:n.type===ii?33190:n.type===si?35056:33189:n.type===ni&&console.error("WebGLRenderer: Floating point depth texture requires WebGL2."),n.format===hi&&6402===f&&n.type!==ti&&n.type!==ii&&(console.warn("THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture."),n.type=ti,m=s.convert(n.type)),n.format===ci&&6402===f&&(f=34041,n.type!==si&&(console.warn("THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture."),n.type=si,m=s.convert(n.type))),i.texImage2D(3553,0,f,c.width,c.height,0,d,m,null);else if(n.isDataTexture)if(x.length>0&&u){for(let e=0,t=x.length;e<t;e++)p=x[e],i.texImage2D(3553,e,f,p.width,p.height,0,d,m,p.data);n.generateMipmaps=!1,t.__maxMipLevel=x.length-1}else i.texImage2D(3553,0,f,c.width,c.height,0,d,m,c.data),t.__maxMipLevel=0;else if(n.isCompressedTexture){for(let e=0,t=x.length;e<t;e++)p=x[e],n.format!==oi&&n.format!==ai?null!==d?i.compressedTexImage2D(3553,e,f,p.width,p.height,0,p.data):console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()"):i.texImage2D(3553,e,f,p.width,p.height,0,d,m,p.data);t.__maxMipLevel=x.length-1}else if(n.isDataTexture2DArray)i.texImage3D(35866,0,f,c.width,c.height,c.depth,0,d,m,c.data),t.__maxMipLevel=0;else if(n.isDataTexture3D)i.texImage3D(32879,0,f,c.width,c.height,c.depth,0,d,m,c.data),t.__maxMipLevel=0;else if(x.length>0&&u){for(let e=0,t=x.length;e<t;e++)p=x[e],i.texImage2D(3553,e,f,d,m,p);n.generateMipmaps=!1,t.__maxMipLevel=x.length-1}else i.texImage2D(3553,0,f,d,m,c),t.__maxMipLevel=0;v(n,u)&&y(a,n,c.width,c.height),t.__version=n.version,n.onUpdate&&n.onUpdate(n)}function L(t,r,a,o,h){const c=s.convert(a.format),l=s.convert(a.type),u=b(a.internalFormat,c,l,a.encoding);32879===h||35866===h?i.texImage3D(h,0,u,r.width,r.height,r.depth,0,c,l,null):i.texImage2D(h,0,u,r.width,r.height,0,c,l,null),i.bindFramebuffer(36160,t),e.framebufferTexture2D(36160,o,h,n.get(a).__webglTexture,0),i.bindFramebuffer(36160,null)}function D(t,i,n){if(e.bindRenderbuffer(36161,t),i.depthBuffer&&!i.stencilBuffer){let r=33189;if(n){const t=i.depthTexture;t&&t.isDepthTexture&&(t.type===ni?r=36012:t.type===ii&&(r=33190));const n=$(i);e.renderbufferStorageMultisample(36161,n,r,i.width,i.height)}else e.renderbufferStorage(36161,r,i.width,i.height);e.framebufferRenderbuffer(36160,36096,36161,t)}else if(i.depthBuffer&&i.stencilBuffer){if(n){const t=$(i);e.renderbufferStorageMultisample(36161,t,35056,i.width,i.height)}else e.renderbufferStorage(36161,34041,i.width,i.height);e.framebufferRenderbuffer(36160,33306,36161,t)}else{const t=!0===i.isWebGLMultipleRenderTargets?i.texture[0]:i.texture,r=s.convert(t.format),a=s.convert(t.type),o=b(t.internalFormat,r,a,t.encoding);if(n){const t=$(i);e.renderbufferStorageMultisample(36161,t,o,i.width,i.height)}else e.renderbufferStorage(36161,o,i.width,i.height)}e.bindRenderbuffer(36161,null)}function N(t){const r=n.get(t),s=!0===t.isWebGLCubeRenderTarget;if(t.depthTexture){if(s)throw new Error("target.depthTexture not supported in Cube render targets");!function(t,r){if(r&&r.isWebGLCubeRenderTarget)throw new Error("Depth Texture with cube render targets is not supported");if(i.bindFramebuffer(36160,t),!r.depthTexture||!r.depthTexture.isDepthTexture)throw new Error("renderTarget.depthTexture must be an instance of THREE.DepthTexture");n.get(r.depthTexture).__webglTexture&&r.depthTexture.image.width===r.width&&r.depthTexture.image.height===r.height||(r.depthTexture.image.width=r.width,r.depthTexture.image.height=r.height,r.depthTexture.needsUpdate=!0),T(r.depthTexture,0);const s=n.get(r.depthTexture).__webglTexture;if(r.depthTexture.format===hi)e.framebufferTexture2D(36160,36096,3553,s,0);else{if(r.depthTexture.format!==ci)throw new Error("Unknown depthTexture format");e.framebufferTexture2D(36160,33306,3553,s,0)}}(r.__webglFramebuffer,t)}else if(s){r.__webglDepthbuffer=[];for(let n=0;n<6;n++)i.bindFramebuffer(36160,r.__webglFramebuffer[n]),r.__webglDepthbuffer[n]=e.createRenderbuffer(),D(r.__webglDepthbuffer[n],t,!1)}else i.bindFramebuffer(36160,r.__webglFramebuffer),r.__webglDepthbuffer=e.createRenderbuffer(),D(r.__webglDepthbuffer,t,!1);i.bindFramebuffer(36160,null)}function $(e){return o&&e.isWebGLMultisampleRenderTarget?Math.min(u,e.samples):0}let k=!1,O=!1;this.allocateTextureUnit=function(){const e=S;return e>=h&&console.warn("THREE.WebGLTextures: Trying to use "+e+" texture units while this GPU supports only "+h),S+=1,e},this.resetTextureUnits=function(){S=0},this.setTexture2D=T,this.setTexture2DArray=function(e,t){const r=n.get(e);e.version>0&&r.__version!==e.version?P(r,e,t):(i.activeTexture(33984+t),i.bindTexture(35866,r.__webglTexture))},this.setTexture3D=function(e,t){const r=n.get(e);e.version>0&&r.__version!==e.version?P(r,e,t):(i.activeTexture(33984+t),i.bindTexture(32879,r.__webglTexture))},this.setTextureCube=C,this.setupRenderTarget=function(t){const h=t.texture,c=n.get(t),l=n.get(h);t.addEventListener("dispose",M),!0!==t.isWebGLMultipleRenderTargets&&(l.__webglTexture=e.createTexture(),l.__version=h.version,a.memory.textures++);const u=!0===t.isWebGLCubeRenderTarget,d=!0===t.isWebGLMultipleRenderTargets,p=!0===t.isWebGLMultisampleRenderTarget,m=h.isDataTexture3D||h.isDataTexture2DArray,f=_(t)||o;if(!o||h.format!==ai||h.type!==ni&&h.type!==ri||(h.format=oi,console.warn("THREE.WebGLRenderer: Rendering to textures with RGB format is not supported. Using RGBA format instead.")),u){c.__webglFramebuffer=[];for(let t=0;t<6;t++)c.__webglFramebuffer[t]=e.createFramebuffer()}else if(c.__webglFramebuffer=e.createFramebuffer(),d)if(r.drawBuffers){const i=t.texture;for(let t=0,r=i.length;t<r;t++){const r=n.get(i[t]);void 0===r.__webglTexture&&(r.__webglTexture=e.createTexture(),a.memory.textures++)}}else console.warn("THREE.WebGLRenderer: WebGLMultipleRenderTargets can only be used with WebGL2 or WEBGL_draw_buffers extension.");else if(p)if(o){c.__webglMultisampledFramebuffer=e.createFramebuffer(),c.__webglColorRenderbuffer=e.createRenderbuffer(),e.bindRenderbuffer(36161,c.__webglColorRenderbuffer);const n=s.convert(h.format),r=s.convert(h.type),a=b(h.internalFormat,n,r,h.encoding),o=$(t);e.renderbufferStorageMultisample(36161,o,a,t.width,t.height),i.bindFramebuffer(36160,c.__webglMultisampledFramebuffer),e.framebufferRenderbuffer(36160,36064,36161,c.__webglColorRenderbuffer),e.bindRenderbuffer(36161,null),t.depthBuffer&&(c.__webglDepthRenderbuffer=e.createRenderbuffer(),D(c.__webglDepthRenderbuffer,t,!0)),i.bindFramebuffer(36160,null)}else console.warn("THREE.WebGLRenderer: WebGLMultisampleRenderTarget can only be used with WebGL2.");if(u){i.bindTexture(34067,l.__webglTexture),I(34067,h,f);for(let e=0;e<6;e++)L(c.__webglFramebuffer[e],t,h,36064,34069+e);v(h,f)&&y(34067,h,t.width,t.height),i.unbindTexture()}else if(d){const e=t.texture;for(let r=0,s=e.length;r<s;r++){const s=e[r],a=n.get(s);i.bindTexture(3553,a.__webglTexture),I(3553,s,f),L(c.__webglFramebuffer,t,s,36064+r,3553),v(s,f)&&y(3553,s,t.width,t.height)}i.unbindTexture()}else{let e=3553;if(m)if(o){e=h.isDataTexture3D?32879:35866}else console.warn("THREE.DataTexture3D and THREE.DataTexture2DArray only supported with WebGL2.");i.bindTexture(e,l.__webglTexture),I(e,h,f),L(c.__webglFramebuffer,t,h,36064,e),v(h,f)&&y(e,h,t.width,t.height,t.depth),i.unbindTexture()}t.depthBuffer&&N(t)},this.updateRenderTargetMipmap=function(e){const t=_(e)||o,r=!0===e.isWebGLMultipleRenderTargets?e.texture:[e.texture];for(let s=0,a=r.length;s<a;s++){const a=r[s];if(v(a,t)){const t=e.isWebGLCubeRenderTarget?34067:3553,r=n.get(a).__webglTexture;i.bindTexture(t,r),y(t,a,e.width,e.height),i.unbindTexture()}}},this.updateMultisampleRenderTarget=function(t){if(t.isWebGLMultisampleRenderTarget)if(o){const r=t.width,s=t.height;let a=16384;t.depthBuffer&&(a|=256),t.stencilBuffer&&(a|=1024);const o=n.get(t);i.bindFramebuffer(36008,o.__webglMultisampledFramebuffer),i.bindFramebuffer(36009,o.__webglFramebuffer),e.blitFramebuffer(0,0,r,s,0,0,r,s,a,9728),i.bindFramebuffer(36008,null),i.bindFramebuffer(36009,o.__webglMultisampledFramebuffer)}else console.warn("THREE.WebGLRenderer: WebGLMultisampleRenderTarget can only be used with WebGL2.")},this.safeSetTexture2D=function(e,t){e&&e.isWebGLRenderTarget&&(!1===k&&(console.warn("THREE.WebGLTextures.safeSetTexture2D: don't use render targets as textures. Use their .texture property instead."),k=!0),e=e.texture),T(e,t)},this.safeSetTextureCube=function(e,t){e&&e.isWebGLCubeRenderTarget&&(!1===O&&(console.warn("THREE.WebGLTextures.safeSetTextureCube: don't use cube render targets as textures. Use their .texture property instead."),O=!0),e=e.texture),C(e,t)}}function th(e,t,i){const n=i.isWebGL2;return{convert:function(e){let i;if(e===ei)return 5121;if(1017===e)return 32819;if(1018===e)return 32820;if(1019===e)return 33635;if(1010===e)return 5120;if(1011===e)return 5122;if(e===ti)return 5123;if(1013===e)return 5124;if(e===ii)return 5125;if(e===ni)return 5126;if(e===ri)return n?5131:(i=t.get("OES_texture_half_float"),null!==i?i.HALF_FLOAT_OES:null);if(1021===e)return 6406;if(e===ai)return 6407;if(e===oi)return 6408;if(1024===e)return 6409;if(1025===e)return 6410;if(e===hi)return 6402;if(e===ci)return 34041;if(1028===e)return 6403;if(1029===e)return 36244;if(1030===e)return 33319;if(1031===e)return 33320;if(1032===e)return 36248;if(1033===e)return 36249;if(33776===e||33777===e||33778===e||33779===e){if(i=t.get("WEBGL_compressed_texture_s3tc"),null===i)return null;if(33776===e)return i.COMPRESSED_RGB_S3TC_DXT1_EXT;if(33777===e)return i.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(33778===e)return i.COMPRESSED_RGBA_S3TC_DXT3_EXT;if(33779===e)return i.COMPRESSED_RGBA_S3TC_DXT5_EXT}if(35840===e||35841===e||35842===e||35843===e){if(i=t.get("WEBGL_compressed_texture_pvrtc"),null===i)return null;if(35840===e)return i.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;if(35841===e)return i.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;if(35842===e)return i.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;if(35843===e)return i.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG}if(36196===e)return i=t.get("WEBGL_compressed_texture_etc1"),null!==i?i.COMPRESSED_RGB_ETC1_WEBGL:null;if((37492===e||37496===e)&&(i=t.get("WEBGL_compressed_texture_etc"),null!==i)){if(37492===e)return i.COMPRESSED_RGB8_ETC2;if(37496===e)return i.COMPRESSED_RGBA8_ETC2_EAC}return 37808===e||37809===e||37810===e||37811===e||37812===e||37813===e||37814===e||37815===e||37816===e||37817===e||37818===e||37819===e||37820===e||37821===e||37840===e||37841===e||37842===e||37843===e||37844===e||37845===e||37846===e||37847===e||37848===e||37849===e||37850===e||37851===e||37852===e||37853===e?(i=t.get("WEBGL_compressed_texture_astc"),null!==i?e:null):36492===e?(i=t.get("EXT_texture_compression_bptc"),null!==i?e:null):e===si?n?34042:(i=t.get("WEBGL_depth_texture"),null!==i?i.UNSIGNED_INT_24_8_WEBGL:null):void 0}}}class ih extends hs{constructor(e=[]){super(),this.cameras=e}}ih.prototype.isArrayCamera=!0;class nh extends tr{constructor(){super(),this.type="Group"}}nh.prototype.isGroup=!0;const rh={type:"move"};class sh{constructor(){this._targetRay=null,this._grip=null,this._hand=null}getHandSpace(){return null===this._hand&&(this._hand=new nh,this._hand.matrixAutoUpdate=!1,this._hand.visible=!1,this._hand.joints={},this._hand.inputState={pinching:!1}),this._hand}getTargetRaySpace(){return null===this._targetRay&&(this._targetRay=new nh,this._targetRay.matrixAutoUpdate=!1,this._targetRay.visible=!1,this._targetRay.hasLinearVelocity=!1,this._targetRay.linearVelocity=new Ki,this._targetRay.hasAngularVelocity=!1,this._targetRay.angularVelocity=new Ki),this._targetRay}getGripSpace(){return null===this._grip&&(this._grip=new nh,this._grip.matrixAutoUpdate=!1,this._grip.visible=!1,this._grip.hasLinearVelocity=!1,this._grip.linearVelocity=new Ki,this._grip.hasAngularVelocity=!1,this._grip.angularVelocity=new Ki),this._grip}dispatchEvent(e){return null!==this._targetRay&&this._targetRay.dispatchEvent(e),null!==this._grip&&this._grip.dispatchEvent(e),null!==this._hand&&this._hand.dispatchEvent(e),this}disconnect(e){return this.dispatchEvent({type:"disconnected",data:e}),null!==this._targetRay&&(this._targetRay.visible=!1),null!==this._grip&&(this._grip.visible=!1),null!==this._hand&&(this._hand.visible=!1),this}update(e,t,i){let n=null,r=null,s=null;const a=this._targetRay,o=this._grip,h=this._hand;if(e&&"visible-blurred"!==t.session.visibilityState)if(null!==a&&(n=t.getPose(e.targetRaySpace,i),null!==n&&(a.matrix.fromArray(n.transform.matrix),a.matrix.decompose(a.position,a.rotation,a.scale),n.linearVelocity?(a.hasLinearVelocity=!0,a.linearVelocity.copy(n.linearVelocity)):a.hasLinearVelocity=!1,n.angularVelocity?(a.hasAngularVelocity=!0,a.angularVelocity.copy(n.angularVelocity)):a.hasAngularVelocity=!1,this.dispatchEvent(rh))),h&&e.hand){s=!0;for(const n of e.hand.values()){const e=t.getJointPose(n,i);if(void 0===h.joints[n.jointName]){const e=new nh;e.matrixAutoUpdate=!1,e.visible=!1,h.joints[n.jointName]=e,h.add(e)}const r=h.joints[n.jointName];null!==e&&(r.matrix.fromArray(e.transform.matrix),r.matrix.decompose(r.position,r.rotation,r.scale),r.jointRadius=e.radius),r.visible=null!==e}const n=h.joints["index-finger-tip"],r=h.joints["thumb-tip"],a=n.position.distanceTo(r.position),o=.02,c=.005;h.inputState.pinching&&a>o+c?(h.inputState.pinching=!1,this.dispatchEvent({type:"pinchend",handedness:e.handedness,target:this})):!h.inputState.pinching&&a<=o-c&&(h.inputState.pinching=!0,this.dispatchEvent({type:"pinchstart",handedness:e.handedness,target:this}))}else null!==o&&e.gripSpace&&(r=t.getPose(e.gripSpace,i),null!==r&&(o.matrix.fromArray(r.transform.matrix),o.matrix.decompose(o.position,o.rotation,o.scale),r.linearVelocity?(o.hasLinearVelocity=!0,o.linearVelocity.copy(r.linearVelocity)):o.hasLinearVelocity=!1,r.angularVelocity?(o.hasAngularVelocity=!0,o.angularVelocity.copy(r.angularVelocity)):o.hasAngularVelocity=!1));return null!==a&&(a.visible=null!==n),null!==o&&(o.visible=null!==r),null!==h&&(h.visible=null!==s),this}}class ah extends Ti{constructor(e,t){super();const i=this,n=e.state;let r=null,s=1,a=null,o="local-floor",h=null,c=null,l=null,u=null,d=null,p=!1,m=null,f=null,g=null,_=null,v=null,y=null;const b=[],x=new Map,w=new hs;w.layers.enable(1),w.viewport=new Xi;const M=new hs;M.layers.enable(2),M.viewport=new Xi;const S=[w,M],T=new ih;T.layers.enable(1),T.layers.enable(2);let C=null,E=null;function A(e){const t=x.get(e.inputSource);t&&t.dispatchEvent({type:e.type,data:e.inputSource})}function I(){x.forEach((function(e,t){e.disconnect(t)})),x.clear(),C=null,E=null,n.bindXRFramebuffer(null),e.setRenderTarget(e.getRenderTarget()),l&&t.deleteFramebuffer(l),m&&t.deleteFramebuffer(m),f&&t.deleteRenderbuffer(f),g&&t.deleteRenderbuffer(g),l=null,m=null,f=null,g=null,d=null,u=null,c=null,r=null,$.stop(),i.isPresenting=!1,i.dispatchEvent({type:"sessionend"})}function R(e){const t=r.inputSources;for(let e=0;e<b.length;e++)x.set(t[e],b[e]);for(let t=0;t<e.removed.length;t++){const i=e.removed[t],n=x.get(i);n&&(n.dispatchEvent({type:"disconnected",data:i}),x.delete(i))}for(let t=0;t<e.added.length;t++){const i=e.added[t],n=x.get(i);n&&n.dispatchEvent({type:"connected",data:i})}}this.cameraAutoUpdate=!0,this.enabled=!1,this.isPresenting=!1,this.getController=function(e){let t=b[e];return void 0===t&&(t=new sh,b[e]=t),t.getTargetRaySpace()},this.getControllerGrip=function(e){let t=b[e];return void 0===t&&(t=new sh,b[e]=t),t.getGripSpace()},this.getHand=function(e){let t=b[e];return void 0===t&&(t=new sh,b[e]=t),t.getHandSpace()},this.setFramebufferScaleFactor=function(e){s=e,!0===i.isPresenting&&console.warn("THREE.WebXRManager: Cannot change framebuffer scale while presenting.")},this.setReferenceSpaceType=function(e){o=e,!0===i.isPresenting&&console.warn("THREE.WebXRManager: Cannot change reference space type while presenting.")},this.getReferenceSpace=function(){return a},this.getBaseLayer=function(){return null!==u?u:d},this.getBinding=function(){return c},this.getFrame=function(){return _},this.getSession=function(){return r},this.setSession=async function(e){if(r=e,null!==r){r.addEventListener("select",A),r.addEventListener("selectstart",A),r.addEventListener("selectend",A),r.addEventListener("squeeze",A),r.addEventListener("squeezestart",A),r.addEventListener("squeezeend",A),r.addEventListener("end",I),r.addEventListener("inputsourceschange",R);const e=t.getContextAttributes();if(!0!==e.xrCompatible&&await t.makeXRCompatible(),void 0===r.renderState.layers){const i={antialias:e.antialias,alpha:e.alpha,depth:e.depth,stencil:e.stencil,framebufferScaleFactor:s};d=new XRWebGLLayer(r,t,i),r.updateRenderState({baseLayer:d})}else if(t instanceof WebGLRenderingContext){const i={antialias:!0,alpha:e.alpha,depth:e.depth,stencil:e.stencil,framebufferScaleFactor:s};d=new XRWebGLLayer(r,t,i),r.updateRenderState({layers:[d]})}else{p=e.antialias;let i=null;e.depth&&(y=256,e.stencil&&(y|=1024),v=e.stencil?33306:36096,i=e.stencil?35056:33190);const a={colorFormat:e.alpha?32856:32849,depthFormat:i,scaleFactor:s};c=new XRWebGLBinding(r,t),u=c.createProjectionLayer(a),l=t.createFramebuffer(),r.updateRenderState({layers:[u]}),p&&(m=t.createFramebuffer(),f=t.createRenderbuffer(),t.bindRenderbuffer(36161,f),t.renderbufferStorageMultisample(36161,4,32856,u.textureWidth,u.textureHeight),n.bindFramebuffer(36160,m),t.framebufferRenderbuffer(36160,36064,36161,f),t.bindRenderbuffer(36161,null),null!==i&&(g=t.createRenderbuffer(),t.bindRenderbuffer(36161,g),t.renderbufferStorageMultisample(36161,4,i,u.textureWidth,u.textureHeight),t.framebufferRenderbuffer(36160,v,36161,g),t.bindRenderbuffer(36161,null)),n.bindFramebuffer(36160,null))}a=await r.requestReferenceSpace(o),$.setContext(r),$.start(),i.isPresenting=!0,i.dispatchEvent({type:"sessionstart"})}};const P=new Ki,L=new Ki;function D(e,t){null===t?e.matrixWorld.copy(e.matrix):e.matrixWorld.multiplyMatrices(t.matrixWorld,e.matrix),e.matrixWorldInverse.copy(e.matrixWorld).invert()}this.updateCamera=function(e){if(null===r)return;T.near=M.near=w.near=e.near,T.far=M.far=w.far=e.far,C===T.near&&E===T.far||(r.updateRenderState({depthNear:T.near,depthFar:T.far}),C=T.near,E=T.far);const t=e.parent,i=T.cameras;D(T,t);for(let e=0;e<i.length;e++)D(i[e],t);T.matrixWorld.decompose(T.position,T.quaternion,T.scale),e.position.copy(T.position),e.quaternion.copy(T.quaternion),e.scale.copy(T.scale),e.matrix.copy(T.matrix),e.matrixWorld.copy(T.matrixWorld);const n=e.children;for(let e=0,t=n.length;e<t;e++)n[e].updateMatrixWorld(!0);2===i.length?function(e,t,i){P.setFromMatrixPosition(t.matrixWorld),L.setFromMatrixPosition(i.matrixWorld);const n=P.distanceTo(L),r=t.projectionMatrix.elements,s=i.projectionMatrix.elements,a=r[14]/(r[10]-1),o=r[14]/(r[10]+1),h=(r[9]+1)/r[5],c=(r[9]-1)/r[5],l=(r[8]-1)/r[0],u=(s[8]+1)/s[0],d=a*l,p=a*u,m=n/(-l+u),f=m*-l;t.matrixWorld.decompose(e.position,e.quaternion,e.scale),e.translateX(f),e.translateZ(m),e.matrixWorld.compose(e.position,e.quaternion,e.scale),e.matrixWorldInverse.copy(e.matrixWorld).invert();const g=a+m,_=o+m,v=d-f,y=p+(n-f),b=h*o/_*g,x=c*o/_*g;e.projectionMatrix.makePerspective(v,y,b,x,g,_)}(T,w,M):T.projectionMatrix.copy(w.projectionMatrix)},this.getCamera=function(){return T},this.getFoveation=function(){return null!==u?u.fixedFoveation:null!==d?d.fixedFoveation:void 0},this.setFoveation=function(e){null!==u&&(u.fixedFoveation=e),null!==d&&void 0!==d.fixedFoveation&&(d.fixedFoveation=e)};let N=null;const $=new bs;$.setAnimationLoop((function(e,i){if(h=i.getViewerPose(a),_=i,null!==h){const e=h.views;null!==d&&n.bindXRFramebuffer(d.framebuffer);let i=!1;e.length!==T.cameras.length&&(T.cameras.length=0,i=!0);for(let r=0;r<e.length;r++){const s=e[r];let a=null;if(null!==d)a=d.getViewport(s);else{const e=c.getViewSubImage(u,s);n.bindXRFramebuffer(l),void 0!==e.depthStencilTexture&&t.framebufferTexture2D(36160,v,3553,e.depthStencilTexture,0),t.framebufferTexture2D(36160,36064,3553,e.colorTexture,0),a=e.viewport}const o=S[r];o.matrix.fromArray(s.transform.matrix),o.projectionMatrix.fromArray(s.projectionMatrix),o.viewport.set(a.x,a.y,a.width,a.height),0===r&&T.matrix.copy(o.matrix),!0===i&&T.cameras.push(o)}p&&(n.bindXRFramebuffer(m),null!==y&&t.clear(y))}const s=r.inputSources;for(let e=0;e<b.length;e++){const t=b[e],n=s[e];t.update(n,i,a)}if(N&&N(e,i),p){const e=u.textureWidth,i=u.textureHeight;n.bindFramebuffer(36008,m),n.bindFramebuffer(36009,l),t.invalidateFramebuffer(36008,[v]),t.invalidateFramebuffer(36009,[v]),t.blitFramebuffer(0,0,e,i,0,0,e,i,16384,9728),t.invalidateFramebuffer(36008,[36064]),n.bindFramebuffer(36008,null),n.bindFramebuffer(36009,null),n.bindFramebuffer(36160,m)}_=null})),this.setAnimationLoop=function(e){N=e},this.dispose=function(){}}}function oh(e){function t(t,i){t.opacity.value=i.opacity,i.color&&t.diffuse.value.copy(i.color),i.emissive&&t.emissive.value.copy(i.emissive).multiplyScalar(i.emissiveIntensity),i.map&&(t.map.value=i.map),i.alphaMap&&(t.alphaMap.value=i.alphaMap),i.specularMap&&(t.specularMap.value=i.specularMap),i.alphaTest>0&&(t.alphaTest.value=i.alphaTest);const n=e.get(i).envMap;if(n){t.envMap.value=n,t.flipEnvMap.value=n.isCubeTexture&&!1===n.isRenderTargetTexture?-1:1,t.reflectivity.value=i.reflectivity,t.ior.value=i.ior,t.refractionRatio.value=i.refractionRatio;const r=e.get(n).__maxMipLevel;void 0!==r&&(t.maxMipLevel.value=r)}let r,s;i.lightMap&&(t.lightMap.value=i.lightMap,t.lightMapIntensity.value=i.lightMapIntensity),i.aoMap&&(t.aoMap.value=i.aoMap,t.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:i.specularIntensityMap?r=i.specularIntensityMap:i.specularColorMap?r=i.specularColorMap:i.transmissionMap?r=i.transmissionMap:i.thicknessMap?r=i.thicknessMap:i.sheenColorMap?r=i.sheenColorMap:i.sheenRoughnessMap&&(r=i.sheenRoughnessMap),void 0!==r&&(r.isWebGLRenderTarget&&(r=r.texture),!0===r.matrixAutoUpdate&&r.updateMatrix(),t.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(),t.uv2Transform.value.copy(s.matrix))}function i(t,i){t.roughness.value=i.roughness,t.metalness.value=i.metalness,i.roughnessMap&&(t.roughnessMap.value=i.roughnessMap),i.metalnessMap&&(t.metalnessMap.value=i.metalnessMap),i.emissiveMap&&(t.emissiveMap.value=i.emissiveMap),i.bumpMap&&(t.bumpMap.value=i.bumpMap,t.bumpScale.value=i.bumpScale,1===i.side&&(t.bumpScale.value*=-1)),i.normalMap&&(t.normalMap.value=i.normalMap,t.normalScale.value.copy(i.normalScale),1===i.side&&t.normalScale.value.negate()),i.displacementMap&&(t.displacementMap.value=i.displacementMap,t.displacementScale.value=i.displacementScale,t.displacementBias.value=i.displacementBias);e.get(i).envMap&&(t.envMapIntensity.value=i.envMapIntensity)}return{refreshFogUniforms:function(e,t){e.fogColor.value.copy(t.color),t.isFog?(e.fogNear.value=t.near,e.fogFar.value=t.far):t.isFogExp2&&(e.fogDensity.value=t.density)},refreshMaterialUniforms:function(e,n,r,s,a){n.isMeshBasicMaterial?t(e,n):n.isMeshLambertMaterial?(t(e,n),function(e,t){t.emissiveMap&&(e.emissiveMap.value=t.emissiveMap)}(e,n)):n.isMeshToonMaterial?(t(e,n),function(e,t){t.gradientMap&&(e.gradientMap.value=t.gradientMap);t.emissiveMap&&(e.emissiveMap.value=t.emissiveMap);t.bumpMap&&(e.bumpMap.value=t.bumpMap,e.bumpScale.value=t.bumpScale,1===t.side&&(e.bumpScale.value*=-1));t.normalMap&&(e.normalMap.value=t.normalMap,e.normalScale.value.copy(t.normalScale),1===t.side&&e.normalScale.value.negate());t.displacementMap&&(e.displacementMap.value=t.displacementMap,e.displacementScale.value=t.displacementScale,e.displacementBias.value=t.displacementBias)}(e,n)):n.isMeshPhongMaterial?(t(e,n),function(e,t){e.specular.value.copy(t.specular),e.shininess.value=Math.max(t.shininess,1e-4),t.emissiveMap&&(e.emissiveMap.value=t.emissiveMap);t.bumpMap&&(e.bumpMap.value=t.bumpMap,e.bumpScale.value=t.bumpScale,1===t.side&&(e.bumpScale.value*=-1));t.normalMap&&(e.normalMap.value=t.normalMap,e.normalScale.value.copy(t.normalScale),1===t.side&&e.normalScale.value.negate());t.displacementMap&&(e.displacementMap.value=t.displacementMap,e.displacementScale.value=t.displacementScale,e.displacementBias.value=t.displacementBias)}(e,n)):n.isMeshStandardMaterial?(t(e,n),n.isMeshPhysicalMaterial?function(e,t,n){i(e,t),e.ior.value=t.ior,t.sheen>0&&(e.sheenColor.value.copy(t.sheenColor).multiplyScalar(t.sheen),e.sheenRoughness.value=t.sheenRoughness,t.sheenColorMap&&(e.sheenColorMap.value=t.sheenColorMap),t.sheenRoughnessMap&&(e.sheenRoughnessMap.value=t.sheenRoughnessMap));t.clearcoat>0&&(e.clearcoat.value=t.clearcoat,e.clearcoatRoughness.value=t.clearcoatRoughness,t.clearcoatMap&&(e.clearcoatMap.value=t.clearcoatMap),t.clearcoatRoughnessMap&&(e.clearcoatRoughnessMap.value=t.clearcoatRoughnessMap),t.clearcoatNormalMap&&(e.clearcoatNormalScale.value.copy(t.clearcoatNormalScale),e.clearcoatNormalMap.value=t.clearcoatNormalMap,1===t.side&&e.clearcoatNormalScale.value.negate()));t.transmission>0&&(e.transmission.value=t.transmission,e.transmissionSamplerMap.value=n.texture,e.transmissionSamplerSize.value.set(n.width,n.height),t.transmissionMap&&(e.transmissionMap.value=t.transmissionMap),e.thickness.value=t.thickness,t.thicknessMap&&(e.thicknessMap.value=t.thicknessMap),e.attenuationDistance.value=t.attenuationDistance,e.attenuationColor.value.copy(t.attenuationColor));e.specularIntensity.value=t.specularIntensity,e.specularColor.value.copy(t.specularColor),t.specularIntensityMap&&(e.specularIntensityMap.value=t.specularIntensityMap);t.specularColorMap&&(e.specularColorMap.value=t.specularColorMap)}(e,n,a):i(e,n)):n.isMeshMatcapMaterial?(t(e,n),function(e,t){t.matcap&&(e.matcap.value=t.matcap);t.bumpMap&&(e.bumpMap.value=t.bumpMap,e.bumpScale.value=t.bumpScale,1===t.side&&(e.bumpScale.value*=-1));t.normalMap&&(e.normalMap.value=t.normalMap,e.normalScale.value.copy(t.normalScale),1===t.side&&e.normalScale.value.negate());t.displacementMap&&(e.displacementMap.value=t.displacementMap,e.displacementScale.value=t.displacementScale,e.displacementBias.value=t.displacementBias)}(e,n)):n.isMeshDepthMaterial?(t(e,n),function(e,t){t.displacementMap&&(e.displacementMap.value=t.displacementMap,e.displacementScale.value=t.displacementScale,e.displacementBias.value=t.displacementBias)}(e,n)):n.isMeshDistanceMaterial?(t(e,n),function(e,t){t.displacementMap&&(e.displacementMap.value=t.displacementMap,e.displacementScale.value=t.displacementScale,e.displacementBias.value=t.displacementBias);e.referencePosition.value.copy(t.referencePosition),e.nearDistance.value=t.nearDistance,e.farDistance.value=t.farDistance}(e,n)):n.isMeshNormalMaterial?(t(e,n),function(e,t){t.bumpMap&&(e.bumpMap.value=t.bumpMap,e.bumpScale.value=t.bumpScale,1===t.side&&(e.bumpScale.value*=-1));t.normalMap&&(e.normalMap.value=t.normalMap,e.normalScale.value.copy(t.normalScale),1===t.side&&e.normalScale.value.negate());t.displacementMap&&(e.displacementMap.value=t.displacementMap,e.displacementScale.value=t.displacementScale,e.displacementBias.value=t.displacementBias)}(e,n)):n.isLineBasicMaterial?(function(e,t){e.diffuse.value.copy(t.color),e.opacity.value=t.opacity}(e,n),n.isLineDashedMaterial&&function(e,t){e.dashSize.value=t.dashSize,e.totalSize.value=t.dashSize+t.gapSize,e.scale.value=t.scale}(e,n)):n.isPointsMaterial?function(e,t,i,n){e.diffuse.value.copy(t.color),e.opacity.value=t.opacity,e.size.value=t.size*i,e.scale.value=.5*n,t.map&&(e.map.value=t.map);t.alphaMap&&(e.alphaMap.value=t.alphaMap);t.alphaTest>0&&(e.alphaTest.value=t.alphaTest);let r;t.map?r=t.map:t.alphaMap&&(r=t.alphaMap);void 0!==r&&(!0===r.matrixAutoUpdate&&r.updateMatrix(),e.uvTransform.value.copy(r.matrix))}(e,n,r,s):n.isSpriteMaterial?function(e,t){e.diffuse.value.copy(t.color),e.opacity.value=t.opacity,e.rotation.value=t.rotation,t.map&&(e.map.value=t.map);t.alphaMap&&(e.alphaMap.value=t.alphaMap);t.alphaTest>0&&(e.alphaTest.value=t.alphaTest);let i;t.map?i=t.map:t.alphaMap&&(i=t.alphaMap);void 0!==i&&(!0===i.matrixAutoUpdate&&i.updateMatrix(),e.uvTransform.value.copy(i.matrix))}(e,n):n.isShadowMaterial?(e.color.value.copy(n.color),e.opacity.value=n.opacity):n.isShaderMaterial&&(n.uniformsNeedUpdate=!1)}}}function hh(e={}){const t=void 0!==e.canvas?e.canvas:function(){const e=Ui("canvas");return e.style.display="block",e}(),i=void 0!==e.context?e.context:null,n=void 0!==e.alpha&&e.alpha,r=void 0===e.depth||e.depth,s=void 0===e.stencil||e.stencil,a=void 0!==e.antialias&&e.antialias,o=void 0===e.premultipliedAlpha||e.premultipliedAlpha,h=void 0!==e.preserveDrawingBuffer&&e.preserveDrawingBuffer,c=void 0!==e.powerPreference?e.powerPreference:"default",l=void 0!==e.failIfMajorPerformanceCaveat&&e.failIfMajorPerformanceCaveat;let u=null,d=null;const p=[],m=[];this.domElement=t,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=_i,this.physicallyCorrectLights=!1,this.toneMapping=0,this.toneMappingExposure=1;const f=this;let g=!1,_=0,v=0,y=null,b=-1,x=null;const w=new Xi,M=new Xi;let S=null,T=t.width,C=t.height,E=1,A=null,I=null;const R=new Xi(0,0,T,C),P=new Xi(0,0,T,C);let L=!1;const D=[],N=new ys;let $=!1,k=!1,O=null;const z=new Rn,F=new Ki,B={background:null,fog:null,environment:null,overrideMaterial:null,isScene:!0};function U(){return null===y?E:1}let V,H,j,G,W,q,X,Z,Y,J,K,Q,ee,te,ie,ne,re,se,ae,oe,he,ce,le,ue=i;function de(e,i){for(let n=0;n<e.length;n++){const r=e[n],s=t.getContext(r,i);if(null!==s)return s}return null}try{const e={alpha:n,depth:r,stencil:s,antialias:a,premultipliedAlpha:o,preserveDrawingBuffer:h,powerPreference:c,failIfMajorPerformanceCaveat:l};if(t.addEventListener("webglcontextlost",fe,!1),t.addEventListener("webglcontextrestored",ge,!1),null===ue){const t=["webgl2","webgl","experimental-webgl"];if(!0===f.isWebGL1Renderer&&t.shift(),ue=de(t,e),null===ue)throw de(t)?new Error("Error creating WebGL context with your selected attributes."):new Error("Error creating WebGL context.")}void 0===ue.getShaderPrecisionFormat&&(ue.getShaderPrecisionFormat=function(){return{rangeMin:1,rangeMax:1,precision:1}})}catch(e){throw console.error("THREE.WebGLRenderer: "+e.message),e}function pe(){V=new ra(ue),H=new Is(ue,V,e),V.init(H),ce=new th(ue,V,H),j=new Qo(ue,V,H),D[0]=1029,G=new oa(ue),W=new Fo,q=new eh(ue,V,j,W,H,ce,G),X=new Ps(f),Z=new na(f),Y=new xs(ue,H),le=new Es(ue,V,Y,H),J=new sa(ue,Y,G,le),K=new pa(ue,J,Y,G),ae=new da(ue,H,q),ne=new Rs(W),Q=new zo(f,X,Z,V,H,le,ne),ee=new oh(W),te=new Ho(W),ie=new Zo(V,H),se=new Cs(f,X,j,K,o),re=new Ko(f,K,H),oe=new As(ue,V,G,H),he=new aa(ue,V,G,H),G.programs=Q.programs,f.capabilities=H,f.extensions=V,f.properties=W,f.renderLists=te,f.shadowMap=re,f.state=j,f.info=G}pe();const me=new ah(f,ue);function fe(e){e.preventDefault(),console.log("THREE.WebGLRenderer: Context Lost."),g=!0}function ge(){console.log("THREE.WebGLRenderer: Context Restored."),g=!1;const e=G.autoReset,t=re.enabled,i=re.autoUpdate,n=re.needsUpdate,r=re.type;pe(),G.autoReset=e,re.enabled=t,re.autoUpdate=i,re.needsUpdate=n,re.type=r}function _e(e){const t=e.target;t.removeEventListener("dispose",_e),function(e){(function(e){const t=W.get(e).programs;void 0!==t&&t.forEach((function(e){Q.releaseProgram(e)}))})(e),W.remove(e)}(t)}this.xr=me,this.getContext=function(){return ue},this.getContextAttributes=function(){return ue.getContextAttributes()},this.forceContextLoss=function(){const e=V.get("WEBGL_lose_context");e&&e.loseContext()},this.forceContextRestore=function(){const e=V.get("WEBGL_lose_context");e&&e.restoreContext()},this.getPixelRatio=function(){return E},this.setPixelRatio=function(e){void 0!==e&&(E=e,this.setSize(T,C,!1))},this.getSize=function(e){return e.set(T,C)},this.setSize=function(e,i,n){me.isPresenting?console.warn("THREE.WebGLRenderer: Can't change size while VR device is presenting."):(T=e,C=i,t.width=Math.floor(e*E),t.height=Math.floor(i*E),!1!==n&&(t.style.width=e+"px",t.style.height=i+"px"),this.setViewport(0,0,e,i))},this.getDrawingBufferSize=function(e){return e.set(T*E,C*E).floor()},this.setDrawingBufferSize=function(e,i,n){T=e,C=i,E=n,t.width=Math.floor(e*n),t.height=Math.floor(i*n),this.setViewport(0,0,e,i)},this.getCurrentViewport=function(e){return e.copy(w)},this.getViewport=function(e){return e.copy(R)},this.setViewport=function(e,t,i,n){e.isVector4?R.set(e.x,e.y,e.z,e.w):R.set(e,t,i,n),j.viewport(w.copy(R).multiplyScalar(E).floor())},this.getScissor=function(e){return e.copy(P)},this.setScissor=function(e,t,i,n){e.isVector4?P.set(e.x,e.y,e.z,e.w):P.set(e,t,i,n),j.scissor(M.copy(P).multiplyScalar(E).floor())},this.getScissorTest=function(){return L},this.setScissorTest=function(e){j.setScissorTest(L=e)},this.setOpaqueSort=function(e){A=e},this.setTransparentSort=function(e){I=e},this.getClearColor=function(e){return e.copy(se.getClearColor())},this.setClearColor=function(){se.setClearColor.apply(se,arguments)},this.getClearAlpha=function(){return se.getClearAlpha()},this.setClearAlpha=function(){se.setClearAlpha.apply(se,arguments)},this.clear=function(e,t,i){let n=0;(void 0===e||e)&&(n|=16384),(void 0===t||t)&&(n|=256),(void 0===i||i)&&(n|=1024),ue.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(){t.removeEventListener("webglcontextlost",fe,!1),t.removeEventListener("webglcontextrestored",ge,!1),te.dispose(),ie.dispose(),W.dispose(),X.dispose(),Z.dispose(),K.dispose(),le.dispose(),me.dispose(),me.removeEventListener("sessionstart",ye),me.removeEventListener("sessionend",be),O&&(O.dispose(),O=null),xe.stop()},this.renderBufferDirect=function(e,t,i,n,r,s){null===t&&(t=B);const a=r.isMesh&&r.matrixWorld.determinant()<0,o=function(e,t,i,n,r){!0!==t.isScene&&(t=B);q.resetTextureUnits();const s=t.fog,a=n.isMeshStandardMaterial?t.environment:null,o=null===y?f.outputEncoding:y.texture.encoding,h=(n.isMeshStandardMaterial?Z:X).get(n.envMap||a),c=!0===n.vertexColors&&!!i.attributes.color&&4===i.attributes.color.itemSize,l=!!n.normalMap&&!!i.attributes.tangent,u=!!i.morphAttributes.position,p=!!i.morphAttributes.normal,m=i.morphAttributes.position?i.morphAttributes.position.length:0,g=W.get(n),_=d.state.lights;if(!0===$&&(!0===k||e!==x)){const t=e===x&&n.id===b;ne.setState(n,e,t)}let v=!1;n.version===g.__version?g.needsLights&&g.lightsStateVersion!==_.state.version||g.outputEncoding!==o||r.isInstancedMesh&&!1===g.instancing?v=!0:r.isInstancedMesh||!0!==g.instancing?r.isSkinnedMesh&&!1===g.skinning?v=!0:r.isSkinnedMesh||!0!==g.skinning?g.envMap!==h||n.fog&&g.fog!==s?v=!0:void 0===g.numClippingPlanes||g.numClippingPlanes===ne.numPlanes&&g.numIntersection===ne.numIntersection?(g.vertexAlphas!==c||g.vertexTangents!==l||g.morphTargets!==u||g.morphNormals!==p||!0===H.isWebGL2&&g.morphTargetsCount!==m)&&(v=!0):v=!0:v=!0:v=!0:(v=!0,g.__version=n.version);let w=g.currentProgram;!0===v&&(w=Ce(n,t,r));let M=!1,S=!1,T=!1;const A=w.getUniforms(),I=g.uniforms;j.useProgram(w.program)&&(M=!0,S=!0,T=!0);n.id!==b&&(b=n.id,S=!0);if(M||x!==e){if(A.setValue(ue,"projectionMatrix",e.projectionMatrix),H.logarithmicDepthBuffer&&A.setValue(ue,"logDepthBufFC",2/(Math.log(e.far+1)/Math.LN2)),x!==e&&(x=e,S=!0,T=!0),n.isShaderMaterial||n.isMeshPhongMaterial||n.isMeshToonMaterial||n.isMeshStandardMaterial||n.envMap){const t=A.map.cameraPosition;void 0!==t&&t.setValue(ue,F.setFromMatrixPosition(e.matrixWorld))}(n.isMeshPhongMaterial||n.isMeshToonMaterial||n.isMeshLambertMaterial||n.isMeshBasicMaterial||n.isMeshStandardMaterial||n.isShaderMaterial)&&A.setValue(ue,"isOrthographic",!0===e.isOrthographicCamera),(n.isMeshPhongMaterial||n.isMeshToonMaterial||n.isMeshLambertMaterial||n.isMeshBasicMaterial||n.isMeshStandardMaterial||n.isShaderMaterial||n.isShadowMaterial||r.isSkinnedMesh)&&A.setValue(ue,"viewMatrix",e.matrixWorldInverse)}if(r.isSkinnedMesh){A.setOptional(ue,r,"bindMatrix"),A.setOptional(ue,r,"bindMatrixInverse");const e=r.skeleton;e&&(H.floatVertexTextures?(null===e.boneTexture&&e.computeBoneTexture(),A.setValue(ue,"boneTexture",e.boneTexture,q),A.setValue(ue,"boneTextureSize",e.boneTextureSize)):A.setOptional(ue,e,"boneMatrices"))}!i||void 0===i.morphAttributes.position&&void 0===i.morphAttributes.normal||ae.update(r,i,n,w);(S||g.receiveShadow!==r.receiveShadow)&&(g.receiveShadow=r.receiveShadow,A.setValue(ue,"receiveShadow",r.receiveShadow));S&&(A.setValue(ue,"toneMappingExposure",f.toneMappingExposure),g.needsLights&&(P=T,(R=I).ambientLightColor.needsUpdate=P,R.lightProbe.needsUpdate=P,R.directionalLights.needsUpdate=P,R.directionalLightShadows.needsUpdate=P,R.pointLights.needsUpdate=P,R.pointLightShadows.needsUpdate=P,R.spotLights.needsUpdate=P,R.spotLightShadows.needsUpdate=P,R.rectAreaLights.needsUpdate=P,R.hemisphereLights.needsUpdate=P),s&&n.fog&&ee.refreshFogUniforms(I,s),ee.refreshMaterialUniforms(I,n,E,C,O),_o.upload(ue,g.uniformsList,I,q));var R,P;n.isShaderMaterial&&!0===n.uniformsNeedUpdate&&(_o.upload(ue,g.uniformsList,I,q),n.uniformsNeedUpdate=!1);n.isSpriteMaterial&&A.setValue(ue,"center",r.center);return A.setValue(ue,"modelViewMatrix",r.modelViewMatrix),A.setValue(ue,"normalMatrix",r.normalMatrix),A.setValue(ue,"modelMatrix",r.matrixWorld),w}(e,t,i,n,r);j.setMaterial(n,a);let h=i.index;const c=i.attributes.position;if(null===h){if(void 0===c||0===c.count)return}else if(0===h.count)return;let l,u=1;!0===n.wireframe&&(h=J.getWireframeAttribute(i),u=2),le.setup(r,n,o,i,h);let p=oe;null!==h&&(l=Y.get(h),p=he,p.setIndex(l));const m=null!==h?h.count:c.count,g=i.drawRange.start*u,_=i.drawRange.count*u,v=null!==s?s.start*u:0,w=null!==s?s.count*u:1/0,M=Math.max(g,v),S=Math.min(m,g+_,v+w)-1,T=Math.max(0,S-M+1);if(0!==T){if(r.isMesh)!0===n.wireframe?(j.setLineWidth(n.wireframeLinewidth*U()),p.setMode(1)):p.setMode(4);else if(r.isLine){let e=n.linewidth;void 0===e&&(e=1),j.setLineWidth(e*U()),r.isLineSegments?p.setMode(1):r.isLineLoop?p.setMode(2):p.setMode(3)}else r.isPoints?p.setMode(0):r.isSprite&&p.setMode(4);if(r.isInstancedMesh)p.renderInstances(M,T,r.count);else if(i.isInstancedBufferGeometry){const e=Math.min(i.instanceCount,i._maxInstanceCount);p.renderInstances(M,T,e)}else p.render(M,T)}},this.compile=function(e,t){d=ie.get(e),d.init(),m.push(d),e.traverseVisible((function(e){e.isLight&&e.layers.test(t.layers)&&(d.pushLight(e),e.castShadow&&d.pushShadow(e))})),d.setupLights(f.physicallyCorrectLights),e.traverse((function(t){const i=t.material;if(i)if(Array.isArray(i))for(let n=0;n<i.length;n++){Ce(i[n],e,t)}else Ce(i,e,t)})),m.pop(),d=null};let ve=null;function ye(){xe.stop()}function be(){xe.start()}const xe=new bs;function we(e,t,i,n){if(!1===e.visible)return;if(e.layers.test(t.layers))if(e.isGroup)i=e.renderOrder;else if(e.isLOD)!0===e.autoUpdate&&e.update(t);else if(e.isLight)d.pushLight(e),e.castShadow&&d.pushShadow(e);else if(e.isSprite){if(!e.frustumCulled||N.intersectsSprite(e)){n&&F.setFromMatrixPosition(e.matrixWorld).applyMatrix4(z);const t=K.update(e),r=e.material;r.visible&&u.push(e,t,r,i,F.z,null)}}else if((e.isMesh||e.isLine||e.isPoints)&&(e.isSkinnedMesh&&e.skeleton.frame!==G.render.frame&&(e.skeleton.update(),e.skeleton.frame=G.render.frame),!e.frustumCulled||N.intersectsObject(e))){n&&F.setFromMatrixPosition(e.matrixWorld).applyMatrix4(z);const t=K.update(e),r=e.material;if(Array.isArray(r)){const n=t.groups;for(let s=0,a=n.length;s<a;s++){const a=n[s],o=r[a.materialIndex];o&&o.visible&&u.push(e,t,o,i,F.z,a)}}else r.visible&&u.push(e,t,r,i,F.z,null)}const r=e.children;for(let e=0,s=r.length;e<s;e++)we(r[e],t,i,n)}function Me(e,t,i,n){const r=e.opaque,s=e.transmissive,o=e.transparent;d.setupLightsView(i),s.length>0&&function(e,t,i){if(null===O){const e=!0===a&&!0===H.isWebGL2;O=new(e?Yi:Zi)(1024,1024,{generateMipmaps:!0,type:null!==ce.convert(ri)?ri:ei,minFilter:Qt,magFilter:Jt,wrapS:Zt,wrapT:Zt})}const n=f.getRenderTarget();f.setRenderTarget(O),f.clear();const r=f.toneMapping;f.toneMapping=0,Se(e,t,i),f.toneMapping=r,q.updateMultisampleRenderTarget(O),q.updateRenderTargetMipmap(O),f.setRenderTarget(n)}(r,t,i),n&&j.viewport(w.copy(n)),r.length>0&&Se(r,t,i),s.length>0&&Se(s,t,i),o.length>0&&Se(o,t,i)}function Se(e,t,i){const n=!0===t.isScene?t.overrideMaterial:null;for(let r=0,s=e.length;r<s;r++){const s=e[r],a=s.object,o=s.geometry,h=null===n?s.material:n,c=s.group;a.layers.test(i.layers)&&Te(a,t,i,o,h,c)}}function Te(e,t,i,n,r,s){e.onBeforeRender(f,t,i,n,r,s),e.modelViewMatrix.multiplyMatrices(i.matrixWorldInverse,e.matrixWorld),e.normalMatrix.getNormalMatrix(e.modelViewMatrix),r.onBeforeRender(f,t,i,n,e,s),!0===r.transparent&&2===r.side?(r.side=1,r.needsUpdate=!0,f.renderBufferDirect(i,t,n,r,e,s),r.side=0,r.needsUpdate=!0,f.renderBufferDirect(i,t,n,r,e,s),r.side=2):f.renderBufferDirect(i,t,n,r,e,s),e.onAfterRender(f,t,i,n,r,s)}function Ce(e,t,i){!0!==t.isScene&&(t=B);const n=W.get(e),r=d.state.lights,s=d.state.shadowsArray,a=r.state.version,o=Q.getParameters(e,r.state,s,t,i),h=Q.getProgramCacheKey(o);let c=n.programs;n.environment=e.isMeshStandardMaterial?t.environment:null,n.fog=t.fog,n.envMap=(e.isMeshStandardMaterial?Z:X).get(e.envMap||n.environment),void 0===c&&(e.addEventListener("dispose",_e),c=new Map,n.programs=c);let l=c.get(h);if(void 0!==l){if(n.currentProgram===l&&n.lightsStateVersion===a)return Ee(e,o),l}else o.uniforms=Q.getUniforms(e),e.onBuild(i,o,f),e.onBeforeCompile(o,f),l=Q.acquireProgram(o,h),c.set(h,l),n.uniforms=o.uniforms;const u=n.uniforms;(e.isShaderMaterial||e.isRawShaderMaterial)&&!0!==e.clipping||(u.clippingPlanes=ne.uniform),Ee(e,o),n.needsLights=function(e){return e.isMeshLambertMaterial||e.isMeshToonMaterial||e.isMeshPhongMaterial||e.isMeshStandardMaterial||e.isShadowMaterial||e.isShaderMaterial&&!0===e.lights}(e),n.lightsStateVersion=a,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=l.getUniforms(),m=_o.seqWithValue(p.seq,u);return n.currentProgram=l,n.uniformsList=m,l}function Ee(e,t){const i=W.get(e);i.outputEncoding=t.outputEncoding,i.instancing=t.instancing,i.skinning=t.skinning,i.morphTargets=t.morphTargets,i.morphNormals=t.morphNormals,i.morphTargetsCount=t.morphTargetsCount,i.numClippingPlanes=t.numClippingPlanes,i.numIntersection=t.numClipIntersection,i.vertexAlphas=t.vertexAlphas,i.vertexTangents=t.vertexTangents}xe.setAnimationLoop((function(e){ve&&ve(e)})),"undefined"!=typeof window&&xe.setContext(window),this.setAnimationLoop=function(e){ve=e,me.setAnimationLoop(e),null===e?xe.stop():xe.start()},me.addEventListener("sessionstart",ye),me.addEventListener("sessionend",be),this.render=function(e,t){if(void 0!==t&&!0!==t.isCamera)return void console.error("THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.");if(!0===g)return;!0===e.autoUpdate&&e.updateMatrixWorld(),null===t.parent&&t.updateMatrixWorld(),!0===me.enabled&&!0===me.isPresenting&&(!0===me.cameraAutoUpdate&&me.updateCamera(t),t=me.getCamera()),!0===e.isScene&&e.onBeforeRender(f,e,t,y),d=ie.get(e,m.length),d.init(),m.push(d),z.multiplyMatrices(t.projectionMatrix,t.matrixWorldInverse),N.setFromProjectionMatrix(z),k=this.localClippingEnabled,$=ne.init(this.clippingPlanes,k,t),u=te.get(e,p.length),u.init(),p.push(u),we(e,t,0,f.sortObjects),u.finish(),!0===f.sortObjects&&u.sort(A,I),!0===$&&ne.beginShadows();const i=d.state.shadowsArray;if(re.render(i,e,t),!0===$&&ne.endShadows(),!0===this.info.autoReset&&this.info.reset(),se.render(u,e),d.setupLights(f.physicallyCorrectLights),t.isArrayCamera){const i=t.cameras;for(let t=0,n=i.length;t<n;t++){const n=i[t];Me(u,e,n,n.viewport)}}else Me(u,e,t);null!==y&&(q.updateMultisampleRenderTarget(y),q.updateRenderTargetMipmap(y)),!0===e.isScene&&e.onAfterRender(f,e,t),j.buffers.depth.setTest(!0),j.buffers.depth.setMask(!0),j.buffers.color.setMask(!0),j.setPolygonOffset(!1),le.resetDefaultState(),b=-1,x=null,m.pop(),d=m.length>0?m[m.length-1]:null,p.pop(),u=p.length>0?p[p.length-1]:null},this.getActiveCubeFace=function(){return _},this.getActiveMipmapLevel=function(){return v},this.getRenderTarget=function(){return y},this.setRenderTarget=function(e,t=0,i=0){y=e,_=t,v=i,e&&void 0===W.get(e).__webglFramebuffer&&q.setupRenderTarget(e);let n=null,r=!1,s=!1;if(e){const i=e.texture;(i.isDataTexture3D||i.isDataTexture2DArray)&&(s=!0);const a=W.get(e).__webglFramebuffer;e.isWebGLCubeRenderTarget?(n=a[t],r=!0):n=e.isWebGLMultisampleRenderTarget?W.get(e).__webglMultisampledFramebuffer:a,w.copy(e.viewport),M.copy(e.scissor),S=e.scissorTest}else w.copy(R).multiplyScalar(E).floor(),M.copy(P).multiplyScalar(E).floor(),S=L;if(j.bindFramebuffer(36160,n)&&H.drawBuffers){let t=!1;if(e)if(e.isWebGLMultipleRenderTargets){const i=e.texture;if(D.length!==i.length||36064!==D[0]){for(let e=0,t=i.length;e<t;e++)D[e]=36064+e;D.length=i.length,t=!0}}else 1===D.length&&36064===D[0]||(D[0]=36064,D.length=1,t=!0);else 1===D.length&&1029===D[0]||(D[0]=1029,D.length=1,t=!0);t&&(H.isWebGL2?ue.drawBuffers(D):V.get("WEBGL_draw_buffers").drawBuffersWEBGL(D))}if(j.viewport(w),j.scissor(M),j.setScissorTest(S),r){const n=W.get(e.texture);ue.framebufferTexture2D(36160,36064,34069+t,n.__webglTexture,i)}else if(s){const n=W.get(e.texture),r=t||0;ue.framebufferTextureLayer(36160,36064,n.__webglTexture,i||0,r)}b=-1},this.readRenderTargetPixels=function(e,t,i,n,r,s,a){if(!e||!e.isWebGLRenderTarget)return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");let o=W.get(e).__webglFramebuffer;if(e.isWebGLCubeRenderTarget&&void 0!==a&&(o=o[a]),o){j.bindFramebuffer(36160,o);try{const a=e.texture,o=a.format,h=a.type;if(o!==oi&&ce.convert(o)!==ue.getParameter(35739))return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.");const c=h===ri&&(V.has("EXT_color_buffer_half_float")||H.isWebGL2&&V.has("EXT_color_buffer_float"));if(!(h===ei||ce.convert(h)===ue.getParameter(35738)||h===ni&&(H.isWebGL2||V.has("OES_texture_float")||V.has("WEBGL_color_buffer_float"))||c))return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.");36053===ue.checkFramebufferStatus(36160)?t>=0&&t<=e.width-n&&i>=0&&i<=e.height-r&&ue.readPixels(t,i,n,r,ce.convert(o),ce.convert(h),s):console.error("THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.")}finally{const e=null!==y?W.get(y).__webglFramebuffer:null;j.bindFramebuffer(36160,e)}}},this.copyFramebufferToTexture=function(e,t,i=0){const n=Math.pow(2,-i),r=Math.floor(t.image.width*n),s=Math.floor(t.image.height*n);let a=ce.convert(t.format);H.isWebGL2&&(6407===a&&(a=32849),6408===a&&(a=32856)),q.setTexture2D(t,0),ue.copyTexImage2D(3553,i,a,e.x,e.y,r,s,0),j.unbindTexture()},this.copyTextureToTexture=function(e,t,i,n=0){const r=t.image.width,s=t.image.height,a=ce.convert(i.format),o=ce.convert(i.type);q.setTexture2D(i,0),ue.pixelStorei(37440,i.flipY),ue.pixelStorei(37441,i.premultiplyAlpha),ue.pixelStorei(3317,i.unpackAlignment),t.isDataTexture?ue.texSubImage2D(3553,n,e.x,e.y,r,s,a,o,t.image.data):t.isCompressedTexture?ue.compressedTexSubImage2D(3553,n,e.x,e.y,t.mipmaps[0].width,t.mipmaps[0].height,a,t.mipmaps[0].data):ue.texSubImage2D(3553,n,e.x,e.y,a,o,t.image),0===n&&i.generateMipmaps&&ue.generateMipmap(3553),j.unbindTexture()},this.copyTextureToTexture3D=function(e,t,i,n,r=0){if(f.isWebGL1Renderer)return void console.warn("THREE.WebGLRenderer.copyTextureToTexture3D: can only be used with WebGL2.");const s=e.max.x-e.min.x+1,a=e.max.y-e.min.y+1,o=e.max.z-e.min.z+1,h=ce.convert(n.format),c=ce.convert(n.type);let l;if(n.isDataTexture3D)q.setTexture3D(n,0),l=32879;else{if(!n.isDataTexture2DArray)return void console.warn("THREE.WebGLRenderer.copyTextureToTexture3D: only supports THREE.DataTexture3D and THREE.DataTexture2DArray.");q.setTexture2DArray(n,0),l=35866}ue.pixelStorei(37440,n.flipY),ue.pixelStorei(37441,n.premultiplyAlpha),ue.pixelStorei(3317,n.unpackAlignment);const u=ue.getParameter(3314),d=ue.getParameter(32878),p=ue.getParameter(3316),m=ue.getParameter(3315),g=ue.getParameter(32877),_=i.isCompressedTexture?i.mipmaps[0]:i.image;ue.pixelStorei(3314,_.width),ue.pixelStorei(32878,_.height),ue.pixelStorei(3316,e.min.x),ue.pixelStorei(3315,e.min.y),ue.pixelStorei(32877,e.min.z),i.isDataTexture||i.isDataTexture3D?ue.texSubImage3D(l,r,t.x,t.y,t.z,s,a,o,h,c,_.data):i.isCompressedTexture?(console.warn("THREE.WebGLRenderer.copyTextureToTexture3D: untested support for compressed srcTexture."),ue.compressedTexSubImage3D(l,r,t.x,t.y,t.z,s,a,o,h,_.data)):ue.texSubImage3D(l,r,t.x,t.y,t.z,s,a,o,h,c,_),ue.pixelStorei(3314,u),ue.pixelStorei(32878,d),ue.pixelStorei(3316,p),ue.pixelStorei(3315,m),ue.pixelStorei(32877,g),0===r&&n.generateMipmaps&&ue.generateMipmap(l),j.unbindTexture()},this.initTexture=function(e){q.setTexture2D(e,0),j.unbindTexture()},this.resetState=function(){_=0,v=0,y=null,j.reset(),le.reset()},"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}hh.prototype.isWebGLRenderer=!0;(class extends hh{}).prototype.isWebGL1Renderer=!0;class ch extends tr{constructor(){super(),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(e,t){return super.copy(e,t),null!==e.background&&(this.background=e.background.clone()),null!==e.environment&&(this.environment=e.environment.clone()),null!==e.fog&&(this.fog=e.fog.clone()),null!==e.overrideMaterial&&(this.overrideMaterial=e.overrideMaterial.clone()),this.autoUpdate=e.autoUpdate,this.matrixAutoUpdate=e.matrixAutoUpdate,this}toJSON(e){const t=super.toJSON(e);return null!==this.fog&&(t.object.fog=this.fog.toJSON()),t}}ch.prototype.isScene=!0;class lh{constructor(e,t){this.array=e,this.stride=t,this.count=void 0!==e?e.length/t:0,this.usage=wi,this.updateRange={offset:0,count:-1},this.version=0,this.uuid=Pi()}onUploadCallback(){}set needsUpdate(e){!0===e&&this.version++}setUsage(e){return this.usage=e,this}copy(e){return this.array=new e.array.constructor(e.array),this.count=e.count,this.stride=e.stride,this.usage=e.usage,this}copyAt(e,t,i){e*=this.stride,i*=t.stride;for(let n=0,r=this.stride;n<r;n++)this.array[e+n]=t.array[i+n];return this}set(e,t=0){return this.array.set(e,t),this}clone(e){void 0===e.arrayBuffers&&(e.arrayBuffers={}),void 0===this.array.buffer._uuid&&(this.array.buffer._uuid=Pi()),void 0===e.arrayBuffers[this.array.buffer._uuid]&&(e.arrayBuffers[this.array.buffer._uuid]=this.array.slice(0).buffer);const t=new this.array.constructor(e.arrayBuffers[this.array.buffer._uuid]),i=new this.constructor(t,this.stride);return i.setUsage(this.usage),i}onUpload(e){return this.onUploadCallback=e,this}toJSON(e){return void 0===e.arrayBuffers&&(e.arrayBuffers={}),void 0===this.array.buffer._uuid&&(this.array.buffer._uuid=Pi()),void 0===e.arrayBuffers[this.array.buffer._uuid]&&(e.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}}}lh.prototype.isInterleavedBuffer=!0;const uh=new Ki;class dh{constructor(e,t,i,n=!1){this.name="",this.data=e,this.itemSize=t,this.offset=i,this.normalized=!0===n}get count(){return this.data.count}get array(){return this.data.array}set needsUpdate(e){this.data.needsUpdate=e}applyMatrix4(e){for(let t=0,i=this.data.count;t<i;t++)uh.x=this.getX(t),uh.y=this.getY(t),uh.z=this.getZ(t),uh.applyMatrix4(e),this.setXYZ(t,uh.x,uh.y,uh.z);return this}applyNormalMatrix(e){for(let t=0,i=this.count;t<i;t++)uh.x=this.getX(t),uh.y=this.getY(t),uh.z=this.getZ(t),uh.applyNormalMatrix(e),this.setXYZ(t,uh.x,uh.y,uh.z);return this}transformDirection(e){for(let t=0,i=this.count;t<i;t++)uh.x=this.getX(t),uh.y=this.getY(t),uh.z=this.getZ(t),uh.transformDirection(e),this.setXYZ(t,uh.x,uh.y,uh.z);return this}setX(e,t){return this.data.array[e*this.data.stride+this.offset]=t,this}setY(e,t){return this.data.array[e*this.data.stride+this.offset+1]=t,this}setZ(e,t){return this.data.array[e*this.data.stride+this.offset+2]=t,this}setW(e,t){return this.data.array[e*this.data.stride+this.offset+3]=t,this}getX(e){return this.data.array[e*this.data.stride+this.offset]}getY(e){return this.data.array[e*this.data.stride+this.offset+1]}getZ(e){return this.data.array[e*this.data.stride+this.offset+2]}getW(e){return this.data.array[e*this.data.stride+this.offset+3]}setXY(e,t,i){return e=e*this.data.stride+this.offset,this.data.array[e+0]=t,this.data.array[e+1]=i,this}setXYZ(e,t,i,n){return e=e*this.data.stride+this.offset,this.data.array[e+0]=t,this.data.array[e+1]=i,this.data.array[e+2]=n,this}setXYZW(e,t,i,n,r){return e=e*this.data.stride+this.offset,this.data.array[e+0]=t,this.data.array[e+1]=i,this.data.array[e+2]=n,this.data.array[e+3]=r,this}clone(e){if(void 0===e){console.log("THREE.InterleavedBufferAttribute.clone(): Cloning an interlaved buffer attribute will deinterleave buffer data.");const e=[];for(let t=0;t<this.count;t++){const i=t*this.data.stride+this.offset;for(let t=0;t<this.itemSize;t++)e.push(this.data.array[i+t])}return new Tr(new this.array.constructor(e),this.itemSize,this.normalized)}return void 0===e.interleavedBuffers&&(e.interleavedBuffers={}),void 0===e.interleavedBuffers[this.data.uuid]&&(e.interleavedBuffers[this.data.uuid]=this.data.clone(e)),new dh(e.interleavedBuffers[this.data.uuid],this.itemSize,this.offset,this.normalized)}toJSON(e){if(void 0===e){console.log("THREE.InterleavedBufferAttribute.toJSON(): Serializing an interlaved buffer attribute will deinterleave buffer data.");const e=[];for(let t=0;t<this.count;t++){const i=t*this.data.stride+this.offset;for(let t=0;t<this.itemSize;t++)e.push(this.data.array[i+t])}return{itemSize:this.itemSize,type:this.array.constructor.name,array:e,normalized:this.normalized}}return void 0===e.interleavedBuffers&&(e.interleavedBuffers={}),void 0===e.interleavedBuffers[this.data.uuid]&&(e.interleavedBuffers[this.data.uuid]=this.data.toJSON(e)),{isInterleavedBufferAttribute:!0,itemSize:this.itemSize,data:this.data.uuid,offset:this.offset,normalized:this.normalized}}}dh.prototype.isInterleavedBufferAttribute=!0;class ph extends mr{constructor(e){super(),this.type="SpriteMaterial",this.color=new xr(16777215),this.map=null,this.alphaMap=null,this.rotation=0,this.sizeAttenuation=!0,this.transparent=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.map=e.map,this.alphaMap=e.alphaMap,this.rotation=e.rotation,this.sizeAttenuation=e.sizeAttenuation,this}}let mh;ph.prototype.isSpriteMaterial=!0;const fh=new Ki,gh=new Ki,_h=new Ki,vh=new zi,yh=new zi,bh=new Rn,xh=new Ki,wh=new Ki,Mh=new Ki,Sh=new zi,Th=new zi,Ch=new zi;class Eh extends tr{constructor(e){if(super(),this.type="Sprite",void 0===mh){mh=new kr;const e=new Float32Array([-.5,-.5,0,0,0,.5,-.5,0,1,0,.5,.5,0,1,1,-.5,.5,0,0,1]),t=new lh(e,5);mh.setIndex([0,1,2,0,2,3]),mh.setAttribute("position",new dh(t,3,0,!1)),mh.setAttribute("uv",new dh(t,2,3,!1))}this.geometry=mh,this.material=void 0!==e?e:new ph,this.center=new zi(.5,.5)}raycast(e,t){null===e.camera&&console.error('THREE.Sprite: "Raycaster.camera" needs to be set in order to raycast against sprites.'),gh.setFromMatrixScale(this.matrixWorld),bh.copy(e.camera.matrixWorld),this.modelViewMatrix.multiplyMatrices(e.camera.matrixWorldInverse,this.matrixWorld),_h.setFromMatrixPosition(this.modelViewMatrix),e.camera.isPerspectiveCamera&&!1===this.material.sizeAttenuation&&gh.multiplyScalar(-_h.z);const i=this.material.rotation;let n,r;0!==i&&(r=Math.cos(i),n=Math.sin(i));const s=this.center;Ah(xh.set(-.5,-.5,0),_h,s,gh,n,r),Ah(wh.set(.5,-.5,0),_h,s,gh,n,r),Ah(Mh.set(.5,.5,0),_h,s,gh,n,r),Sh.set(0,0),Th.set(1,0),Ch.set(1,1);let a=e.ray.intersectTriangle(xh,wh,Mh,!1,fh);if(null===a&&(Ah(wh.set(-.5,.5,0),_h,s,gh,n,r),Th.set(0,1),a=e.ray.intersectTriangle(xh,Mh,wh,!1,fh),null===a))return;const o=e.ray.origin.distanceTo(fh);o<e.near||o>e.far||t.push({distance:o,point:fh.clone(),uv:dr.getUV(fh,xh,wh,Mh,Sh,Th,Ch,new zi),face:null,object:this})}copy(e){return super.copy(e),void 0!==e.center&&this.center.copy(e.center),this.material=e.material,this}}function Ah(e,t,i,n,r,s){vh.subVectors(e,i).addScalar(.5).multiply(n),void 0!==r?(yh.x=s*vh.x-r*vh.y,yh.y=r*vh.x+s*vh.y):yh.copy(vh),e.copy(t),e.x+=yh.x,e.y+=yh.y,e.applyMatrix4(bh)}Eh.prototype.isSprite=!0;const Ih=new Ki,Rh=new Xi,Ph=new Xi,Lh=new Ki,Dh=new Rn;class Nh extends es{constructor(e,t){super(e,t),this.type="SkinnedMesh",this.bindMode="attached",this.bindMatrix=new Rn,this.bindMatrixInverse=new Rn}copy(e){return super.copy(e),this.bindMode=e.bindMode,this.bindMatrix.copy(e.bindMatrix),this.bindMatrixInverse.copy(e.bindMatrixInverse),this.skeleton=e.skeleton,this}bind(e,t){this.skeleton=e,void 0===t&&(this.updateMatrixWorld(!0),this.skeleton.calculateInverses(),t=this.matrixWorld),this.bindMatrix.copy(t),this.bindMatrixInverse.copy(t).invert()}pose(){this.skeleton.pose()}normalizeSkinWeights(){const e=new Xi,t=this.geometry.attributes.skinWeight;for(let i=0,n=t.count;i<n;i++){e.x=t.getX(i),e.y=t.getY(i),e.z=t.getZ(i),e.w=t.getW(i);const n=1/e.manhattanLength();n!==1/0?e.multiplyScalar(n):e.set(1,0,0,0),t.setXYZW(i,e.x,e.y,e.z,e.w)}}updateMatrixWorld(e){super.updateMatrixWorld(e),"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(e,t){const i=this.skeleton,n=this.geometry;Rh.fromBufferAttribute(n.attributes.skinIndex,e),Ph.fromBufferAttribute(n.attributes.skinWeight,e),Ih.copy(t).applyMatrix4(this.bindMatrix),t.set(0,0,0);for(let e=0;e<4;e++){const n=Ph.getComponent(e);if(0!==n){const r=Rh.getComponent(e);Dh.multiplyMatrices(i.bones[r].matrixWorld,i.boneInverses[r]),t.addScaledVector(Lh.copy(Ih).applyMatrix4(Dh),n)}}return t.applyMatrix4(this.bindMatrixInverse)}}Nh.prototype.isSkinnedMesh=!0;(class extends tr{constructor(){super(),this.type="Bone"}}).prototype.isBone=!0;(class extends Wi{constructor(e=null,t=1,i=1,n,r,s,a,o,h=1003,c=1003,l,u){super(null,s,a,o,h,c,n,r,l,u),this.image={data:e,width:t,height:i},this.magFilter=h,this.minFilter=c,this.generateMipmaps=!1,this.flipY=!1,this.unpackAlignment=1,this.needsUpdate=!0}}).prototype.isDataTexture=!0;class $h extends Tr{constructor(e,t,i,n=1){"number"==typeof i&&(n=i,i=!1,console.error("THREE.InstancedBufferAttribute: The constructor now expects normalized as the third argument.")),super(e,t,i),this.meshPerAttribute=n}copy(e){return super.copy(e),this.meshPerAttribute=e.meshPerAttribute,this}toJSON(){const e=super.toJSON();return e.meshPerAttribute=this.meshPerAttribute,e.isInstancedBufferAttribute=!0,e}}$h.prototype.isInstancedBufferAttribute=!0;const kh=new Rn,Oh=new Rn,zh=[],Fh=new es;(class extends es{constructor(e,t,i){super(e,t),this.instanceMatrix=new $h(new Float32Array(16*i),16),this.instanceColor=null,this.count=i,this.frustumCulled=!1}copy(e){return super.copy(e),this.instanceMatrix.copy(e.instanceMatrix),null!==e.instanceColor&&(this.instanceColor=e.instanceColor.clone()),this.count=e.count,this}getColorAt(e,t){t.fromArray(this.instanceColor.array,3*e)}getMatrixAt(e,t){t.fromArray(this.instanceMatrix.array,16*e)}raycast(e,t){const i=this.matrixWorld,n=this.count;if(Fh.geometry=this.geometry,Fh.material=this.material,void 0!==Fh.material)for(let r=0;r<n;r++){this.getMatrixAt(r,kh),Oh.multiplyMatrices(i,kh),Fh.matrixWorld=Oh,Fh.raycast(e,zh);for(let e=0,i=zh.length;e<i;e++){const i=zh[e];i.instanceId=r,i.object=this,t.push(i)}zh.length=0}}setColorAt(e,t){null===this.instanceColor&&(this.instanceColor=new $h(new Float32Array(3*this.instanceMatrix.count),3)),t.toArray(this.instanceColor.array,3*e)}setMatrixAt(e,t){t.toArray(this.instanceMatrix.array,16*e)}updateMorphTargets(){}dispose(){this.dispatchEvent({type:"dispose"})}}).prototype.isInstancedMesh=!0;class Bh extends mr{constructor(e){super(),this.type="LineBasicMaterial",this.color=new xr(16777215),this.linewidth=1,this.linecap="round",this.linejoin="round",this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.linewidth=e.linewidth,this.linecap=e.linecap,this.linejoin=e.linejoin,this}}Bh.prototype.isLineBasicMaterial=!0;const Uh=new Ki,Vh=new Ki,Hh=new Rn,jh=new In,Gh=new xn;class Wh extends tr{constructor(e=new kr,t=new Bh){super(),this.type="Line",this.geometry=e,this.material=t,this.updateMorphTargets()}copy(e){return super.copy(e),this.material=e.material,this.geometry=e.geometry,this}computeLineDistances(){const e=this.geometry;if(e.isBufferGeometry)if(null===e.index){const t=e.attributes.position,i=[0];for(let e=1,n=t.count;e<n;e++)Uh.fromBufferAttribute(t,e-1),Vh.fromBufferAttribute(t,e),i[e]=i[e-1],i[e]+=Uh.distanceTo(Vh);e.setAttribute("lineDistance",new Ar(i,1))}else console.warn("THREE.Line.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.");else e.isGeometry&&console.error("THREE.Line.computeLineDistances() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.");return this}raycast(e,t){const i=this.geometry,n=this.matrixWorld,r=e.params.Line.threshold,s=i.drawRange;if(null===i.boundingSphere&&i.computeBoundingSphere(),Gh.copy(i.boundingSphere),Gh.applyMatrix4(n),Gh.radius+=r,!1===e.ray.intersectsSphere(Gh))return;Hh.copy(n).invert(),jh.copy(e.ray).applyMatrix4(Hh);const a=r/((this.scale.x+this.scale.y+this.scale.z)/3),o=a*a,h=new Ki,c=new Ki,l=new Ki,u=new Ki,d=this.isLineSegments?2:1;if(i.isBufferGeometry){const n=i.index,r=i.attributes.position;if(null!==n){for(let i=Math.max(0,s.start),a=Math.min(n.count,s.start+s.count)-1;i<a;i+=d){const s=n.getX(i),a=n.getX(i+1);h.fromBufferAttribute(r,s),c.fromBufferAttribute(r,a);if(jh.distanceSqToSegment(h,c,u,l)>o)continue;u.applyMatrix4(this.matrixWorld);const d=e.ray.origin.distanceTo(u);d<e.near||d>e.far||t.push({distance:d,point:l.clone().applyMatrix4(this.matrixWorld),index:i,face:null,faceIndex:null,object:this})}}else{for(let i=Math.max(0,s.start),n=Math.min(r.count,s.start+s.count)-1;i<n;i+=d){h.fromBufferAttribute(r,i),c.fromBufferAttribute(r,i+1);if(jh.distanceSqToSegment(h,c,u,l)>o)continue;u.applyMatrix4(this.matrixWorld);const n=e.ray.origin.distanceTo(u);n<e.near||n>e.far||t.push({distance:n,point:l.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(){const e=this.geometry;if(e.isBufferGeometry){const t=e.morphAttributes,i=Object.keys(t);if(i.length>0){const e=t[i[0]];if(void 0!==e){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let t=0,i=e.length;t<i;t++){const i=e[t].name||String(t);this.morphTargetInfluences.push(0),this.morphTargetDictionary[i]=t}}}}else{const t=e.morphTargets;void 0!==t&&t.length>0&&console.error("THREE.Line.updateMorphTargets() does not support THREE.Geometry. Use THREE.BufferGeometry instead.")}}}Wh.prototype.isLine=!0;const qh=new Ki,Xh=new Ki;class Zh extends Wh{constructor(e,t){super(e,t),this.type="LineSegments"}computeLineDistances(){const e=this.geometry;if(e.isBufferGeometry)if(null===e.index){const t=e.attributes.position,i=[];for(let e=0,n=t.count;e<n;e+=2)qh.fromBufferAttribute(t,e),Xh.fromBufferAttribute(t,e+1),i[e]=0===e?0:i[e-1],i[e+1]=i[e]+qh.distanceTo(Xh);e.setAttribute("lineDistance",new Ar(i,1))}else console.warn("THREE.LineSegments.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.");else e.isGeometry&&console.error("THREE.LineSegments.computeLineDistances() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.");return this}}Zh.prototype.isLineSegments=!0;(class extends Wh{constructor(e,t){super(e,t),this.type="LineLoop"}}).prototype.isLineLoop=!0;class Yh extends mr{constructor(e){super(),this.type="PointsMaterial",this.color=new xr(16777215),this.map=null,this.alphaMap=null,this.size=1,this.sizeAttenuation=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.map=e.map,this.alphaMap=e.alphaMap,this.size=e.size,this.sizeAttenuation=e.sizeAttenuation,this}}Yh.prototype.isPointsMaterial=!0;const Jh=new Rn,Kh=new In,Qh=new xn,ec=new Ki;class tc extends tr{constructor(e=new kr,t=new Yh){super(),this.type="Points",this.geometry=e,this.material=t,this.updateMorphTargets()}copy(e){return super.copy(e),this.material=e.material,this.geometry=e.geometry,this}raycast(e,t){const i=this.geometry,n=this.matrixWorld,r=e.params.Points.threshold,s=i.drawRange;if(null===i.boundingSphere&&i.computeBoundingSphere(),Qh.copy(i.boundingSphere),Qh.applyMatrix4(n),Qh.radius+=r,!1===e.ray.intersectsSphere(Qh))return;Jh.copy(n).invert(),Kh.copy(e.ray).applyMatrix4(Jh);const a=r/((this.scale.x+this.scale.y+this.scale.z)/3),o=a*a;if(i.isBufferGeometry){const r=i.index,a=i.attributes.position;if(null!==r){for(let i=Math.max(0,s.start),h=Math.min(r.count,s.start+s.count);i<h;i++){const s=r.getX(i);ec.fromBufferAttribute(a,s),ic(ec,s,o,n,e,t,this)}}else{for(let i=Math.max(0,s.start),r=Math.min(a.count,s.start+s.count);i<r;i++)ec.fromBufferAttribute(a,i),ic(ec,i,o,n,e,t,this)}}else console.error("THREE.Points.raycast() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.")}updateMorphTargets(){const e=this.geometry;if(e.isBufferGeometry){const t=e.morphAttributes,i=Object.keys(t);if(i.length>0){const e=t[i[0]];if(void 0!==e){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let t=0,i=e.length;t<i;t++){const i=e[t].name||String(t);this.morphTargetInfluences.push(0),this.morphTargetDictionary[i]=t}}}}else{const t=e.morphTargets;void 0!==t&&t.length>0&&console.error("THREE.Points.updateMorphTargets() does not support THREE.Geometry. Use THREE.BufferGeometry instead.")}}}function ic(e,t,i,n,r,s,a){const o=Kh.distanceSqToPoint(e);if(o<i){const i=new Ki;Kh.closestPointToPoint(e,i),i.applyMatrix4(n);const h=r.ray.origin.distanceTo(i);if(h<r.near||h>r.far)return;s.push({distance:h,distanceToRay:Math.sqrt(o),point:i,index:t,face:null,object:a})}}tc.prototype.isPoints=!0;(class extends Wi{constructor(e,t,i,n,r,s,a,o,h){super(e,t,i,n,r,s,a,o,h),this.format=void 0!==a?a:ai,this.minFilter=void 0!==s?s:Kt,this.magFilter=void 0!==r?r:Kt,this.generateMipmaps=!1;const c=this;"requestVideoFrameCallback"in e&&e.requestVideoFrameCallback((function t(){c.needsUpdate=!0,e.requestVideoFrameCallback(t)}))}clone(){return new this.constructor(this.image).copy(this)}update(){const e=this.image;!1==="requestVideoFrameCallback"in e&&e.readyState>=e.HAVE_CURRENT_DATA&&(this.needsUpdate=!0)}}).prototype.isVideoTexture=!0;(class extends Wi{constructor(e,t,i,n,r,s,a,o,h,c,l,u){super(null,s,a,o,h,c,n,r,l,u),this.image={width:t,height:i},this.mipmaps=e,this.flipY=!1,this.generateMipmaps=!1}}).prototype.isCompressedTexture=!0;(class extends Wi{constructor(e,t,i,n,r,s,a,o,h){super(e,t,i,n,r,s,a,o,h),this.needsUpdate=!0}}).prototype.isCanvasTexture=!0;(class extends Wi{constructor(e,t,i,n,r,s,a,o,h,c){if((c=void 0!==c?c:hi)!==hi&&c!==ci)throw new Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");void 0===i&&c===hi&&(i=ti),void 0===i&&c===ci&&(i=si),super(null,n,r,s,a,o,c,i,h),this.image={width:e,height:t},this.magFilter=void 0!==a?a:Jt,this.minFilter=void 0!==o?o:Jt,this.flipY=!1,this.generateMipmaps=!1}}).prototype.isDepthTexture=!0;class nc extends kr{constructor(e=1,t=8,i=0,n=2*Math.PI){super(),this.type="CircleGeometry",this.parameters={radius:e,segments:t,thetaStart:i,thetaLength:n},t=Math.max(3,t);const r=[],s=[],a=[],o=[],h=new Ki,c=new zi;s.push(0,0,0),a.push(0,0,1),o.push(.5,.5);for(let r=0,l=3;r<=t;r++,l+=3){const u=i+r/t*n;h.x=e*Math.cos(u),h.y=e*Math.sin(u),s.push(h.x,h.y,h.z),a.push(0,0,1),c.x=(s[l]/e+1)/2,c.y=(s[l+1]/e+1)/2,o.push(c.x,c.y)}for(let e=1;e<=t;e++)r.push(e,e+1,0);this.setIndex(r),this.setAttribute("position",new Ar(s,3)),this.setAttribute("normal",new Ar(a,3)),this.setAttribute("uv",new Ar(o,2))}static fromJSON(e){return new nc(e.radius,e.segments,e.thetaStart,e.thetaLength)}}new Ki,new Ki,new Ki,new dr;class rc{constructor(){this.type="Curve",this.arcLengthDivisions=200}getPoint(){return console.warn("THREE.Curve: .getPoint() not implemented."),null}getPointAt(e,t){const i=this.getUtoTmapping(e);return this.getPoint(i,t)}getPoints(e=5){const t=[];for(let i=0;i<=e;i++)t.push(this.getPoint(i/e));return t}getSpacedPoints(e=5){const t=[];for(let i=0;i<=e;i++)t.push(this.getPointAt(i/e));return t}getLength(){const e=this.getLengths();return e[e.length-1]}getLengths(e=this.arcLengthDivisions){if(this.cacheArcLengths&&this.cacheArcLengths.length===e+1&&!this.needsUpdate)return this.cacheArcLengths;this.needsUpdate=!1;const t=[];let i,n=this.getPoint(0),r=0;t.push(0);for(let s=1;s<=e;s++)i=this.getPoint(s/e),r+=i.distanceTo(n),t.push(r),n=i;return this.cacheArcLengths=t,t}updateArcLengths(){this.needsUpdate=!0,this.getLengths()}getUtoTmapping(e,t){const i=this.getLengths();let n=0;const r=i.length;let s;s=t||e*i[r-1];let a,o=0,h=r-1;for(;o<=h;)if(n=Math.floor(o+(h-o)/2),a=i[n]-s,a<0)o=n+1;else{if(!(a>0)){h=n;break}h=n-1}if(n=h,i[n]===s)return n/(r-1);const c=i[n];return(n+(s-c)/(i[n+1]-c))/(r-1)}getTangent(e,t){const i=1e-4;let n=e-i,r=e+i;n<0&&(n=0),r>1&&(r=1);const s=this.getPoint(n),a=this.getPoint(r),o=t||(s.isVector2?new zi:new Ki);return o.copy(a).sub(s).normalize(),o}getTangentAt(e,t){const i=this.getUtoTmapping(e);return this.getTangent(i,t)}computeFrenetFrames(e,t){const i=new Ki,n=[],r=[],s=[],a=new Ki,o=new Rn;for(let t=0;t<=e;t++){const i=t/e;n[t]=this.getTangentAt(i,new Ki)}r[0]=new Ki,s[0]=new Ki;let h=Number.MAX_VALUE;const c=Math.abs(n[0].x),l=Math.abs(n[0].y),u=Math.abs(n[0].z);c<=h&&(h=c,i.set(1,0,0)),l<=h&&(h=l,i.set(0,1,0)),u<=h&&i.set(0,0,1),a.crossVectors(n[0],i).normalize(),r[0].crossVectors(n[0],a),s[0].crossVectors(n[0],r[0]);for(let t=1;t<=e;t++){if(r[t]=r[t-1].clone(),s[t]=s[t-1].clone(),a.crossVectors(n[t-1],n[t]),a.length()>Number.EPSILON){a.normalize();const e=Math.acos(Li(n[t-1].dot(n[t]),-1,1));r[t].applyMatrix4(o.makeRotationAxis(a,e))}s[t].crossVectors(n[t],r[t])}if(!0===t){let t=Math.acos(Li(r[0].dot(r[e]),-1,1));t/=e,n[0].dot(a.crossVectors(r[0],r[e]))>0&&(t=-t);for(let i=1;i<=e;i++)r[i].applyMatrix4(o.makeRotationAxis(n[i],t*i)),s[i].crossVectors(n[i],r[i])}return{tangents:n,normals:r,binormals:s}}clone(){return(new this.constructor).copy(this)}copy(e){return this.arcLengthDivisions=e.arcLengthDivisions,this}toJSON(){const e={metadata:{version:4.5,type:"Curve",generator:"Curve.toJSON"}};return e.arcLengthDivisions=this.arcLengthDivisions,e.type=this.type,e}fromJSON(e){return this.arcLengthDivisions=e.arcLengthDivisions,this}}class sc extends rc{constructor(e=0,t=0,i=1,n=1,r=0,s=2*Math.PI,a=!1,o=0){super(),this.type="EllipseCurve",this.aX=e,this.aY=t,this.xRadius=i,this.yRadius=n,this.aStartAngle=r,this.aEndAngle=s,this.aClockwise=a,this.aRotation=o}getPoint(e,t){const i=t||new zi,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 a=this.aStartAngle+e*r;let o=this.aX+this.xRadius*Math.cos(a),h=this.aY+this.yRadius*Math.sin(a);if(0!==this.aRotation){const e=Math.cos(this.aRotation),t=Math.sin(this.aRotation),i=o-this.aX,n=h-this.aY;o=i*e-n*t+this.aX,h=i*t+n*e+this.aY}return i.set(o,h)}copy(e){return super.copy(e),this.aX=e.aX,this.aY=e.aY,this.xRadius=e.xRadius,this.yRadius=e.yRadius,this.aStartAngle=e.aStartAngle,this.aEndAngle=e.aEndAngle,this.aClockwise=e.aClockwise,this.aRotation=e.aRotation,this}toJSON(){const e=super.toJSON();return e.aX=this.aX,e.aY=this.aY,e.xRadius=this.xRadius,e.yRadius=this.yRadius,e.aStartAngle=this.aStartAngle,e.aEndAngle=this.aEndAngle,e.aClockwise=this.aClockwise,e.aRotation=this.aRotation,e}fromJSON(e){return super.fromJSON(e),this.aX=e.aX,this.aY=e.aY,this.xRadius=e.xRadius,this.yRadius=e.yRadius,this.aStartAngle=e.aStartAngle,this.aEndAngle=e.aEndAngle,this.aClockwise=e.aClockwise,this.aRotation=e.aRotation,this}}sc.prototype.isEllipseCurve=!0;class ac extends sc{constructor(e,t,i,n,r,s){super(e,t,i,i,n,r,s),this.type="ArcCurve"}}function oc(){let e=0,t=0,i=0,n=0;function r(r,s,a,o){e=r,t=a,i=-3*r+3*s-2*a-o,n=2*r-2*s+a+o}return{initCatmullRom:function(e,t,i,n,s){r(t,i,s*(i-e),s*(n-t))},initNonuniformCatmullRom:function(e,t,i,n,s,a,o){let h=(t-e)/s-(i-e)/(s+a)+(i-t)/a,c=(i-t)/a-(n-t)/(a+o)+(n-i)/o;h*=a,c*=a,r(t,i,h,c)},calc:function(r){const s=r*r;return e+t*r+i*s+n*(s*r)}}}ac.prototype.isArcCurve=!0;const hc=new Ki,cc=new oc,lc=new oc,uc=new oc;class dc extends rc{constructor(e=[],t=!1,i="centripetal",n=.5){super(),this.type="CatmullRomCurve3",this.points=e,this.closed=t,this.curveType=i,this.tension=n}getPoint(e,t=new Ki){const i=t,n=this.points,r=n.length,s=(r-(this.closed?0:1))*e;let a,o,h=Math.floor(s),c=s-h;this.closed?h+=h>0?0:(Math.floor(Math.abs(h)/r)+1)*r:0===c&&h===r-1&&(h=r-2,c=1),this.closed||h>0?a=n[(h-1)%r]:(hc.subVectors(n[0],n[1]).add(n[0]),a=hc);const l=n[h%r],u=n[(h+1)%r];if(this.closed||h+2<r?o=n[(h+2)%r]:(hc.subVectors(n[r-1],n[r-2]).add(n[r-1]),o=hc),"centripetal"===this.curveType||"chordal"===this.curveType){const e="chordal"===this.curveType?.5:.25;let t=Math.pow(a.distanceToSquared(l),e),i=Math.pow(l.distanceToSquared(u),e),n=Math.pow(u.distanceToSquared(o),e);i<1e-4&&(i=1),t<1e-4&&(t=i),n<1e-4&&(n=i),cc.initNonuniformCatmullRom(a.x,l.x,u.x,o.x,t,i,n),lc.initNonuniformCatmullRom(a.y,l.y,u.y,o.y,t,i,n),uc.initNonuniformCatmullRom(a.z,l.z,u.z,o.z,t,i,n)}else"catmullrom"===this.curveType&&(cc.initCatmullRom(a.x,l.x,u.x,o.x,this.tension),lc.initCatmullRom(a.y,l.y,u.y,o.y,this.tension),uc.initCatmullRom(a.z,l.z,u.z,o.z,this.tension));return i.set(cc.calc(c),lc.calc(c),uc.calc(c)),i}copy(e){super.copy(e),this.points=[];for(let t=0,i=e.points.length;t<i;t++){const i=e.points[t];this.points.push(i.clone())}return this.closed=e.closed,this.curveType=e.curveType,this.tension=e.tension,this}toJSON(){const e=super.toJSON();e.points=[];for(let t=0,i=this.points.length;t<i;t++){const i=this.points[t];e.points.push(i.toArray())}return e.closed=this.closed,e.curveType=this.curveType,e.tension=this.tension,e}fromJSON(e){super.fromJSON(e),this.points=[];for(let t=0,i=e.points.length;t<i;t++){const i=e.points[t];this.points.push((new Ki).fromArray(i))}return this.closed=e.closed,this.curveType=e.curveType,this.tension=e.tension,this}}function pc(e,t,i,n,r){const s=.5*(n-t),a=.5*(r-i),o=e*e;return(2*i-2*n+s+a)*(e*o)+(-3*i+3*n-2*s-a)*o+s*e+i}function mc(e,t,i,n){return function(e,t){const i=1-e;return i*i*t}(e,t)+function(e,t){return 2*(1-e)*e*t}(e,i)+function(e,t){return e*e*t}(e,n)}function fc(e,t,i,n,r){return function(e,t){const i=1-e;return i*i*i*t}(e,t)+function(e,t){const i=1-e;return 3*i*i*e*t}(e,i)+function(e,t){return 3*(1-e)*e*e*t}(e,n)+function(e,t){return e*e*e*t}(e,r)}dc.prototype.isCatmullRomCurve3=!0;class gc extends rc{constructor(e=new zi,t=new zi,i=new zi,n=new zi){super(),this.type="CubicBezierCurve",this.v0=e,this.v1=t,this.v2=i,this.v3=n}getPoint(e,t=new zi){const i=t,n=this.v0,r=this.v1,s=this.v2,a=this.v3;return i.set(fc(e,n.x,r.x,s.x,a.x),fc(e,n.y,r.y,s.y,a.y)),i}copy(e){return super.copy(e),this.v0.copy(e.v0),this.v1.copy(e.v1),this.v2.copy(e.v2),this.v3.copy(e.v3),this}toJSON(){const e=super.toJSON();return e.v0=this.v0.toArray(),e.v1=this.v1.toArray(),e.v2=this.v2.toArray(),e.v3=this.v3.toArray(),e}fromJSON(e){return super.fromJSON(e),this.v0.fromArray(e.v0),this.v1.fromArray(e.v1),this.v2.fromArray(e.v2),this.v3.fromArray(e.v3),this}}gc.prototype.isCubicBezierCurve=!0;class _c extends rc{constructor(e=new Ki,t=new Ki,i=new Ki,n=new Ki){super(),this.type="CubicBezierCurve3",this.v0=e,this.v1=t,this.v2=i,this.v3=n}getPoint(e,t=new Ki){const i=t,n=this.v0,r=this.v1,s=this.v2,a=this.v3;return i.set(fc(e,n.x,r.x,s.x,a.x),fc(e,n.y,r.y,s.y,a.y),fc(e,n.z,r.z,s.z,a.z)),i}copy(e){return super.copy(e),this.v0.copy(e.v0),this.v1.copy(e.v1),this.v2.copy(e.v2),this.v3.copy(e.v3),this}toJSON(){const e=super.toJSON();return e.v0=this.v0.toArray(),e.v1=this.v1.toArray(),e.v2=this.v2.toArray(),e.v3=this.v3.toArray(),e}fromJSON(e){return super.fromJSON(e),this.v0.fromArray(e.v0),this.v1.fromArray(e.v1),this.v2.fromArray(e.v2),this.v3.fromArray(e.v3),this}}_c.prototype.isCubicBezierCurve3=!0;class vc extends rc{constructor(e=new zi,t=new zi){super(),this.type="LineCurve",this.v1=e,this.v2=t}getPoint(e,t=new zi){const i=t;return 1===e?i.copy(this.v2):(i.copy(this.v2).sub(this.v1),i.multiplyScalar(e).add(this.v1)),i}getPointAt(e,t){return this.getPoint(e,t)}getTangent(e,t){const i=t||new zi;return i.copy(this.v2).sub(this.v1).normalize(),i}copy(e){return super.copy(e),this.v1.copy(e.v1),this.v2.copy(e.v2),this}toJSON(){const e=super.toJSON();return e.v1=this.v1.toArray(),e.v2=this.v2.toArray(),e}fromJSON(e){return super.fromJSON(e),this.v1.fromArray(e.v1),this.v2.fromArray(e.v2),this}}vc.prototype.isLineCurve=!0;class yc extends rc{constructor(e=new zi,t=new zi,i=new zi){super(),this.type="QuadraticBezierCurve",this.v0=e,this.v1=t,this.v2=i}getPoint(e,t=new zi){const i=t,n=this.v0,r=this.v1,s=this.v2;return i.set(mc(e,n.x,r.x,s.x),mc(e,n.y,r.y,s.y)),i}copy(e){return super.copy(e),this.v0.copy(e.v0),this.v1.copy(e.v1),this.v2.copy(e.v2),this}toJSON(){const e=super.toJSON();return e.v0=this.v0.toArray(),e.v1=this.v1.toArray(),e.v2=this.v2.toArray(),e}fromJSON(e){return super.fromJSON(e),this.v0.fromArray(e.v0),this.v1.fromArray(e.v1),this.v2.fromArray(e.v2),this}}yc.prototype.isQuadraticBezierCurve=!0;class bc extends rc{constructor(e=new Ki,t=new Ki,i=new Ki){super(),this.type="QuadraticBezierCurve3",this.v0=e,this.v1=t,this.v2=i}getPoint(e,t=new Ki){const i=t,n=this.v0,r=this.v1,s=this.v2;return i.set(mc(e,n.x,r.x,s.x),mc(e,n.y,r.y,s.y),mc(e,n.z,r.z,s.z)),i}copy(e){return super.copy(e),this.v0.copy(e.v0),this.v1.copy(e.v1),this.v2.copy(e.v2),this}toJSON(){const e=super.toJSON();return e.v0=this.v0.toArray(),e.v1=this.v1.toArray(),e.v2=this.v2.toArray(),e}fromJSON(e){return super.fromJSON(e),this.v0.fromArray(e.v0),this.v1.fromArray(e.v1),this.v2.fromArray(e.v2),this}}bc.prototype.isQuadraticBezierCurve3=!0;class xc extends rc{constructor(e=[]){super(),this.type="SplineCurve",this.points=e}getPoint(e,t=new zi){const i=t,n=this.points,r=(n.length-1)*e,s=Math.floor(r),a=r-s,o=n[0===s?s:s-1],h=n[s],c=n[s>n.length-2?n.length-1:s+1],l=n[s>n.length-3?n.length-1:s+2];return i.set(pc(a,o.x,h.x,c.x,l.x),pc(a,o.y,h.y,c.y,l.y)),i}copy(e){super.copy(e),this.points=[];for(let t=0,i=e.points.length;t<i;t++){const i=e.points[t];this.points.push(i.clone())}return this}toJSON(){const e=super.toJSON();e.points=[];for(let t=0,i=this.points.length;t<i;t++){const i=this.points[t];e.points.push(i.toArray())}return e}fromJSON(e){super.fromJSON(e),this.points=[];for(let t=0,i=e.points.length;t<i;t++){const i=e.points[t];this.points.push((new zi).fromArray(i))}return this}}xc.prototype.isSplineCurve=!0;var wc=Object.freeze({__proto__:null,ArcCurve:ac,CatmullRomCurve3:dc,CubicBezierCurve:gc,CubicBezierCurve3:_c,EllipseCurve:sc,LineCurve:vc,LineCurve3:class extends rc{constructor(e=new Ki,t=new Ki){super(),this.type="LineCurve3",this.isLineCurve3=!0,this.v1=e,this.v2=t}getPoint(e,t=new Ki){const i=t;return 1===e?i.copy(this.v2):(i.copy(this.v2).sub(this.v1),i.multiplyScalar(e).add(this.v1)),i}getPointAt(e,t){return this.getPoint(e,t)}copy(e){return super.copy(e),this.v1.copy(e.v1),this.v2.copy(e.v2),this}toJSON(){const e=super.toJSON();return e.v1=this.v1.toArray(),e.v2=this.v2.toArray(),e}fromJSON(e){return super.fromJSON(e),this.v1.fromArray(e.v1),this.v2.fromArray(e.v2),this}},QuadraticBezierCurve:yc,QuadraticBezierCurve3:bc,SplineCurve:xc});class Mc extends rc{constructor(){super(),this.type="CurvePath",this.curves=[],this.autoClose=!1}add(e){this.curves.push(e)}closePath(){const e=this.curves[0].getPoint(0),t=this.curves[this.curves.length-1].getPoint(1);e.equals(t)||this.curves.push(new vc(t,e))}getPoint(e,t){const i=e*this.getLength(),n=this.getCurveLengths();let r=0;for(;r<n.length;){if(n[r]>=i){const e=n[r]-i,s=this.curves[r],a=s.getLength(),o=0===a?0:1-e/a;return s.getPointAt(o,t)}r++}return null}getLength(){const e=this.getCurveLengths();return e[e.length-1]}updateArcLengths(){this.needsUpdate=!0,this.cacheLengths=null,this.getCurveLengths()}getCurveLengths(){if(this.cacheLengths&&this.cacheLengths.length===this.curves.length)return this.cacheLengths;const e=[];let t=0;for(let i=0,n=this.curves.length;i<n;i++)t+=this.curves[i].getLength(),e.push(t);return this.cacheLengths=e,e}getSpacedPoints(e=40){const t=[];for(let i=0;i<=e;i++)t.push(this.getPoint(i/e));return this.autoClose&&t.push(t[0]),t}getPoints(e=12){const t=[];let i;for(let n=0,r=this.curves;n<r.length;n++){const s=r[n],a=s&&s.isEllipseCurve?2*e:s&&(s.isLineCurve||s.isLineCurve3)?1:s&&s.isSplineCurve?e*s.points.length:e,o=s.getPoints(a);for(let e=0;e<o.length;e++){const n=o[e];i&&i.equals(n)||(t.push(n),i=n)}}return this.autoClose&&t.length>1&&!t[t.length-1].equals(t[0])&&t.push(t[0]),t}copy(e){super.copy(e),this.curves=[];for(let t=0,i=e.curves.length;t<i;t++){const i=e.curves[t];this.curves.push(i.clone())}return this.autoClose=e.autoClose,this}toJSON(){const e=super.toJSON();e.autoClose=this.autoClose,e.curves=[];for(let t=0,i=this.curves.length;t<i;t++){const i=this.curves[t];e.curves.push(i.toJSON())}return e}fromJSON(e){super.fromJSON(e),this.autoClose=e.autoClose,this.curves=[];for(let t=0,i=e.curves.length;t<i;t++){const i=e.curves[t];this.curves.push((new wc[i.type]).fromJSON(i))}return this}}class Sc extends Mc{constructor(e){super(),this.type="Path",this.currentPoint=new zi,e&&this.setFromPoints(e)}setFromPoints(e){this.moveTo(e[0].x,e[0].y);for(let t=1,i=e.length;t<i;t++)this.lineTo(e[t].x,e[t].y);return this}moveTo(e,t){return this.currentPoint.set(e,t),this}lineTo(e,t){const i=new vc(this.currentPoint.clone(),new zi(e,t));return this.curves.push(i),this.currentPoint.set(e,t),this}quadraticCurveTo(e,t,i,n){const r=new yc(this.currentPoint.clone(),new zi(e,t),new zi(i,n));return this.curves.push(r),this.currentPoint.set(i,n),this}bezierCurveTo(e,t,i,n,r,s){const a=new gc(this.currentPoint.clone(),new zi(e,t),new zi(i,n),new zi(r,s));return this.curves.push(a),this.currentPoint.set(r,s),this}splineThru(e){const t=[this.currentPoint.clone()].concat(e),i=new xc(t);return this.curves.push(i),this.currentPoint.copy(e[e.length-1]),this}arc(e,t,i,n,r,s){const a=this.currentPoint.x,o=this.currentPoint.y;return this.absarc(e+a,t+o,i,n,r,s),this}absarc(e,t,i,n,r,s){return this.absellipse(e,t,i,i,n,r,s),this}ellipse(e,t,i,n,r,s,a,o){const h=this.currentPoint.x,c=this.currentPoint.y;return this.absellipse(e+h,t+c,i,n,r,s,a,o),this}absellipse(e,t,i,n,r,s,a,o){const h=new sc(e,t,i,n,r,s,a,o);if(this.curves.length>0){const e=h.getPoint(0);e.equals(this.currentPoint)||this.lineTo(e.x,e.y)}this.curves.push(h);const c=h.getPoint(1);return this.currentPoint.copy(c),this}copy(e){return super.copy(e),this.currentPoint.copy(e.currentPoint),this}toJSON(){const e=super.toJSON();return e.currentPoint=this.currentPoint.toArray(),e}fromJSON(e){return super.fromJSON(e),this.currentPoint.fromArray(e.currentPoint),this}}class Tc extends Sc{constructor(e){super(e),this.uuid=Pi(),this.type="Shape",this.holes=[]}getPointsHoles(e){const t=[];for(let i=0,n=this.holes.length;i<n;i++)t[i]=this.holes[i].getPoints(e);return t}extractPoints(e){return{shape:this.getPoints(e),holes:this.getPointsHoles(e)}}copy(e){super.copy(e),this.holes=[];for(let t=0,i=e.holes.length;t<i;t++){const i=e.holes[t];this.holes.push(i.clone())}return this}toJSON(){const e=super.toJSON();e.uuid=this.uuid,e.holes=[];for(let t=0,i=this.holes.length;t<i;t++){const i=this.holes[t];e.holes.push(i.toJSON())}return e}fromJSON(e){super.fromJSON(e),this.uuid=e.uuid,this.holes=[];for(let t=0,i=e.holes.length;t<i;t++){const i=e.holes[t];this.holes.push((new Sc).fromJSON(i))}return this}}const Cc=function(e,t,i=2){const n=t&&t.length,r=n?t[0]*i:e.length;let s=Ec(e,0,r,i,!0);const a=[];if(!s||s.next===s.prev)return a;let o,h,c,l,u,d,p;if(n&&(s=function(e,t,i,n){const r=[];let s,a,o,h,c;for(s=0,a=t.length;s<a;s++)o=t[s]*n,h=s<a-1?t[s+1]*n:e.length,c=Ec(e,o,h,n,!1),c===c.next&&(c.steiner=!0),r.push(zc(c));for(r.sort(Nc),s=0;s<r.length;s++)$c(r[s],i),i=Ac(i,i.next);return i}(e,t,s,i)),e.length>80*i){o=c=e[0],h=l=e[1];for(let t=i;t<r;t+=i)u=e[t],d=e[t+1],u<o&&(o=u),d<h&&(h=d),u>c&&(c=u),d>l&&(l=d);p=Math.max(c-o,l-h),p=0!==p?1/p:0}return Ic(s,a,i,o,h,p),a};function Ec(e,t,i,n,r){let s,a;if(r===function(e,t,i,n){let r=0;for(let s=t,a=i-n;s<i;s+=n)r+=(e[a]-e[s])*(e[s+1]+e[a+1]),a=s;return r}(e,t,i,n)>0)for(s=t;s<i;s+=n)a=Xc(s,e[s],e[s+1],a);else for(s=i-n;s>=t;s-=n)a=Xc(s,e[s],e[s+1],a);return a&&Vc(a,a.next)&&(Zc(a),a=a.next),a}function Ac(e,t){if(!e)return e;t||(t=e);let i,n=e;do{if(i=!1,n.steiner||!Vc(n,n.next)&&0!==Uc(n.prev,n,n.next))n=n.next;else{if(Zc(n),n=t=n.prev,n===n.next)break;i=!0}}while(i||n!==t);return t}function Ic(e,t,i,n,r,s,a){if(!e)return;!a&&s&&function(e,t,i,n){let r=e;do{null===r.z&&(r.z=Oc(r.x,r.y,t,i,n)),r.prevZ=r.prev,r.nextZ=r.next,r=r.next}while(r!==e);r.prevZ.nextZ=null,r.prevZ=null,function(e){let t,i,n,r,s,a,o,h,c=1;do{for(i=e,e=null,s=null,a=0;i;){for(a++,n=i,o=0,t=0;t<c&&(o++,n=n.nextZ,n);t++);for(h=c;o>0||h>0&&n;)0!==o&&(0===h||!n||i.z<=n.z)?(r=i,i=i.nextZ,o--):(r=n,n=n.nextZ,h--),s?s.nextZ=r:e=r,r.prevZ=s,s=r;i=n}s.nextZ=null,c*=2}while(a>1)}(r)}(e,n,r,s);let o,h,c=e;for(;e.prev!==e.next;)if(o=e.prev,h=e.next,s?Pc(e,n,r,s):Rc(e))t.push(o.i/i),t.push(e.i/i),t.push(h.i/i),Zc(e),e=h.next,c=h.next;else if((e=h)===c){a?1===a?Ic(e=Lc(Ac(e),t,i),t,i,n,r,s,2):2===a&&Dc(e,t,i,n,r,s):Ic(Ac(e),t,i,n,r,s,1);break}}function Rc(e){const t=e.prev,i=e,n=e.next;if(Uc(t,i,n)>=0)return!1;let r=e.next.next;for(;r!==e.prev;){if(Fc(t.x,t.y,i.x,i.y,n.x,n.y,r.x,r.y)&&Uc(r.prev,r,r.next)>=0)return!1;r=r.next}return!0}function Pc(e,t,i,n){const r=e.prev,s=e,a=e.next;if(Uc(r,s,a)>=0)return!1;const o=r.x<s.x?r.x<a.x?r.x:a.x:s.x<a.x?s.x:a.x,h=r.y<s.y?r.y<a.y?r.y:a.y:s.y<a.y?s.y:a.y,c=r.x>s.x?r.x>a.x?r.x:a.x:s.x>a.x?s.x:a.x,l=r.y>s.y?r.y>a.y?r.y:a.y:s.y>a.y?s.y:a.y,u=Oc(o,h,t,i,n),d=Oc(c,l,t,i,n);let p=e.prevZ,m=e.nextZ;for(;p&&p.z>=u&&m&&m.z<=d;){if(p!==e.prev&&p!==e.next&&Fc(r.x,r.y,s.x,s.y,a.x,a.y,p.x,p.y)&&Uc(p.prev,p,p.next)>=0)return!1;if(p=p.prevZ,m!==e.prev&&m!==e.next&&Fc(r.x,r.y,s.x,s.y,a.x,a.y,m.x,m.y)&&Uc(m.prev,m,m.next)>=0)return!1;m=m.nextZ}for(;p&&p.z>=u;){if(p!==e.prev&&p!==e.next&&Fc(r.x,r.y,s.x,s.y,a.x,a.y,p.x,p.y)&&Uc(p.prev,p,p.next)>=0)return!1;p=p.prevZ}for(;m&&m.z<=d;){if(m!==e.prev&&m!==e.next&&Fc(r.x,r.y,s.x,s.y,a.x,a.y,m.x,m.y)&&Uc(m.prev,m,m.next)>=0)return!1;m=m.nextZ}return!0}function Lc(e,t,i){let n=e;do{const r=n.prev,s=n.next.next;!Vc(r,s)&&Hc(r,n,n.next,s)&&Wc(r,s)&&Wc(s,r)&&(t.push(r.i/i),t.push(n.i/i),t.push(s.i/i),Zc(n),Zc(n.next),n=e=s),n=n.next}while(n!==e);return Ac(n)}function Dc(e,t,i,n,r,s){let a=e;do{let e=a.next.next;for(;e!==a.prev;){if(a.i!==e.i&&Bc(a,e)){let o=qc(a,e);return a=Ac(a,a.next),o=Ac(o,o.next),Ic(a,t,i,n,r,s),void Ic(o,t,i,n,r,s)}e=e.next}a=a.next}while(a!==e)}function Nc(e,t){return e.x-t.x}function $c(e,t){if(t=function(e,t){let i=t;const n=e.x,r=e.y;let s,a=-1/0;do{if(r<=i.y&&r>=i.next.y&&i.next.y!==i.y){const e=i.x+(r-i.y)*(i.next.x-i.x)/(i.next.y-i.y);if(e<=n&&e>a){if(a=e,e===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!==t);if(!s)return null;if(n===a)return s;const o=s,h=s.x,c=s.y;let l,u=1/0;i=s;do{n>=i.x&&i.x>=h&&n!==i.x&&Fc(r<c?n:a,r,h,c,r<c?a:n,r,i.x,i.y)&&(l=Math.abs(r-i.y)/(n-i.x),Wc(i,e)&&(l<u||l===u&&(i.x>s.x||i.x===s.x&&kc(s,i)))&&(s=i,u=l)),i=i.next}while(i!==o);return s}(e,t)){const i=qc(t,e);Ac(t,t.next),Ac(i,i.next)}}function kc(e,t){return Uc(e.prev,e,t.prev)<0&&Uc(t.next,e,e.next)<0}function Oc(e,t,i,n,r){return(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e=32767*(e-i)*r)|e<<8))|e<<4))|e<<2))|e<<1))|(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t=32767*(t-n)*r)|t<<8))|t<<4))|t<<2))|t<<1))<<1}function zc(e){let t=e,i=e;do{(t.x<i.x||t.x===i.x&&t.y<i.y)&&(i=t),t=t.next}while(t!==e);return i}function Fc(e,t,i,n,r,s,a,o){return(r-a)*(t-o)-(e-a)*(s-o)>=0&&(e-a)*(n-o)-(i-a)*(t-o)>=0&&(i-a)*(s-o)-(r-a)*(n-o)>=0}function Bc(e,t){return e.next.i!==t.i&&e.prev.i!==t.i&&!function(e,t){let i=e;do{if(i.i!==e.i&&i.next.i!==e.i&&i.i!==t.i&&i.next.i!==t.i&&Hc(i,i.next,e,t))return!0;i=i.next}while(i!==e);return!1}(e,t)&&(Wc(e,t)&&Wc(t,e)&&function(e,t){let i=e,n=!1;const r=(e.x+t.x)/2,s=(e.y+t.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!==e);return n}(e,t)&&(Uc(e.prev,e,t.prev)||Uc(e,t.prev,t))||Vc(e,t)&&Uc(e.prev,e,e.next)>0&&Uc(t.prev,t,t.next)>0)}function Uc(e,t,i){return(t.y-e.y)*(i.x-t.x)-(t.x-e.x)*(i.y-t.y)}function Vc(e,t){return e.x===t.x&&e.y===t.y}function Hc(e,t,i,n){const r=Gc(Uc(e,t,i)),s=Gc(Uc(e,t,n)),a=Gc(Uc(i,n,e)),o=Gc(Uc(i,n,t));return r!==s&&a!==o||(!(0!==r||!jc(e,i,t))||(!(0!==s||!jc(e,n,t))||(!(0!==a||!jc(i,e,n))||!(0!==o||!jc(i,t,n)))))}function jc(e,t,i){return t.x<=Math.max(e.x,i.x)&&t.x>=Math.min(e.x,i.x)&&t.y<=Math.max(e.y,i.y)&&t.y>=Math.min(e.y,i.y)}function Gc(e){return e>0?1:e<0?-1:0}function Wc(e,t){return Uc(e.prev,e,e.next)<0?Uc(e,t,e.next)>=0&&Uc(e,e.prev,t)>=0:Uc(e,t,e.prev)<0||Uc(e,e.next,t)<0}function qc(e,t){const i=new Yc(e.i,e.x,e.y),n=new Yc(t.i,t.x,t.y),r=e.next,s=t.prev;return e.next=t,t.prev=e,i.next=r,r.prev=i,n.next=i,i.prev=n,s.next=n,n.prev=s,n}function Xc(e,t,i,n){const r=new Yc(e,t,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 Zc(e){e.next.prev=e.prev,e.prev.next=e.next,e.prevZ&&(e.prevZ.nextZ=e.nextZ),e.nextZ&&(e.nextZ.prevZ=e.prevZ)}function Yc(e,t,i){this.i=e,this.x=t,this.y=i,this.prev=null,this.next=null,this.z=null,this.prevZ=null,this.nextZ=null,this.steiner=!1}class Jc{static area(e){const t=e.length;let i=0;for(let n=t-1,r=0;r<t;n=r++)i+=e[n].x*e[r].y-e[r].x*e[n].y;return.5*i}static isClockWise(e){return Jc.area(e)<0}static triangulateShape(e,t){const i=[],n=[],r=[];Kc(e),Qc(i,e);let s=e.length;t.forEach(Kc);for(let e=0;e<t.length;e++)n.push(s),s+=t[e].length,Qc(i,t[e]);const a=Cc(i,n);for(let e=0;e<a.length;e+=3)r.push(a.slice(e,e+3));return r}}function Kc(e){const t=e.length;t>2&&e[t-1].equals(e[0])&&e.pop()}function Qc(e,t){for(let i=0;i<t.length;i++)e.push(t[i].x),e.push(t[i].y)}class el extends kr{constructor(e=new Tc([new zi(.5,.5),new zi(-.5,.5),new zi(-.5,-.5),new zi(.5,-.5)]),t={}){super(),this.type="ExtrudeGeometry",this.parameters={shapes:e,options:t},e=Array.isArray(e)?e:[e];const i=this,n=[],r=[];for(let t=0,i=e.length;t<i;t++){s(e[t])}function s(e){const s=[],a=void 0!==t.curveSegments?t.curveSegments:12,o=void 0!==t.steps?t.steps:1;let h=void 0!==t.depth?t.depth:1,c=void 0===t.bevelEnabled||t.bevelEnabled,l=void 0!==t.bevelThickness?t.bevelThickness:.2,u=void 0!==t.bevelSize?t.bevelSize:l-.1,d=void 0!==t.bevelOffset?t.bevelOffset:0,p=void 0!==t.bevelSegments?t.bevelSegments:3;const m=t.extrudePath,f=void 0!==t.UVGenerator?t.UVGenerator:tl;void 0!==t.amount&&(console.warn("THREE.ExtrudeBufferGeometry: amount has been renamed to depth."),h=t.amount);let g,_,v,y,b,x=!1;m&&(g=m.getSpacedPoints(o),x=!0,c=!1,_=m.computeFrenetFrames(o,!1),v=new Ki,y=new Ki,b=new Ki),c||(p=0,l=0,u=0,d=0);const w=e.extractPoints(a);let M=w.shape;const S=w.holes;if(!Jc.isClockWise(M)){M=M.reverse();for(let e=0,t=S.length;e<t;e++){const t=S[e];Jc.isClockWise(t)&&(S[e]=t.reverse())}}const T=Jc.triangulateShape(M,S),C=M;for(let e=0,t=S.length;e<t;e++){const t=S[e];M=M.concat(t)}function E(e,t,i){return t||console.error("THREE.ExtrudeGeometry: vec does not exist"),t.clone().multiplyScalar(i).add(e)}const A=M.length,I=T.length;function R(e,t,i){let n,r,s;const a=e.x-t.x,o=e.y-t.y,h=i.x-e.x,c=i.y-e.y,l=a*a+o*o,u=a*c-o*h;if(Math.abs(u)>Number.EPSILON){const u=Math.sqrt(l),d=Math.sqrt(h*h+c*c),p=t.x-o/u,m=t.y+a/u,f=((i.x-c/d-p)*c-(i.y+h/d-m)*h)/(a*c-o*h);n=p+a*f-e.x,r=m+o*f-e.y;const g=n*n+r*r;if(g<=2)return new zi(n,r);s=Math.sqrt(g/2)}else{let e=!1;a>Number.EPSILON?h>Number.EPSILON&&(e=!0):a<-Number.EPSILON?h<-Number.EPSILON&&(e=!0):Math.sign(o)===Math.sign(c)&&(e=!0),e?(n=-o,r=a,s=Math.sqrt(l)):(n=a,r=o,s=Math.sqrt(l/2))}return new zi(n/s,r/s)}const P=[];for(let e=0,t=C.length,i=t-1,n=e+1;e<t;e++,i++,n++)i===t&&(i=0),n===t&&(n=0),P[e]=R(C[e],C[i],C[n]);const L=[];let D,N=P.concat();for(let e=0,t=S.length;e<t;e++){const t=S[e];D=[];for(let e=0,i=t.length,n=i-1,r=e+1;e<i;e++,n++,r++)n===i&&(n=0),r===i&&(r=0),D[e]=R(t[e],t[n],t[r]);L.push(D),N=N.concat(D)}for(let e=0;e<p;e++){const t=e/p,i=l*Math.cos(t*Math.PI/2),n=u*Math.sin(t*Math.PI/2)+d;for(let e=0,t=C.length;e<t;e++){const t=E(C[e],P[e],n);O(t.x,t.y,-i)}for(let e=0,t=S.length;e<t;e++){const t=S[e];D=L[e];for(let e=0,r=t.length;e<r;e++){const r=E(t[e],D[e],n);O(r.x,r.y,-i)}}}const $=u+d;for(let e=0;e<A;e++){const t=c?E(M[e],N[e],$):M[e];x?(y.copy(_.normals[0]).multiplyScalar(t.x),v.copy(_.binormals[0]).multiplyScalar(t.y),b.copy(g[0]).add(y).add(v),O(b.x,b.y,b.z)):O(t.x,t.y,0)}for(let e=1;e<=o;e++)for(let t=0;t<A;t++){const i=c?E(M[t],N[t],$):M[t];x?(y.copy(_.normals[e]).multiplyScalar(i.x),v.copy(_.binormals[e]).multiplyScalar(i.y),b.copy(g[e]).add(y).add(v),O(b.x,b.y,b.z)):O(i.x,i.y,h/o*e)}for(let e=p-1;e>=0;e--){const t=e/p,i=l*Math.cos(t*Math.PI/2),n=u*Math.sin(t*Math.PI/2)+d;for(let e=0,t=C.length;e<t;e++){const t=E(C[e],P[e],n);O(t.x,t.y,h+i)}for(let e=0,t=S.length;e<t;e++){const t=S[e];D=L[e];for(let e=0,r=t.length;e<r;e++){const r=E(t[e],D[e],n);x?O(r.x,r.y+g[o-1].y,g[o-1].x+i):O(r.x,r.y,h+i)}}}function k(e,t){let i=e.length;for(;--i>=0;){const n=i;let r=i-1;r<0&&(r=e.length-1);for(let e=0,i=o+2*p;e<i;e++){const i=A*e,s=A*(e+1);F(t+n+i,t+r+i,t+r+s,t+n+s)}}}function O(e,t,i){s.push(e),s.push(t),s.push(i)}function z(e,t,r){B(e),B(t),B(r);const s=n.length/3,a=f.generateTopUV(i,n,s-3,s-2,s-1);U(a[0]),U(a[1]),U(a[2])}function F(e,t,r,s){B(e),B(t),B(s),B(t),B(r),B(s);const a=n.length/3,o=f.generateSideWallUV(i,n,a-6,a-3,a-2,a-1);U(o[0]),U(o[1]),U(o[3]),U(o[1]),U(o[2]),U(o[3])}function B(e){n.push(s[3*e+0]),n.push(s[3*e+1]),n.push(s[3*e+2])}function U(e){r.push(e.x),r.push(e.y)}!function(){const e=n.length/3;if(c){let e=0,t=A*e;for(let e=0;e<I;e++){const i=T[e];z(i[2]+t,i[1]+t,i[0]+t)}e=o+2*p,t=A*e;for(let e=0;e<I;e++){const i=T[e];z(i[0]+t,i[1]+t,i[2]+t)}}else{for(let e=0;e<I;e++){const t=T[e];z(t[2],t[1],t[0])}for(let e=0;e<I;e++){const t=T[e];z(t[0]+A*o,t[1]+A*o,t[2]+A*o)}}i.addGroup(e,n.length/3-e,0)}(),function(){const e=n.length/3;let t=0;k(C,t),t+=C.length;for(let e=0,i=S.length;e<i;e++){const i=S[e];k(i,t),t+=i.length}i.addGroup(e,n.length/3-e,1)}()}this.setAttribute("position",new Ar(n,3)),this.setAttribute("uv",new Ar(r,2)),this.computeVertexNormals()}toJSON(){const e=super.toJSON();return function(e,t,i){if(i.shapes=[],Array.isArray(e))for(let t=0,n=e.length;t<n;t++){const n=e[t];i.shapes.push(n.uuid)}else i.shapes.push(e.uuid);void 0!==t.extrudePath&&(i.options.extrudePath=t.extrudePath.toJSON());return i}(this.parameters.shapes,this.parameters.options,e)}static fromJSON(e,t){const i=[];for(let n=0,r=e.shapes.length;n<r;n++){const r=t[e.shapes[n]];i.push(r)}const n=e.options.extrudePath;return void 0!==n&&(e.options.extrudePath=(new wc[n.type]).fromJSON(n)),new el(i,e.options)}}const tl={generateTopUV:function(e,t,i,n,r){const s=t[3*i],a=t[3*i+1],o=t[3*n],h=t[3*n+1],c=t[3*r],l=t[3*r+1];return[new zi(s,a),new zi(o,h),new zi(c,l)]},generateSideWallUV:function(e,t,i,n,r,s){const a=t[3*i],o=t[3*i+1],h=t[3*i+2],c=t[3*n],l=t[3*n+1],u=t[3*n+2],d=t[3*r],p=t[3*r+1],m=t[3*r+2],f=t[3*s],g=t[3*s+1],_=t[3*s+2];return Math.abs(o-l)<Math.abs(a-c)?[new zi(a,1-h),new zi(c,1-u),new zi(d,1-m),new zi(f,1-_)]:[new zi(o,1-h),new zi(l,1-u),new zi(p,1-m),new zi(g,1-_)]}};class il extends kr{constructor(e=new Tc([new zi(0,.5),new zi(-.5,-.5),new zi(.5,-.5)]),t=12){super(),this.type="ShapeGeometry",this.parameters={shapes:e,curveSegments:t};const i=[],n=[],r=[],s=[];let a=0,o=0;if(!1===Array.isArray(e))h(e);else for(let t=0;t<e.length;t++)h(e[t]),this.addGroup(a,o,t),a+=o,o=0;function h(e){const a=n.length/3,h=e.extractPoints(t);let c=h.shape;const l=h.holes;!1===Jc.isClockWise(c)&&(c=c.reverse());for(let e=0,t=l.length;e<t;e++){const t=l[e];!0===Jc.isClockWise(t)&&(l[e]=t.reverse())}const u=Jc.triangulateShape(c,l);for(let e=0,t=l.length;e<t;e++){const t=l[e];c=c.concat(t)}for(let e=0,t=c.length;e<t;e++){const t=c[e];n.push(t.x,t.y,0),r.push(0,0,1),s.push(t.x,t.y)}for(let e=0,t=u.length;e<t;e++){const t=u[e],n=t[0]+a,r=t[1]+a,s=t[2]+a;i.push(n,r,s),o+=3}}this.setIndex(i),this.setAttribute("position",new Ar(n,3)),this.setAttribute("normal",new Ar(r,3)),this.setAttribute("uv",new Ar(s,2))}toJSON(){const e=super.toJSON();return function(e,t){if(t.shapes=[],Array.isArray(e))for(let i=0,n=e.length;i<n;i++){const n=e[i];t.shapes.push(n.uuid)}else t.shapes.push(e.uuid);return t}(this.parameters.shapes,e)}static fromJSON(e,t){const i=[];for(let n=0,r=e.shapes.length;n<r;n++){const r=t[e.shapes[n]];i.push(r)}return new il(i,e.curveSegments)}}class nl extends kr{constructor(e=1,t=32,i=16,n=0,r=2*Math.PI,s=0,a=Math.PI){super(),this.type="SphereGeometry",this.parameters={radius:e,widthSegments:t,heightSegments:i,phiStart:n,phiLength:r,thetaStart:s,thetaLength:a},t=Math.max(3,Math.floor(t)),i=Math.max(2,Math.floor(i));const o=Math.min(s+a,Math.PI);let h=0;const c=[],l=new Ki,u=new Ki,d=[],p=[],m=[],f=[];for(let d=0;d<=i;d++){const g=[],_=d/i;let v=0;0==d&&0==s?v=.5/t:d==i&&o==Math.PI&&(v=-.5/t);for(let i=0;i<=t;i++){const o=i/t;l.x=-e*Math.cos(n+o*r)*Math.sin(s+_*a),l.y=e*Math.cos(s+_*a),l.z=e*Math.sin(n+o*r)*Math.sin(s+_*a),p.push(l.x,l.y,l.z),u.copy(l).normalize(),m.push(u.x,u.y,u.z),f.push(o+v,1-_),g.push(h++)}c.push(g)}for(let e=0;e<i;e++)for(let n=0;n<t;n++){const t=c[e][n+1],r=c[e][n],a=c[e+1][n],h=c[e+1][n+1];(0!==e||s>0)&&d.push(t,r,h),(e!==i-1||o<Math.PI)&&d.push(r,a,h)}this.setIndex(d),this.setAttribute("position",new Ar(p,3)),this.setAttribute("normal",new Ar(m,3)),this.setAttribute("uv",new Ar(f,2))}static fromJSON(e){return new nl(e.radius,e.widthSegments,e.heightSegments,e.phiStart,e.phiLength,e.thetaStart,e.thetaLength)}}(class extends mr{constructor(e){super(),this.type="ShadowMaterial",this.color=new xr(0),this.transparent=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this}}).prototype.isShadowMaterial=!0;class rl extends mr{constructor(e){super(),this.defines={STANDARD:""},this.type="MeshStandardMaterial",this.color=new xr(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 xr(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new zi(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.flatShading=!1,this.setValues(e)}copy(e){return super.copy(e),this.defines={STANDARD:""},this.color.copy(e.color),this.roughness=e.roughness,this.metalness=e.metalness,this.map=e.map,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.emissive.copy(e.emissive),this.emissiveMap=e.emissiveMap,this.emissiveIntensity=e.emissiveIntensity,this.bumpMap=e.bumpMap,this.bumpScale=e.bumpScale,this.normalMap=e.normalMap,this.normalMapType=e.normalMapType,this.normalScale.copy(e.normalScale),this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.roughnessMap=e.roughnessMap,this.metalnessMap=e.metalnessMap,this.alphaMap=e.alphaMap,this.envMap=e.envMap,this.envMapIntensity=e.envMapIntensity,this.refractionRatio=e.refractionRatio,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.flatShading=e.flatShading,this}}rl.prototype.isMeshStandardMaterial=!0;(class extends rl{constructor(e){super(),this.defines={STANDARD:"",PHYSICAL:""},this.type="MeshPhysicalMaterial",this.clearcoatMap=null,this.clearcoatRoughness=0,this.clearcoatRoughnessMap=null,this.clearcoatNormalScale=new zi(1,1),this.clearcoatNormalMap=null,this.ior=1.5,Object.defineProperty(this,"reflectivity",{get:function(){return Li(2.5*(this.ior-1)/(this.ior+1),0,1)},set:function(e){this.ior=(1+.4*e)/(1-.4*e)}}),this.sheenColor=new xr(0),this.sheenColorMap=null,this.sheenRoughness=1,this.sheenRoughnessMap=null,this.transmissionMap=null,this.thickness=.01,this.thicknessMap=null,this.attenuationDistance=0,this.attenuationColor=new xr(1,1,1),this.specularIntensity=1,this.specularIntensityMap=null,this.specularColor=new xr(1,1,1),this.specularColorMap=null,this._sheen=0,this._clearcoat=0,this._transmission=0,this.setValues(e)}get sheen(){return this._sheen}set sheen(e){this._sheen>0!=e>0&&this.version++,this._sheen=e}get clearcoat(){return this._clearcoat}set clearcoat(e){this._clearcoat>0!=e>0&&this.version++,this._clearcoat=e}get transmission(){return this._transmission}set transmission(e){this._transmission>0!=e>0&&this.version++,this._transmission=e}copy(e){return super.copy(e),this.defines={STANDARD:"",PHYSICAL:""},this.clearcoat=e.clearcoat,this.clearcoatMap=e.clearcoatMap,this.clearcoatRoughness=e.clearcoatRoughness,this.clearcoatRoughnessMap=e.clearcoatRoughnessMap,this.clearcoatNormalMap=e.clearcoatNormalMap,this.clearcoatNormalScale.copy(e.clearcoatNormalScale),this.ior=e.ior,this.sheen=e.sheen,this.sheenColor.copy(e.sheenColor),this.sheenColorMap=e.sheenColorMap,this.sheenRoughness=e.sheenRoughness,this.sheenRoughnessMap=e.sheenRoughnessMap,this.transmission=e.transmission,this.transmissionMap=e.transmissionMap,this.thickness=e.thickness,this.thicknessMap=e.thicknessMap,this.attenuationDistance=e.attenuationDistance,this.attenuationColor.copy(e.attenuationColor),this.specularIntensity=e.specularIntensity,this.specularIntensityMap=e.specularIntensityMap,this.specularColor.copy(e.specularColor),this.specularColorMap=e.specularColorMap,this}}).prototype.isMeshPhysicalMaterial=!0;(class extends mr{constructor(e){super(),this.type="MeshPhongMaterial",this.color=new xr(16777215),this.specular=new xr(1118481),this.shininess=30,this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new xr(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new zi(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.flatShading=!1,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.specular.copy(e.specular),this.shininess=e.shininess,this.map=e.map,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.emissive.copy(e.emissive),this.emissiveMap=e.emissiveMap,this.emissiveIntensity=e.emissiveIntensity,this.bumpMap=e.bumpMap,this.bumpScale=e.bumpScale,this.normalMap=e.normalMap,this.normalMapType=e.normalMapType,this.normalScale.copy(e.normalScale),this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.specularMap=e.specularMap,this.alphaMap=e.alphaMap,this.envMap=e.envMap,this.combine=e.combine,this.reflectivity=e.reflectivity,this.refractionRatio=e.refractionRatio,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.flatShading=e.flatShading,this}}).prototype.isMeshPhongMaterial=!0;(class extends mr{constructor(e){super(),this.defines={TOON:""},this.type="MeshToonMaterial",this.color=new xr(16777215),this.map=null,this.gradientMap=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new xr(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new zi(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.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.map=e.map,this.gradientMap=e.gradientMap,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.emissive.copy(e.emissive),this.emissiveMap=e.emissiveMap,this.emissiveIntensity=e.emissiveIntensity,this.bumpMap=e.bumpMap,this.bumpScale=e.bumpScale,this.normalMap=e.normalMap,this.normalMapType=e.normalMapType,this.normalScale.copy(e.normalScale),this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.alphaMap=e.alphaMap,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this}}).prototype.isMeshToonMaterial=!0;(class extends mr{constructor(e){super(),this.type="MeshNormalMaterial",this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new zi(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.fog=!1,this.flatShading=!1,this.setValues(e)}copy(e){return super.copy(e),this.bumpMap=e.bumpMap,this.bumpScale=e.bumpScale,this.normalMap=e.normalMap,this.normalMapType=e.normalMapType,this.normalScale.copy(e.normalScale),this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.flatShading=e.flatShading,this}}).prototype.isMeshNormalMaterial=!0;(class extends mr{constructor(e){super(),this.type="MeshLambertMaterial",this.color=new xr(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new xr(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.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.map=e.map,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.emissive.copy(e.emissive),this.emissiveMap=e.emissiveMap,this.emissiveIntensity=e.emissiveIntensity,this.specularMap=e.specularMap,this.alphaMap=e.alphaMap,this.envMap=e.envMap,this.combine=e.combine,this.reflectivity=e.reflectivity,this.refractionRatio=e.refractionRatio,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this}}).prototype.isMeshLambertMaterial=!0;(class extends mr{constructor(e){super(),this.defines={MATCAP:""},this.type="MeshMatcapMaterial",this.color=new xr(16777215),this.matcap=null,this.map=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new zi(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.alphaMap=null,this.flatShading=!1,this.setValues(e)}copy(e){return super.copy(e),this.defines={MATCAP:""},this.color.copy(e.color),this.matcap=e.matcap,this.map=e.map,this.bumpMap=e.bumpMap,this.bumpScale=e.bumpScale,this.normalMap=e.normalMap,this.normalMapType=e.normalMapType,this.normalScale.copy(e.normalScale),this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.alphaMap=e.alphaMap,this.flatShading=e.flatShading,this}}).prototype.isMeshMatcapMaterial=!0;(class extends Bh{constructor(e){super(),this.type="LineDashedMaterial",this.scale=1,this.dashSize=3,this.gapSize=1,this.setValues(e)}copy(e){return super.copy(e),this.scale=e.scale,this.dashSize=e.dashSize,this.gapSize=e.gapSize,this}}).prototype.isLineDashedMaterial=!0;const sl={arraySlice:function(e,t,i){return sl.isTypedArray(e)?new e.constructor(e.subarray(t,void 0!==i?i:e.length)):e.slice(t,i)},convertArray:function(e,t,i){return!e||!i&&e.constructor===t?e:"number"==typeof t.BYTES_PER_ELEMENT?new t(e):Array.prototype.slice.call(e)},isTypedArray:function(e){return ArrayBuffer.isView(e)&&!(e instanceof DataView)},getKeyframeOrder:function(e){const t=e.length,i=new Array(t);for(let e=0;e!==t;++e)i[e]=e;return i.sort((function(t,i){return e[t]-e[i]})),i},sortedArray:function(e,t,i){const n=e.length,r=new e.constructor(n);for(let s=0,a=0;a!==n;++s){const n=i[s]*t;for(let i=0;i!==t;++i)r[a++]=e[n+i]}return r},flattenJSON:function(e,t,i,n){let r=1,s=e[0];for(;void 0!==s&&void 0===s[n];)s=e[r++];if(void 0===s)return;let a=s[n];if(void 0!==a)if(Array.isArray(a))do{a=s[n],void 0!==a&&(t.push(s.time),i.push.apply(i,a)),s=e[r++]}while(void 0!==s);else if(void 0!==a.toArray)do{a=s[n],void 0!==a&&(t.push(s.time),a.toArray(i,i.length)),s=e[r++]}while(void 0!==s);else do{a=s[n],void 0!==a&&(t.push(s.time),i.push(a)),s=e[r++]}while(void 0!==s)},subclip:function(e,t,i,n,r=30){const s=e.clone();s.name=t;const a=[];for(let e=0;e<s.tracks.length;++e){const t=s.tracks[e],o=t.getValueSize(),h=[],c=[];for(let e=0;e<t.times.length;++e){const s=t.times[e]*r;if(!(s<i||s>=n)){h.push(t.times[e]);for(let i=0;i<o;++i)c.push(t.values[e*o+i])}}0!==h.length&&(t.times=sl.convertArray(h,t.times.constructor),t.values=sl.convertArray(c,t.values.constructor),a.push(t))}s.tracks=a;let o=1/0;for(let e=0;e<s.tracks.length;++e)o>s.tracks[e].times[0]&&(o=s.tracks[e].times[0]);for(let e=0;e<s.tracks.length;++e)s.tracks[e].shift(-1*o);return s.resetDuration(),s},makeClipAdditive:function(e,t=0,i=e,n=30){n<=0&&(n=30);const r=i.tracks.length,s=t/n;for(let t=0;t<r;++t){const n=i.tracks[t],r=n.ValueTypeName;if("bool"===r||"string"===r)continue;const a=e.tracks.find((function(e){return e.name===n.name&&e.ValueTypeName===r}));if(void 0===a)continue;let o=0;const h=n.getValueSize();n.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline&&(o=h/3);let c=0;const l=a.getValueSize();a.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline&&(c=l/3);const u=n.times.length-1;let d;if(s<=n.times[0]){const e=o,t=h-o;d=sl.arraySlice(n.values,e,t)}else if(s>=n.times[u]){const e=u*h+o,t=e+h-o;d=sl.arraySlice(n.values,e,t)}else{const e=n.createInterpolant(),t=o,i=h-o;e.evaluate(s),d=sl.arraySlice(e.resultBuffer,t,i)}if("quaternion"===r){(new Ji).fromArray(d).normalize().conjugate().toArray(d)}const p=a.times.length;for(let e=0;e<p;++e){const t=e*l+c;if("quaternion"===r)Ji.multiplyQuaternionsFlat(a.values,t,d,0,a.values,t);else{const e=l-2*c;for(let i=0;i<e;++i)a.values[t+i]-=d[i]}}}return e.blendMode=2501,e}};class al{constructor(e,t,i,n){this.parameterPositions=e,this._cachedIndex=0,this.resultBuffer=void 0!==n?n:new t.constructor(i),this.sampleValues=t,this.valueSize=i,this.settings=null,this.DefaultSettings_={}}evaluate(e){const t=this.parameterPositions;let i=this._cachedIndex,n=t[i],r=t[i-1];e:{t:{let s;i:{n:if(!(e<n)){for(let s=i+2;;){if(void 0===n){if(e<r)break n;return i=t.length,this._cachedIndex=i,this.afterEnd_(i-1,e,r)}if(i===s)break;if(r=n,n=t[++i],e<n)break t}s=t.length;break i}if(e>=r)break e;{const a=t[1];e<a&&(i=2,r=a);for(let s=i-2;;){if(void 0===r)return this._cachedIndex=0,this.beforeStart_(0,e,n);if(i===s)break;if(n=r,r=t[--i-1],e>=r)break t}s=i,i=0}}for(;i<s;){const n=i+s>>>1;e<t[n]?s=n:i=n+1}if(n=t[i],r=t[i-1],void 0===r)return this._cachedIndex=0,this.beforeStart_(0,e,n);if(void 0===n)return i=t.length,this._cachedIndex=i,this.afterEnd_(i-1,r,e)}this._cachedIndex=i,this.intervalChanged_(i,r,n)}return this.interpolate_(i,r,e,n)}getSettings_(){return this.settings||this.DefaultSettings_}copySampleValue_(e){const t=this.resultBuffer,i=this.sampleValues,n=this.valueSize,r=e*n;for(let e=0;e!==n;++e)t[e]=i[r+e];return t}interpolate_(){throw new Error("call to abstract method")}intervalChanged_(){}}al.prototype.beforeStart_=al.prototype.copySampleValue_,al.prototype.afterEnd_=al.prototype.copySampleValue_;class ol extends al{constructor(e,t,i,n){super(e,t,i,n),this._weightPrev=-0,this._offsetPrev=-0,this._weightNext=-0,this._offsetNext=-0,this.DefaultSettings_={endingStart:pi,endingEnd:pi}}intervalChanged_(e,t,i){const n=this.parameterPositions;let r=e-2,s=e+1,a=n[r],o=n[s];if(void 0===a)switch(this.getSettings_().endingStart){case mi:r=e,a=2*t-i;break;case fi:r=n.length-2,a=t+n[r]-n[r+1];break;default:r=e,a=i}if(void 0===o)switch(this.getSettings_().endingEnd){case mi:s=e,o=2*i-t;break;case fi:s=1,o=i+n[1]-n[0];break;default:s=e-1,o=t}const h=.5*(i-t),c=this.valueSize;this._weightPrev=h/(t-a),this._weightNext=h/(o-i),this._offsetPrev=r*c,this._offsetNext=s*c}interpolate_(e,t,i,n){const r=this.resultBuffer,s=this.sampleValues,a=this.valueSize,o=e*a,h=o-a,c=this._offsetPrev,l=this._offsetNext,u=this._weightPrev,d=this._weightNext,p=(i-t)/(n-t),m=p*p,f=m*p,g=-u*f+2*u*m-u*p,_=(1+u)*f+(-1.5-2*u)*m+(-.5+u)*p+1,v=(-1-d)*f+(1.5+d)*m+.5*p,y=d*f-d*m;for(let e=0;e!==a;++e)r[e]=g*s[c+e]+_*s[h+e]+v*s[o+e]+y*s[l+e];return r}}class hl extends al{constructor(e,t,i,n){super(e,t,i,n)}interpolate_(e,t,i,n){const r=this.resultBuffer,s=this.sampleValues,a=this.valueSize,o=e*a,h=o-a,c=(i-t)/(n-t),l=1-c;for(let e=0;e!==a;++e)r[e]=s[h+e]*l+s[o+e]*c;return r}}class cl extends al{constructor(e,t,i,n){super(e,t,i,n)}interpolate_(e){return this.copySampleValue_(e-1)}}class ll{constructor(e,t,i,n){if(void 0===e)throw new Error("THREE.KeyframeTrack: track name is undefined");if(void 0===t||0===t.length)throw new Error("THREE.KeyframeTrack: no keyframes in track named "+e);this.name=e,this.times=sl.convertArray(t,this.TimeBufferType),this.values=sl.convertArray(i,this.ValueBufferType),this.setInterpolation(n||this.DefaultInterpolation)}static toJSON(e){const t=e.constructor;let i;if(t.toJSON!==this.toJSON)i=t.toJSON(e);else{i={name:e.name,times:sl.convertArray(e.times,Array),values:sl.convertArray(e.values,Array)};const t=e.getInterpolation();t!==e.DefaultInterpolation&&(i.interpolation=t)}return i.type=e.ValueTypeName,i}InterpolantFactoryMethodDiscrete(e){return new cl(this.times,this.values,this.getValueSize(),e)}InterpolantFactoryMethodLinear(e){return new hl(this.times,this.values,this.getValueSize(),e)}InterpolantFactoryMethodSmooth(e){return new ol(this.times,this.values,this.getValueSize(),e)}setInterpolation(e){let t;switch(e){case li:t=this.InterpolantFactoryMethodDiscrete;break;case ui:t=this.InterpolantFactoryMethodLinear;break;case di:t=this.InterpolantFactoryMethodSmooth}if(void 0===t){const t="unsupported interpolation for "+this.ValueTypeName+" keyframe track named "+this.name;if(void 0===this.createInterpolant){if(e===this.DefaultInterpolation)throw new Error(t);this.setInterpolation(this.DefaultInterpolation)}return console.warn("THREE.KeyframeTrack:",t),this}return this.createInterpolant=t,this}getInterpolation(){switch(this.createInterpolant){case this.InterpolantFactoryMethodDiscrete:return li;case this.InterpolantFactoryMethodLinear:return ui;case this.InterpolantFactoryMethodSmooth:return di}}getValueSize(){return this.values.length/this.times.length}shift(e){if(0!==e){const t=this.times;for(let i=0,n=t.length;i!==n;++i)t[i]+=e}return this}scale(e){if(1!==e){const t=this.times;for(let i=0,n=t.length;i!==n;++i)t[i]*=e}return this}trim(e,t){const i=this.times,n=i.length;let r=0,s=n-1;for(;r!==n&&i[r]<e;)++r;for(;-1!==s&&i[s]>t;)--s;if(++s,0!==r||s!==n){r>=s&&(s=Math.max(s,1),r=s-1);const e=this.getValueSize();this.times=sl.arraySlice(i,r,s),this.values=sl.arraySlice(this.values,r*e,s*e)}return this}validate(){let e=!0;const t=this.getValueSize();t-Math.floor(t)!=0&&(console.error("THREE.KeyframeTrack: Invalid value size in track.",this),e=!1);const i=this.times,n=this.values,r=i.length;0===r&&(console.error("THREE.KeyframeTrack: Track is empty.",this),e=!1);let s=null;for(let t=0;t!==r;t++){const n=i[t];if("number"==typeof n&&isNaN(n)){console.error("THREE.KeyframeTrack: Time is not a valid number.",this,t,n),e=!1;break}if(null!==s&&s>n){console.error("THREE.KeyframeTrack: Out of order keys.",this,t,n,s),e=!1;break}s=n}if(void 0!==n&&sl.isTypedArray(n))for(let t=0,i=n.length;t!==i;++t){const i=n[t];if(isNaN(i)){console.error("THREE.KeyframeTrack: Value is not a valid number.",this,t,i),e=!1;break}}return e}optimize(){const e=sl.arraySlice(this.times),t=sl.arraySlice(this.values),i=this.getValueSize(),n=this.getInterpolation()===di,r=e.length-1;let s=1;for(let a=1;a<r;++a){let r=!1;const o=e[a];if(o!==e[a+1]&&(1!==a||o!==e[0]))if(n)r=!0;else{const e=a*i,n=e-i,s=e+i;for(let a=0;a!==i;++a){const i=t[e+a];if(i!==t[n+a]||i!==t[s+a]){r=!0;break}}}if(r){if(a!==s){e[s]=e[a];const n=a*i,r=s*i;for(let e=0;e!==i;++e)t[r+e]=t[n+e]}++s}}if(r>0){e[s]=e[r];for(let e=r*i,n=s*i,a=0;a!==i;++a)t[n+a]=t[e+a];++s}return s!==e.length?(this.times=sl.arraySlice(e,0,s),this.values=sl.arraySlice(t,0,s*i)):(this.times=e,this.values=t),this}clone(){const e=sl.arraySlice(this.times,0),t=sl.arraySlice(this.values,0),i=new(0,this.constructor)(this.name,e,t);return i.createInterpolant=this.createInterpolant,i}}ll.prototype.TimeBufferType=Float32Array,ll.prototype.ValueBufferType=Float32Array,ll.prototype.DefaultInterpolation=ui;class ul extends ll{}ul.prototype.ValueTypeName="bool",ul.prototype.ValueBufferType=Array,ul.prototype.DefaultInterpolation=li,ul.prototype.InterpolantFactoryMethodLinear=void 0,ul.prototype.InterpolantFactoryMethodSmooth=void 0;class dl extends ll{}dl.prototype.ValueTypeName="color";class pl extends ll{}pl.prototype.ValueTypeName="number";class ml extends al{constructor(e,t,i,n){super(e,t,i,n)}interpolate_(e,t,i,n){const r=this.resultBuffer,s=this.sampleValues,a=this.valueSize,o=(i-t)/(n-t);let h=e*a;for(let e=h+a;h!==e;h+=4)Ji.slerpFlat(r,0,s,h-a,s,h,o);return r}}class fl extends ll{InterpolantFactoryMethodLinear(e){return new ml(this.times,this.values,this.getValueSize(),e)}}fl.prototype.ValueTypeName="quaternion",fl.prototype.DefaultInterpolation=ui,fl.prototype.InterpolantFactoryMethodSmooth=void 0;class gl extends ll{}gl.prototype.ValueTypeName="string",gl.prototype.ValueBufferType=Array,gl.prototype.DefaultInterpolation=li,gl.prototype.InterpolantFactoryMethodLinear=void 0,gl.prototype.InterpolantFactoryMethodSmooth=void 0;class _l extends ll{}_l.prototype.ValueTypeName="vector";class vl{constructor(e,t=-1,i,n=2500){this.name=e,this.tracks=i,this.duration=t,this.blendMode=n,this.uuid=Pi(),this.duration<0&&this.resetDuration()}static parse(e){const t=[],i=e.tracks,n=1/(e.fps||1);for(let e=0,r=i.length;e!==r;++e)t.push(yl(i[e]).scale(n));const r=new this(e.name,e.duration,t,e.blendMode);return r.uuid=e.uuid,r}static toJSON(e){const t=[],i=e.tracks,n={name:e.name,duration:e.duration,tracks:t,uuid:e.uuid,blendMode:e.blendMode};for(let e=0,n=i.length;e!==n;++e)t.push(ll.toJSON(i[e]));return n}static CreateFromMorphTargetSequence(e,t,i,n){const r=t.length,s=[];for(let e=0;e<r;e++){let a=[],o=[];a.push((e+r-1)%r,e,(e+1)%r),o.push(0,1,0);const h=sl.getKeyframeOrder(a);a=sl.sortedArray(a,1,h),o=sl.sortedArray(o,1,h),n||0!==a[0]||(a.push(r),o.push(o[0])),s.push(new pl(".morphTargetInfluences["+t[e].name+"]",a,o).scale(1/i))}return new this(e,-1,s)}static findByName(e,t){let i=e;if(!Array.isArray(e)){const t=e;i=t.geometry&&t.geometry.animations||t.animations}for(let e=0;e<i.length;e++)if(i[e].name===t)return i[e];return null}static CreateClipsFromMorphTargetSequences(e,t,i){const n={},r=/^([\w-]*?)([\d]+)$/;for(let t=0,i=e.length;t<i;t++){const i=e[t],s=i.name.match(r);if(s&&s.length>1){const e=s[1];let t=n[e];t||(n[e]=t=[]),t.push(i)}}const s=[];for(const e in n)s.push(this.CreateFromMorphTargetSequence(e,n[e],t,i));return s}static parseAnimation(e,t){if(!e)return console.error("THREE.AnimationClip: No animation in JSONLoader data."),null;const i=function(e,t,i,n,r){if(0!==i.length){const s=[],a=[];sl.flattenJSON(i,s,a,n),0!==s.length&&r.push(new e(t,s,a))}},n=[],r=e.name||"default",s=e.fps||30,a=e.blendMode;let o=e.length||-1;const h=e.hierarchy||[];for(let e=0;e<h.length;e++){const r=h[e].keys;if(r&&0!==r.length)if(r[0].morphTargets){const e={};let t;for(t=0;t<r.length;t++)if(r[t].morphTargets)for(let i=0;i<r[t].morphTargets.length;i++)e[r[t].morphTargets[i]]=-1;for(const i in e){const e=[],s=[];for(let n=0;n!==r[t].morphTargets.length;++n){const n=r[t];e.push(n.time),s.push(n.morphTarget===i?1:0)}n.push(new pl(".morphTargetInfluence["+i+"]",e,s))}o=e.length*(s||1)}else{const s=".bones["+t[e].name+"]";i(_l,s+".position",r,"pos",n),i(fl,s+".quaternion",r,"rot",n),i(_l,s+".scale",r,"scl",n)}}if(0===n.length)return null;return new this(r,o,n,a)}resetDuration(){let e=0;for(let t=0,i=this.tracks.length;t!==i;++t){const i=this.tracks[t];e=Math.max(e,i.times[i.times.length-1])}return this.duration=e,this}trim(){for(let e=0;e<this.tracks.length;e++)this.tracks[e].trim(0,this.duration);return this}validate(){let e=!0;for(let t=0;t<this.tracks.length;t++)e=e&&this.tracks[t].validate();return e}optimize(){for(let e=0;e<this.tracks.length;e++)this.tracks[e].optimize();return this}clone(){const e=[];for(let t=0;t<this.tracks.length;t++)e.push(this.tracks[t].clone());return new this.constructor(this.name,this.duration,e,this.blendMode)}toJSON(){return this.constructor.toJSON(this)}}function yl(e){if(void 0===e.type)throw new Error("THREE.KeyframeTrack: track type undefined, can not parse");const t=function(e){switch(e.toLowerCase()){case"scalar":case"double":case"float":case"number":case"integer":return pl;case"vector":case"vector2":case"vector3":case"vector4":return _l;case"color":return dl;case"quaternion":return fl;case"bool":case"boolean":return ul;case"string":return gl}throw new Error("THREE.KeyframeTrack: Unsupported typeName: "+e)}(e.type);if(void 0===e.times){const t=[],i=[];sl.flattenJSON(e.keys,t,i,"value"),e.times=t,e.values=i}return void 0!==t.parse?t.parse(e):new t(e.name,e.times,e.values,e.interpolation)}const bl={enabled:!1,files:{},add:function(e,t){!1!==this.enabled&&(this.files[e]=t)},get:function(e){if(!1!==this.enabled)return this.files[e]},remove:function(e){delete this.files[e]},clear:function(){this.files={}}};const xl=new class{constructor(e,t,i){const n=this;let r,s=!1,a=0,o=0;const h=[];this.onStart=void 0,this.onLoad=e,this.onProgress=t,this.onError=i,this.itemStart=function(e){o++,!1===s&&void 0!==n.onStart&&n.onStart(e,a,o),s=!0},this.itemEnd=function(e){a++,void 0!==n.onProgress&&n.onProgress(e,a,o),a===o&&(s=!1,void 0!==n.onLoad&&n.onLoad())},this.itemError=function(e){void 0!==n.onError&&n.onError(e)},this.resolveURL=function(e){return r?r(e):e},this.setURLModifier=function(e){return r=e,this},this.addHandler=function(e,t){return h.push(e,t),this},this.removeHandler=function(e){const t=h.indexOf(e);return-1!==t&&h.splice(t,2),this},this.getHandler=function(e){for(let t=0,i=h.length;t<i;t+=2){const i=h[t],n=h[t+1];if(i.global&&(i.lastIndex=0),i.test(e))return n}return null}}};class wl{constructor(e){this.manager=void 0!==e?e:xl,this.crossOrigin="anonymous",this.withCredentials=!1,this.path="",this.resourcePath="",this.requestHeader={}}load(){}loadAsync(e,t){const i=this;return new Promise((function(n,r){i.load(e,n,t,r)}))}parse(){}setCrossOrigin(e){return this.crossOrigin=e,this}setWithCredentials(e){return this.withCredentials=e,this}setPath(e){return this.path=e,this}setResourcePath(e){return this.resourcePath=e,this}setRequestHeader(e){return this.requestHeader=e,this}}const Ml={};class Sl extends wl{constructor(e){super(e)}load(e,t,i,n){void 0===e&&(e=""),void 0!==this.path&&(e=this.path+e),e=this.manager.resolveURL(e);const r=bl.get(e);if(void 0!==r)return this.manager.itemStart(e),setTimeout((()=>{t&&t(r),this.manager.itemEnd(e)}),0),r;if(void 0!==Ml[e])return void Ml[e].push({onLoad:t,onProgress:i,onError:n});Ml[e]=[],Ml[e].push({onLoad:t,onProgress:i,onError:n});const s=new Request(e,{headers:new Headers(this.requestHeader),credentials:this.withCredentials?"include":"same-origin"});fetch(s).then((t=>{if(200===t.status||0===t.status){0===t.status&&console.warn("THREE.FileLoader: HTTP Status 0 received.");const i=Ml[e],n=t.body.getReader(),r=t.headers.get("Content-Length"),s=r?parseInt(r):0,a=0!==s;let o=0;return new ReadableStream({start(e){!function t(){n.read().then((({done:n,value:r})=>{if(n)e.close();else{o+=r.byteLength;const n=new ProgressEvent("progress",{lengthComputable:a,loaded:o,total:s});for(let e=0,t=i.length;e<t;e++){const t=i[e];t.onProgress&&t.onProgress(n)}e.enqueue(r),t()}}))}()}})}throw Error(`fetch for "${t.url}" responded with ${t.status}: ${t.statusText}`)})).then((e=>{const t=new Response(e);switch(this.responseType){case"arraybuffer":return t.arrayBuffer();case"blob":return t.blob();case"document":return t.text().then((e=>(new DOMParser).parseFromString(e,this.mimeType)));case"json":return t.json();default:return t.text()}})).then((t=>{bl.add(e,t);const i=Ml[e];delete Ml[e];for(let e=0,n=i.length;e<n;e++){const n=i[e];n.onLoad&&n.onLoad(t)}this.manager.itemEnd(e)})).catch((t=>{const i=Ml[e];delete Ml[e];for(let e=0,n=i.length;e<n;e++){const n=i[e];n.onError&&n.onError(t)}this.manager.itemError(e),this.manager.itemEnd(e)})),this.manager.itemStart(e)}setResponseType(e){return this.responseType=e,this}setMimeType(e){return this.mimeType=e,this}}class Tl extends wl{constructor(e){super(e)}load(e,t,i,n){void 0!==this.path&&(e=this.path+e),e=this.manager.resolveURL(e);const r=this,s=bl.get(e);if(void 0!==s)return r.manager.itemStart(e),setTimeout((function(){t&&t(s),r.manager.itemEnd(e)}),0),s;const a=Ui("img");function o(){c(),bl.add(e,this),t&&t(this),r.manager.itemEnd(e)}function h(t){c(),n&&n(t),r.manager.itemError(e),r.manager.itemEnd(e)}function c(){a.removeEventListener("load",o,!1),a.removeEventListener("error",h,!1)}return a.addEventListener("load",o,!1),a.addEventListener("error",h,!1),"data:"!==e.substr(0,5)&&void 0!==this.crossOrigin&&(a.crossOrigin=this.crossOrigin),r.manager.itemStart(e),a.src=e,a}}class Cl extends wl{constructor(e){super(e)}load(e,t,i,n){const r=new us,s=new Tl(this.manager);s.setCrossOrigin(this.crossOrigin),s.setPath(this.path);let a=0;function o(i){s.load(e[i],(function(e){r.images[i]=e,a++,6===a&&(r.needsUpdate=!0,t&&t(r))}),void 0,n)}for(let t=0;t<e.length;++t)o(t);return r}}class El extends wl{constructor(e){super(e)}load(e,t,i,n){const r=new Wi,s=new Tl(this.manager);return s.setCrossOrigin(this.crossOrigin),s.setPath(this.path),s.load(e,(function(e){r.image=e,r.needsUpdate=!0,void 0!==t&&t(r)}),i,n),r}}class Al extends tr{constructor(e,t=1){super(),this.type="Light",this.color=new xr(e),this.intensity=t}dispose(){}copy(e){return super.copy(e),this.color.copy(e.color),this.intensity=e.intensity,this}toJSON(e){const t=super.toJSON(e);return t.object.color=this.color.getHex(),t.object.intensity=this.intensity,void 0!==this.groundColor&&(t.object.groundColor=this.groundColor.getHex()),void 0!==this.distance&&(t.object.distance=this.distance),void 0!==this.angle&&(t.object.angle=this.angle),void 0!==this.decay&&(t.object.decay=this.decay),void 0!==this.penumbra&&(t.object.penumbra=this.penumbra),void 0!==this.shadow&&(t.object.shadow=this.shadow.toJSON()),t}}Al.prototype.isLight=!0;(class extends Al{constructor(e,t,i){super(e,i),this.type="HemisphereLight",this.position.copy(tr.DefaultUp),this.updateMatrix(),this.groundColor=new xr(t)}copy(e){return Al.prototype.copy.call(this,e),this.groundColor.copy(e.groundColor),this}}).prototype.isHemisphereLight=!0;const Il=new Rn,Rl=new Ki,Pl=new Ki;class Ll{constructor(e){this.camera=e,this.bias=0,this.normalBias=0,this.radius=1,this.blurSamples=8,this.mapSize=new zi(512,512),this.map=null,this.mapPass=null,this.matrix=new Rn,this.autoUpdate=!0,this.needsUpdate=!1,this._frustum=new ys,this._frameExtents=new zi(1,1),this._viewportCount=1,this._viewports=[new Xi(0,0,1,1)]}getViewportCount(){return this._viewportCount}getFrustum(){return this._frustum}updateMatrices(e){const t=this.camera,i=this.matrix;Rl.setFromMatrixPosition(e.matrixWorld),t.position.copy(Rl),Pl.setFromMatrixPosition(e.target.matrixWorld),t.lookAt(Pl),t.updateMatrixWorld(),Il.multiplyMatrices(t.projectionMatrix,t.matrixWorldInverse),this._frustum.setFromProjectionMatrix(Il),i.set(.5,0,0,.5,0,.5,0,.5,0,0,.5,.5,0,0,0,1),i.multiply(t.projectionMatrix),i.multiply(t.matrixWorldInverse)}getViewport(e){return this._viewports[e]}getFrameExtents(){return this._frameExtents}dispose(){this.map&&this.map.dispose(),this.mapPass&&this.mapPass.dispose()}copy(e){return this.camera=e.camera.clone(),this.bias=e.bias,this.radius=e.radius,this.mapSize.copy(e.mapSize),this}clone(){return(new this.constructor).copy(this)}toJSON(){const e={};return 0!==this.bias&&(e.bias=this.bias),0!==this.normalBias&&(e.normalBias=this.normalBias),1!==this.radius&&(e.radius=this.radius),512===this.mapSize.x&&512===this.mapSize.y||(e.mapSize=this.mapSize.toArray()),e.camera=this.camera.toJSON(!1).object,delete e.camera.matrix,e}}class Dl extends Ll{constructor(){super(new hs(50,1,.5,500)),this.focus=1}updateMatrices(e){const t=this.camera,i=2*Ai*e.angle*this.focus,n=this.mapSize.width/this.mapSize.height,r=e.distance||t.far;i===t.fov&&n===t.aspect&&r===t.far||(t.fov=i,t.aspect=n,t.far=r,t.updateProjectionMatrix()),super.updateMatrices(e)}copy(e){return super.copy(e),this.focus=e.focus,this}}Dl.prototype.isSpotLightShadow=!0;(class extends Al{constructor(e,t,i=0,n=Math.PI/3,r=0,s=1){super(e,t),this.type="SpotLight",this.position.copy(tr.DefaultUp),this.updateMatrix(),this.target=new tr,this.distance=i,this.angle=n,this.penumbra=r,this.decay=s,this.shadow=new Dl}get power(){return this.intensity*Math.PI}set power(e){this.intensity=e/Math.PI}dispose(){this.shadow.dispose()}copy(e){return super.copy(e),this.distance=e.distance,this.angle=e.angle,this.penumbra=e.penumbra,this.decay=e.decay,this.target=e.target.clone(),this.shadow=e.shadow.clone(),this}}).prototype.isSpotLight=!0;const Nl=new Rn,$l=new Ki,kl=new Ki;class Ol extends Ll{constructor(){super(new hs(90,1,.5,500)),this._frameExtents=new zi(4,2),this._viewportCount=6,this._viewports=[new Xi(2,1,1,1),new Xi(0,1,1,1),new Xi(3,1,1,1),new Xi(1,1,1,1),new Xi(3,0,1,1),new Xi(1,0,1,1)],this._cubeDirections=[new Ki(1,0,0),new Ki(-1,0,0),new Ki(0,0,1),new Ki(0,0,-1),new Ki(0,1,0),new Ki(0,-1,0)],this._cubeUps=[new Ki(0,1,0),new Ki(0,1,0),new Ki(0,1,0),new Ki(0,1,0),new Ki(0,0,1),new Ki(0,0,-1)]}updateMatrices(e,t=0){const i=this.camera,n=this.matrix,r=e.distance||i.far;r!==i.far&&(i.far=r,i.updateProjectionMatrix()),$l.setFromMatrixPosition(e.matrixWorld),i.position.copy($l),kl.copy(i.position),kl.add(this._cubeDirections[t]),i.up.copy(this._cubeUps[t]),i.lookAt(kl),i.updateMatrixWorld(),n.makeTranslation(-$l.x,-$l.y,-$l.z),Nl.multiplyMatrices(i.projectionMatrix,i.matrixWorldInverse),this._frustum.setFromProjectionMatrix(Nl)}}Ol.prototype.isPointLightShadow=!0;(class extends Al{constructor(e,t,i=0,n=1){super(e,t),this.type="PointLight",this.distance=i,this.decay=n,this.shadow=new Ol}get power(){return 4*this.intensity*Math.PI}set power(e){this.intensity=e/(4*Math.PI)}dispose(){this.shadow.dispose()}copy(e){return super.copy(e),this.distance=e.distance,this.decay=e.decay,this.shadow=e.shadow.clone(),this}}).prototype.isPointLight=!0;class zl extends Ll{constructor(){super(new Ls(-5,5,5,-5,.5,500))}}zl.prototype.isDirectionalLightShadow=!0;(class extends Al{constructor(e,t){super(e,t),this.type="DirectionalLight",this.position.copy(tr.DefaultUp),this.updateMatrix(),this.target=new tr,this.shadow=new zl}dispose(){this.shadow.dispose()}copy(e){return super.copy(e),this.target=e.target.clone(),this.shadow=e.shadow.clone(),this}}).prototype.isDirectionalLight=!0;(class extends Al{constructor(e,t){super(e,t),this.type="AmbientLight"}}).prototype.isAmbientLight=!0;(class extends Al{constructor(e,t,i=10,n=10){super(e,t),this.type="RectAreaLight",this.width=i,this.height=n}get power(){return this.intensity*this.width*this.height*Math.PI}set power(e){this.intensity=e/(this.width*this.height*Math.PI)}copy(e){return super.copy(e),this.width=e.width,this.height=e.height,this}toJSON(e){const t=super.toJSON(e);return t.object.width=this.width,t.object.height=this.height,t}}).prototype.isRectAreaLight=!0;class Fl{constructor(){this.coefficients=[];for(let e=0;e<9;e++)this.coefficients.push(new Ki)}set(e){for(let t=0;t<9;t++)this.coefficients[t].copy(e[t]);return this}zero(){for(let e=0;e<9;e++)this.coefficients[e].set(0,0,0);return this}getAt(e,t){const i=e.x,n=e.y,r=e.z,s=this.coefficients;return t.copy(s[0]).multiplyScalar(.282095),t.addScaledVector(s[1],.488603*n),t.addScaledVector(s[2],.488603*r),t.addScaledVector(s[3],.488603*i),t.addScaledVector(s[4],i*n*1.092548),t.addScaledVector(s[5],n*r*1.092548),t.addScaledVector(s[6],.315392*(3*r*r-1)),t.addScaledVector(s[7],i*r*1.092548),t.addScaledVector(s[8],.546274*(i*i-n*n)),t}getIrradianceAt(e,t){const i=e.x,n=e.y,r=e.z,s=this.coefficients;return t.copy(s[0]).multiplyScalar(.886227),t.addScaledVector(s[1],1.023328*n),t.addScaledVector(s[2],1.023328*r),t.addScaledVector(s[3],1.023328*i),t.addScaledVector(s[4],.858086*i*n),t.addScaledVector(s[5],.858086*n*r),t.addScaledVector(s[6],.743125*r*r-.247708),t.addScaledVector(s[7],.858086*i*r),t.addScaledVector(s[8],.429043*(i*i-n*n)),t}add(e){for(let t=0;t<9;t++)this.coefficients[t].add(e.coefficients[t]);return this}addScaledSH(e,t){for(let i=0;i<9;i++)this.coefficients[i].addScaledVector(e.coefficients[i],t);return this}scale(e){for(let t=0;t<9;t++)this.coefficients[t].multiplyScalar(e);return this}lerp(e,t){for(let i=0;i<9;i++)this.coefficients[i].lerp(e.coefficients[i],t);return this}equals(e){for(let t=0;t<9;t++)if(!this.coefficients[t].equals(e.coefficients[t]))return!1;return!0}copy(e){return this.set(e.coefficients)}clone(){return(new this.constructor).copy(this)}fromArray(e,t=0){const i=this.coefficients;for(let n=0;n<9;n++)i[n].fromArray(e,t+3*n);return this}toArray(e=[],t=0){const i=this.coefficients;for(let n=0;n<9;n++)i[n].toArray(e,t+3*n);return e}static getBasisAt(e,t){const i=e.x,n=e.y,r=e.z;t[0]=.282095,t[1]=.488603*n,t[2]=.488603*r,t[3]=.488603*i,t[4]=1.092548*i*n,t[5]=1.092548*n*r,t[6]=.315392*(3*r*r-1),t[7]=1.092548*i*r,t[8]=.546274*(i*i-n*n)}}Fl.prototype.isSphericalHarmonics3=!0;class Bl extends Al{constructor(e=new Fl,t=1){super(void 0,t),this.sh=e}copy(e){return super.copy(e),this.sh.copy(e.sh),this}fromJSON(e){return this.intensity=e.intensity,this.sh.fromArray(e.sh),this}toJSON(e){const t=super.toJSON(e);return t.object.sh=this.sh.toArray(),t}}Bl.prototype.isLightProbe=!0;(class extends kr{constructor(){super(),this.type="InstancedBufferGeometry",this.instanceCount=1/0}copy(e){return super.copy(e),this.instanceCount=e.instanceCount,this}clone(){return(new this.constructor).copy(this)}toJSON(){const e=super.toJSON(this);return e.instanceCount=this.instanceCount,e.isInstancedBufferGeometry=!0,e}}).prototype.isInstancedBufferGeometry=!0;let Ul;(class extends wl{constructor(e){super(e),"undefined"==typeof createImageBitmap&&console.warn("THREE.ImageBitmapLoader: createImageBitmap() not supported."),"undefined"==typeof fetch&&console.warn("THREE.ImageBitmapLoader: fetch() not supported."),this.options={premultiplyAlpha:"none"}}setOptions(e){return this.options=e,this}load(e,t,i,n){void 0===e&&(e=""),void 0!==this.path&&(e=this.path+e),e=this.manager.resolveURL(e);const r=this,s=bl.get(e);if(void 0!==s)return r.manager.itemStart(e),setTimeout((function(){t&&t(s),r.manager.itemEnd(e)}),0),s;const a={};a.credentials="anonymous"===this.crossOrigin?"same-origin":"include",a.headers=this.requestHeader,fetch(e,a).then((function(e){return e.blob()})).then((function(e){return createImageBitmap(e,Object.assign(r.options,{colorSpaceConversion:"none"}))})).then((function(i){bl.add(e,i),t&&t(i),r.manager.itemEnd(e)})).catch((function(t){n&&n(t),r.manager.itemError(e),r.manager.itemEnd(e)})),r.manager.itemStart(e)}}).prototype.isImageBitmapLoader=!0;const Vl=function(){return void 0===Ul&&(Ul=new(window.AudioContext||window.webkitAudioContext)),Ul};class Hl extends wl{constructor(e){super(e)}load(e,t,i,n){const r=this,s=new Sl(this.manager);s.setResponseType("arraybuffer"),s.setPath(this.path),s.setRequestHeader(this.requestHeader),s.setWithCredentials(this.withCredentials),s.load(e,(function(i){try{const e=i.slice(0);Vl().decodeAudioData(e,(function(e){t(e)}))}catch(t){n?n(t):console.error(t),r.manager.itemError(e)}}),i,n)}}(class extends Bl{constructor(e,t,i=1){super(void 0,i);const n=(new xr).set(e),r=(new xr).set(t),s=new Ki(n.r,n.g,n.b),a=new Ki(r.r,r.g,r.b),o=Math.sqrt(Math.PI),h=o*Math.sqrt(.75);this.sh.coefficients[0].copy(s).add(a).multiplyScalar(o),this.sh.coefficients[1].copy(s).sub(a).multiplyScalar(h)}}).prototype.isHemisphereLightProbe=!0;(class extends Bl{constructor(e,t=1){super(void 0,t);const i=(new xr).set(e);this.sh.coefficients[0].set(i.r,i.g,i.b).multiplyScalar(2*Math.sqrt(Math.PI))}}).prototype.isAmbientLightProbe=!0;class jl{constructor(e=!0){this.autoStart=e,this.startTime=0,this.oldTime=0,this.elapsedTime=0,this.running=!1}start(){this.startTime=Gl(),this.oldTime=this.startTime,this.elapsedTime=0,this.running=!0}stop(){this.getElapsedTime(),this.running=!1,this.autoStart=!1}getElapsedTime(){return this.getDelta(),this.elapsedTime}getDelta(){let e=0;if(this.autoStart&&!this.running)return this.start(),0;if(this.running){const t=Gl();e=(t-this.oldTime)/1e3,this.oldTime=t,this.elapsedTime+=e}return e}}function Gl(){return("undefined"==typeof performance?Date:performance).now()}class Wl{constructor(e,t,i){let n,r,s;switch(this.binding=e,this.valueSize=i,t){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}accumulate(e,t){const i=this.buffer,n=this.valueSize,r=e*n+n;let s=this.cumulativeWeight;if(0===s){for(let e=0;e!==n;++e)i[r+e]=i[e];s=t}else{s+=t;const e=t/s;this._mixBufferRegion(i,r,0,e,n)}this.cumulativeWeight=s}accumulateAdditive(e){const t=this.buffer,i=this.valueSize,n=i*this._addIndex;0===this.cumulativeWeightAdditive&&this._setIdentity(),this._mixBufferRegionAdditive(t,n,0,e,i),this.cumulativeWeightAdditive+=e}apply(e){const t=this.valueSize,i=this.buffer,n=e*t+t,r=this.cumulativeWeight,s=this.cumulativeWeightAdditive,a=this.binding;if(this.cumulativeWeight=0,this.cumulativeWeightAdditive=0,r<1){const e=t*this._origIndex;this._mixBufferRegion(i,n,e,1-r,t)}s>0&&this._mixBufferRegionAdditive(i,n,this._addIndex*t,1,t);for(let e=t,r=t+t;e!==r;++e)if(i[e]!==i[e+t]){a.setValue(i,n);break}}saveOriginalState(){const e=this.binding,t=this.buffer,i=this.valueSize,n=i*this._origIndex;e.getValue(t,n);for(let e=i,r=n;e!==r;++e)t[e]=t[n+e%i];this._setIdentity(),this.cumulativeWeight=0,this.cumulativeWeightAdditive=0}restoreOriginalState(){const e=3*this.valueSize;this.binding.setValue(this.buffer,e)}_setAdditiveIdentityNumeric(){const e=this._addIndex*this.valueSize,t=e+this.valueSize;for(let i=e;i<t;i++)this.buffer[i]=0}_setAdditiveIdentityQuaternion(){this._setAdditiveIdentityNumeric(),this.buffer[this._addIndex*this.valueSize+3]=1}_setAdditiveIdentityOther(){const e=this._origIndex*this.valueSize,t=this._addIndex*this.valueSize;for(let i=0;i<this.valueSize;i++)this.buffer[t+i]=this.buffer[e+i]}_select(e,t,i,n,r){if(n>=.5)for(let n=0;n!==r;++n)e[t+n]=e[i+n]}_slerp(e,t,i,n){Ji.slerpFlat(e,t,e,t,e,i,n)}_slerpAdditive(e,t,i,n,r){const s=this._workIndex*r;Ji.multiplyQuaternionsFlat(e,s,e,t,e,i),Ji.slerpFlat(e,t,e,t,e,s,n)}_lerp(e,t,i,n,r){const s=1-n;for(let a=0;a!==r;++a){const r=t+a;e[r]=e[r]*s+e[i+a]*n}}_lerpAdditive(e,t,i,n,r){for(let s=0;s!==r;++s){const r=t+s;e[r]=e[r]+e[i+s]*n}}}const ql="\\[\\]\\.:\\/",Xl=new RegExp("[\\[\\]\\.:\\/]","g"),Zl="[^\\[\\]\\.:\\/]",Yl="[^"+ql.replace("\\.","")+"]",Jl=/((?:WC+[\/:])*)/.source.replace("WC",Zl),Kl=/(WCOD+)?/.source.replace("WCOD",Yl),Ql=/(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace("WC",Zl),eu=/\.(WC+)(?:\[(.+)\])?/.source.replace("WC",Zl),tu=new RegExp("^"+Jl+Kl+Ql+eu+"$"),iu=["material","materials","bones"];class nu{constructor(e,t,i){this.path=t,this.parsedPath=i||nu.parseTrackName(t),this.node=nu.findNode(e,this.parsedPath.nodeName)||e,this.rootNode=e,this.getValue=this._getValue_unbound,this.setValue=this._setValue_unbound}static create(e,t,i){return e&&e.isAnimationObjectGroup?new nu.Composite(e,t,i):new nu(e,t,i)}static sanitizeNodeName(e){return e.replace(/\s/g,"_").replace(Xl,"")}static parseTrackName(e){const t=tu.exec(e);if(!t)throw new Error("PropertyBinding: Cannot parse trackName: "+e);const i={nodeName:t[2],objectName:t[3],objectIndex:t[4],propertyName:t[5],propertyIndex:t[6]},n=i.nodeName&&i.nodeName.lastIndexOf(".");if(void 0!==n&&-1!==n){const e=i.nodeName.substring(n+1);-1!==iu.indexOf(e)&&(i.nodeName=i.nodeName.substring(0,n),i.objectName=e)}if(null===i.propertyName||0===i.propertyName.length)throw new Error("PropertyBinding: can not parse propertyName from trackName: "+e);return i}static findNode(e,t){if(!t||""===t||"."===t||-1===t||t===e.name||t===e.uuid)return e;if(e.skeleton){const i=e.skeleton.getBoneByName(t);if(void 0!==i)return i}if(e.children){const i=function(e){for(let n=0;n<e.length;n++){const r=e[n];if(r.name===t||r.uuid===t)return r;const s=i(r.children);if(s)return s}return null},n=i(e.children);if(n)return n}return null}_getValue_unavailable(){}_setValue_unavailable(){}_getValue_direct(e,t){e[t]=this.targetObject[this.propertyName]}_getValue_array(e,t){const i=this.resolvedProperty;for(let n=0,r=i.length;n!==r;++n)e[t++]=i[n]}_getValue_arrayElement(e,t){e[t]=this.resolvedProperty[this.propertyIndex]}_getValue_toArray(e,t){this.resolvedProperty.toArray(e,t)}_setValue_direct(e,t){this.targetObject[this.propertyName]=e[t]}_setValue_direct_setNeedsUpdate(e,t){this.targetObject[this.propertyName]=e[t],this.targetObject.needsUpdate=!0}_setValue_direct_setMatrixWorldNeedsUpdate(e,t){this.targetObject[this.propertyName]=e[t],this.targetObject.matrixWorldNeedsUpdate=!0}_setValue_array(e,t){const i=this.resolvedProperty;for(let n=0,r=i.length;n!==r;++n)i[n]=e[t++]}_setValue_array_setNeedsUpdate(e,t){const i=this.resolvedProperty;for(let n=0,r=i.length;n!==r;++n)i[n]=e[t++];this.targetObject.needsUpdate=!0}_setValue_array_setMatrixWorldNeedsUpdate(e,t){const i=this.resolvedProperty;for(let n=0,r=i.length;n!==r;++n)i[n]=e[t++];this.targetObject.matrixWorldNeedsUpdate=!0}_setValue_arrayElement(e,t){this.resolvedProperty[this.propertyIndex]=e[t]}_setValue_arrayElement_setNeedsUpdate(e,t){this.resolvedProperty[this.propertyIndex]=e[t],this.targetObject.needsUpdate=!0}_setValue_arrayElement_setMatrixWorldNeedsUpdate(e,t){this.resolvedProperty[this.propertyIndex]=e[t],this.targetObject.matrixWorldNeedsUpdate=!0}_setValue_fromArray(e,t){this.resolvedProperty.fromArray(e,t)}_setValue_fromArray_setNeedsUpdate(e,t){this.resolvedProperty.fromArray(e,t),this.targetObject.needsUpdate=!0}_setValue_fromArray_setMatrixWorldNeedsUpdate(e,t){this.resolvedProperty.fromArray(e,t),this.targetObject.matrixWorldNeedsUpdate=!0}_getValue_unbound(e,t){this.bind(),this.getValue(e,t)}_setValue_unbound(e,t){this.bind(),this.setValue(e,t)}bind(){let e=this.node;const t=this.parsedPath,i=t.objectName,n=t.propertyName;let r=t.propertyIndex;if(e||(e=nu.findNode(this.rootNode,t.nodeName)||this.rootNode,this.node=e),this.getValue=this._getValue_unavailable,this.setValue=this._setValue_unavailable,!e)return void console.error("THREE.PropertyBinding: Trying to update node for track: "+this.path+" but it wasn't found.");if(i){let n=t.objectIndex;switch(i){case"materials":if(!e.material)return void console.error("THREE.PropertyBinding: Can not bind to material as node does not have a material.",this);if(!e.material.materials)return void console.error("THREE.PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.",this);e=e.material.materials;break;case"bones":if(!e.skeleton)return void console.error("THREE.PropertyBinding: Can not bind to bones as node does not have a skeleton.",this);e=e.skeleton.bones;for(let t=0;t<e.length;t++)if(e[t].name===n){n=t;break}break;default:if(void 0===e[i])return void console.error("THREE.PropertyBinding: Can not bind to objectName of node undefined.",this);e=e[i]}if(void 0!==n){if(void 0===e[n])return void console.error("THREE.PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.",this,e);e=e[n]}}const s=e[n];if(void 0===s){const i=t.nodeName;return void console.error("THREE.PropertyBinding: Trying to update property for track: "+i+"."+n+" but it wasn't found.",e)}let a=this.Versioning.None;this.targetObject=e,void 0!==e.needsUpdate?a=this.Versioning.NeedsUpdate:void 0!==e.matrixWorldNeedsUpdate&&(a=this.Versioning.MatrixWorldNeedsUpdate);let o=this.BindingType.Direct;if(void 0!==r){if("morphTargetInfluences"===n){if(!e.geometry)return void console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.",this);if(!e.geometry.isBufferGeometry)return void console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences on THREE.Geometry. Use THREE.BufferGeometry instead.",this);if(!e.geometry.morphAttributes)return void console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.",this);void 0!==e.morphTargetDictionary[r]&&(r=e.morphTargetDictionary[r])}o=this.BindingType.ArrayElement,this.resolvedProperty=s,this.propertyIndex=r}else void 0!==s.fromArray&&void 0!==s.toArray?(o=this.BindingType.HasFromToArray,this.resolvedProperty=s):Array.isArray(s)?(o=this.BindingType.EntireArray,this.resolvedProperty=s):this.propertyName=n;this.getValue=this.GetterByBindingType[o],this.setValue=this.SetterByBindingTypeAndVersioning[o][a]}unbind(){this.node=null,this.getValue=this._getValue_unbound,this.setValue=this._setValue_unbound}}nu.Composite=class{constructor(e,t,i){const n=i||nu.parseTrackName(t);this._targetGroup=e,this._bindings=e.subscribe_(t,n)}getValue(e,t){this.bind();const i=this._targetGroup.nCachedObjects_,n=this._bindings[i];void 0!==n&&n.getValue(e,t)}setValue(e,t){const i=this._bindings;for(let n=this._targetGroup.nCachedObjects_,r=i.length;n!==r;++n)i[n].setValue(e,t)}bind(){const e=this._bindings;for(let t=this._targetGroup.nCachedObjects_,i=e.length;t!==i;++t)e[t].bind()}unbind(){const e=this._bindings;for(let t=this._targetGroup.nCachedObjects_,i=e.length;t!==i;++t)e[t].unbind()}},nu.prototype.BindingType={Direct:0,EntireArray:1,ArrayElement:2,HasFromToArray:3},nu.prototype.Versioning={None:0,NeedsUpdate:1,MatrixWorldNeedsUpdate:2},nu.prototype.GetterByBindingType=[nu.prototype._getValue_direct,nu.prototype._getValue_array,nu.prototype._getValue_arrayElement,nu.prototype._getValue_toArray],nu.prototype.SetterByBindingTypeAndVersioning=[[nu.prototype._setValue_direct,nu.prototype._setValue_direct_setNeedsUpdate,nu.prototype._setValue_direct_setMatrixWorldNeedsUpdate],[nu.prototype._setValue_array,nu.prototype._setValue_array_setNeedsUpdate,nu.prototype._setValue_array_setMatrixWorldNeedsUpdate],[nu.prototype._setValue_arrayElement,nu.prototype._setValue_arrayElement_setNeedsUpdate,nu.prototype._setValue_arrayElement_setMatrixWorldNeedsUpdate],[nu.prototype._setValue_fromArray,nu.prototype._setValue_fromArray_setNeedsUpdate,nu.prototype._setValue_fromArray_setMatrixWorldNeedsUpdate]];class ru{constructor(e,t,i=null,n=t.blendMode){this._mixer=e,this._clip=t,this._localRoot=i,this.blendMode=n;const r=t.tracks,s=r.length,a=new Array(s),o={endingStart:pi,endingEnd:pi};for(let e=0;e!==s;++e){const t=r[e].createInterpolant(null);a[e]=t,t.settings=o}this._interpolantSettings=o,this._interpolants=a,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(e){return this._startTime=e,this}setLoop(e,t){return this.loop=e,this.repetitions=t,this}setEffectiveWeight(e){return this.weight=e,this._effectiveWeight=this.enabled?e:0,this.stopFading()}getEffectiveWeight(){return this._effectiveWeight}fadeIn(e){return this._scheduleFading(e,0,1)}fadeOut(e){return this._scheduleFading(e,1,0)}crossFadeFrom(e,t,i){if(e.fadeOut(t),this.fadeIn(t),i){const i=this._clip.duration,n=e._clip.duration,r=n/i,s=i/n;e.warp(1,r,t),this.warp(s,1,t)}return this}crossFadeTo(e,t,i){return e.crossFadeFrom(this,t,i)}stopFading(){const e=this._weightInterpolant;return null!==e&&(this._weightInterpolant=null,this._mixer._takeBackControlInterpolant(e)),this}setEffectiveTimeScale(e){return this.timeScale=e,this._effectiveTimeScale=this.paused?0:e,this.stopWarping()}getEffectiveTimeScale(){return this._effectiveTimeScale}setDuration(e){return this.timeScale=this._clip.duration/e,this.stopWarping()}syncWith(e){return this.time=e.time,this.timeScale=e.timeScale,this.stopWarping()}halt(e){return this.warp(this._effectiveTimeScale,0,e)}warp(e,t,i){const n=this._mixer,r=n.time,s=this.timeScale;let a=this._timeScaleInterpolant;null===a&&(a=n._lendControlInterpolant(),this._timeScaleInterpolant=a);const o=a.parameterPositions,h=a.sampleValues;return o[0]=r,o[1]=r+i,h[0]=e/s,h[1]=t/s,this}stopWarping(){const e=this._timeScaleInterpolant;return null!==e&&(this._timeScaleInterpolant=null,this._mixer._takeBackControlInterpolant(e)),this}getMixer(){return this._mixer}getClip(){return this._clip}getRoot(){return this._localRoot||this._mixer._root}_update(e,t,i,n){if(!this.enabled)return void this._updateWeight(e);const r=this._startTime;if(null!==r){const n=(e-r)*i;if(n<0||0===i)return;this._startTime=null,t=i*n}t*=this._updateTimeScale(e);const s=this._updateTime(t),a=this._updateWeight(e);if(a>0){const e=this._interpolants,t=this._propertyBindings;switch(this.blendMode){case 2501:for(let i=0,n=e.length;i!==n;++i)e[i].evaluate(s),t[i].accumulateAdditive(a);break;case gi:default:for(let i=0,r=e.length;i!==r;++i)e[i].evaluate(s),t[i].accumulate(n,a)}}}_updateWeight(e){let t=0;if(this.enabled){t=this.weight;const i=this._weightInterpolant;if(null!==i){const n=i.evaluate(e)[0];t*=n,e>i.parameterPositions[1]&&(this.stopFading(),0===n&&(this.enabled=!1))}}return this._effectiveWeight=t,t}_updateTimeScale(e){let t=0;if(!this.paused){t=this.timeScale;const i=this._timeScaleInterpolant;if(null!==i){t*=i.evaluate(e)[0],e>i.parameterPositions[1]&&(this.stopWarping(),0===t?this.paused=!0:this.timeScale=t)}}return this._effectiveTimeScale=t,t}_updateTime(e){const t=this._clip.duration,i=this.loop;let n=this.time+e,r=this._loopCount;const s=2202===i;if(0===e)return-1===r?n:s&&1==(1&r)?t-n:n;if(2200===i){-1===r&&(this._loopCount=0,this._setEndings(!0,!0,!1));e:{if(n>=t)n=t;else{if(!(n<0)){this.time=n;break e}n=0}this.clampWhenFinished?this.paused=!0:this.enabled=!1,this.time=n,this._mixer.dispatchEvent({type:"finished",action:this,direction:e<0?-1:1})}}else{if(-1===r&&(e>=0?(r=0,this._setEndings(!0,0===this.repetitions,s)):this._setEndings(0===this.repetitions,!0,s)),n>=t||n<0){const i=Math.floor(n/t);n-=t*i,r+=Math.abs(i);const a=this.repetitions-r;if(a<=0)this.clampWhenFinished?this.paused=!0:this.enabled=!1,n=e>0?t:0,this.time=n,this._mixer.dispatchEvent({type:"finished",action:this,direction:e>0?1:-1});else{if(1===a){const t=e<0;this._setEndings(t,!t,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 t-n}return n}_setEndings(e,t,i){const n=this._interpolantSettings;i?(n.endingStart=mi,n.endingEnd=mi):(n.endingStart=e?this.zeroSlopeAtStart?mi:pi:fi,n.endingEnd=t?this.zeroSlopeAtEnd?mi:pi:fi)}_scheduleFading(e,t,i){const n=this._mixer,r=n.time;let s=this._weightInterpolant;null===s&&(s=n._lendControlInterpolant(),this._weightInterpolant=s);const a=s.parameterPositions,o=s.sampleValues;return a[0]=r,o[0]=t,a[1]=r+e,o[1]=i,this}}(class extends Ti{constructor(e){super(),this._root=e,this._initMemoryManager(),this._accuIndex=0,this.time=0,this.timeScale=1}_bindAction(e,t){const i=e._localRoot||this._root,n=e._clip.tracks,r=n.length,s=e._propertyBindings,a=e._interpolants,o=i.uuid,h=this._bindingsByRootAndName;let c=h[o];void 0===c&&(c={},h[o]=c);for(let e=0;e!==r;++e){const r=n[e],h=r.name;let l=c[h];if(void 0!==l)s[e]=l;else{if(l=s[e],void 0!==l){null===l._cacheIndex&&(++l.referenceCount,this._addInactiveBinding(l,o,h));continue}const n=t&&t._propertyBindings[e].binding.parsedPath;l=new Wl(nu.create(i,h,n),r.ValueTypeName,r.getValueSize()),++l.referenceCount,this._addInactiveBinding(l,o,h),s[e]=l}a[e].resultBuffer=l.buffer}}_activateAction(e){if(!this._isActiveAction(e)){if(null===e._cacheIndex){const t=(e._localRoot||this._root).uuid,i=e._clip.uuid,n=this._actionsByClip[i];this._bindAction(e,n&&n.knownActions[0]),this._addInactiveAction(e,i,t)}const t=e._propertyBindings;for(let e=0,i=t.length;e!==i;++e){const i=t[e];0==i.useCount++&&(this._lendBinding(i),i.saveOriginalState())}this._lendAction(e)}}_deactivateAction(e){if(this._isActiveAction(e)){const t=e._propertyBindings;for(let e=0,i=t.length;e!==i;++e){const i=t[e];0==--i.useCount&&(i.restoreOriginalState(),this._takeBackBinding(i))}this._takeBackAction(e)}}_initMemoryManager(){this._actions=[],this._nActiveActions=0,this._actionsByClip={},this._bindings=[],this._nActiveBindings=0,this._bindingsByRootAndName={},this._controlInterpolants=[],this._nActiveControlInterpolants=0;const e=this;this.stats={actions:{get total(){return e._actions.length},get inUse(){return e._nActiveActions}},bindings:{get total(){return e._bindings.length},get inUse(){return e._nActiveBindings}},controlInterpolants:{get total(){return e._controlInterpolants.length},get inUse(){return e._nActiveControlInterpolants}}}}_isActiveAction(e){const t=e._cacheIndex;return null!==t&&t<this._nActiveActions}_addInactiveAction(e,t,i){const n=this._actions,r=this._actionsByClip;let s=r[t];if(void 0===s)s={knownActions:[e],actionByRoot:{}},e._byClipCacheIndex=0,r[t]=s;else{const t=s.knownActions;e._byClipCacheIndex=t.length,t.push(e)}e._cacheIndex=n.length,n.push(e),s.actionByRoot[i]=e}_removeInactiveAction(e){const t=this._actions,i=t[t.length-1],n=e._cacheIndex;i._cacheIndex=n,t[n]=i,t.pop(),e._cacheIndex=null;const r=e._clip.uuid,s=this._actionsByClip,a=s[r],o=a.knownActions,h=o[o.length-1],c=e._byClipCacheIndex;h._byClipCacheIndex=c,o[c]=h,o.pop(),e._byClipCacheIndex=null;delete a.actionByRoot[(e._localRoot||this._root).uuid],0===o.length&&delete s[r],this._removeInactiveBindingsForAction(e)}_removeInactiveBindingsForAction(e){const t=e._propertyBindings;for(let e=0,i=t.length;e!==i;++e){const i=t[e];0==--i.referenceCount&&this._removeInactiveBinding(i)}}_lendAction(e){const t=this._actions,i=e._cacheIndex,n=this._nActiveActions++,r=t[n];e._cacheIndex=n,t[n]=e,r._cacheIndex=i,t[i]=r}_takeBackAction(e){const t=this._actions,i=e._cacheIndex,n=--this._nActiveActions,r=t[n];e._cacheIndex=n,t[n]=e,r._cacheIndex=i,t[i]=r}_addInactiveBinding(e,t,i){const n=this._bindingsByRootAndName,r=this._bindings;let s=n[t];void 0===s&&(s={},n[t]=s),s[i]=e,e._cacheIndex=r.length,r.push(e)}_removeInactiveBinding(e){const t=this._bindings,i=e.binding,n=i.rootNode.uuid,r=i.path,s=this._bindingsByRootAndName,a=s[n],o=t[t.length-1],h=e._cacheIndex;o._cacheIndex=h,t[h]=o,t.pop(),delete a[r],0===Object.keys(a).length&&delete s[n]}_lendBinding(e){const t=this._bindings,i=e._cacheIndex,n=this._nActiveBindings++,r=t[n];e._cacheIndex=n,t[n]=e,r._cacheIndex=i,t[i]=r}_takeBackBinding(e){const t=this._bindings,i=e._cacheIndex,n=--this._nActiveBindings,r=t[n];e._cacheIndex=n,t[n]=e,r._cacheIndex=i,t[i]=r}_lendControlInterpolant(){const e=this._controlInterpolants,t=this._nActiveControlInterpolants++;let i=e[t];return void 0===i&&(i=new hl(new Float32Array(2),new Float32Array(2),1,this._controlInterpolantsResultBuffer),i.__cacheIndex=t,e[t]=i),i}_takeBackControlInterpolant(e){const t=this._controlInterpolants,i=e.__cacheIndex,n=--this._nActiveControlInterpolants,r=t[n];e.__cacheIndex=n,t[n]=e,r.__cacheIndex=i,t[i]=r}clipAction(e,t,i){const n=t||this._root,r=n.uuid;let s="string"==typeof e?vl.findByName(n,e):e;const a=null!==s?s.uuid:e,o=this._actionsByClip[a];let h=null;if(void 0===i&&(i=null!==s?s.blendMode:gi),void 0!==o){const e=o.actionByRoot[r];if(void 0!==e&&e.blendMode===i)return e;h=o.knownActions[0],null===s&&(s=h._clip)}if(null===s)return null;const c=new ru(this,s,t,i);return this._bindAction(c,h),this._addInactiveAction(c,a,r),c}existingAction(e,t){const i=t||this._root,n=i.uuid,r="string"==typeof e?vl.findByName(i,e):e,s=r?r.uuid:e,a=this._actionsByClip[s];return void 0!==a&&a.actionByRoot[n]||null}stopAllAction(){const e=this._actions;for(let t=this._nActiveActions-1;t>=0;--t)e[t].stop();return this}update(e){e*=this.timeScale;const t=this._actions,i=this._nActiveActions,n=this.time+=e,r=Math.sign(e),s=this._accuIndex^=1;for(let a=0;a!==i;++a){t[a]._update(n,e,r,s)}const a=this._bindings,o=this._nActiveBindings;for(let e=0;e!==o;++e)a[e].apply(s);return this}setTime(e){this.time=0;for(let e=0;e<this._actions.length;e++)this._actions[e].time=0;return this.update(e)}getRoot(){return this._root}uncacheClip(e){const t=this._actions,i=e.uuid,n=this._actionsByClip,r=n[i];if(void 0!==r){const e=r.knownActions;for(let i=0,n=e.length;i!==n;++i){const n=e[i];this._deactivateAction(n);const r=n._cacheIndex,s=t[t.length-1];n._cacheIndex=null,n._byClipCacheIndex=null,s._cacheIndex=r,t[r]=s,t.pop(),this._removeInactiveBindingsForAction(n)}delete n[i]}}uncacheRoot(e){const t=e.uuid,i=this._actionsByClip;for(const e in i){const n=i[e].actionByRoot[t];void 0!==n&&(this._deactivateAction(n),this._removeInactiveAction(n))}const n=this._bindingsByRootAndName[t];if(void 0!==n)for(const e in n){const t=n[e];t.restoreOriginalState(),this._removeInactiveBinding(t)}}uncacheAction(e,t){const i=this.existingAction(e,t);null!==i&&(this._deactivateAction(i),this._removeInactiveAction(i))}}).prototype._controlInterpolantsResultBuffer=new Float32Array(1);(class extends lh{constructor(e,t,i=1){super(e,t),this.meshPerAttribute=i}copy(e){return super.copy(e),this.meshPerAttribute=e.meshPerAttribute,this}clone(e){const t=super.clone(e);return t.meshPerAttribute=this.meshPerAttribute,t}toJSON(e){const t=super.toJSON(e);return t.isInstancedInterleavedBuffer=!0,t.meshPerAttribute=this.meshPerAttribute,t}}).prototype.isInstancedInterleavedBuffer=!0;class su{constructor(e,t,i=0,n=1/0){this.ray=new In(e,t),this.near=i,this.far=n,this.camera=null,this.layers=new Un,this.params={Mesh:{},Line:{threshold:1},LOD:{},Points:{threshold:1},Sprite:{}}}set(e,t){this.ray.set(e,t)}setFromCamera(e,t){t&&t.isPerspectiveCamera?(this.ray.origin.setFromMatrixPosition(t.matrixWorld),this.ray.direction.set(e.x,e.y,.5).unproject(t).sub(this.ray.origin).normalize(),this.camera=t):t&&t.isOrthographicCamera?(this.ray.origin.set(e.x,e.y,(t.near+t.far)/(t.near-t.far)).unproject(t),this.ray.direction.set(0,0,-1).transformDirection(t.matrixWorld),this.camera=t):console.error("THREE.Raycaster: Unsupported camera type: "+t.type)}intersectObject(e,t=!0,i=[]){return ou(e,this,i,t),i.sort(au),i}intersectObjects(e,t=!0,i=[]){for(let n=0,r=e.length;n<r;n++)ou(e[n],this,i,t);return i.sort(au),i}}function au(e,t){return e.distance-t.distance}function ou(e,t,i,n){if(e.layers.test(t.layers)&&e.raycast(t,i),!0===n){const n=e.children;for(let e=0,r=n.length;e<r;e++)ou(n[e],t,i,!0)}}const hu=new Ki,cu=new Rn,lu=new Rn;function uu(e){const t=[];e&&e.isBone&&t.push(e);for(let i=0;i<e.children.length;i++)t.push.apply(t,uu(e.children[i]));return t}const du=new Float32Array(1);new Int32Array(du.buffer),rc.create=function(e,t){return console.log("THREE.Curve.create() has been deprecated"),e.prototype=Object.create(rc.prototype),e.prototype.constructor=e,e.prototype.getPoint=t,e},Sc.prototype.fromPoints=function(e){return console.warn("THREE.Path: .fromPoints() has been renamed to .setFromPoints()."),this.setFromPoints(e)},class extends Zh{constructor(e=10,t=10,i=4473924,n=8947848){i=new xr(i),n=new xr(n);const r=t/2,s=e/t,a=e/2,o=[],h=[];for(let e=0,c=0,l=-a;e<=t;e++,l+=s){o.push(-a,0,l,a,0,l),o.push(l,0,-a,l,0,a);const t=e===r?i:n;t.toArray(h,c),c+=3,t.toArray(h,c),c+=3,t.toArray(h,c),c+=3,t.toArray(h,c),c+=3}const c=new kr;c.setAttribute("position",new Ar(o,3)),c.setAttribute("color",new Ar(h,3));super(c,new Bh({vertexColors:!0,toneMapped:!1})),this.type="GridHelper"}}.prototype.setColors=function(){console.error("THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.")},class extends Zh{constructor(e){const t=uu(e),i=new kr,n=[],r=[],s=new xr(0,0,1),a=new xr(0,1,0);for(let e=0;e<t.length;e++){const i=t[e];i.parent&&i.parent.isBone&&(n.push(0,0,0),n.push(0,0,0),r.push(s.r,s.g,s.b),r.push(a.r,a.g,a.b))}i.setAttribute("position",new Ar(n,3)),i.setAttribute("color",new Ar(r,3));super(i,new Bh({vertexColors:!0,depthTest:!1,depthWrite:!1,toneMapped:!1,transparent:!0})),this.type="SkeletonHelper",this.isSkeletonHelper=!0,this.root=e,this.bones=t,this.matrix=e.matrixWorld,this.matrixAutoUpdate=!1}updateMatrixWorld(e){const t=this.bones,i=this.geometry,n=i.getAttribute("position");lu.copy(this.root.matrixWorld).invert();for(let e=0,i=0;e<t.length;e++){const r=t[e];r.parent&&r.parent.isBone&&(cu.multiplyMatrices(lu,r.matrixWorld),hu.setFromMatrixPosition(cu),n.setXYZ(i,hu.x,hu.y,hu.z),cu.multiplyMatrices(lu,r.parent.matrixWorld),hu.setFromMatrixPosition(cu),n.setXYZ(i+1,hu.x,hu.y,hu.z),i+=2)}i.getAttribute("position").needsUpdate=!0,super.updateMatrixWorld(e)}}.prototype.update=function(){console.error("THREE.SkeletonHelper: update() no longer needs to be called.")},wl.prototype.extractUrlBase=function(e){return console.warn("THREE.Loader: .extractUrlBase() has been deprecated. Use THREE.LoaderUtils.extractUrlBase() instead."),class{static decodeText(e){if("undefined"!=typeof TextDecoder)return(new TextDecoder).decode(e);let t="";for(let i=0,n=e.length;i<n;i++)t+=String.fromCharCode(e[i]);try{return decodeURIComponent(escape(t))}catch(e){return t}}static extractUrlBase(e){const t=e.lastIndexOf("/");return-1===t?"./":e.substr(0,t+1)}static resolveURL(e,t){return"string"!=typeof e||""===e?"":(/^https?:\/\//i.test(t)&&/^\//.test(e)&&(t=t.replace(/(^https?:\/\/[^\/]+).*/i,"$1")),/^(https?:)?\/\//i.test(e)||/^data:.*,.*$/i.test(e)||/^blob:.*$/i.test(e)?e:t+e)}}.extractUrlBase(e)},wl.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.")}},tn.prototype.center=function(e){return console.warn("THREE.Box3: .center() has been renamed to .getCenter()."),this.getCenter(e)},tn.prototype.empty=function(){return console.warn("THREE.Box3: .empty() has been renamed to .isEmpty()."),this.isEmpty()},tn.prototype.isIntersectionBox=function(e){return console.warn("THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox()."),this.intersectsBox(e)},tn.prototype.isIntersectionSphere=function(e){return console.warn("THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere()."),this.intersectsSphere(e)},tn.prototype.size=function(e){return console.warn("THREE.Box3: .size() has been renamed to .getSize()."),this.getSize(e)},xn.prototype.empty=function(){return console.warn("THREE.Sphere: .empty() has been renamed to .isEmpty()."),this.isEmpty()},ys.prototype.setFromMatrix=function(e){return console.warn("THREE.Frustum: .setFromMatrix() has been renamed to .setFromProjectionMatrix()."),this.setFromProjectionMatrix(e)},Fi.prototype.flattenToArrayOffset=function(e,t){return console.warn("THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead."),this.toArray(e,t)},Fi.prototype.multiplyVector3=function(e){return console.warn("THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead."),e.applyMatrix3(this)},Fi.prototype.multiplyVector3Array=function(){console.error("THREE.Matrix3: .multiplyVector3Array() has been removed.")},Fi.prototype.applyToBufferAttribute=function(e){return console.warn("THREE.Matrix3: .applyToBufferAttribute() has been removed. Use attribute.applyMatrix3( matrix ) instead."),e.applyMatrix3(this)},Fi.prototype.applyToVector3Array=function(){console.error("THREE.Matrix3: .applyToVector3Array() has been removed.")},Fi.prototype.getInverse=function(e){return console.warn("THREE.Matrix3: .getInverse() has been removed. Use matrixInv.copy( matrix ).invert(); instead."),this.copy(e).invert()},Rn.prototype.extractPosition=function(e){return console.warn("THREE.Matrix4: .extractPosition() has been renamed to .copyPosition()."),this.copyPosition(e)},Rn.prototype.flattenToArrayOffset=function(e,t){return console.warn("THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead."),this.toArray(e,t)},Rn.prototype.getPosition=function(){return console.warn("THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead."),(new Ki).setFromMatrixColumn(this,3)},Rn.prototype.setRotationFromQuaternion=function(e){return console.warn("THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion()."),this.makeRotationFromQuaternion(e)},Rn.prototype.multiplyToArray=function(){console.warn("THREE.Matrix4: .multiplyToArray() has been removed.")},Rn.prototype.multiplyVector3=function(e){return console.warn("THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead."),e.applyMatrix4(this)},Rn.prototype.multiplyVector4=function(e){return console.warn("THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead."),e.applyMatrix4(this)},Rn.prototype.multiplyVector3Array=function(){console.error("THREE.Matrix4: .multiplyVector3Array() has been removed.")},Rn.prototype.rotateAxis=function(e){console.warn("THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead."),e.transformDirection(this)},Rn.prototype.crossVector=function(e){return console.warn("THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead."),e.applyMatrix4(this)},Rn.prototype.translate=function(){console.error("THREE.Matrix4: .translate() has been removed.")},Rn.prototype.rotateX=function(){console.error("THREE.Matrix4: .rotateX() has been removed.")},Rn.prototype.rotateY=function(){console.error("THREE.Matrix4: .rotateY() has been removed.")},Rn.prototype.rotateZ=function(){console.error("THREE.Matrix4: .rotateZ() has been removed.")},Rn.prototype.rotateByAxis=function(){console.error("THREE.Matrix4: .rotateByAxis() has been removed.")},Rn.prototype.applyToBufferAttribute=function(e){return console.warn("THREE.Matrix4: .applyToBufferAttribute() has been removed. Use attribute.applyMatrix4( matrix ) instead."),e.applyMatrix4(this)},Rn.prototype.applyToVector3Array=function(){console.error("THREE.Matrix4: .applyToVector3Array() has been removed.")},Rn.prototype.makeFrustum=function(e,t,i,n,r,s){return console.warn("THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead."),this.makePerspective(e,t,n,i,r,s)},Rn.prototype.getInverse=function(e){return console.warn("THREE.Matrix4: .getInverse() has been removed. Use matrixInv.copy( matrix ).invert(); instead."),this.copy(e).invert()},gs.prototype.isIntersectionLine=function(e){return console.warn("THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine()."),this.intersectsLine(e)},Ji.prototype.multiplyVector3=function(e){return console.warn("THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead."),e.applyQuaternion(this)},Ji.prototype.inverse=function(){return console.warn("THREE.Quaternion: .inverse() has been renamed to invert()."),this.invert()},In.prototype.isIntersectionBox=function(e){return console.warn("THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox()."),this.intersectsBox(e)},In.prototype.isIntersectionPlane=function(e){return console.warn("THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane()."),this.intersectsPlane(e)},In.prototype.isIntersectionSphere=function(e){return console.warn("THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere()."),this.intersectsSphere(e)},dr.prototype.area=function(){return console.warn("THREE.Triangle: .area() has been renamed to .getArea()."),this.getArea()},dr.prototype.barycoordFromPoint=function(e,t){return console.warn("THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord()."),this.getBarycoord(e,t)},dr.prototype.midpoint=function(e){return console.warn("THREE.Triangle: .midpoint() has been renamed to .getMidpoint()."),this.getMidpoint(e)},dr.prototypenormal=function(e){return console.warn("THREE.Triangle: .normal() has been renamed to .getNormal()."),this.getNormal(e)},dr.prototype.plane=function(e){return console.warn("THREE.Triangle: .plane() has been renamed to .getPlane()."),this.getPlane(e)},dr.barycoordFromPoint=function(e,t,i,n,r){return console.warn("THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord()."),dr.getBarycoord(e,t,i,n,r)},dr.normal=function(e,t,i,n){return console.warn("THREE.Triangle: .normal() has been renamed to .getNormal()."),dr.getNormal(e,t,i,n)},Tc.prototype.extractAllPoints=function(e){return console.warn("THREE.Shape: .extractAllPoints() has been removed. Use .extractPoints() instead."),this.extractPoints(e)},Tc.prototype.extrude=function(e){return console.warn("THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead."),new el(this,e)},Tc.prototype.makeGeometry=function(e){return console.warn("THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead."),new il(this,e)},zi.prototype.fromAttribute=function(e,t,i){return console.warn("THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute()."),this.fromBufferAttribute(e,t,i)},zi.prototype.distanceToManhattan=function(e){return console.warn("THREE.Vector2: .distanceToManhattan() has been renamed to .manhattanDistanceTo()."),this.manhattanDistanceTo(e)},zi.prototype.lengthManhattan=function(){return console.warn("THREE.Vector2: .lengthManhattan() has been renamed to .manhattanLength()."),this.manhattanLength()},Ki.prototype.setEulerFromRotationMatrix=function(){console.error("THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.")},Ki.prototype.setEulerFromQuaternion=function(){console.error("THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.")},Ki.prototype.getPositionFromMatrix=function(e){return console.warn("THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition()."),this.setFromMatrixPosition(e)},Ki.prototype.getScaleFromMatrix=function(e){return console.warn("THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale()."),this.setFromMatrixScale(e)},Ki.prototype.getColumnFromMatrix=function(e,t){return console.warn("THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn()."),this.setFromMatrixColumn(t,e)},Ki.prototype.applyProjection=function(e){return console.warn("THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead."),this.applyMatrix4(e)},Ki.prototype.fromAttribute=function(e,t,i){return console.warn("THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute()."),this.fromBufferAttribute(e,t,i)},Ki.prototype.distanceToManhattan=function(e){return console.warn("THREE.Vector3: .distanceToManhattan() has been renamed to .manhattanDistanceTo()."),this.manhattanDistanceTo(e)},Ki.prototype.lengthManhattan=function(){return console.warn("THREE.Vector3: .lengthManhattan() has been renamed to .manhattanLength()."),this.manhattanLength()},Xi.prototype.fromAttribute=function(e,t,i){return console.warn("THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute()."),this.fromBufferAttribute(e,t,i)},Xi.prototype.lengthManhattan=function(){return console.warn("THREE.Vector4: .lengthManhattan() has been renamed to .manhattanLength()."),this.manhattanLength()},tr.prototype.getChildByName=function(e){return console.warn("THREE.Object3D: .getChildByName() has been renamed to .getObjectByName()."),this.getObjectByName(e)},tr.prototype.renderDepth=function(){console.warn("THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.")},tr.prototype.translate=function(e,t){return console.warn("THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead."),this.translateOnAxis(t,e)},tr.prototype.getWorldRotation=function(){console.error("THREE.Object3D: .getWorldRotation() has been removed. Use THREE.Object3D.getWorldQuaternion( target ) instead.")},tr.prototype.applyMatrix=function(e){return console.warn("THREE.Object3D: .applyMatrix() has been renamed to .applyMatrix4()."),this.applyMatrix4(e)},Object.defineProperties(tr.prototype,{eulerOrder:{get:function(){return console.warn("THREE.Object3D: .eulerOrder is now .rotation.order."),this.rotation.order},set:function(e){console.warn("THREE.Object3D: .eulerOrder is now .rotation.order."),this.rotation.order=e}},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.")}}}),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.")}}}),Nh.prototype.initBones=function(){console.error("THREE.SkinnedMesh: initBones() has been removed.")},hs.prototype.setLens=function(e,t){console.warn("THREE.PerspectiveCamera.setLens is deprecated. Use .setFocalLength and .filmGauge for a photographic setup."),void 0!==t&&(this.filmGauge=t),this.setFocalLength(e)},Object.defineProperties(Al.prototype,{onlyShadow:{set:function(){console.warn("THREE.Light: .onlyShadow has been removed.")}},shadowCameraFov:{set:function(e){console.warn("THREE.Light: .shadowCameraFov is now .shadow.camera.fov."),this.shadow.camera.fov=e}},shadowCameraLeft:{set:function(e){console.warn("THREE.Light: .shadowCameraLeft is now .shadow.camera.left."),this.shadow.camera.left=e}},shadowCameraRight:{set:function(e){console.warn("THREE.Light: .shadowCameraRight is now .shadow.camera.right."),this.shadow.camera.right=e}},shadowCameraTop:{set:function(e){console.warn("THREE.Light: .shadowCameraTop is now .shadow.camera.top."),this.shadow.camera.top=e}},shadowCameraBottom:{set:function(e){console.warn("THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom."),this.shadow.camera.bottom=e}},shadowCameraNear:{set:function(e){console.warn("THREE.Light: .shadowCameraNear is now .shadow.camera.near."),this.shadow.camera.near=e}},shadowCameraFar:{set:function(e){console.warn("THREE.Light: .shadowCameraFar is now .shadow.camera.far."),this.shadow.camera.far=e}},shadowCameraVisible:{set:function(){console.warn("THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.")}},shadowBias:{set:function(e){console.warn("THREE.Light: .shadowBias is now .shadow.bias."),this.shadow.bias=e}},shadowDarkness:{set:function(){console.warn("THREE.Light: .shadowDarkness has been removed.")}},shadowMapWidth:{set:function(e){console.warn("THREE.Light: .shadowMapWidth is now .shadow.mapSize.width."),this.shadow.mapSize.width=e}},shadowMapHeight:{set:function(e){console.warn("THREE.Light: .shadowMapHeight is now .shadow.mapSize.height."),this.shadow.mapSize.height=e}}}),Object.defineProperties(Tr.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===Mi},set:function(){console.warn("THREE.BufferAttribute: .dynamic has been deprecated. Use .usage instead."),this.setUsage(Mi)}}}),Tr.prototype.setDynamic=function(e){return console.warn("THREE.BufferAttribute: .setDynamic() has been deprecated. Use .setUsage() instead."),this.setUsage(!0===e?Mi:wi),this},Tr.prototype.copyIndicesArray=function(){console.error("THREE.BufferAttribute: .copyIndicesArray() has been removed.")},Tr.prototype.setArray=function(){console.error("THREE.BufferAttribute: .setArray has been removed. Use BufferGeometry .setAttribute to replace/resize attribute buffers")},kr.prototype.addIndex=function(e){console.warn("THREE.BufferGeometry: .addIndex() has been renamed to .setIndex()."),this.setIndex(e)},kr.prototype.addAttribute=function(e,t){return console.warn("THREE.BufferGeometry: .addAttribute() has been renamed to .setAttribute()."),t&&t.isBufferAttribute||t&&t.isInterleavedBufferAttribute?"index"===e?(console.warn("THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute."),this.setIndex(t),this):this.setAttribute(e,t):(console.warn("THREE.BufferGeometry: .addAttribute() now expects ( name, attribute )."),this.setAttribute(e,new Tr(arguments[1],arguments[2])))},kr.prototype.addDrawCall=function(e,t,i){void 0!==i&&console.warn("THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset."),console.warn("THREE.BufferGeometry: .addDrawCall() is now .addGroup()."),this.addGroup(e,t)},kr.prototype.clearDrawCalls=function(){console.warn("THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups()."),this.clearGroups()},kr.prototype.computeOffsets=function(){console.warn("THREE.BufferGeometry: .computeOffsets() has been removed.")},kr.prototype.removeAttribute=function(e){return console.warn("THREE.BufferGeometry: .removeAttribute() has been renamed to .deleteAttribute()."),this.deleteAttribute(e)},kr.prototype.applyMatrix=function(e){return console.warn("THREE.BufferGeometry: .applyMatrix() has been renamed to .applyMatrix4()."),this.applyMatrix4(e)},Object.defineProperties(kr.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}}}),lh.prototype.setDynamic=function(e){return console.warn("THREE.InterleavedBuffer: .setDynamic() has been deprecated. Use .setUsage() instead."),this.setUsage(!0===e?Mi:wi),this},lh.prototype.setArray=function(){console.error("THREE.InterleavedBuffer: .setArray has been removed. Use BufferGeometry .setAttribute to replace/resize attribute buffers")},el.prototype.getArrays=function(){console.error("THREE.ExtrudeGeometry: .getArrays() has been removed.")},el.prototype.addShapeList=function(){console.error("THREE.ExtrudeGeometry: .addShapeList() has been removed.")},el.prototype.addShape=function(){console.error("THREE.ExtrudeGeometry: .addShape() has been removed.")},ch.prototype.dispose=function(){console.error("THREE.Scene: .dispose() has been removed.")},Object.defineProperties(mr.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 xr}},shading:{get:function(){console.error("THREE."+this.type+": .shading has been removed. Use the boolean .flatShading instead.")},set:function(e){console.warn("THREE."+this.type+": .shading has been removed. Use the boolean .flatShading instead."),this.flatShading=1===e}},stencilMask:{get:function(){return console.warn("THREE."+this.type+": .stencilMask has been removed. Use .stencilFuncMask instead."),this.stencilFuncMask},set:function(e){console.warn("THREE."+this.type+": .stencilMask has been removed. Use .stencilFuncMask instead."),this.stencilFuncMask=e}},vertexTangents:{get:function(){console.warn("THREE."+this.type+": .vertexTangents has been removed.")},set:function(){console.warn("THREE."+this.type+": .vertexTangents has been removed.")}}}),Object.defineProperties(as.prototype,{derivatives:{get:function(){return console.warn("THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives."),this.extensions.derivatives},set:function(e){console.warn("THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives."),this.extensions.derivatives=e}}}),hh.prototype.clearTarget=function(e,t,i,n){console.warn("THREE.WebGLRenderer: .clearTarget() has been deprecated. Use .setRenderTarget() and .clear() instead."),this.setRenderTarget(e),this.clear(t,i,n)},hh.prototype.animate=function(e){console.warn("THREE.WebGLRenderer: .animate() is now .setAnimationLoop()."),this.setAnimationLoop(e)},hh.prototype.getCurrentRenderTarget=function(){return console.warn("THREE.WebGLRenderer: .getCurrentRenderTarget() is now .getRenderTarget()."),this.getRenderTarget()},hh.prototype.getMaxAnisotropy=function(){return console.warn("THREE.WebGLRenderer: .getMaxAnisotropy() is now .capabilities.getMaxAnisotropy()."),this.capabilities.getMaxAnisotropy()},hh.prototype.getPrecision=function(){return console.warn("THREE.WebGLRenderer: .getPrecision() is now .capabilities.precision."),this.capabilities.precision},hh.prototype.resetGLState=function(){return console.warn("THREE.WebGLRenderer: .resetGLState() is now .state.reset()."),this.state.reset()},hh.prototype.supportsFloatTextures=function(){return console.warn("THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( 'OES_texture_float' )."),this.extensions.get("OES_texture_float")},hh.prototype.supportsHalfFloatTextures=function(){return console.warn("THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( 'OES_texture_half_float' )."),this.extensions.get("OES_texture_half_float")},hh.prototype.supportsStandardDerivatives=function(){return console.warn("THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( 'OES_standard_derivatives' )."),this.extensions.get("OES_standard_derivatives")},hh.prototype.supportsCompressedTextureS3TC=function(){return console.warn("THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( 'WEBGL_compressed_texture_s3tc' )."),this.extensions.get("WEBGL_compressed_texture_s3tc")},hh.prototype.supportsCompressedTexturePVRTC=function(){return console.warn("THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( 'WEBGL_compressed_texture_pvrtc' )."),this.extensions.get("WEBGL_compressed_texture_pvrtc")},hh.prototype.supportsBlendMinMax=function(){return console.warn("THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( 'EXT_blend_minmax' )."),this.extensions.get("EXT_blend_minmax")},hh.prototype.supportsVertexTextures=function(){return console.warn("THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures."),this.capabilities.vertexTextures},hh.prototype.supportsInstancedArrays=function(){return console.warn("THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( 'ANGLE_instanced_arrays' )."),this.extensions.get("ANGLE_instanced_arrays")},hh.prototype.enableScissorTest=function(e){console.warn("THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest()."),this.setScissorTest(e)},hh.prototype.initMaterial=function(){console.warn("THREE.WebGLRenderer: .initMaterial() has been removed.")},hh.prototype.addPrePlugin=function(){console.warn("THREE.WebGLRenderer: .addPrePlugin() has been removed.")},hh.prototype.addPostPlugin=function(){console.warn("THREE.WebGLRenderer: .addPostPlugin() has been removed.")},hh.prototype.updateShadowMap=function(){console.warn("THREE.WebGLRenderer: .updateShadowMap() has been removed.")},hh.prototype.setFaceCulling=function(){console.warn("THREE.WebGLRenderer: .setFaceCulling() has been removed.")},hh.prototype.allocTextureUnit=function(){console.warn("THREE.WebGLRenderer: .allocTextureUnit() has been removed.")},hh.prototype.setTexture=function(){console.warn("THREE.WebGLRenderer: .setTexture() has been removed.")},hh.prototype.setTexture2D=function(){console.warn("THREE.WebGLRenderer: .setTexture2D() has been removed.")},hh.prototype.setTextureCube=function(){console.warn("THREE.WebGLRenderer: .setTextureCube() has been removed.")},hh.prototype.getActiveMipMapLevel=function(){return console.warn("THREE.WebGLRenderer: .getActiveMipMapLevel() is now .getActiveMipmapLevel()."),this.getActiveMipmapLevel()},Object.defineProperties(hh.prototype,{shadowMapEnabled:{get:function(){return this.shadowMap.enabled},set:function(e){console.warn("THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled."),this.shadowMap.enabled=e}},shadowMapType:{get:function(){return this.shadowMap.type},set:function(e){console.warn("THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type."),this.shadowMap.type=e}},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(e){console.warn("THREE.WebGLRenderer: .gammaOutput has been removed. Set WebGLRenderer.outputEncoding instead."),this.outputEncoding=!0===e?vi:_i}},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(Ko.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(Zi.prototype,{wrapS:{get:function(){return console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS."),this.texture.wrapS},set:function(e){console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS."),this.texture.wrapS=e}},wrapT:{get:function(){return console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT."),this.texture.wrapT},set:function(e){console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT."),this.texture.wrapT=e}},magFilter:{get:function(){return console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter."),this.texture.magFilter},set:function(e){console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter."),this.texture.magFilter=e}},minFilter:{get:function(){return console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter."),this.texture.minFilter},set:function(e){console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter."),this.texture.minFilter=e}},anisotropy:{get:function(){return console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy."),this.texture.anisotropy},set:function(e){console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy."),this.texture.anisotropy=e}},offset:{get:function(){return console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset."),this.texture.offset},set:function(e){console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset."),this.texture.offset=e}},repeat:{get:function(){return console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat."),this.texture.repeat},set:function(e){console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat."),this.texture.repeat=e}},format:{get:function(){return console.warn("THREE.WebGLRenderTarget: .format is now .texture.format."),this.texture.format},set:function(e){console.warn("THREE.WebGLRenderTarget: .format is now .texture.format."),this.texture.format=e}},type:{get:function(){return console.warn("THREE.WebGLRenderTarget: .type is now .texture.type."),this.texture.type},set:function(e){console.warn("THREE.WebGLRenderTarget: .type is now .texture.type."),this.texture.type=e}},generateMipmaps:{get:function(){return console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps."),this.texture.generateMipmaps},set:function(e){console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps."),this.texture.generateMipmaps=e}}}),class extends tr{constructor(e){super(),this.type="Audio",this.listener=e,this.context=e.context,this.gain=this.context.createGain(),this.gain.connect(e.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(e){return this.hasPlaybackControl=!1,this.sourceType="audioNode",this.source=e,this.connect(),this}setMediaElementSource(e){return this.hasPlaybackControl=!1,this.sourceType="mediaNode",this.source=this.context.createMediaElementSource(e),this.connect(),this}setMediaStreamSource(e){return this.hasPlaybackControl=!1,this.sourceType="mediaStreamNode",this.source=this.context.createMediaStreamSource(e),this.connect(),this}setBuffer(e){return this.buffer=e,this.sourceType="buffer",this.autoplay&&this.play(),this}play(e=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+e;const t=this.context.createBufferSource();return t.buffer=this.buffer,t.loop=this.loop,t.loopStart=this.loopStart,t.loopEnd=this.loopEnd,t.onended=this.onEnded.bind(this),t.start(this._startedAt,this._progress+this.offset,this.duration),this.isPlaying=!0,this.source=t,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 e=1,t=this.filters.length;e<t;e++)this.filters[e-1].connect(this.filters[e]);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 e=1,t=this.filters.length;e<t;e++)this.filters[e-1].disconnect(this.filters[e]);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(e){return e||(e=[]),!0===this._connected?(this.disconnect(),this.filters=e.slice(),this.connect()):this.filters=e.slice(),this}setDetune(e){if(this.detune=e,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(e){return this.setFilters(e?[e]:[])}setPlaybackRate(e){if(!1!==this.hasPlaybackControl)return this.playbackRate=e,!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(e){if(!1!==this.hasPlaybackControl)return this.loop=e,!0===this.isPlaying&&(this.source.loop=this.loop),this;console.warn("THREE.Audio: this Audio has no playback control.")}setLoopStart(e){return this.loopStart=e,this}setLoopEnd(e){return this.loopEnd=e,this}getVolume(){return this.gain.gain.value}setVolume(e){return this.gain.gain.setTargetAtTime(e,this.context.currentTime,.01),this}}.prototype.load=function(e){console.warn("THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.");const t=this;return(new Hl).load(e,(function(e){t.setBuffer(e)})),this},ls.prototype.updateCubeMap=function(e,t){return console.warn("THREE.CubeCamera: .updateCubeMap() is now .update()."),this.update(e,t)},ls.prototype.clear=function(e,t,i,n){return console.warn("THREE.CubeCamera: .clear() is now .renderTarget.clear()."),this.renderTarget.clear(e,t,i,n)},ji.crossOrigin=void 0,ji.loadTexture=function(e,t,i,n){console.warn("THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.");const r=new El;r.setCrossOrigin(this.crossOrigin);const s=r.load(e,i,void 0,n);return t&&(s.mapping=t),s},ji.loadTextureCube=function(e,t,i,n){console.warn("THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.");const r=new Cl;r.setCrossOrigin(this.crossOrigin);const s=r.load(e,i,void 0,n);return t&&(s.mapping=t),s},ji.loadCompressedTexture=function(){console.error("THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.")},ji.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:"134"}})),"undefined"!=typeof window&&(window.__THREE__?console.warn("WARNING: Multiple instances of Three.js being imported."):window.__THREE__="134");const pu=Math.PI/180,mu=180/Math.PI,fu=6378137,gu=6356752.31424518;function _u(e,t,i,n,r,s){const a=xu(e,t,i);return yu(a[0],a[1],a[2],n,r,s)}function vu(e,t,i,n,r,s){const a=bu(e,t,i,n,r,s);return wu(a[0],a[1],a[2])}function yu(e,t,i,n,r,s){const a=xu(n,r,s),o=[e-a[0],t-a[1],i-a[2]];n*=pu,r*=pu;const h=Math.cos(n),c=Math.sin(n),l=Math.cos(r),u=Math.sin(r);return[-c*o[0]+h*o[1],-u*h*o[0]-u*c*o[1]+l*o[2],l*h*o[0]+l*c*o[1]+u*o[2]]}function bu(e,t,i,n,r,s){const a=xu(n,r,s);n*=pu,r*=pu;const o=Math.cos(n),h=Math.sin(n),c=Math.cos(r),l=Math.sin(r);return[-h*e-l*o*t+c*o*i+a[0],o*e-l*h*t+c*h*i+a[1],c*t+l*i+a[2]]}function xu(e,t,i){const n=fu,r=gu;e*=pu,t*=pu;const s=Math.cos(e),a=Math.sin(e),o=Math.cos(t),h=Math.sin(t),c=n*n,l=r*r,u=1/Math.sqrt(c*o*o+l*h*h),d=(c*u+i)*o;return[d*s,d*a,(l*u+i)*h]}function wu(e,t,i){const n=fu,r=gu,s=n*n,a=r*r,o=s-a,h=Math.sqrt(o/s),c=Math.sqrt(o/a),l=Math.sqrt(e*e+t*t),u=Math.atan2(i*n,l*r),d=Math.sin(u),p=Math.cos(u),m=Math.atan2(t,e),f=Math.atan2(i+c*c*r*d*d*d,l-h*h*n*p*p*p),g=Math.sin(f),_=Math.cos(f),v=n/Math.sqrt(1-h*h*g*g);return[m*mu,f*mu,l/_-v]}class Mu{boundingBoxCorners(e,t){const i=vu(-t,-t,0,e.lng,e.lat,0),n=vu(t,t,0,e.lng,e.lat,0);return[{lat:i[1],lng:i[0]},{lat:n[1],lng:n[0]}]}rotationFromCompass(e,t){let i=0,n=0,r=0;switch(t){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 Rn).makeRotationZ(r),a=new Bn(i,n,e*Math.PI/180,"XYZ"),o=(new Rn).makeRotationFromEuler(a),h=(new Xi).setAxisAngleFromRotationMatrix(o.multiply(s));return h.multiplyScalar(h.w).toArray().slice(0,3)}}class Su{constructor(e){if(!e)throw new Error(`Incorrect core image data ${e}`);this._cache=null,this._core=e,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(De((()=>this)))}cacheImage$(){return this._cache.cacheImage$(this._spatial).pipe(De((()=>this)))}cacheSequenceEdges(e){this._cache.cacheSequenceEdges(e)}cacheSpatialEdges(e){this._cache.cacheSpatialEdges(e)}dispose(){null!=this._cache&&(this._cache.dispose(),this._cache=null),this._core=null,this._spatial=null}initializeCache(e){if(null!=this._cache)throw new Error(`Image cache already initialized (${this.id}).`);this._cache=e}makeComplete(e){if(null==e)throw new Error("Fill can not be null.");this._spatial=e}resetSequenceEdges(){this._cache.resetSequenceEdges()}resetSpatialEdges(){this._cache.resetSpatialEdges()}uncache(){null!=this._cache&&(this._cache.dispose(),this._cache=null)}}class Tu{constructor(e){this._disposed=!1,this._provider=e,this._image=null,this._mesh=null,this._sequenceEdges={cached:!1,edges:[]},this._spatialEdges={cached:!1,edges:[]},this._imageChanged$=new j,this._image$=this._imageChanged$.pipe(Ot(null),Rt(1),U()),this._iamgeSubscription=this._image$.subscribe(),this._sequenceEdgesChanged$=new j,this._sequenceEdges$=this._sequenceEdgesChanged$.pipe(Ot(this._sequenceEdges),Rt(1),U()),this._sequenceEdgesSubscription=this._sequenceEdges$.subscribe((()=>{})),this._spatialEdgesChanged$=new j,this._spatialEdges$=this._spatialEdgesChanged$.pipe(Ot(this._spatialEdges),Rt(1),U()),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$(e,t){return null!=this._cachingAssets$||(this._cachingAssets$=Ve(this._cacheImage$(e),this._cacheMesh$(e,t)).pipe(De((([e,t])=>(this._image=e,this._mesh=t,this))),Mt((()=>{this._cachingAssets$=null})),Rt(1),U()),this._cachingAssets$.pipe(St((e=>!!e._image))).subscribe((()=>{this._imageChanged$.next(this._image)}),(()=>{}))),this._cachingAssets$}cacheImage$(e){if(null!=this._image)return Ce(this);const t=this._cacheImage$(e).pipe(St((e=>!!e)),Ut((e=>{this._disposeImage(),this._image=e})),De((()=>this)),Rt(1),U());return t.subscribe((()=>{this._imageChanged$.next(this._image)}),(()=>{})),t}cacheSequenceEdges(e){this._sequenceEdges={cached:!0,edges:e},this._sequenceEdgesChanged$.next(this._sequenceEdges)}cacheSpatialEdges(e){this._spatialEdges={cached:!0,edges:e},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$(e){return k.create((t=>{const i=new Promise(((e,t)=>{this._imageAborter=t})),n=e.thumb.url;if(n)this._provider.getImageBuffer(n,i).then((e=>{this._imageAborter=null;const i=new Image;i.crossOrigin="Anonymous",i.onload=()=>{if(this._disposed){window.URL.revokeObjectURL(i.src);const e=`Image load was aborted (${n})`;t.error(new Error(e))}else t.next(i),t.complete()},i.onerror=()=>{this._imageAborter=null,t.error(new Error(`Failed to load image (${n})`))};const r=new Blob([e]);i.src=window.URL.createObjectURL(r)}),(e=>{this._imageAborter=null,t.error(e)}));else{const i=e.thumb.id,r=`Incorrect thumb URL for ${e.id} (${i}, ${n})`;t.error(new Error(r))}}))}_cacheMesh$(e,t){return k.create((i=>{if(!t)return i.next(this._createEmptyMesh()),void i.complete();const n=e.mesh.url;if(!n){const t=e.mesh.id,r=`Incorrect mesh URL for ${e.id} (${t}, ${n})`;return console.warn(r),i.next(this._createEmptyMesh()),void i.complete()}const r=new Promise(((e,t)=>{this._meshAborter=t}));this._provider.getMesh(n,r).then((e=>{this._meshAborter=null,this._disposed||(i.next(e),i.complete())}),(e=>{this._meshAborter=null,console.error(e),i.next(this._createEmptyMesh()),i.complete()}))}))}_createEmptyMesh(){return{faces:[],vertices:[]}}_disposeImage(){null!=this._image&&window.URL.revokeObjectURL(this._image.src),this._image=null}}class Cu{constructor(e){this._id=e.id,this._imageIds=e.image_ids}get id(){return this._id}get imageIds(){return this._imageIds}dispose(){this._id=null,this._imageIds=null}findNext(e){let t=this._imageIds.indexOf(e);return t+1>=this._imageIds.length||-1===t?null:this._imageIds[t+1]}findPrev(e){let t=this._imageIds.indexOf(e);return 0===t||-1===t?null:this._imageIds[t-1]}}class Eu{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 Au;e.NavigationDirection=void 0,(Au=e.NavigationDirection||(e.NavigationDirection={}))[Au.Next=0]="Next",Au[Au.Prev=1]="Prev",Au[Au.StepLeft=2]="StepLeft",Au[Au.StepRight=3]="StepRight",Au[Au.StepForward=4]="StepForward",Au[Au.StepBackward=5]="StepBackward",Au[Au.TurnLeft=6]="TurnLeft",Au[Au.TurnRight=7]="TurnRight",Au[Au.TurnU=8]="TurnU",Au[Au.Spherical=9]="Spherical",Au[Au.Similar=10]="Similar";class Iu{constructor(){this.steps={},this.turns={},this.spherical={},this.steps[e.NavigationDirection.StepForward]={direction:e.NavigationDirection.StepForward,motionChange:0,useFallback:!0},this.steps[e.NavigationDirection.StepBackward]={direction:e.NavigationDirection.StepBackward,motionChange:Math.PI,useFallback:!0},this.steps[e.NavigationDirection.StepLeft]={direction:e.NavigationDirection.StepLeft,motionChange:Math.PI/2,useFallback:!1},this.steps[e.NavigationDirection.StepRight]={direction:e.NavigationDirection.StepRight,motionChange:-Math.PI/2,useFallback:!1},this.turns[e.NavigationDirection.TurnLeft]={direction:e.NavigationDirection.TurnLeft,directionChange:Math.PI/2,motionChange:Math.PI/4},this.turns[e.NavigationDirection.TurnRight]={direction:e.NavigationDirection.TurnRight,directionChange:-Math.PI/2,motionChange:-Math.PI/4},this.turns[e.NavigationDirection.TurnU]={direction:e.NavigationDirection.TurnU,directionChange:Math.PI,motionChange:null},this.spherical[e.NavigationDirection.StepForward]={direction:e.NavigationDirection.StepForward,directionChange:0,next:e.NavigationDirection.StepLeft,prev:e.NavigationDirection.StepRight},this.spherical[e.NavigationDirection.StepBackward]={direction:e.NavigationDirection.StepBackward,directionChange:Math.PI,next:e.NavigationDirection.StepRight,prev:e.NavigationDirection.StepLeft},this.spherical[e.NavigationDirection.StepLeft]={direction:e.NavigationDirection.StepLeft,directionChange:Math.PI/2,next:e.NavigationDirection.StepBackward,prev:e.NavigationDirection.StepForward},this.spherical[e.NavigationDirection.StepRight]={direction:e.NavigationDirection.StepRight,directionChange:-Math.PI/2,next:e.NavigationDirection.StepForward,prev:e.NavigationDirection.StepBackward}}}class Ru{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 Pu extends Error{constructor(e){super(e),Object.setPrototypeOf(this,Pu.prototype),this.name="MapillaryError"}}class Lu extends Pu{constructor(e){super(null!=e?e:"The argument is not valid."),Object.setPrototypeOf(this,Lu.prototype),this.name="ArgumentMapillaryError"}}class Du{constructor(){this._epsilon=1e-9}azimuthalToBearing(e){return-e+Math.PI/2}degToRad(e){return Math.PI*e/180}radToDeg(e){return 180*e/Math.PI}rotationMatrix(e){let t=new Ki(e[0],e[1],e[2]),i=t.length();return i>0&&t.normalize(),(new Rn).makeRotationAxis(t,i)}rotate(e,t){let i=new Ki(e[0],e[1],e[2]),n=this.rotationMatrix(t);return i.applyMatrix4(n),i}opticalCenter(e,t){let i=[-e[0],-e[1],-e[2]],n=[-t[0],-t[1],-t[2]];return this.rotate(n,i)}viewingDirection(e){let t=[-e[0],-e[1],-e[2]];return this.rotate([0,0,1],t)}wrap(e,t,i){if(i<t)throw new Error("Invalid arguments: max must be larger than min.");let n=i-t;for(;e>i||e<t;)e>i?e-=n:e<t&&(e+=n);return e}wrapAngle(e){return this.wrap(e,-Math.PI,Math.PI)}clamp(e,t,i){return e<t?t:e>i?i:e}angleBetweenVector2(e,t,i,n){let r=Math.atan2(n,i)-Math.atan2(t,e);return this.wrapAngle(r)}angleDifference(e,t){let i=t-e;return this.wrapAngle(i)}relativeRotationAngle(e,t){let i=this.rotationMatrix([-e[0],-e[1],-e[2]]),n=this.rotationMatrix(t),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(e,t){let i=(new Ki).fromArray(e),n=i.length();if(n<this._epsilon)return 0;let r=i.dot((new Ki).fromArray(t));return Math.asin(r/n)}azimuthal(e,t){const i=(new Ki).fromArray(e),n=(new Ki).fromArray(t),r=i.clone().dot(n),s=i.clone().sub(n.clone().multiplyScalar(r));return Math.atan2(s.y,s.x)}distanceFromLngLat(e,t,i,n){let r=this.degToRad(n-t),s=this.degToRad(i-e),a=Math.sin(r/2)*Math.sin(r/2)+Math.cos(this.degToRad(t))*Math.cos(this.degToRad(n))*Math.sin(s/2)*Math.sin(s/2);return 12742e3*Math.atan2(Math.sqrt(a),Math.sqrt(1-a))}}const Nu=new Du;function $u(e){return"spherical"===e}function ku(e){return"fisheye"===e}function Ou(e,t,i){const n=_u(e.lng,e.lat,e.alt,i.lng,i.lat,i.alt),r=Nu.rotate(n,t);return[-r.x,-r.y,-r.z]}function zu(e,t,i,n,r){const s=[];for(let e=0;e<t.length;++e){const r=t[e],a=i[e];for(let e=0;e<=n;++e)s.push([r[0]+a[0]*e/n,r[1]+a[1]*e/n])}const a=new os;a.up.copy(e.upVector()),a.position.copy((new Ki).fromArray(e.unprojectSfM([0,0],0))),a.lookAt((new Ki).fromArray(e.unprojectSfM([0,0],10))),a.updateMatrix(),a.updateMatrixWorld(!0);return s.map((t=>{const i=e.unprojectBasic(t,1e4),n=r.worldToCamera(i,a);return[Math.abs(n[0]/n[2]),Math.abs(n[1]/n[2])]}))}class Fu{constructor(e,t,i){this._spatial=new Du,this._settings=null!=e?e:new Ru,this._directions=null!=t?t:new Iu,this._coefficients=null!=i?i:new Eu}getPotentialEdges(e,t,i){if(!e.complete)throw new Lu("Image has to be full.");if(!e.merged)return[];let n=this._spatial.viewingDirection(e.rotation),r=this._spatial.angleToPlane(n.toArray(),[0,0,1]),s=[];for(let a of t){if(!a.merged||a.id===e.id)continue;let t=_u(a.lngLat.lng,a.lngLat.lat,a.computedAltitude,e.lngLat.lng,e.lngLat.lat,e.computedAltitude),o=new Ki(t[0],t[1],t[2]),h=o.length();if(h>this._settings.maxDistance&&i.indexOf(a.id)<0)continue;let c=this._spatial.angleBetweenVector2(n.x,n.y,o.x,o.y),l=this._spatial.angleToPlane(o.toArray(),[0,0,1]),u=this._spatial.viewingDirection(a.rotation),d=this._spatial.angleBetweenVector2(n.x,n.y,u.x,u.y),p=this._spatial.angleToPlane(u.toArray(),[0,0,1])-r,m=this._spatial.relativeRotationAngle(e.rotation,a.rotation),f=this._spatial.angleBetweenVector2(1,0,o.x,o.y),g=null!=a.sequenceId&&null!=e.sequenceId&&a.sequenceId===e.sequenceId,_=a.mergeId===e.mergeId,v=a.creatorId===e.creatorId,y={capturedAt:a.capturedAt,directionChange:d,distance:h,spherical:$u(a.cameraType),id:a.id,motionChange:c,rotation:m,sameMergeCC:_,sameSequence:g,sameUser:v,sequenceId:a.sequenceId,verticalDirectionChange:p,verticalMotion:l,worldMotionAzimuth:f};s.push(y)}return s}computeSequenceEdges(t,i){if(!t.complete)throw new Lu("Image has to be full.");if(t.sequenceId!==i.id)throw new Lu("Image and sequence does not correspond.");let n=[],r=i.findNext(t.id);null!=r&&n.push({data:{direction:e.NavigationDirection.Next,worldMotionAzimuth:Number.NaN},source:t.id,target:r});let s=i.findPrev(t.id);return null!=s&&n.push({data:{direction:e.NavigationDirection.Prev,worldMotionAzimuth:Number.NaN},source:t.id,target:s}),n}computeSimilarEdges(t,i){if(!t.complete)throw new Lu("Image has to be full.");let n=$u(t.cameraType),r={};for(let e of i)if(null!=e.sequenceId&&!e.sameSequence){if(n){if(!e.spherical)continue}else if(!e.spherical&&Math.abs(e.directionChange)>this._settings.similarMaxDirectionChange)continue;e.distance>this._settings.similarMaxDistance||e.sameUser&&Math.abs(e.capturedAt-t.capturedAt)<this._settings.similarMinTimeDifference||(null==r[e.sequenceId]&&(r[e.sequenceId]=[]),r[e.sequenceId].push(e))}let s=[],a=$u(t.cameraType)?e=>e.distance:e=>this._coefficients.similarDistance*e.distance+this._coefficients.similarRotation*e.rotation;for(let e in r){if(!r.hasOwnProperty(e))continue;let t=Number.MAX_VALUE,i=null;for(let n of r[e]){let e=a(n);e<t&&(t=e,i=n)}null!=i&&s.push(i)}return s.map((i=>({data:{direction:e.NavigationDirection.Similar,worldMotionAzimuth:i.worldMotionAzimuth},source:t.id,target:i.id})))}computeStepEdges(e,t,i,n){if(!e.complete)throw new Lu("Image has to be full.");let r=[];if($u(e.cameraType))return r;for(let s in this._directions.steps){if(!this._directions.steps.hasOwnProperty(s))continue;let a=this._directions.steps[s],o=Number.MAX_VALUE,h=null,c=null;for(let e of t){if(e.spherical)continue;if(Math.abs(e.directionChange)>this._settings.stepMaxDirectionChange)continue;let t=this._spatial.angleDifference(a.motionChange,e.motionChange),r=this._spatial.angleDifference(e.directionChange,t),s=Math.max(Math.abs(t),Math.abs(r));if(Math.abs(s)>this._settings.stepMaxDrift)continue;let l=e.id;if(!a.useFallback||l!==i&&l!==n||(c=e),e.distance>this._settings.stepMaxDistance)continue;t=Math.sqrt(t*t+e.verticalMotion*e.verticalMotion);let u=this._coefficients.stepPreferredDistance*Math.abs(e.distance-this._settings.stepPreferredDistance)/this._settings.stepMaxDistance+this._coefficients.stepMotion*t/this._settings.stepMaxDrift+this._coefficients.stepRotation*e.rotation/this._settings.stepMaxDirectionChange+this._coefficients.stepSequencePenalty*(e.sameSequence?0:1)+this._coefficients.stepMergeCCPenalty*(e.sameMergeCC?0:1);u<o&&(o=u,h=e)}h=null==h?c:h,null!=h&&r.push({data:{direction:a.direction,worldMotionAzimuth:h.worldMotionAzimuth},source:e.id,target:h.id})}return r}computeTurnEdges(t,i){if(!t.complete)throw new Lu("Image has to be full.");let n=[];if($u(t.cameraType))return n;for(let r in this._directions.turns){if(!this._directions.turns.hasOwnProperty(r))continue;let s=this._directions.turns[r],a=Number.MAX_VALUE,o=null;for(let t of i){if(t.spherical)continue;if(t.distance>this._settings.turnMaxDistance)continue;let i,n=s.direction!==e.NavigationDirection.TurnU&&t.distance<this._settings.turnMaxRigDistance&&Math.abs(t.directionChange)>this._settings.turnMinRigDirectionChange,r=this._spatial.angleDifference(s.directionChange,t.directionChange);if(n&&t.directionChange*s.directionChange>0&&Math.abs(t.directionChange)<Math.abs(s.directionChange))i=-Math.PI/2+Math.abs(t.directionChange);else{if(Math.abs(r)>this._settings.turnMaxDirectionChange)continue;let e=s.motionChange?this._spatial.angleDifference(s.motionChange,t.motionChange):0;e=Math.sqrt(e*e+t.verticalMotion*t.verticalMotion),i=this._coefficients.turnDistance*t.distance/this._settings.turnMaxDistance+this._coefficients.turnMotion*e/Math.PI+this._coefficients.turnSequencePenalty*(t.sameSequence?0:1)+this._coefficients.turnMergeCCPenalty*(t.sameMergeCC?0:1)}i<a&&(a=i,o=t)}null!=o&&n.push({data:{direction:s.direction,worldMotionAzimuth:o.worldMotionAzimuth},source:t.id,target:o.id})}return n}computePerspectiveToSphericalEdges(t,i){if(!t.complete)throw new Lu("Image has to be full.");if($u(t.cameraType))return[];let n=Number.MAX_VALUE,r=null;for(let e of i){if(!e.spherical)continue;let t=this._coefficients.sphericalPreferredDistance*Math.abs(e.distance-this._settings.sphericalPreferredDistance)/this._settings.sphericalMaxDistance+this._coefficients.sphericalMotion*Math.abs(e.motionChange)/Math.PI+this._coefficients.sphericalMergeCCPenalty*(e.sameMergeCC?0:1);t<n&&(n=t,r=e)}return null==r?[]:[{data:{direction:e.NavigationDirection.Spherical,worldMotionAzimuth:r.worldMotionAzimuth},source:t.id,target:r.id}]}computeSphericalEdges(t,i){if(!t.complete)throw new Lu("Image has to be full.");if(!$u(t.cameraType))return[];let n=[],r=[],s=[];for(let e of i)if(!(e.distance>this._settings.sphericalMaxDistance))if(e.spherical){if(e.distance<this._settings.sphericalMinDistance)continue;r.push(e)}else for(let t in this._directions.spherical){if(!this._directions.spherical.hasOwnProperty(t))continue;let i=this._directions.spherical[t],n=this._spatial.angleDifference(e.directionChange,e.motionChange),r=this._spatial.angleDifference(i.directionChange,n);if(!(Math.abs(r)>this._settings.sphericalMaxStepTurnChange)){s.push([i.direction,e]);break}}let a=Math.PI/this._settings.sphericalMaxItems,o=[],h=[];for(let i=0;i<this._settings.sphericalMaxItems;i++){let s=i/this._settings.sphericalMaxItems*2*Math.PI,c=Number.MAX_VALUE,l=null;for(let e of r){let t=this._spatial.angleDifference(s,e.motionChange);if(Math.abs(t)>a)continue;let i=Number.MAX_VALUE;for(let t of o){let n=Math.abs(this._spatial.angleDifference(t,e.motionChange));n<i&&(i=n)}if(i<=a)continue;let n=this._coefficients.sphericalPreferredDistance*Math.abs(e.distance-this._settings.sphericalPreferredDistance)/this._settings.sphericalMaxDistance+this._coefficients.sphericalMotion*Math.abs(t)/a+this._coefficients.sphericalSequencePenalty*(e.sameSequence?0:1)+this._coefficients.sphericalMergeCCPenalty*(e.sameMergeCC?0:1);n<c&&(c=n,l=e)}null!=l?(o.push(l.motionChange),n.push({data:{direction:e.NavigationDirection.Spherical,worldMotionAzimuth:l.worldMotionAzimuth},source:t.id,target:l.id})):h.push(s)}let c={};c[e.NavigationDirection.Spherical]=o,c[e.NavigationDirection.StepForward]=[],c[e.NavigationDirection.StepLeft]=[],c[e.NavigationDirection.StepBackward]=[],c[e.NavigationDirection.StepRight]=[];for(let i of h){let r=[];for(let o in this._directions.spherical){if(!this._directions.spherical.hasOwnProperty(o))continue;let h=this._directions.spherical[o],l=c[e.NavigationDirection.Spherical].concat(c[h.direction]).concat(c[h.prev]).concat(c[h.next]),u=Number.MAX_VALUE,d=null;for(let e of s){if(e[0]!==h.direction)continue;let t=this._spatial.angleDifference(i,e[1].motionChange);if(Math.abs(t)>a)continue;let n=Number.MAX_VALUE;for(let t of l){let i=Math.abs(this._spatial.angleDifference(t,e[1].motionChange));i<n&&(n=i)}if(n<=a)continue;let r=this._coefficients.sphericalPreferredDistance*Math.abs(e[1].distance-this._settings.sphericalPreferredDistance)/this._settings.sphericalMaxDistance+this._coefficients.sphericalMotion*Math.abs(t)/a+this._coefficients.sphericalMergeCCPenalty*(e[1].sameMergeCC?0:1);r<u&&(u=r,d=e)}null!=d&&(r.push(d),n.push({data:{direction:d[0],worldMotionAzimuth:d[1].worldMotionAzimuth},source:t.id,target:d[1].id}))}for(let e of r)c[e[0]].push(e[1].motionChange)}return n}}class Bu extends Pu{constructor(e){super(e),Object.setPrototypeOf(this,Bu.prototype),this.name="GraphMapillaryError"}}class Uu{constructor(e,t,i,n,r,s){this._api=e,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 j,this._filterCreator=null!=r?r:new Ht,this._filter=this._filterCreator.createFilter(void 0),this._filterSubject$=new j,this._filter$=Ze(Ce(this._filter),this._filterSubject$).pipe(Rt(1),U()),this._filterSubscription=this._filter$.subscribe((()=>{})),this._defaultAlt=2,this._edgeCalculator=null!=n?n:new Fu,this._graphCalculator=null!=i?i:new Mu,this._configuration=null!=s?s:{maxSequences:50,maxUnusedImages:100,maxUnusedPreStoredImages:30,maxUnusedTiles:20},this._nodes={},this._nodeIndex=null!=t?t:new Uu._spatialIndex(16),this._nodeIndexTiles={},this._nodeToTile={},this._preStored={},this._requiredNodeTiles={},this._requiredSpatialArea={},this._sequences={},this._tileThreshold=20}static register(e){Uu._spatialIndex=e}get api(){return this._api}get changed$(){return this._changed$}get filter$(){return this._filter$}cacheBoundingBox$(e,t){const i=this._api.data.geometry.bboxToCellIds(e,t).filter((e=>!(e in this._cachedTiles))).map((e=>e in this._cachingTiles$?this._cachingTiles$[e]:this._cacheTile$(e)));return 0===i.length&&i.push(Ce(this)),ge(i).pipe(qe(),Ct(),We((()=>{const i=this._nodeIndex.search({maxX:t.lng,maxY:t.lat,minX:e.lng,minY:e.lat}).map((e=>e.node)),n=[],r=[];for(const e of i)e.complete?n.push(e):r.push(e.id);const s=[];for(;r.length>0;)s.push(r.splice(0,200));return it(Ce(n),ge(s.map((e=>this._api.getSpatialImages$(e).pipe(De((e=>{const t=[];for(const i of e){if(!this.hasNode(i.node_id))continue;const e=this.getNode(i.node_id);e.complete||this._makeFull(e,i.node),t.push(e)}return t})))))).pipe(qe()))})),ut(((e,t)=>e.concat(t))))}cacheCell$(e){return(e in this._cachedTiles?Ce(this):e in this._cachingTiles$?this._cachingTiles$[e]:this._cacheTile$(e)).pipe(We((()=>{const t=this._cachedTiles[e];t.accessed=(new Date).getTime();const i=t.nodes,n=[],r=[];for(const e of i)e.complete?n.push(e):r.push(e.id);const s=[];for(;r.length>0;)s.push(r.splice(0,200));return it(Ce(n),ge(s.map((e=>this._api.getSpatialImages$(e).pipe(De((e=>{const t=[];for(const i of e){if(!i.node){console.warn(`Image is empty (${i.node})`);continue}const e=i.node_id;if(!this.hasNode(e))continue;const n=this.getNode(e);n.complete||this._makeFull(n,i.node),t.push(n)}return t})))))).pipe(qe()))})),ut(((e,t)=>e.concat(t))))}cacheFill$(e){if(e in this._cachingFull$)throw new Bu(`Cannot fill node while caching full (${e}).`);if(!this.hasNode(e))throw new Bu(`Cannot fill node that does not exist in graph (${e}).`);if(e in this._cachingFill$)return this._cachingFill$[e];const t=this.getNode(e);if(t.complete)throw new Bu(`Cannot fill node that is already full (${e}).`);return this._cachingFill$[e]=this._api.getSpatialImages$([e]).pipe(Ut((e=>{for(const i of e)i.node||console.warn(`Image is empty ${i.node_id}`),t.complete||this._makeFull(t,i.node),delete this._cachingFill$[i.node_id]})),De((()=>this)),Mt((()=>{e in this._cachingFill$&&delete this._cachingFill$[e],this._changed$.next(this)})),It(),U()),this._cachingFill$[e]}cacheFull$(e){if(e in this._cachingFull$)return this._cachingFull$[e];if(this.hasNode(e))throw new Bu(`Cannot cache full node that already exist in graph (${e}).`);return this._cachingFull$[e]=this._api.getImages$([e]).pipe(Ut((t=>{for(const i of t){if(!i.node)throw new Bu(`Image does not exist (${e}, ${i.node}).`);const t=i.node_id;if(this.hasNode(t)){const t=this.getNode(e);t.complete||this._makeFull(t,i.node)}else{if(null==i.node.sequence.id)throw new Bu(`Image has no sequence key (${e}).`);const n=new Su(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$[t]}}})),De((()=>this)),Mt((()=>{e in this._cachingFull$&&delete this._cachingFull$[e],this._changed$.next(this)})),It(),U()),this._cachingFull$[e]}cacheNodeSequence$(e){if(!this.hasNode(e))throw new Bu(`Cannot cache sequence edges of node that does not exist in graph (${e}).`);let t=this.getNode(e);if(t.sequenceId in this._sequences)throw new Bu(`Sequence already cached (${e}), (${t.sequenceId}).`);return this._cacheSequence$(t.sequenceId)}cacheSequence$(e){if(e in this._sequences)throw new Bu(`Sequence already cached (${e})`);return this._cacheSequence$(e)}cacheSequenceEdges(e){let t=this.getNode(e);if(!(t.sequenceId in this._sequences))throw new Bu(`Sequence is not cached (${e}), (${t.sequenceId})`);let i=this._sequences[t.sequenceId].sequence,n=this._edgeCalculator.computeSequenceEdges(t,i);t.cacheSequenceEdges(n)}cacheSequenceNodes$(e,t){if(!this.hasSequence(e))throw new Bu(`Cannot cache sequence nodes of sequence that does not exist in graph (${e}).`);if(this.hasSequenceNodes(e))throw new Bu(`Sequence nodes already cached (${e}).`);const i=this.getSequence(e);if(i.id in this._cachingSequenceNodes$)return this._cachingSequenceNodes$[i.id];const n=[],r=i.imageIds.slice();if(t&&r.length>50){const e=r.indexOf(t),i=Math.max(0,Math.min(e-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 a=ge(n).pipe(We((e=>this._api.getImages$(e).pipe(Ut((e=>{for(const t of e){if(!t.node){console.warn(`Image empty (${t.node_id})`);continue}const e=t.node_id;if(this.hasNode(e)){const i=this.getNode(e);i.complete||this._makeFull(i,t.node)}else{null==t.node.sequence.id&&console.warn(`Sequence missing, discarding node (${t.node_id})`);const e=new Su(t.node);this._makeFull(e,t.node);const i=this._api.data.geometry.lngLatToCellId(e.originalLngLat);this._preStore(i,e),this._setNode(e)}}s--})),De((()=>this)))),6),Ct(),Mt((()=>{delete this._cachingSequenceNodes$[i.id],0===s&&(this._cachedSequenceNodes[i.id]=!0)})),It(),U());return this._cachingSequenceNodes$[i.id]=a,a}cacheSpatialArea$(e){if(!this.hasNode(e))throw new Bu(`Cannot cache spatial area of node that does not exist in graph (${e}).`);if(e in this._cachedSpatialEdges)throw new Bu(`Image already spatially cached (${e}).`);if(!(e in this._requiredSpatialArea))throw new Bu(`Spatial area not determined (${e}).`);let t=this._requiredSpatialArea[e];if(0===Object.keys(t.cacheNodes).length)throw new Bu(`Spatial nodes already cached (${e}).`);if(e in this._cachingSpatialArea$)return this._cachingSpatialArea$[e];let i=[];for(;t.cacheKeys.length>0;)i.push(t.cacheKeys.splice(0,200));let n=i.length,r=[];for(let s of i){let i=this._api.getSpatialImages$(s).pipe(Ut((i=>{for(const e of i){if(!e.node){console.warn(`Image is empty (${e.node_id})`);continue}const i=e.node_id,n=t.cacheNodes[i];n.complete?delete t.cacheNodes[i]:(this._makeFull(n,e.node),delete t.cacheNodes[i])}0==--n&&delete this._cachingSpatialArea$[e]})),De((()=>this)),ct((i=>{for(let e of s)e in t.all&&delete t.all[e],e in t.cacheNodes&&delete t.cacheNodes[e];throw 0==--n&&delete this._cachingSpatialArea$[e],i})),Mt((()=>{0===Object.keys(t.cacheNodes).length&&this._changed$.next(this)})),It(),U());r.push(i)}return this._cachingSpatialArea$[e]=r,r}cacheSpatialEdges(e){if(e in this._cachedSpatialEdges)throw new Bu(`Spatial edges already cached (${e}).`);let t=this.getNode(e),i=this._sequences[t.sequenceId].sequence,n=[],r=i.findPrev(t.id);null!=r&&n.push(r);let s=i.findNext(t.id);null!=s&&n.push(s);let a=this._requiredSpatialArea[e].all,o=[],h=this._filter;for(let e in a){if(!a.hasOwnProperty(e))continue;let t=a[e];h(t)&&o.push(t)}let c=this._edgeCalculator.getPotentialEdges(t,o,n),l=this._edgeCalculator.computeStepEdges(t,c,r,s);l=l.concat(this._edgeCalculator.computeTurnEdges(t,c)),l=l.concat(this._edgeCalculator.computeSphericalEdges(t,c)),l=l.concat(this._edgeCalculator.computePerspectiveToSphericalEdges(t,c)),l=l.concat(this._edgeCalculator.computeSimilarEdges(t,c)),t.cacheSpatialEdges(l),this._cachedSpatialEdges[e]=t,delete this._requiredSpatialArea[e],delete this._cachedNodeTiles[e]}cacheTiles$(e){if(e in this._cachedNodeTiles)throw new Bu(`Tiles already cached (${e}).`);if(e in this._cachedSpatialEdges)throw new Bu(`Spatial edges already cached so tiles considered cached (${e}).`);if(!(e in this._requiredNodeTiles))throw new Bu(`Tiles have not been determined (${e}).`);let t=this._requiredNodeTiles[e];if(0===t.cache.length&&0===t.caching.length)throw new Bu(`Tiles already cached (${e}).`);if(!this.hasNode(e))throw new Bu(`Cannot cache tiles of node that does not exist in graph (${e}).`);let i=t.cache.slice();t.caching=this._requiredNodeTiles[e].caching.concat(i),t.cache=[];let n=[];for(let i of t.caching){const r=i in this._cachingTiles$?this._cachingTiles$[i]:this._cacheTile$(i);n.push(r.pipe(Ut((n=>{let r=t.caching.indexOf(i);r>-1&&t.caching.splice(r,1),0===t.caching.length&&0===t.cache.length&&(delete this._requiredNodeTiles[e],this._cachedNodeTiles[e]=!0)})),ct((n=>{let r=t.caching.indexOf(i);throw r>-1&&t.caching.splice(r,1),0===t.caching.length&&0===t.cache.length&&(delete this._requiredNodeTiles[e],this._cachedNodeTiles[e]=!0),n})),Mt((()=>{this._changed$.next(this)})),It(),U()))}return n}initializeCache(e){if(e in this._cachedNodes)throw new Bu(`Image already in cache (${e}).`);const t=this.getNode(e),i=this._api.data;t.initializeCache(new Tu(i));const n=(new Date).getTime();this._cachedNodes[e]={accessed:n,node:t},this._updateCachedTileAccess(e,n)}isCachingFill(e){return e in this._cachingFill$}isCachingFull(e){return e in this._cachingFull$}isCachingNodeSequence(e){return this.getNode(e).sequenceId in this._cachingSequences$}isCachingSequence(e){return e in this._cachingSequences$}isCachingSequenceNodes(e){return e in this._cachingSequenceNodes$}isCachingTiles(e){return e in this._requiredNodeTiles&&0===this._requiredNodeTiles[e].cache.length&&this._requiredNodeTiles[e].caching.length>0}hasInitializedCache(e){return e in this._cachedNodes}hasNode(e){let t=(new Date).getTime();return this._updateCachedNodeAccess(e,t),this._updateCachedTileAccess(e,t),e in this._nodes}hasNodeSequence(e){let t=this.getNode(e).sequenceId,i=t in this._sequences;return i&&(this._sequences[t].accessed=(new Date).getTime()),i}hasSequence(e){let t=e in this._sequences;return t&&(this._sequences[e].accessed=(new Date).getTime()),t}hasSequenceNodes(e){return e in this._cachedSequenceNodes}hasSpatialArea(e){if(!this.hasNode(e))throw new Bu(`Spatial area nodes cannot be determined if node not in graph (${e}).`);if(e in this._cachedSpatialEdges)return!0;if(e in this._requiredSpatialArea)return 0===Object.keys(this._requiredSpatialArea[e].cacheNodes).length;let t=this.getNode(e),i=this._graphCalculator.boundingBoxCorners(t.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 e of n)r.all[e.node.id]=e.node,e.node.complete||(r.cacheKeys.push(e.node.id),r.cacheNodes[e.node.id]=e.node);return this._requiredSpatialArea[e]=r,0===r.cacheKeys.length}hasTiles(e){if(e in this._cachedNodeTiles)return!0;if(e in this._cachedSpatialEdges)return!0;if(!this.hasNode(e))throw new Bu(`Image does not exist in graph (${e}).`);let t={cache:[],caching:[]};if(e in this._requiredNodeTiles)t=this._requiredNodeTiles[e];else{const i=this.getNode(e),[n,r]=this._graphCalculator.boundingBoxCorners(i.lngLat,this._tileThreshold);t.cache=this._api.data.geometry.bboxToCellIds(n,r).filter((e=>!(e in this._cachedTiles))),t.cache.length>0&&(this._requiredNodeTiles[e]=t)}return 0===t.cache.length&&0===t.caching.length}getNode(e){let t=(new Date).getTime();return this._updateCachedNodeAccess(e,t),this._updateCachedTileAccess(e,t),this._nodes[e]}getSequence(e){let t=this._sequences[e];return t.accessed=(new Date).getTime(),t.sequence}resetSpatialEdges(){let e=Object.keys(this._cachedSpatialEdges);for(let t of e){this._cachedSpatialEdges[t].resetSpatialEdges(),delete this._cachedSpatialEdges[t]}}reset(e){const t=[];for(const i of e){if(!this.hasNode(i))throw new Error(`Image does not exist ${i}`);const e=this.getNode(i);e.resetSequenceEdges(),e.resetSpatialEdges(),t.push(e)}for(let t of Object.keys(this._cachedNodes))-1===e.indexOf(t)&&(this._cachedNodes[t].node.dispose(),delete this._cachedNodes[t]);this._cachedNodeTiles={},this._cachedSpatialEdges={},this._cachedTiles={},this._cachingFill$={},this._cachingFull$={},this._cachingSequences$={},this._cachingSpatialArea$={},this._cachingTiles$={},this._nodes={},this._nodeToTile={},this._preStored={};for(const e of t){this._nodes[e.id]=e;const t=this._api.data.geometry.lngLatToCellId(e.originalLngLat);this._preStore(t,e)}this._requiredNodeTiles={},this._requiredSpatialArea={},this._sequences={},this._nodeIndexTiles={},this._nodeIndex.clear()}setFilter(e){this._filter=this._filterCreator.createFilter(e),this._filterSubject$.next(this._filter)}uncache(e,t,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 t of e)t in n||(n[t]=!0);const r=this._tileThreshold,s=this._graphCalculator,a=this._api.data.geometry,o=new Set(t);for(let e in n){if(!n.hasOwnProperty(e))continue;const t=this._nodes[e],[i,h]=s.boundingBoxCorners(t.lngLat,r),c=a.bboxToCellIds(i,h);for(const e of c)o.has(e)||o.add(e)}const h=[];for(let e in this._cachedTiles)this._cachedTiles.hasOwnProperty(e)&&!o.has(e)&&h.push([e,this._cachedTiles[e]]);const c=h.sort(((e,t)=>t[1].accessed-e[1].accessed)).slice(this._configuration.maxUnusedTiles).map((e=>e[0]));for(let e of c)this._uncacheTile(e,i);const l=[],u=[];for(let e in this._preStored){if(!this._preStored.hasOwnProperty(e)||e in this._cachingTiles$)continue;const t=this._preStored[e];for(let r in t)t.hasOwnProperty(r)&&!(r in n)&&t[r].sequenceId!==i&&(r in this._cachedNodes?l.push([this._cachedNodes[r],e]):u.push([r,e]))}const d=l.sort((([e],[t])=>t.accessed-e.accessed)).slice(this._configuration.maxUnusedPreStoredImages).map((([e,t])=>[e.node.id,t]));this._uncachePreStored(u),this._uncachePreStored(d);const p=[];for(let e in this._cachedNodes)this._cachedNodes.hasOwnProperty(e)&&!(e in n)&&p.push(this._cachedNodes[e]);const m=p.sort(((e,t)=>t.accessed-e.accessed)).slice(this._configuration.maxUnusedImages);for(const e of m){e.node.uncache();const t=e.node.id;delete this._cachedNodes[t],t in this._cachedNodeTiles&&delete this._cachedNodeTiles[t],t in this._cachedSpatialEdges&&delete this._cachedSpatialEdges[t]}const f=[];for(let e in this._sequences)this._sequences.hasOwnProperty(e)&&!(e in this._cachingSequences$)&&e!==i&&f.push(this._sequences[e]);const g=f.sort(((e,t)=>t.accessed-e.accessed)).slice(this._configuration.maxSequences);for(const e of g){const t=e.sequence.id;delete this._sequences[t],t in this._cachedSequenceNodes&&delete this._cachedSequenceNodes[t],e.sequence.dispose()}}updateCells$(e){const t=this._cachedTiles,i=this._cachingTiles$;return ge(e).pipe(We((e=>e in t?this._updateCell$(e):e in i?i[e].pipe(ct((()=>Ce(this))),We((()=>this._updateCell$(e)))):ie())))}unsubscribe(){this._filterSubscription.unsubscribe()}_addNewKeys(e,t){for(let i in t)t.hasOwnProperty(i)&&this.hasNode(i)&&(i in e||(e[i]=!0))}_cacheSequence$(e){return e in this._cachingSequences$||(this._cachingSequences$[e]=this._api.getSequence$(e).pipe(Ut((t=>{t?(t.id in this._sequences||(this._sequences[t.id]={accessed:(new Date).getTime(),sequence:new Cu(t)}),delete this._cachingSequences$[e]):console.warn(`Sequence does not exist (${e})`)})),De((()=>this)),Mt((()=>{e in this._cachingSequences$&&delete this._cachingSequences$[e],this._changed$.next(this)})),It(),U())),this._cachingSequences$[e]}_cacheTile$(e){return this._cachingTiles$[e]=this._api.getCoreImages$(e).pipe(Ut((t=>{if(e in this._cachedTiles)return;const i=t.images;this._nodeIndexTiles[e]=[],this._cachedTiles[e]={accessed:(new Date).getTime(),nodes:[]};const n=this._cachedTiles[e].nodes,r=this._removeFromPreStore(e);for(const t of i){if(!t)break;if(null==t.sequence.id){console.warn(`Sequence missing, discarding node (${t.id})`);continue}if(null!=r&&t.id in r){const i=r[t.id];delete r[t.id],n.push(i);const s={lat:i.lngLat.lat,lng:i.lngLat.lng,node:i};this._nodeIndex.insert(s),this._nodeIndexTiles[e].push(s),this._nodeToTile[i.id]=e;continue}const i=new Su(t);n.push(i);const s={lat:i.lngLat.lat,lng:i.lngLat.lng,node:i};this._nodeIndex.insert(s),this._nodeIndexTiles[e].push(s),this._nodeToTile[i.id]=e,this._setNode(i)}delete this._cachingTiles$[e]})),De((()=>this)),ct((t=>{throw delete this._cachingTiles$[e],t})),It(),U()),this._cachingTiles$[e]}_makeFull(e,t){null==t.computed_altitude&&(t.computed_altitude=this._defaultAlt),null==t.computed_rotation&&(t.computed_rotation=this._graphCalculator.rotationFromCompass(t.compass_angle,t.exif_orientation)),e.makeComplete(t)}_preStore(e,t){e in this._preStored||(this._preStored[e]={}),this._preStored[e][t.id]=t}_removeFromPreStore(e){let t=null;return e in this._preStored&&(t=this._preStored[e],delete this._preStored[e]),t}_setNode(e){let t=e.id;if(this.hasNode(t))throw new Bu(`Image already exist (${t}).`);this._nodes[t]=e}_uncacheTile(e,t){for(let i of this._cachedTiles[e].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===t?(this._preStore(e,i),i.uncache()):(delete this._nodes[n],i.sequenceId in this._cachedSequenceNodes&&delete this._cachedSequenceNodes[i.sequenceId],i.dispose())}for(let t of this._nodeIndexTiles[e])this._nodeIndex.remove(t);delete this._nodeIndexTiles[e],delete this._cachedTiles[e]}_uncachePreStored(e){let t={};for(let[i,n]of e){i in this._nodes&&delete this._nodes[i],i in this._cachedNodes&&delete this._cachedNodes[i];let e=this._preStored[n][i];e.sequenceId in this._cachedSequenceNodes&&delete this._cachedSequenceNodes[e.sequenceId],delete this._preStored[n][i],e.dispose(),t[n]=!0}for(let e in t)t.hasOwnProperty(e)&&0===Object.keys(this._preStored[e]).length&&delete this._preStored[e]}_updateCachedTileAccess(e,t){e in this._nodeToTile&&(this._cachedTiles[this._nodeToTile[e]].accessed=t)}_updateCachedNodeAccess(e,t){e in this._cachedNodes&&(this._cachedNodes[e].accessed=t)}_updateCell$(e){return this._api.getCoreImages$(e).pipe(We((t=>{if(!(e in this._cachedTiles))return ie();const i=this._nodeIndex,n=this._nodeIndexTiles[e],r=this._nodeToTile,s=this._cachedTiles[e];s.accessed=(new Date).getTime();const a=s.nodes,o=t.images;for(const t of o){if(null==t)break;if(this.hasNode(t.id))continue;if(null==t.sequence.id){console.warn(`Sequence missing, discarding node (${t.id})`);continue}const s=new Su(t);a.push(s);const o={lat:s.lngLat.lat,lng:s.lngLat.lng,node:s};i.insert(o),n.push(o),r[s.id]=e,this._setNode(s)}return Ce(e)})),ct((e=>(console.error(e),ie()))))}}class Vu{constructor(){this._hash={},this._index=new Vu._spatialIndex(16),this._indexChanged$=new j,this._updated$=new j}static register(e){Vu._spatialIndex=e}get changed$(){return this._indexChanged$}get updated$(){return this._updated$}add(e){const t=[],i=this._hash,n=this._index;for(const r of e){const e=r.id;e in i&&(n.remove(i[e]),t.push(r));const s={lat:r.lngLat.lat,lng:r.lngLat.lng,marker:r};i[e]=s,n.insert(s)}t.length>0&&this._updated$.next(t),e.length>t.length&&this._indexChanged$.next(this)}has(e){return e in this._hash}get(e){return this.has(e)?this._hash[e].marker:void 0}getAll(){return this._index.all().map((e=>e.marker))}remove(e){const t=this._hash,i=this._index;let n=!1;for(const r of e){if(!(r in t))continue;const e=t[r];i.remove(e),delete t[r],n=!0}n&&this._indexChanged$.next(this)}removeAll(){this._hash={},this._index.clear(),this._indexChanged$.next(this)}search([e,t]){return this._index.search({maxX:t.lng,maxY:t.lat,minX:e.lng,minY:e.lat}).map((e=>e.marker))}update(e){const t=this._hash,i=this._index,n=e.id;if(!(n in t))return;i.remove(t[n]);const r={lat:e.lngLat.lat,lng:e.lngLat.lng,marker:e};t[n]=r,i.insert(r)}}function Hu(e,t,i,n,r){ju(e,t,i||0,n||e.length-1,r||Wu)}function ju(e,t,i,n,r){for(;n>i;){if(n-i>600){var s=n-i+1,a=t-i+1,o=Math.log(s),h=.5*Math.exp(2*o/3),c=.5*Math.sqrt(o*h*(s-h)/s)*(a-s/2<0?-1:1);ju(e,t,Math.max(i,Math.floor(t-a*h/s+c)),Math.min(n,Math.floor(t+(s-a)*h/s+c)),r)}var l=e[t],u=i,d=n;for(Gu(e,i,t),r(e[n],l)>0&&Gu(e,i,n);u<d;){for(Gu(e,u,d),u++,d--;r(e[u],l)<0;)u++;for(;r(e[d],l)>0;)d--}0===r(e[i],l)?Gu(e,i,d):Gu(e,++d,n),d<=t&&(i=d+1),t<=d&&(n=d-1)}}function Gu(e,t,i){var n=e[t];e[t]=e[i],e[i]=n}function Wu(e,t){return e<t?-1:e>t?1:0}function qu(e,t,i){if(!i)return t.indexOf(e);for(let n=0;n<t.length;n++)if(i(e,t[n]))return n;return-1}function Xu(e,t){Zu(e,0,e.children.length,t,e)}function Zu(e,t,i,n,r){r||(r=rd(null)),r.minX=1/0,r.minY=1/0,r.maxX=-1/0,r.maxY=-1/0;for(let s=t;s<i;s++){const t=e.children[s];Yu(r,e.leaf?n(t):t)}return r}function Yu(e,t){return e.minX=Math.min(e.minX,t.minX),e.minY=Math.min(e.minY,t.minY),e.maxX=Math.max(e.maxX,t.maxX),e.maxY=Math.max(e.maxY,t.maxY),e}function Ju(e,t){return e.minX-t.minX}function Ku(e,t){return e.minY-t.minY}function Qu(e){return(e.maxX-e.minX)*(e.maxY-e.minY)}function ed(e){return e.maxX-e.minX+(e.maxY-e.minY)}function td(e,t){const i=Math.max(e.minX,t.minX),n=Math.max(e.minY,t.minY),r=Math.min(e.maxX,t.maxX),s=Math.min(e.maxY,t.maxY);return Math.max(0,r-i)*Math.max(0,s-n)}function id(e,t){return e.minX<=t.minX&&e.minY<=t.minY&&t.maxX<=e.maxX&&t.maxY<=e.maxY}function nd(e,t){return t.minX<=e.maxX&&t.minY<=e.maxY&&t.maxX>=e.minX&&t.maxY>=e.minY}function rd(e){return{children:e,height:1,leaf:!0,minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0}}function sd(e,t,i,n,r){const s=[t,i];for(;s.length;){if((i=s.pop())-(t=s.pop())<=n)continue;const a=t+Math.ceil((i-t)/n/2)*n;Hu(e,a,t,i,r),s.push(t,a,a,i)}}class ad extends class{constructor(e=9){this._maxEntries=Math.max(4,e),this._minEntries=Math.max(2,Math.ceil(.4*this._maxEntries)),this.clear()}all(){return this._all(this.data,[])}search(e){let t=this.data;const i=[];if(!nd(e,t))return i;const n=this.toBBox,r=[];for(;t;){for(let s=0;s<t.children.length;s++){const a=t.children[s],o=t.leaf?n(a):a;nd(e,o)&&(t.leaf?i.push(a):id(e,o)?this._all(a,i):r.push(a))}t=r.pop()}return i}collides(e){let t=this.data;if(!nd(e,t))return!1;const i=[];for(;t;){for(let n=0;n<t.children.length;n++){const r=t.children[n],s=t.leaf?this.toBBox(r):r;if(nd(e,s)){if(t.leaf||id(e,s))return!0;i.push(r)}}t=i.pop()}return!1}load(e){if(!e||!e.length)return this;if(e.length<this._minEntries){for(let t=0;t<e.length;t++)this.insert(e[t]);return this}let t=this._build(e.slice(),0,e.length-1,0);if(this.data.children.length)if(this.data.height===t.height)this._splitRoot(this.data,t);else{if(this.data.height<t.height){const e=this.data;this.data=t,t=e}this._insert(t,this.data.height-t.height-1,!0)}else this.data=t;return this}insert(e){return e&&this._insert(e,this.data.height-1),this}clear(){return this.data=rd([]),this}remove(e,t){if(!e)return this;let i=this.data;const n=this.toBBox(e),r=[],s=[];let a,o,h;for(;i||r.length;){if(i||(i=r.pop(),o=r[r.length-1],a=s.pop(),h=!0),i.leaf){const n=qu(e,i.children,t);if(-1!==n)return i.children.splice(n,1),r.push(i),this._condense(r),this}h||i.leaf||!id(i,n)?o?(a++,i=o.children[a],h=!1):i=null:(r.push(i),s.push(a),a=0,o=i,i=i.children[0])}return this}toBBox(e){return e}compareMinX(e,t){return e.minX-t.minX}compareMinY(e,t){return e.minY-t.minY}toJSON(){return this.data}fromJSON(e){return this.data=e,this}_all(e,t){const i=[];for(;e;)e.leaf?t.push(...e.children):i.push(...e.children),e=i.pop();return t}_build(e,t,i,n){const r=i-t+1;let s,a=this._maxEntries;if(r<=a)return s=rd(e.slice(t,i+1)),Xu(s,this.toBBox),s;n||(n=Math.ceil(Math.log(r)/Math.log(a)),a=Math.ceil(r/Math.pow(a,n-1))),s=rd([]),s.leaf=!1,s.height=n;const o=Math.ceil(r/a),h=o*Math.ceil(Math.sqrt(a));sd(e,t,i,h,this.compareMinX);for(let r=t;r<=i;r+=h){const t=Math.min(r+h-1,i);sd(e,r,t,o,this.compareMinY);for(let i=r;i<=t;i+=o){const r=Math.min(i+o-1,t);s.children.push(this._build(e,i,r,n-1))}}return Xu(s,this.toBBox),s}_chooseSubtree(e,t,i,n){for(;n.push(t),!t.leaf&&n.length-1!==i;){let i,n=1/0,a=1/0;for(let o=0;o<t.children.length;o++){const h=t.children[o],c=Qu(h),l=(r=e,s=h,(Math.max(s.maxX,r.maxX)-Math.min(s.minX,r.minX))*(Math.max(s.maxY,r.maxY)-Math.min(s.minY,r.minY))-c);l<a?(a=l,n=c<n?c:n,i=h):l===a&&c<n&&(n=c,i=h)}t=i||t.children[0]}var r,s;return t}_insert(e,t,i){const n=i?e:this.toBBox(e),r=[],s=this._chooseSubtree(n,this.data,t,r);for(s.children.push(e),Yu(s,n);t>=0&&r[t].children.length>this._maxEntries;)this._split(r,t),t--;this._adjustParentBBoxes(n,r,t)}_split(e,t){const i=e[t],n=i.children.length,r=this._minEntries;this._chooseSplitAxis(i,r,n);const s=this._chooseSplitIndex(i,r,n),a=rd(i.children.splice(s,i.children.length-s));a.height=i.height,a.leaf=i.leaf,Xu(i,this.toBBox),Xu(a,this.toBBox),t?e[t-1].children.push(a):this._splitRoot(i,a)}_splitRoot(e,t){this.data=rd([e,t]),this.data.height=e.height+1,this.data.leaf=!1,Xu(this.data,this.toBBox)}_chooseSplitIndex(e,t,i){let n,r=1/0,s=1/0;for(let a=t;a<=i-t;a++){const t=Zu(e,0,a,this.toBBox),o=Zu(e,a,i,this.toBBox),h=td(t,o),c=Qu(t)+Qu(o);h<r?(r=h,n=a,s=c<s?c:s):h===r&&c<s&&(s=c,n=a)}return n||i-t}_chooseSplitAxis(e,t,i){const n=e.leaf?this.compareMinX:Ju,r=e.leaf?this.compareMinY:Ku;this._allDistMargin(e,t,i,n)<this._allDistMargin(e,t,i,r)&&e.children.sort(n)}_allDistMargin(e,t,i,n){e.children.sort(n);const r=this.toBBox,s=Zu(e,0,t,r),a=Zu(e,i-t,i,r);let o=ed(s)+ed(a);for(let n=t;n<i-t;n++){const t=e.children[n];Yu(s,e.leaf?r(t):t),o+=ed(s)}for(let n=i-t-1;n>=t;n--){const t=e.children[n];Yu(a,e.leaf?r(t):t),o+=ed(a)}return o}_adjustParentBBoxes(e,t,i){for(let n=i;n>=0;n--)Yu(t[n],e)}_condense(e){for(let t,i=e.length-1;i>=0;i--)0===e[i].children.length?i>0?(t=e[i-1].children,t.splice(t.indexOf(e[i]),1)):this.clear():Xu(e[i],this.toBBox)}}{compareMinX(e,t){return e.lng-t.lng}compareMinY(e,t){return e.lat-t.lat}toBBox(e){return{minX:e.lng,minY:e.lat,maxX:e.lng,maxY:e.lat}}}class od{constructor(e,t){this._components={};for(const i in od.registeredComponents){if(!od.registeredComponents.hasOwnProperty(i))continue;const n=od.registeredComponents[i];this._components[i]={active:!1,component:new n(i,e,t)}}this._coverComponent=new od.registeredCoverComponent("cover",e,t),this._coverComponent.activate(),this._coverActivated=!0}static register(e){void 0===od.registeredComponents[e.componentName]&&(od.registeredComponents[e.componentName]=e)}static registerCover(e){od.registeredCoverComponent=e}get coverActivated(){return this._coverActivated}activateCover(){if(!this._coverActivated){this._coverActivated=!0;for(const e in this._components){if(!this._components.hasOwnProperty(e))continue;const t=this._components[e];t.active&&t.component.deactivate()}}}deactivateCover(){if(this._coverActivated){this._coverActivated=!1;for(const e in this._components){if(!this._components.hasOwnProperty(e))continue;const t=this._components[e];t.active&&t.component.activate()}}}activate(e){this._checkName(e),this._components[e].active=!0,this._coverActivated||this.get(e).activate()}configure(e,t){this._checkName(e),this.get(e).configure(t)}deactivate(e){this._checkName(e),this._components[e].active=!1,this._coverActivated||this.get(e).deactivate()}get(e){return this._components[e].component}getCover(){return this._coverComponent}remove(){this._coverComponent.deactivate();for(const e in this._components)this._components.hasOwnProperty(e)&&this._components[e].component.deactivate()}_checkName(e){if(!(e in this._components))throw new Lu(`Component does not exist: ${e}`)}}od.registeredComponents={};var hd="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function cd(e){if(e.__esModule)return e;var t=Object.defineProperty({},"__esModule",{value:!0});return Object.keys(e).forEach((function(i){var n=Object.getOwnPropertyDescriptor(e,i);Object.defineProperty(t,i,n.get?n:{enumerable:!0,get:function(){return e[i]}})})),t}var ld=Array.isArray,ud=Object.prototype.toString,dd=ld||function(e){return"[object Array]"===ud.call(e)};md.NONE=0,md.VTEXT=1,md.VNODE=2,md.WIDGET=3,md.PROPS=4,md.ORDER=5,md.INSERT=6,md.REMOVE=7,md.THUNK=8;var pd=md;function md(e,t,i){this.type=Number(e),this.vNode=t,this.patch=i}md.prototype.version="2",md.prototype.type="VirtualPatch";var fd=function(e){return e&&"VirtualNode"===e.type&&"2"===e.version};var gd=function(e){return e&&"VirtualText"===e.type&&"2"===e.version};var _d=function(e){return e&&"Widget"===e.type};var vd=function(e){return e&&"Thunk"===e.type};var yd=fd,bd=gd,xd=_d,wd=vd,Md=function(e,t){var i=e,n=t;wd(t)&&(n=Sd(t,e));wd(e)&&(i=Sd(e,null));return{a:i,b:n}};function Sd(e,t){var i=e.vnode;if(i||(i=e.vnode=e.render(t)),!(yd(i)||bd(i)||xd(i)))throw new Error("thunk did not return a valid node");return i}var Td=function(e){return"object"==typeof e&&null!==e},Cd=function(e){return e&&("function"==typeof e.hook&&!e.hasOwnProperty("hook")||"function"==typeof e.unhook&&!e.hasOwnProperty("unhook"))};var Ed=Td,Ad=Cd;function Id(e){return Object.getPrototypeOf?Object.getPrototypeOf(e):e.__proto__?e.__proto__:e.constructor?e.constructor.prototype:void 0}var Rd=dd,Pd=pd,Ld=fd,Dd=gd,Nd=_d,$d=vd,kd=Md,Od=function e(t,i){var n;for(var r in t){r in i||((n=n||{})[r]=void 0);var s=t[r],a=i[r];if(s!==a)if(Ed(s)&&Ed(a))if(Id(a)!==Id(s))(n=n||{})[r]=a;else if(Ad(a))(n=n||{})[r]=a;else{var o=e(s,a);o&&((n=n||{})[r]=o)}else(n=n||{})[r]=a}for(var h in i)h in t||((n=n||{})[h]=i[h]);return n};function zd(e,t){var i={a:e};return Fd(e,t,i,0),i}function Fd(e,t,i,n){if(e!==t){var r=i[n],s=!1;if($d(e)||$d(t))Vd(e,t,i,n);else if(null==t)Nd(e)||(Bd(e,i,n),r=i[n]),r=Wd(r,new Pd(Pd.REMOVE,e,t));else if(Ld(t))if(Ld(e))if(e.tagName===t.tagName&&e.namespace===t.namespace&&e.key===t.key){var a=Od(e.properties,t.properties);a&&(r=Wd(r,new Pd(Pd.PROPS,e,a))),r=function(e,t,i,n,r){for(var s=e.children,a=function(e,t){var i=Gd(t),n=i.keys,r=i.free;if(r.length===t.length)return{children:t,moves:null};var s=Gd(e),a=s.keys;if(s.free.length===e.length)return{children:t,moves:null};for(var o=[],h=0,c=r.length,l=0,u=0;u<e.length;u++){var d,p=e[u];p.key?n.hasOwnProperty(p.key)?(d=n[p.key],o.push(t[d])):(d=u-l++,o.push(null)):h<c?(d=r[h++],o.push(t[d])):(d=u-l++,o.push(null))}for(var m=h>=r.length?t.length:r[h],f=0;f<t.length;f++){var g=t[f];g.key?a.hasOwnProperty(g.key)||o.push(g):f>=m&&o.push(g)}for(var _,v=o.slice(),y=0,b=[],x=[],w=0;w<t.length;){var M=t[w];for(_=v[y];null===_&&v.length;)b.push(jd(v,y,null)),_=v[y];_&&_.key===M.key?(y++,w++):M.key?(_&&_.key&&n[_.key]!==w+1?(b.push(jd(v,y,_.key)),(_=v[y])&&_.key===M.key?y++:x.push({key:M.key,to:w})):x.push({key:M.key,to:w}),w++):_&&_.key&&b.push(jd(v,y,_.key))}for(;y<v.length;)_=v[y],b.push(jd(v,y,_&&_.key));if(b.length===l&&!x.length)return{children:o,moves:null};return{children:o,moves:{removes:b,inserts:x}}}(s,t.children),o=a.children,h=s.length,c=o.length,l=h>c?h:c,u=0;u<l;u++){var d=s[u],p=o[u];r+=1,d?Fd(d,p,i,r):p&&(n=Wd(n,new Pd(Pd.INSERT,null,p))),Ld(d)&&d.count&&(r+=d.count)}a.moves&&(n=Wd(n,new Pd(Pd.ORDER,e,a.moves)));return n}(e,t,i,r,n)}else r=Wd(r,new Pd(Pd.VNODE,e,t)),s=!0;else r=Wd(r,new Pd(Pd.VNODE,e,t)),s=!0;else Dd(t)?Dd(e)?e.text!==t.text&&(r=Wd(r,new Pd(Pd.VTEXT,e,t))):(r=Wd(r,new Pd(Pd.VTEXT,e,t)),s=!0):Nd(t)&&(Nd(e)||(s=!0),r=Wd(r,new Pd(Pd.WIDGET,e,t)));r&&(i[n]=r),s&&Bd(e,i,n)}}function Bd(e,t,i){Hd(e,t,i),Ud(e,t,i)}function Ud(e,t,i){if(Nd(e))"function"==typeof e.destroy&&(t[i]=Wd(t[i],new Pd(Pd.REMOVE,e,null)));else if(Ld(e)&&(e.hasWidgets||e.hasThunks))for(var n=e.children,r=n.length,s=0;s<r;s++){var a=n[s];Ud(a,t,i+=1),Ld(a)&&a.count&&(i+=a.count)}else $d(e)&&Vd(e,null,t,i)}function Vd(e,t,i,n){var r=kd(e,t),s=zd(r.a,r.b);(function(e){for(var t in e)if("a"!==t)return!0;return!1})(s)&&(i[n]=new Pd(Pd.THUNK,null,s))}function Hd(e,t,i){if(Ld(e)){if(e.hooks&&(t[i]=Wd(t[i],new Pd(Pd.PROPS,e,function(e){var t={};for(var i in e)t[i]=void 0;return t}(e.hooks)))),e.descendantHooks||e.hasThunks)for(var n=e.children,r=n.length,s=0;s<r;s++){var a=n[s];Hd(a,t,i+=1),Ld(a)&&a.count&&(i+=a.count)}}else $d(e)&&Vd(e,null,t,i)}function jd(e,t,i){return e.splice(t,1),{from:t,key:i}}function Gd(e){for(var t={},i=[],n=e.length,r=0;r<n;r++){var s=e[r];s.key?t[s.key]=r:i.push(r)}return{keys:t,free:i}}function Wd(e,t){return e?(Rd(e)?e.push(t):e=[e,t],e):t}var qd=zd,Xd=Array.prototype.slice,Zd=function(e,t){"length"in e||(e=[e]);e=Xd.call(e);for(;e.length;){var i=e.shift(),n=t(i);if(n)return n;i.childNodes&&i.childNodes.length&&(e=Xd.call(i.childNodes).concat(e))}};var Yd=Jd;function Jd(e,t){if(!(this instanceof Jd))return new Jd(e,t);this.data=e,this.nodeValue=e,this.length=e.length,this.ownerDocument=t||null}Jd.prototype.nodeType=8,Jd.prototype.nodeName="#comment",Jd.prototype.toString=function(){return"[object Comment]"};var Kd=Qd;function Qd(e,t){if(!(this instanceof Qd))return new Qd(e);this.data=e||"",this.length=this.data.length,this.ownerDocument=t||null}Qd.prototype.type="DOMTextNode",Qd.prototype.nodeType=3,Qd.prototype.nodeName="#text",Qd.prototype.toString=function(){return this.data},Qd.prototype.replaceData=function(e,t,i){var n=this.data,r=n.substring(0,e),s=n.substring(e+t,n.length);this.data=r+i+s,this.length=this.data.length};var ep=function(e){var t=this,i=e.type;e.target||(e.target=t);t.listeners||(t.listeners={});var n=t.listeners[i];if(n)return n.forEach((function(i){e.currentTarget=t,"function"==typeof i?i(e):i.handleEvent(e)}));t.parentNode&&t.parentNode.dispatchEvent(e)};var tp=function(e,t){var i=this;i.listeners||(i.listeners={});i.listeners[e]||(i.listeners[e]=[]);-1===i.listeners[e].indexOf(t)&&i.listeners[e].push(t)};var ip=function(e,t){var i=this;if(!i.listeners)return;if(!i.listeners[e])return;var n=i.listeners[e],r=n.indexOf(t);-1!==r&&n.splice(r,1)};var np=["area","base","br","col","embed","hr","img","input","keygen","link","menuitem","meta","param","source","track","wbr"];function rp(e){switch(e.nodeType){case 3:return op(e.data);case 8:return"\x3c!--"+e.data+"--\x3e";default:return function(e){var t=[],i=e.tagName;"http://www.w3.org/1999/xhtml"===e.namespaceURI&&(i=i.toLowerCase());t.push("<"+i+function(e){var t=[];for(var i in e)sp(e,i)&&t.push({name:i,value:e[i]});for(var n in e._attributes)for(var r in e._attributes[n]){var s=e._attributes[n][r],a=(s.prefix?s.prefix+":":"")+r;t.push({name:a,value:s.value})}e.className&&t.push({name:"class",value:e.className});return t.length?ap(t):""}(e)+function(e){var t=e.dataset,i=[];for(var n in t)i.push({name:"data-"+n,value:t[n]});return i.length?ap(i):""}(e)),np.indexOf(i)>-1?t.push(" />"):(t.push(">"),e.childNodes.length?t.push.apply(t,e.childNodes.map(rp)):e.textContent||e.innerText?t.push(op(e.textContent||e.innerText)):e.innerHTML&&t.push(e.innerHTML),t.push("</"+i+">"));return t.join("")}(e)}}function sp(e,t){var i=typeof e[t];return"style"===t&&Object.keys(e.style).length>0||e.hasOwnProperty(t)&&("string"===i||"boolean"===i||"number"===i)&&"nodeName"!==t&&"className"!==t&&"tagName"!==t&&"textContent"!==t&&"innerText"!==t&&"namespaceURI"!==t&&"innerHTML"!==t}function ap(e){var t=[];return e.forEach((function(e){var i=e.name,n=e.value;"style"===i&&(n=function(e){if("string"==typeof e)return e;var t="";return Object.keys(e).forEach((function(i){var n=e[i];i=i.replace(/[A-Z]/g,(function(e){return"-"+e.toLowerCase()})),t+=i+":"+n+";"})),t}(n)),t.push(i+'="'+(op(n).replace(/"/g,"&quot;")+'"'))})),t.length?" "+t.join(" "):""}function op(e){var t="";return"string"==typeof e?t=e:e&&(t=e.toString()),t.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}var hp=Zd,cp=ep,lp=tp,up=ip,dp=rp,pp="http://www.w3.org/1999/xhtml",mp=fp;function fp(e,t,i){if(!(this instanceof fp))return new fp(e);var n=void 0===i?pp:i||null;this.tagName=n===pp?String(e).toUpperCase():e,this.nodeName=this.tagName,this.className="",this.dataset={},this.childNodes=[],this.parentNode=null,this.style={},this.ownerDocument=t||null,this.namespaceURI=n,this._attributes={},"INPUT"===this.tagName&&(this.type="text")}fp.prototype.type="DOMElement",fp.prototype.nodeType=1,fp.prototype.appendChild=function(e){return e.parentNode&&e.parentNode.removeChild(e),this.childNodes.push(e),e.parentNode=this,e},fp.prototype.replaceChild=function(e,t){e.parentNode&&e.parentNode.removeChild(e);var i=this.childNodes.indexOf(t);return t.parentNode=null,this.childNodes[i]=e,e.parentNode=this,t},fp.prototype.removeChild=function(e){var t=this.childNodes.indexOf(e);return this.childNodes.splice(t,1),e.parentNode=null,e},fp.prototype.insertBefore=function(e,t){e.parentNode&&e.parentNode.removeChild(e);var i=null==t?-1:this.childNodes.indexOf(t);return i>-1?this.childNodes.splice(i,0,e):this.childNodes.push(e),e.parentNode=this,e},fp.prototype.setAttributeNS=function(e,t,i){var n=null,r=t,s=t.indexOf(":");(s>-1&&(n=t.substr(0,s),r=t.substr(s+1)),"INPUT"===this.tagName&&"type"===t)?this.type=i:(this._attributes[e]||(this._attributes[e]={}))[r]={value:i,prefix:n}},fp.prototype.getAttributeNS=function(e,t){var i=this._attributes[e],n=i&&i[t]&&i[t].value;return"INPUT"===this.tagName&&"type"===t?this.type:"string"!=typeof n?null:n},fp.prototype.removeAttributeNS=function(e,t){var i=this._attributes[e];i&&delete i[t]},fp.prototype.hasAttributeNS=function(e,t){var i=this._attributes[e];return!!i&&t in i},fp.prototype.setAttribute=function(e,t){return this.setAttributeNS(null,e,t)},fp.prototype.getAttribute=function(e){return this.getAttributeNS(null,e)},fp.prototype.removeAttribute=function(e){return this.removeAttributeNS(null,e)},fp.prototype.hasAttribute=function(e){return this.hasAttributeNS(null,e)},fp.prototype.removeEventListener=up,fp.prototype.addEventListener=lp,fp.prototype.dispatchEvent=cp,fp.prototype.focus=function(){},fp.prototype.toString=function(){return dp(this)},fp.prototype.getElementsByClassName=function(e){var t=e.split(" "),i=[];return hp(this,(function(e){if(1===e.nodeType){var n=(e.className||"").split(" ");t.every((function(e){return-1!==n.indexOf(e)}))&&i.push(e)}})),i},fp.prototype.getElementsByTagName=function(e){e=e.toLowerCase();var t=[];return hp(this.childNodes,(function(i){1!==i.nodeType||"*"!==e&&i.tagName.toLowerCase()!==e||t.push(i)})),t},fp.prototype.contains=function(e){return hp(this,(function(t){return e===t}))||!1};var gp=mp,_p=vp;function vp(e){if(!(this instanceof vp))return new vp;this.childNodes=[],this.parentNode=null,this.ownerDocument=e||null}vp.prototype.type="DocumentFragment",vp.prototype.nodeType=11,vp.prototype.nodeName="#document-fragment",vp.prototype.appendChild=gp.prototype.appendChild,vp.prototype.replaceChild=gp.prototype.replaceChild,vp.prototype.removeChild=gp.prototype.removeChild,vp.prototype.toString=function(){return this.childNodes.map((function(e){return String(e)})).join("")};var yp=bp;function bp(e){}bp.prototype.initEvent=function(e,t,i){this.type=e,this.bubbles=t,this.cancelable=i},bp.prototype.preventDefault=function(){};var xp=Zd,wp=Yd,Mp=Kd,Sp=mp,Tp=_p,Cp=yp,Ep=ep,Ap=tp,Ip=ip,Rp=Pp;function Pp(){if(!(this instanceof Pp))return new Pp;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 Lp=Pp.prototype;Lp.createTextNode=function(e){return new Mp(e,this)},Lp.createElementNS=function(e,t){var i=null===e?null:String(e);return new Sp(t,this,i)},Lp.createElement=function(e){return new Sp(e,this)},Lp.createDocumentFragment=function(){return new Tp(this)},Lp.createEvent=function(e){return new Cp(e)},Lp.createComment=function(e){return new wp(e,this)},Lp.getElementById=function(e){return e=String(e),xp(this.childNodes,(function(t){if(String(t.id)===e)return t}))||null},Lp.getElementsByClassName=Sp.prototype.getElementsByClassName,Lp.getElementsByTagName=Sp.prototype.getElementsByTagName,Lp.contains=Sp.prototype.contains,Lp.removeEventListener=Ip,Lp.addEventListener=Ap,Lp.dispatchEvent=Ep;var Dp,Np=new Rp,$p=void 0!==hd?hd:"undefined"!=typeof window?window:{},kp=Np;"undefined"!=typeof document?Dp=document:(Dp=$p["__GLOBAL_DOCUMENT_CACHE@4"])||(Dp=$p["__GLOBAL_DOCUMENT_CACHE@4"]=kp);var Op=Td,zp=Cd,Fp=function(e,t,i){for(var n in t){var r=t[n];void 0===r?Bp(e,n,r,i):zp(r)?(Bp(e,n,r,i),r.hook&&r.hook(e,n,i?i[n]:void 0)):Op(r)?Up(e,t,i,n,r):e[n]=r}};function Bp(e,t,i,n){if(n){var r=n[t];if(zp(r))r.unhook&&r.unhook(e,t,i);else if("attributes"===t)for(var s in r)e.removeAttribute(s);else if("style"===t)for(var a in r)e.style[a]="";else e[t]="string"==typeof r?"":null}}function Up(e,t,i,n,r){var s=i?i[n]:void 0;if("attributes"!==n)if(s&&Op(s)&&Vp(s)!==Vp(r))e[n]=r;else{Op(e[n])||(e[n]={});var a="style"===n?"":void 0;for(var o in r){var h=r[o];e[n][o]=void 0===h?a:h}}else for(var c in r){var l=r[c];void 0===l?e.removeAttribute(c):e.setAttribute(c,l)}}function Vp(e){return Object.getPrototypeOf?Object.getPrototypeOf(e):e.__proto__?e.__proto__:e.constructor?e.constructor.prototype:void 0}var Hp=Dp,jp=Fp,Gp=fd,Wp=gd,qp=_d,Xp=Md,Zp=function e(t,i){var n=i&&i.document||Hp,r=i?i.warn:null;if(t=Xp(t).a,qp(t))return t.init();if(Wp(t))return n.createTextNode(t.text);if(!Gp(t))return r&&r("Item is not a valid virtual dom node",t),null;var s=null===t.namespace?n.createElement(t.tagName):n.createElementNS(t.namespace,t.tagName),a=t.properties;jp(s,a);for(var o=t.children,h=0;h<o.length;h++){var c=e(o[h],i);c&&s.appendChild(c)}return s};var Yp={};function Jp(e,t,i,n,r){if(n=n||{},e){Kp(i,r,r)&&(n[r]=e);var s=t.children;if(s)for(var a=e.childNodes,o=0;o<t.children.length;o++){r+=1;var h=s[o]||Yp,c=r+(h.count||0);Kp(i,r,c)&&Jp(a[o],h,i,n,r),r=c}}return n}function Kp(e,t,i){if(0===e.length)return!1;for(var n,r,s=0,a=e.length-1;s<=a;){if(r=e[n=(a+s)/2>>0],s===a)return r>=t&&r<=i;if(r<t)s=n+1;else{if(!(r>i))return!0;a=n-1}}return!1}function Qp(e,t){return e>t?1:-1}var em=_d;var tm=Fp,im=_d,nm=pd,rm=function(e,t){if(em(e)&&em(t))return"name"in e&&"name"in t?e.id===t.id:e.init===t.init;return!1};function sm(e,t){"function"==typeof t.destroy&&im(t)&&t.destroy(e)}var am=Dp,om=dd,hm=Zp,cm=function(e,t,i,n){return i&&0!==i.length?(i.sort(Qp),Jp(e,t,i,n,0)):{}},lm=function(e,t,i){var n=e.type,r=e.vNode,s=e.patch;switch(n){case nm.REMOVE:return function(e,t){var i=e.parentNode;i&&i.removeChild(e);return sm(e,t),null}(t,r);case nm.INSERT:return function(e,t,i){var n=i.render(t,i);e&&e.appendChild(n);return e}(t,s,i);case nm.VTEXT:return function(e,t,i,n){var r;if(3===e.nodeType)e.replaceData(0,e.length,i.text),r=e;else{var s=e.parentNode;r=n.render(i,n),s&&r!==e&&s.replaceChild(r,e)}return r}(t,0,s,i);case nm.WIDGET:return function(e,t,i,n){var r,s=rm(t,i);r=s?i.update(t,e)||e:n.render(i,n);var a=e.parentNode;a&&r!==e&&a.replaceChild(r,e);s||sm(e,t);return r}(t,r,s,i);case nm.VNODE:return function(e,t,i,n){var r=e.parentNode,s=n.render(i,n);r&&s!==e&&r.replaceChild(s,e);return s}(t,0,s,i);case nm.ORDER:return function(e,t){for(var i,n,r,s=e.childNodes,a={},o=0;o<t.removes.length;o++)i=s[(n=t.removes[o]).from],n.key&&(a[n.key]=i),e.removeChild(i);for(var h=s.length,c=0;c<t.inserts.length;c++)i=a[(r=t.inserts[c]).key],e.insertBefore(i,r.to>=h++?null:s[r.to])}(t,s),t;case nm.PROPS:return tm(t,s,r.properties),t;case nm.THUNK:return function(e,t){e&&t&&e!==t&&e.parentNode&&e.parentNode.replaceChild(t,e);return t}(t,i.patch(t,s,i));default:return t}};function um(e,t,i){var n=function(e){var t=[];for(var i in e)"a"!==i&&t.push(Number(i));return t}(t);if(0===n.length)return e;var r=cm(e,t.a,n),s=e.ownerDocument;i.document||s===am||(i.document=s);for(var a=0;a<n.length;a++){var o=n[a];e=dm(e,r[o],t[o],i)}return e}function dm(e,t,i,n){if(!t)return e;var r;if(om(i))for(var s=0;s<i.length;s++)r=lm(i[s],t,n),t===e&&(e=r);else r=lm(i,t,n),t===e&&(e=r);return e}var pm=function e(t,i,n){return(n=n||{}).patch=n.patch&&n.patch!==e?n.patch:um,n.render=n.render||hm,n.patch(t,i,n)},mm=fd,fm=_d,gm=vd,_m=Cd,vm=xm,ym={},bm=[];function xm(e,t,i,n,r){this.tagName=e,this.properties=t||ym,this.children=i||bm,this.key=null!=n?String(n):void 0,this.namespace="string"==typeof r?r:null;var s,a=i&&i.length||0,o=0,h=!1,c=!1,l=!1;for(var u in t)if(t.hasOwnProperty(u)){var d=t[u];_m(d)&&d.unhook&&(s||(s={}),s[u]=d)}for(var p=0;p<a;p++){var m=i[p];mm(m)?(o+=m.count||0,!h&&m.hasWidgets&&(h=!0),!c&&m.hasThunks&&(c=!0),l||!m.hooks&&!m.descendantHooks||(l=!0)):!h&&fm(m)?"function"==typeof m.destroy&&(h=!0):!c&&gm(m)&&(c=!0)}this.count=a+o,this.hasWidgets=h,this.hasThunks=c,this.hooks=s,this.descendantHooks=l}xm.prototype.version="2",xm.prototype.type="VirtualNode";var wm=Mm;function Mm(e){this.text=String(e)}Mm.prototype.version="2",Mm.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 = {}));
-
-},{}],327:[function(require,module,exports){
-/// <reference path="../../typings/index.d.ts" />
-"use strict";
-var _ = require("underscore");
-var Subject_1 = require("rxjs/Subject");
-require("rxjs/add/operator/debounceTime");
-require("rxjs/add/operator/distinctUntilChanged");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/publishReplay");
-require("rxjs/add/operator/scan");
-require("rxjs/add/operator/startWith");
-var LoadingService = (function () {
-    function LoadingService() {
-        this._loadersSubject$ = new Subject_1.Subject();
-        this._loaders$ = this._loadersSubject$
-            .scan(function (loaders, loader) {
-            if (loader.task !== undefined) {
-                loaders[loader.task] = loader.loading;
-            }
-            return loaders;
-        }, {})
-            .startWith({})
-            .publishReplay(1)
-            .refCount();
-    }
-    Object.defineProperty(LoadingService.prototype, "loading$", {
-        get: function () {
-            return this._loaders$
-                .map(function (loaders) {
-                return _.reduce(loaders, function (loader, acc) {
-                    return (loader || acc);
-                }, false);
-            })
-                .debounceTime(100)
-                .distinctUntilChanged();
-        },
-        enumerable: true,
-        configurable: true
-    });
-    LoadingService.prototype.taskLoading$ = function (task) {
-        return this._loaders$
-            .map(function (loaders) {
-            return !!loaders[task];
-        })
-            .debounceTime(100)
-            .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;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = LoadingService;
-
-},{"rxjs/Subject":33,"rxjs/add/operator/debounceTime":52,"rxjs/add/operator/distinctUntilChanged":55,"rxjs/add/operator/map":62,"rxjs/add/operator/publishReplay":69,"rxjs/add/operator/scan":70,"rxjs/add/operator/startWith":75,"underscore":168}],328:[function(require,module,exports){
-"use strict";
-var BehaviorSubject_1 = require("rxjs/BehaviorSubject");
-var Observable_1 = require("rxjs/Observable");
-var Subject_1 = require("rxjs/Subject");
-require("rxjs/add/observable/fromEvent");
-require("rxjs/add/operator/distinctUntilChanged");
-require("rxjs/add/operator/filter");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/merge");
-require("rxjs/add/operator/mergeMap");
-require("rxjs/add/operator/publishReplay");
-require("rxjs/add/operator/scan");
-require("rxjs/add/operator/switchMap");
-require("rxjs/add/operator/withLatestFrom");
-var MouseService = (function () {
-    function MouseService(element) {
-        var _this = this;
-        this._element = element;
-        this._activeSubject$ = new BehaviorSubject_1.BehaviorSubject(false);
-        this._active$ = this._activeSubject$
-            .distinctUntilChanged()
-            .publishReplay(1)
-            .refCount();
-        this._preventMouseDownOperation$ = new Subject_1.Subject();
-        this._preventMouseDown$ = new Subject_1.Subject();
-        this._mouseMoveOperation$ = new Subject_1.Subject();
-        this._claimMouse$ = new Subject_1.Subject();
-        this._mouseDown$ = Observable_1.Observable.fromEvent(element, "mousedown");
-        this._mouseLeave$ = Observable_1.Observable.fromEvent(element, "mouseleave");
-        this._mouseUp$ = Observable_1.Observable.fromEvent(element, "mouseup");
-        this._mouseOver$ = Observable_1.Observable.fromEvent(element, "mouseover");
-        this._click$ = Observable_1.Observable.fromEvent(element, "click");
-        this._mouseWheel$ = Observable_1.Observable.fromEvent(element, "wheel");
-        this._mouseWheel$
-            .subscribe(function (event) {
-            event.preventDefault();
-        });
-        this._preventMouseDownOperation$
-            .scan(function (prevent, operation) {
-            return operation(prevent);
-        }, true)
-            .subscribe(function () { });
-        this._preventMouseDown$
-            .map(function (prevent) {
-            return function (previous) {
-                return prevent;
-            };
-        })
-            .subscribe(this._preventMouseDownOperation$);
-        this._mouseDown$
-            .map(function (e) {
-            return function (prevent) {
-                if (prevent) {
-                    e.preventDefault();
-                }
-                return prevent;
-            };
-        })
-            .subscribe(this._preventMouseDownOperation$);
-        this._mouseMove$ = this._mouseMoveOperation$
-            .scan(function (e, operation) {
-            return operation(e);
-        }, null);
-        Observable_1.Observable
-            .fromEvent(element, "mousemove")
-            .map(function (e) {
-            return function (previous) {
-                if (previous == null) {
-                    previous = e;
-                }
-                if (e.movementX == null) {
-                    Object.defineProperty(e, "movementX", {
-                        configurable: false,
-                        enumerable: false,
-                        value: e.clientX - previous.clientX,
-                        writable: false,
-                    });
-                }
-                if (e.movementY == null) {
-                    Object.defineProperty(e, "movementY", {
-                        configurable: false,
-                        enumerable: false,
-                        value: e.clientY - previous.clientY,
-                        writable: false,
-                    });
-                }
-                return e;
-            };
-        })
-            .subscribe(this._mouseMoveOperation$);
-        var dragStop$ = Observable_1.Observable
-            .merge(this._mouseLeave$, this._mouseUp$);
-        this._mouseDragStart$ = this._mouseDown$
-            .mergeMap(function (e) {
-            return _this._mouseMove$
-                .takeUntil(dragStop$)
-                .take(1);
-        });
-        this._mouseDrag$ = this._mouseDown$
-            .mergeMap(function (e) {
-            return _this._mouseMove$
-                .skip(1)
-                .takeUntil(dragStop$);
-        });
-        this._mouseDragEnd$ = this._mouseDragStart$
-            .mergeMap(function (e) {
-            return dragStop$.first();
-        });
-        this._staticClick$ = this._mouseDown$
-            .switchMap(function (e) {
-            return _this._click$
-                .takeUntil(_this._mouseMove$)
-                .take(1);
-        });
-        this._mouseOwner$ = this._claimMouse$
-            .scan(function (claims, mouseClaim) {
-            if (mouseClaim.zindex == null) {
-                delete claims[mouseClaim.name];
-            }
-            else {
-                claims[mouseClaim.name] = mouseClaim.zindex;
-            }
-            return claims;
-        }, {})
-            .map(function (claims) {
-            var owner = null;
-            var curZ = -1;
-            for (var name_1 in claims) {
-                if (claims.hasOwnProperty(name_1)) {
-                    if (claims[name_1] > curZ) {
-                        curZ = claims[name_1];
-                        owner = name_1;
-                    }
-                }
-            }
-            return owner;
-        })
-            .publishReplay(1)
-            .refCount();
-    }
-    Object.defineProperty(MouseService.prototype, "active$", {
-        get: function () {
-            return this._active$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(MouseService.prototype, "activate$", {
-        get: function () {
-            return this._activeSubject$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(MouseService.prototype, "mouseOwner$", {
-        get: function () {
-            return this._mouseOwner$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(MouseService.prototype, "mouseDown$", {
-        get: function () {
-            return this._mouseDown$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(MouseService.prototype, "mouseMove$", {
-        get: function () {
-            return this._mouseMove$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(MouseService.prototype, "mouseLeave$", {
-        get: function () {
-            return this._mouseLeave$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(MouseService.prototype, "mouseUp$", {
-        get: function () {
-            return this._mouseUp$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(MouseService.prototype, "click$", {
-        get: function () {
-            return this._click$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(MouseService.prototype, "mouseWheel$", {
-        get: function () {
-            return this._mouseWheel$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(MouseService.prototype, "mouseDragStart$", {
-        get: function () {
-            return this._mouseDragStart$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(MouseService.prototype, "mouseDrag$", {
-        get: function () {
-            return this._mouseDrag$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(MouseService.prototype, "mouseDragEnd$", {
-        get: function () {
-            return this._mouseDragEnd$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(MouseService.prototype, "staticClick$", {
-        get: function () {
-            return this._staticClick$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(MouseService.prototype, "preventDefaultMouseDown$", {
-        get: function () {
-            return this._preventMouseDown$;
-        },
-        enumerable: true,
-        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.filtered$ = function (name, observable$) {
-        return observable$
-            .withLatestFrom(this.mouseOwner$, function (event, owner) {
-            return [event, owner];
-        })
-            .filter(function (eo) {
-            return eo[1] === name;
-        })
-            .map(function (eo) {
-            return eo[0];
-        });
-    };
-    return MouseService;
-}());
-exports.MouseService = MouseService;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = MouseService;
-
-},{"rxjs/BehaviorSubject":25,"rxjs/Observable":28,"rxjs/Subject":33,"rxjs/add/observable/fromEvent":41,"rxjs/add/operator/distinctUntilChanged":55,"rxjs/add/operator/filter":58,"rxjs/add/operator/map":62,"rxjs/add/operator/merge":63,"rxjs/add/operator/mergeMap":65,"rxjs/add/operator/publishReplay":69,"rxjs/add/operator/scan":70,"rxjs/add/operator/switchMap":76,"rxjs/add/operator/withLatestFrom":80}],329:[function(require,module,exports){
-/// <reference path="../../typings/index.d.ts" />
-"use strict";
-var BehaviorSubject_1 = require("rxjs/BehaviorSubject");
-var Observable_1 = require("rxjs/Observable");
-require("rxjs/add/observable/throw");
-require("rxjs/add/operator/do");
-require("rxjs/add/operator/finally");
-require("rxjs/add/operator/first");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/mergeMap");
-var API_1 = require("../API");
-var Graph_1 = require("../Graph");
-var Edge_1 = require("../Edge");
-var State_1 = require("../State");
-var Viewer_1 = require("../Viewer");
-var Navigator = (function () {
-    function Navigator(clientId, token, apiV3, graphService, imageLoadingService, loadingService, stateService, cacheService) {
-        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();
-        this._cacheService = cacheService != null ?
-            cacheService :
-            new Viewer_1.CacheService(this._graphService, this._stateService);
-        this._cacheService.start();
-        this._keyRequested$ = new BehaviorSubject_1.BehaviorSubject(null);
-        this._movedToKey$ = new BehaviorSubject_1.BehaviorSubject(null);
-        this._dirRequested$ = new BehaviorSubject_1.BehaviorSubject(null);
-        this._latLonRequested$ = new BehaviorSubject_1.BehaviorSubject(null);
-    }
-    Object.defineProperty(Navigator.prototype, "apiV3", {
-        get: function () {
-            return this._apiV3;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Navigator.prototype, "graphService", {
-        get: function () {
-            return this._graphService;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Navigator.prototype, "imageLoadingService", {
-        get: function () {
-            return this._imageLoadingService;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Navigator.prototype, "keyRequested$", {
-        get: function () {
-            return this._keyRequested$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Navigator.prototype, "loadingService", {
-        get: function () {
-            return this._loadingService;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Navigator.prototype, "movedToKey$", {
-        get: function () {
-            return this._movedToKey$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Navigator.prototype, "stateService", {
-        get: function () {
-            return this._stateService;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Navigator.prototype.moveToKey$ = function (key) {
-        var _this = this;
-        this.loadingService.startLoading(this._loadingName);
-        this._keyRequested$.next(key);
-        return this._graphService.cacheNode$(key)
-            .do(function (node) {
-            _this.stateService.setNodes([node]);
-            _this._movedToKey$.next(node.key);
-        })
-            .finally(function () {
-            _this.loadingService.stopLoading(_this._loadingName);
-        });
-    };
-    Navigator.prototype.moveDir$ = function (direction) {
-        var _this = this;
-        this.loadingService.startLoading(this._loadingName);
-        this._dirRequested$.next(direction);
-        return this.stateService.currentNode$
-            .first()
-            .mergeMap(function (node) {
-            return ([Edge_1.EdgeDirection.Next, Edge_1.EdgeDirection.Prev].indexOf(direction) > -1 ?
-                node.sequenceEdges$ :
-                node.spatialEdges$)
-                .first()
-                .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;
-            });
-        })
-            .mergeMap(function (directionKey) {
-            if (directionKey == null) {
-                _this.loadingService.stopLoading(_this._loadingName);
-                return Observable_1.Observable
-                    .throw(new Error("Direction (" + direction + ") does not exist for current node."));
-            }
-            return _this.moveToKey$(directionKey);
-        });
-    };
-    Navigator.prototype.moveCloseTo$ = function (lat, lon) {
-        var _this = this;
-        this.loadingService.startLoading(this._loadingName);
-        this._latLonRequested$.next({ lat: lat, lon: lon });
-        return this.apiV3.imageCloseTo$(lat, lon)
-            .mergeMap(function (fullNode) {
-            if (fullNode == null) {
-                _this.loadingService.stopLoading(_this._loadingName);
-                return Observable_1.Observable
-                    .throw(new Error("No image found close to lat " + lat + ", lon " + lon + "."));
-            }
-            return _this.moveToKey$(fullNode.key);
-        });
-    };
-    Navigator.prototype.setFilter$ = function (filter) {
-        var _this = this;
-        this._stateService.clearNodes();
-        return this._movedToKey$
-            .first()
-            .mergeMap(function (key) {
-            if (key != null) {
-                return _this._trajectoryKeys$()
-                    .mergeMap(function (keys) {
-                    return _this._graphService.setFilter$(filter)
-                        .mergeMap(function (graph) {
-                        return _this._cacheKeys$(keys);
-                    });
-                })
-                    .last();
-            }
-            return _this._keyRequested$
-                .mergeMap(function (requestedKey) {
-                if (requestedKey != null) {
-                    return _this._graphService.setFilter$(filter)
-                        .mergeMap(function (graph) {
-                        return _this._graphService.cacheNode$(requestedKey);
-                    });
-                }
-                return _this._graphService.setFilter$(filter)
-                    .map(function (graph) {
-                    return undefined;
-                });
-            });
-        })
-            .map(function (node) {
-            return undefined;
-        });
-    };
-    Navigator.prototype.setToken$ = function (token) {
-        var _this = this;
-        this._stateService.clearNodes();
-        return this._movedToKey$
-            .first()
-            .do(function (key) {
-            _this._apiV3.setToken(token);
-        })
-            .mergeMap(function (key) {
-            return key == null ?
-                _this._graphService.reset$([])
-                    .map(function (graph) {
-                    return undefined;
-                }) :
-                _this._trajectoryKeys$()
-                    .mergeMap(function (keys) {
-                    return _this._graphService.reset$(keys)
-                        .mergeMap(function (graph) {
-                        return _this._cacheKeys$(keys);
-                    });
-                })
-                    .last()
-                    .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 Observable_1.Observable
-            .from(cacheNodes$)
-            .mergeAll();
-    };
-    Navigator.prototype._trajectoryKeys$ = function () {
-        return this._stateService.currentState$
-            .first()
-            .map(function (frame) {
-            return frame.state.trajectory
-                .map(function (node) {
-                return node.key;
-            });
-        });
-    };
-    return Navigator;
-}());
-exports.Navigator = Navigator;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = Navigator;
-
-},{"../API":216,"../Edge":218,"../Graph":221,"../State":224,"../Viewer":227,"rxjs/BehaviorSubject":25,"rxjs/Observable":28,"rxjs/add/observable/throw":45,"rxjs/add/operator/do":56,"rxjs/add/operator/finally":59,"rxjs/add/operator/first":60,"rxjs/add/operator/map":62,"rxjs/add/operator/mergeMap":65}],330:[function(require,module,exports){
-"use strict";
-var SpriteAlignment;
-(function (SpriteAlignment) {
-    SpriteAlignment[SpriteAlignment["Center"] = 0] = "Center";
-    SpriteAlignment[SpriteAlignment["Start"] = 1] = "Start";
-    SpriteAlignment[SpriteAlignment["End"] = 2] = "End";
-})(SpriteAlignment = exports.SpriteAlignment || (exports.SpriteAlignment = {}));
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = SpriteAlignment;
-
-},{}],331:[function(require,module,exports){
-/// <reference path="../../typings/index.d.ts" />
-"use strict";
-var THREE = require("three");
-var vd = require("virtual-dom");
-var Subject_1 = require("rxjs/Subject");
-require("rxjs/add/operator/publishReplay");
-require("rxjs/add/operator/scan");
-require("rxjs/add/operator/startWith");
-var Viewer_1 = require("../Viewer");
-var SpriteAtlas = (function () {
-    function SpriteAtlas() {
-    }
-    Object.defineProperty(SpriteAtlas.prototype, "json", {
-        set: function (value) {
-            this._json = value;
-        },
-        enumerable: true,
-        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: true,
-        configurable: true
-    });
-    Object.defineProperty(SpriteAtlas.prototype, "loaded", {
-        get: function () {
-            return !!(this._image && this._json);
-        },
-        enumerable: true,
-        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, horizontalAlign, verticalAlign) {
-        if (!this.loaded) {
-            throw new Error("Sprites cannot be retrieved before the atlas is loaded.");
-        }
-        if (horizontalAlign == null) {
-            horizontalAlign = Viewer_1.SpriteAlignment.Start;
-        }
-        if (verticalAlign == null) {
-            verticalAlign = Viewer_1.SpriteAlignment.Start;
-        }
-        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 (horizontalAlign) {
-            case Viewer_1.SpriteAlignment.Center:
-                left -= definition.width / 2;
-                break;
-            case Viewer_1.SpriteAlignment.End:
-                left -= definition.width;
-                break;
-            case Viewer_1.SpriteAlignment.Start:
-                break;
-            default:
-                break;
-        }
-        switch (verticalAlign) {
-            case Viewer_1.SpriteAlignment.Center:
-                top -= definition.height / 2;
-                break;
-            case Viewer_1.SpriteAlignment.End:
-                top -= definition.height;
-                break;
-            case Viewer_1.SpriteAlignment.Start:
-                break;
-            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 = (function () {
-    function SpriteService(sprite) {
-        var _this = this;
-        this._retina = window.devicePixelRatio > 1;
-        this._spriteAtlasOperation$ = new Subject_1.Subject();
-        this._spriteAtlas$ = this._spriteAtlasOperation$
-            .startWith(function (atlas) {
-            return atlas;
-        })
-            .scan(function (atlas, operation) {
-            return operation(atlas);
-        }, new SpriteAtlas())
-            .publishReplay(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: true,
-        configurable: true
-    });
-    return SpriteService;
-}());
-exports.SpriteService = SpriteService;
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = SpriteService;
-
-},{"../Viewer":227,"rxjs/Subject":33,"rxjs/add/operator/publishReplay":69,"rxjs/add/operator/scan":70,"rxjs/add/operator/startWith":75,"three":167,"virtual-dom":173}],332:[function(require,module,exports){
-"use strict";
-var BehaviorSubject_1 = require("rxjs/BehaviorSubject");
-var Observable_1 = require("rxjs/Observable");
-var Subject_1 = require("rxjs/Subject");
-require("rxjs/add/operator/filter");
-require("rxjs/add/operator/map");
-require("rxjs/add/operator/merge");
-require("rxjs/add/operator/scan");
-require("rxjs/add/operator/switchMap");
-var TouchMove = (function () {
-    function TouchMove(touch) {
-        this.movementX = 0;
-        this.movementY = 0;
-        if (touch == null) {
-            return;
-        }
-        this.identifier = touch.identifier;
-        this.clientX = touch.clientX;
-        this.clientY = touch.clientY;
-        this.pageX = touch.pageX;
-        this.pageY = touch.pageY;
-        this.screenX = touch.screenX;
-        this.screenY = touch.screenY;
-        this.target = touch.target;
-    }
-    return TouchMove;
-}());
-exports.TouchMove = TouchMove;
-var TouchService = (function () {
-    function TouchService(element) {
-        var _this = this;
-        this._element = element;
-        this._activeSubject$ = new BehaviorSubject_1.BehaviorSubject(false);
-        this._active$ = this._activeSubject$
-            .distinctUntilChanged()
-            .publishReplay(1)
-            .refCount();
-        this._touchStart$ = Observable_1.Observable.fromEvent(element, "touchstart");
-        this._touchMove$ = Observable_1.Observable.fromEvent(element, "touchmove");
-        this._touchEnd$ = Observable_1.Observable.fromEvent(element, "touchend");
-        this._touchCancel$ = Observable_1.Observable.fromEvent(element, "touchcancel");
-        this._preventTouchMoveOperation$ = new Subject_1.Subject();
-        this._preventTouchMove$ = new Subject_1.Subject();
-        this._preventTouchMoveOperation$
-            .scan(function (prevent, operation) {
-            return operation(prevent);
-        }, true)
-            .subscribe(function () { });
-        this._preventTouchMove$
-            .map(function (prevent) {
-            return function (previous) {
-                return prevent;
-            };
-        })
-            .subscribe(this._preventTouchMoveOperation$);
-        this._touchMove$
-            .map(function (te) {
-            return function (prevent) {
-                if (prevent) {
-                    te.preventDefault();
-                }
-                return prevent;
-            };
-        })
-            .subscribe(this._preventTouchMoveOperation$);
-        this._singleTouchMoveOperation$ = new Subject_1.Subject();
-        this._singleTouchMove$ = this._singleTouchMoveOperation$
-            .scan(function (touch, operation) {
-            return operation(touch);
-        }, new TouchMove());
-        this._touchMove$
-            .filter(function (te) {
-            return te.touches.length === 1 && te.targetTouches.length === 1;
-        })
-            .map(function (te) {
-            return function (previous) {
-                var touch = te.touches[0];
-                var current = new TouchMove(touch);
-                current.movementX = touch.pageX - previous.pageX;
-                current.movementY = touch.pageY - previous.pageY;
-                return current;
-            };
-        })
-            .subscribe(this._singleTouchMoveOperation$);
-        var singleTouchStart$ = Observable_1.Observable
-            .merge(this._touchStart$, this._touchEnd$, this._touchCancel$)
-            .filter(function (te) {
-            return te.touches.length === 1 && te.targetTouches.length === 1;
-        });
-        var multipleTouchStart$ = Observable_1.Observable
-            .merge(this._touchStart$, this._touchEnd$, this._touchCancel$)
-            .filter(function (te) {
-            return te.touches.length >= 1;
-        });
-        var touchStop$ = Observable_1.Observable
-            .merge(this._touchEnd$, this._touchCancel$)
-            .filter(function (te) {
-            return te.touches.length === 0;
-        });
-        this._singleTouchMoveStart$ = singleTouchStart$
-            .mergeMap(function (e) {
-            return _this._singleTouchMove$
-                .takeUntil(Observable_1.Observable.merge(touchStop$, multipleTouchStart$))
-                .take(1);
-        });
-        this._singleTouchMoveEnd$ = singleTouchStart$
-            .mergeMap(function (e) {
-            return Observable_1.Observable
-                .merge(touchStop$, multipleTouchStart$)
-                .first();
-        });
-        this._singleTouch$ = singleTouchStart$
-            .switchMap(function (te) {
-            return _this._singleTouchMove$
-                .skip(1)
-                .takeUntil(Observable_1.Observable
-                .merge(multipleTouchStart$, touchStop$));
-        });
-        var touchesChanged$ = Observable_1.Observable
-            .merge(this._touchStart$, this._touchEnd$, this._touchCancel$);
-        var pinchStart$ = touchesChanged$
-            .filter(function (te) {
-            return te.touches.length === 2 && te.targetTouches.length === 2;
-        });
-        var pinchStop$ = touchesChanged$
-            .filter(function (te) {
-            return te.touches.length !== 2 || te.targetTouches.length !== 2;
-        });
-        this._pinchOperation$ = new Subject_1.Subject();
-        this._pinch$ = this._pinchOperation$
-            .scan(function (pinch, operation) {
-            return operation(pinch);
-        }, {
-            centerClientX: 0,
-            centerClientY: 0,
-            centerPageX: 0,
-            centerPageY: 0,
-            centerScreenX: 0,
-            centerScreenY: 0,
-            changeX: 0,
-            changeY: 0,
-            distance: 0,
-            distanceChange: 0,
-            distanceX: 0,
-            distanceY: 0,
-            touch1: null,
-            touch2: null,
-        });
-        this._touchMove$
-            .filter(function (te) {
-            return te.touches.length === 2 && te.targetTouches.length === 2;
-        })
-            .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 = {
-                    centerClientX: centerClientX,
-                    centerClientY: centerClientY,
-                    centerPageX: centerPageX,
-                    centerPageY: centerPageY,
-                    centerScreenX: centerScreenX,
-                    centerScreenY: centerScreenY,
-                    changeX: changeX,
-                    changeY: changeY,
-                    distance: distance,
-                    distanceChange: distanceChange,
-                    distanceX: distanceX,
-                    distanceY: distanceY,
-                    touch1: touch1,
-                    touch2: touch2,
-                };
-                return current;
-            };
-        })
-            .subscribe(this._pinchOperation$);
-        this._pinchChange$ = pinchStart$
-            .switchMap(function (te) {
-            return _this._pinch$
-                .skip(1)
-                .takeUntil(pinchStop$);
-        });
-    }
-    Object.defineProperty(TouchService.prototype, "active$", {
-        get: function () {
-            return this._active$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(TouchService.prototype, "activate$", {
-        get: function () {
-            return this._activeSubject$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(TouchService.prototype, "touchStart$", {
-        get: function () {
-            return this._touchStart$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(TouchService.prototype, "touchMove$", {
-        get: function () {
-            return this._touchMove$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(TouchService.prototype, "touchEnd$", {
-        get: function () {
-            return this._touchEnd$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(TouchService.prototype, "touchCancel$", {
-        get: function () {
-            return this._touchCancel$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(TouchService.prototype, "singleTouchMoveStart$", {
-        get: function () {
-            return this._singleTouchMoveStart$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(TouchService.prototype, "singleTouchMove$", {
-        get: function () {
-            return this._singleTouch$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(TouchService.prototype, "singleTouchMoveEnd$", {
-        get: function () {
-            return this._singleTouchMoveEnd$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(TouchService.prototype, "pinch$", {
-        get: function () {
-            return this._pinchChange$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(TouchService.prototype, "preventDefaultTouchMove$", {
-        get: function () {
-            return this._preventTouchMove$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    return TouchService;
-}());
-exports.TouchService = TouchService;
-
-},{"rxjs/BehaviorSubject":25,"rxjs/Observable":28,"rxjs/Subject":33,"rxjs/add/operator/filter":58,"rxjs/add/operator/map":62,"rxjs/add/operator/merge":63,"rxjs/add/operator/scan":70,"rxjs/add/operator/switchMap":76}],333:[function(require,module,exports){
-/// <reference path="../../typings/index.d.ts" />
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var when = require("when");
-var Viewer_1 = require("../Viewer");
-var Utils_1 = require("../Utils");
+var Sm,Tm,Cm,Em=(Tm=String.prototype.split,Cm=/()??/.exec("")[1]===Sm,function(e,t,i){if("[object RegExp]"!==Object.prototype.toString.call(t))return Tm.call(e,t,i);var n,r,s,a,o=[],h=(t.ignoreCase?"i":"")+(t.multiline?"m":"")+(t.extended?"x":"")+(t.sticky?"y":""),c=0;for(t=new RegExp(t.source,h+"g"),e+="",Cm||(n=new RegExp("^"+t.source+"$(?!\\s)",h)),i=i===Sm?-1>>>0:i>>>0;(r=t.exec(e))&&!((s=r.index+r[0].length)>c&&(o.push(e.slice(c,r.index)),!Cm&&r.length>1&&r[0].replace(n,(function(){for(var e=1;e<arguments.length-2;e++)arguments[e]===Sm&&(r[e]=Sm)})),r.length>1&&r.index<e.length&&Array.prototype.push.apply(o,r.slice(1)),a=r[0].length,c=s,o.length>=i));)t.lastIndex===r.index&&t.lastIndex++;return c===e.length?!a&&t.test("")||o.push(""):o.push(e.slice(c)),o.length>i?o.slice(0,i):o}),Am=/([\.#]?[a-zA-Z0-9\u007F-\uFFFF_:-]+)/,Im=/^\.|#/,Rm=function(e,t){if(!e)return"DIV";var i,n,r,s,a=!t.hasOwnProperty("id"),o=Em(e,Am),h=null;Im.test(o[1])&&(h="DIV");for(s=0;s<o.length;s++)(n=o[s])&&(r=n.charAt(0),h?"."===r?(i=i||[]).push(n.substring(1,n.length)):"#"===r&&a&&(t.id=n.substring(1,n.length)):h=n);i&&(t.className&&i.push(t.className),t.className=i.join(" "));return t.namespace?h:h.toUpperCase()};var Pm=Lm;function Lm(e){if(!(this instanceof Lm))return new Lm(e);this.value=e}Lm.prototype.hook=function(e,t){e[t]!==this.value&&(e[t]=this.value)};var Dm="undefined"!=typeof window?window:void 0!==hd?hd:{};var Nm=function(e,t){if(e in Dm)return Dm[e];return Dm[e]=t,t};(function(e,t,i){var n="__INDIVIDUAL_ONE_VERSION_"+e,r=Nm(n+"_ENFORCE_SINGLETON",t);if(r!==t)throw new Error("Can only have one copy of "+e+".\nYou already have version "+r+" installed.\nThis means you cannot install version "+t);Nm(n,i)})("ev-store","7");var $m="__EV_STORE_KEY@7";var km=function(e){var t=e[$m];t||(t=e[$m]={});return t},Om=zm;function zm(e){if(!(this instanceof zm))return new zm(e);this.value=e}zm.prototype.hook=function(e,t){km(e)[t.substr(3)]=this.value},zm.prototype.unhook=function(e,t){km(e)[t.substr(3)]=void 0};var Fm=dd,Bm=vm,Um=wm,Vm=fd,Hm=gd,jm=_d,Gm=Cd,Wm=vd,qm=Rm,Xm=Pm,Zm=Om;function Ym(e,t,i,n){if("string"==typeof e)t.push(new Um(e));else if("number"==typeof e)t.push(new Um(String(e)));else if(Jm(e))t.push(e);else{if(!Fm(e)){if(null==e)return;throw function(e){var t=new Error;return t.type="virtual-hyperscript.unexpected.virtual-element",t.message="Unexpected virtual child passed to h().\nExpected a VNode / Vthunk / VWidget / string but:\ngot:\n"+Km(e.foreignObject)+".\nThe parent vnode is:\n"+Km(e.parentVnode),t.foreignObject=e.foreignObject,t.parentVnode=e.parentVnode,t}({foreignObject:e,parentVnode:{tagName:i,properties:n}})}for(var r=0;r<e.length;r++)Ym(e[r],t,i,n)}}function Jm(e){return Vm(e)||Hm(e)||jm(e)||Wm(e)}function Km(e){try{return JSON.stringify(e,null,"    ")}catch(t){return String(e)}}var Qm,ef,tf={diff:qd,patch:pm,h:function(e,t,i){var n,r,s,a,o=[];!i&&(h=t,"string"==typeof h||Fm(h)||Jm(h))&&(i=t,r={});var h;n=qm(e,r=r||t||{}),r.hasOwnProperty("key")&&(s=r.key,r.key=void 0);r.hasOwnProperty("namespace")&&(a=r.namespace,r.namespace=void 0);"INPUT"!==n||a||!r.hasOwnProperty("value")||void 0===r.value||Gm(r.value)||(r.value=Xm(r.value));(function(e){for(var t in e)if(e.hasOwnProperty(t)){var i=e[t];if(Gm(i))continue;"ev-"===t.substr(0,3)&&(e[t]=Zm(i))}})(r),null!=i&&Ym(i,o,n,r);return new Bm(n,r,o,s,a)},create:Zp,VNode:vm,VText:wm};class nf{constructor(){this._events={}}fire(e,t){if(this._listens(e))for(const i of this._events[e])i(t)}off(e,t){if(e){if(this._listens(e)){const i=this._events[e].indexOf(t);i>=0&&this._events[e].splice(i,1),this._events[e].length||delete this._events[e]}}else this._events={}}on(e,t){this._events[e]=this._events[e]||[],this._events[e].push(t)}_listens(e){return e in this._events}}class rf{constructor(){this._subscriptions=[]}push(e){this._subscriptions.push(e)}unsubscribe(){for(const e of this._subscriptions)e.unsubscribe();this._subscriptions=[]}}class sf extends nf{constructor(e,t,i){super(),this._activated$=new W(!1),this._configurationSubject$=new j,this._activated=!1,this._container=t,this._name=e,this._navigator=i,this._subscriptions=new rf,this._configuration$=this._configurationSubject$.pipe(Ot(this.defaultConfiguration),Lt(((e,t)=>{for(let i in t)t.hasOwnProperty(i)&&(e[i]=t[i]);return e})),Rt(1),U()),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(e){this._activated||(void 0!==e&&this._configurationSubject$.next(e),this._activated=!0,this._activate(),this._activated$.next(!0))}configure(e){this._configurationSubject$.next(e)}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(e,t){super.fire(e,t)}off(e,t){super.off(e,t)}on(e,t){super.on(e,t)}resize(){}}!function(e){e[e.Hidden=0]="Hidden",e[e.Loading=1]="Loading",e[e.Visible=2]="Visible"}(Qm||(Qm={}));class af extends sf{constructor(e,t,i){super(e,t,i)}_activate(){const e=this.configuration$.pipe(St((e=>!!e.id)),st((e=>!e.src)),zt((e=>this._getImageSrc$(e.id).pipe(ct((e=>(console.error(e),ie())))))),Rt(1),U()),t=this._subscriptions;t.push(e.pipe(De((e=>({src:e})))).subscribe((e=>{this._configurationSubject$.next(e)}))),t.push(Ve(this.configuration$,e).pipe(st((([e,t])=>!!e.src&&e.src!==t)),St()).subscribe((([,e])=>{window.URL.revokeObjectURL(e)}))),t.push(this._configuration$.pipe(vt(void 0,(e=>e.state)),zt((e=>Ve(Ce(e.state),this._navigator.stateService.currentImage$))),zt((([e,t])=>{const i=Ve(Ce(t.id),t.image$.pipe(st((e=>!!e)),De((e=>e.src))));return e===Qm.Visible?i.pipe(St()):i})),vt((([e,t],[i,n])=>e===i&&t===n)),De((([e,t])=>({id:e,src:t})))).subscribe(this._configurationSubject$)),t.push(Ve(this._configuration$,this._container.configurationService.exploreUrl$,this._container.renderService.size$).pipe(De((([e,t,i])=>{if(!e.src)return{name:this._name,vNode:tf.h("div",[])};const n=i.width<=640||i.height<=480?".mapillary-cover-compact":"";if(e.state===Qm.Hidden){const t=tf.h("div.mapillary-cover-container.mapillary-cover-done"+n,[this._getCoverBackgroundVNode(e)]);return{name:this._name,vNode:t}}const r=tf.h("div.mapillary-cover-container"+n,[this._getCoverButtonVNode(e,t)]);return{name:this._name,vNode:r}}))).subscribe(this._container.domRenderer.render$))}_deactivate(){this._subscriptions.unsubscribe()}_getDefaultConfiguration(){return{state:Qm.Visible}}_getCoverButtonVNode(e,t){const i=e.state===Qm.Loading?"div.mapillary-cover.mapillary-cover-loading":"div.mapillary-cover",n=tf.h("div.mapillary-cover-button",[tf.h("div.mapillary-cover-button-icon",[])]),r=tf.h("a.mapillary-cover-logo",{href:t,target:"_blank"},[]),s=tf.h("div.mapillary-cover-indicator",{onclick:()=>{this.configure({state:Qm.Loading})}},[]);return tf.h(i,[this._getCoverBackgroundVNode(e),s,n,r])}_getCoverBackgroundVNode(e){const t={style:{backgroundImage:`url(${e.src})`}},i=[];return e.state===Qm.Loading&&i.push(tf.h("div.mapillary-cover-spinner",{},[])),tf.h("div.mapillary-cover-background",t,i)}_getImageSrc$(e){return k.create((t=>{this._navigator.api.getImages$([e]).subscribe((i=>{for(const n of i){const i="number"==typeof e?e.toString():e;if(n.node_id===i)return void this._navigator.api.data.getImageBuffer(n.node.thumb.url).then((i=>{const n=new Image;n.crossOrigin="Anonymous",n.onload=()=>{t.next(n.src),t.complete()},n.onerror=()=>{t.error(new Error(`Failed to load cover image (${e})`))};const r=new Blob([i]);n.src=window.URL.createObjectURL(r)}),(e=>{t.error(e)}))}t.error(new Pu(`Non existent cover key: ${e}`))}),(e=>{t.error(e)}))}))}}af.componentName="cover";class of extends sf{_activate(){this._subscriptions.push(Ve(this._container.configurationService.exploreUrl$,this._navigator.stateService.currentImage$,this._container.renderService.size$).pipe(De((([e,t,i])=>{const n=this._makeAttribution(t.creatorUsername,e,t.id,t.capturedAt,i.width);return{name:this._name,vNode:n}}))).subscribe(this._container.domRenderer.render$))}_deactivate(){this._subscriptions.unsubscribe()}_getDefaultConfiguration(){return{}}makeImageUrl(e,t){return`${e}/app/?pKey=${t}&focus=photo`}_makeAttribution(e,t,i,n,r){const s=r<=640,a=this._makeDate(n,s),o=this._makeBy(e,t,i,s),h=s?".mapillary-attribution-compact":"";return tf.h("div.mapillary-attribution-container"+h,{},[...o,a])}_makeBy(e,t,i,n){const r=tf.h("div.mapillary-attribution-logo",[]);return e?this._makeCreatorBy(r,e,t,i,n):this._makeGeneralBy(r,t,i,n)}_makeCreatorBy(e,t,i,n,r){const s=tf.h("a.mapillary-attribution-icon-container",{href:i,rel:"noreferrer",target:"_blank"},[e]),a=r?`${t}`:`image by ${t}`,o=tf.h("div.mapillary-attribution-username",{textContent:a},[]);return[s,tf.h("a.mapillary-attribution-image-container",{href:this.makeImageUrl(i,n),rel:"noreferrer",target:"_blank"},[o])]}_makeGeneralBy(e,t,i,n){const r=tf.h("div.mapillary-attribution-username",{textContent:"images by"},[]),s=[tf.h("div.mapillary-attribution-icon-container",{},[e]),tf.h("div.mapillary-attribution-username",{textContent:"contributors"},[])];n||s.unshift(r);return[tf.h("a.mapillary-attribution-image-container",{href:this.makeImageUrl(t,i),rel:"noreferrer",target:"_blank"},s)]}_makeDate(e,t){const i=new Date(e).toDateString().split(" "),n=(i.length>3?t?[i[3]]:[i[1],i[2]+",",i[3]]:i).join(" ");return tf.h("div.mapillary-attribution-date",{textContent:n},[])}}of.componentName="attribution";class hf{constructor(){this._unprojectDepth=200}basicToCanvas(e,t,i,n,r){const s=n.unprojectBasic([e,t],this._unprojectDepth);return this.projectToCanvas(s,i,r)}basicToCanvasSafe(e,t,i,n,r){const s=this.basicToViewportSafe(e,t,n,r);if(null===s)return null;return this.viewportToCanvas(s[0],s[1],i)}basicToViewport(e,t,i,n){const r=i.unprojectBasic([e,t],this._unprojectDepth);return this.projectToViewport(r,n)}basicToViewportSafe(e,t,i,n){const r=i.unprojectBasic([e,t],this._unprojectDepth);if(this.worldToCamera(r,n)[2]>0)return null;return this.projectToViewport(r,n)}cameraToViewport(e,t){const i=(new Ki).fromArray(e).applyMatrix4(t.projectionMatrix);return[i.x,i.y]}canvasPosition(e,t){const i=t.getBoundingClientRect();return[e.clientX-i.left-t.clientLeft,e.clientY-i.top-t.clientTop]}canvasToBasic(e,t,i,n,r){const s=this.unprojectFromCanvas(e,t,i,r).toArray();return n.projectBasic(s)}canvasToViewport(e,t,i){const[n,r]=this.containerToCanvas(i);return[2*e/n-1,1-2*t/r]}containerToCanvas(e){return[e.offsetWidth,e.offsetHeight]}getBasicDistances(e,t){const i=this.viewportToBasic(-1,1,e,t),n=this.viewportToBasic(1,1,e,t),r=this.viewportToBasic(1,-1,e,t),s=this.viewportToBasic(-1,-1,e,t);let a=0,o=0,h=0,c=0;return i[1]<0&&n[1]<0&&(a=i[1]>n[1]?-i[1]:-n[1]),n[0]>1&&r[0]>1&&(o=n[0]<r[0]?n[0]-1:r[0]-1),r[1]>1&&s[1]>1&&(h=r[1]<s[1]?r[1]-1:s[1]-1),s[0]<0&&i[0]<0&&(c=s[0]>i[0]?-s[0]:-i[0]),[a,o,h,c]}getPixelDistances(e,t,i){const n=this.viewportToBasic(-1,1,t,i),r=this.viewportToBasic(1,1,t,i),s=this.viewportToBasic(1,-1,t,i),a=this.viewportToBasic(-1,-1,t,i);let o=0,h=0,c=0,l=0;const[u,d]=this.containerToCanvas(e);if(n[1]<0&&r[1]<0){const s=n[1]>r[1]?n[0]:r[0],a=this.basicToCanvas(s,0,e,t,i);o=a[1]>0?a[1]:0}if(r[0]>1&&s[0]>1){const n=r[0]<s[0]?r[1]:s[1],a=this.basicToCanvas(1,n,e,t,i);h=a[0]<u?u-a[0]:0}if(s[1]>1&&a[1]>1){const n=s[1]<a[1]?s[0]:a[0],r=this.basicToCanvas(n,1,e,t,i);c=r[1]<d?d-r[1]:0}if(a[0]<0&&n[0]<0){const r=a[0]>n[0]?a[1]:n[1],s=this.basicToCanvas(0,r,e,t,i);l=s[0]>0?s[0]:0}return[o,h,c,l]}insideElement(e,t){const i=t.getBoundingClientRect(),n=i.left+t.clientLeft,r=n+t.clientWidth,s=i.top+t.clientTop,a=s+t.clientHeight;return e.clientX>n&&e.clientX<r&&e.clientY>s&&e.clientY<a}projectToCanvas(e,t,i){const n=this.projectToViewport(e,i);return this.viewportToCanvas(n[0],n[1],t)}projectToCanvasSafe(e,t,i){if(this.worldToCamera(e,i)[2]>0)return null;const n=this.projectToViewport(e,i);return this.viewportToCanvas(n[0],n[1],t)}projectToViewport(e,t){const i=new Ki(e[0],e[1],e[2]).project(t);return[i.x,i.y]}unprojectFromCanvas(e,t,i,n){const r=this.canvasToViewport(e,t,i);return this.unprojectFromViewport(r[0],r[1],n)}unprojectFromViewport(e,t,i){return new Ki(e,t,1).unproject(i)}viewportToBasic(e,t,i,n){const r=new Ki(e,t,1).unproject(n).toArray();return i.projectBasic(r)}viewportToCanvas(e,t,i){const[n,r]=this.containerToCanvas(i);return[n*(e+1)/2,-r*(t-1)/2]}worldToCamera(e,t){return new Ki(e[0],e[1],e[2]).applyMatrix4(t.matrixWorldInverse).toArray()}}e.ComponentSize=void 0,(ef=e.ComponentSize||(e.ComponentSize={}))[ef.Automatic=0]="Automatic",ef[ef.Large=1]="Large",ef[ef.Small=2]="Small";class cf extends sf{constructor(e,t,i){super(e,t,i),this._spatial=new Du,this._viewportCoords=new hf,this._svgNamespace="http://www.w3.org/2000/svg",this._distinctThreshold=Math.PI/360,this._animationSpeed=.075}_activate(){const t=this._subscriptions,i=this._container.renderService.renderCamera$.pipe(De((e=>{let t=this._spatial.degToRad(e.perspective.fov),i=e.perspective.aspect===Number.POSITIVE_INFINITY?Math.PI:2*Math.atan(e.perspective.aspect*Math.tan(.5*t));return[this._spatial.azimuthalToBearing(e.rotation.phi),i]})),vt(((e,t)=>Math.abs(t[0]-e[0])<this._distinctThreshold&&Math.abs(t[1]-e[1])<this._distinctThreshold))),n=Ve(this._navigator.stateService.currentState$.pipe(vt(void 0,(e=>e.state.currentImage.id))),this._navigator.panService.panImages$).pipe(De((([e,t])=>{const i=e.state.currentImage,n=e.state.currentTransform;if($u(i.cameraType))return[Math.PI,Math.PI];const r=this._computeProjectedPoints(n),s=this._spatial.degToRad(this._computeHorizontalFov(r));let a=s/2,o=s/2;for(const[e,,n]of t){const t=this._spatial.wrap(e.compassAngle-i.compassAngle,-180,180);t<0?a=this._spatial.degToRad(Math.abs(t))+n/2:o=this._spatial.degToRad(Math.abs(t))+n/2}return[a,o]})),vt((([e,t],[i,n])=>Math.abs(i-e)<this._distinctThreshold&&Math.abs(n-t)<this._distinctThreshold))),r=Ve(this._navigator.stateService.currentState$.pipe(vt(void 0,(e=>e.state.currentImage.id))),this._container.renderService.bearing$).pipe(De((([e,t])=>this._spatial.degToRad(e.state.currentImage.compassAngle-t)))),s=new j,a=s.pipe(Lt(((e,t)=>t(e)),{alpha:0,curr:[0,0,0],prev:[0,0,0]}),De((e=>{const t=Oi.smootherstep(e.alpha,0,1),i=e.curr,n=e.prev;return[this._interpolate(n[0],i[0],t),this._interpolate(n[1],i[1],t)]})));t.push(n.pipe(De((e=>t=>{const i=Oi.smootherstep(t.alpha,0,1),n=t.curr,r=t.prev,s=[this._interpolate(r[0],n[0],i),this._interpolate(r[1],n[1],i)];return{alpha:0,curr:e.slice(),prev:s}}))).subscribe(s)),t.push(n.pipe(zt((()=>this._container.renderService.renderCameraFrame$.pipe($t(1),Lt((e=>e+this._animationSpeed),0),Bt((e=>e<=1+this._animationSpeed)),De((e=>Math.min(e,1)))))),De((e=>t=>({alpha:e,curr:t.curr.slice(),prev:t.prev.slice()})))).subscribe(s));const o=Ve(r,a).pipe(De((([e,t])=>[e,t[0],t[1]])));t.push(Ve(i,o,this._configuration$,this._container.renderService.size$).pipe(De((([[t,i],[n,r,s],a,o])=>{const h=this._createBackground(t),c=this._createFovIndicator(r,s,n),l=this._createNorth(t),u=this._createCircleSectorCompass(this._createCircleSector(Math.max(Math.PI/20,i),"#FFF")),d=a.size===e.ComponentSize.Small||a.size===e.ComponentSize.Automatic&&o.width<640?".mapillary-bearing-compact":"";return{name:this._name,vNode:tf.h("div.mapillary-bearing-indicator-container"+d,{oncontextmenu:e=>{e.preventDefault()}},[h,c,l,u])}}))).subscribe(this._container.domRenderer.render$))}_deactivate(){this._subscriptions.unsubscribe()}_getDefaultConfiguration(){return{size:e.ComponentSize.Automatic}}_createFovIndicator(e,t,i){const n=this._createFovArc(e,t),r=tf.h("g",{attributes:{transform:"translate(18,18)"},namespace:this._svgNamespace},[n]);return tf.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(e,t){const i=16.75,n=e+t;if(n>2*Math.PI-Math.PI/90)return tf.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-e,s=r+n,a=i*Math.cos(r),o=i*Math.sin(r),h=i*Math.cos(s),c=i*Math.sin(s),l=`M ${a} ${o} A 16.75 16.75 0 ${n>=Math.PI?1:0} 1 ${h} ${c}`;return tf.h("path",{attributes:{d:l,"fill-opacity":"0",stroke:"#FFF","stroke-width":"2.5"},namespace:this._svgNamespace},[])}_createCircleSectorCompass(e){let t=tf.h("g",{attributes:{transform:"translate(1,1)"},namespace:this._svgNamespace},[e]);return tf.h("svg",{attributes:{viewBox:"0 0 2 2"},namespace:this._svgNamespace,style:{height:"26px",left:"7px",position:"absolute",top:"7px",width:"26px"}},[t])}_createCircleSector(e,t){if(e>2*Math.PI-Math.PI/90)return tf.h("circle",{attributes:{cx:"0",cy:"0",fill:t,r:"1"},namespace:this._svgNamespace},[]);let i=-Math.PI/2-e/2,n=i+e,r=Math.cos(i),s=Math.sin(i),a=Math.cos(n),o=Math.sin(n),h=`M 0 0 ${r} ${s} A 1 1 0 ${e>=Math.PI?1:0} 1 ${a} ${o}`;return tf.h("path",{attributes:{d:h,fill:t},namespace:this._svgNamespace},[])}_createNorth(e){const t=tf.h("div.mapillary-bearing-north",[]);return tf.h("div.mapillary-bearing-north-container",{style:{transform:`rotateZ(${this._spatial.radToDeg(-e)}deg)`}},[t])}_createBackground(e){return tf.h("div.mapillary-bearing-indicator-background",{style:{transform:`rotateZ(${this._spatial.radToDeg(-e)}deg)`}},[tf.h("div.mapillary-bearing-indicator-background-circle",[]),tf.h("div.mapillary-bearing-indicator-background-arrow-container",[tf.h("div.mapillary-bearing-indicator-background-arrow",[])])])}_computeProjectedPoints(e){return zu(e,[[1,0]],[[0,.5]],12,this._viewportCoords)}_computeHorizontalFov(e){const t=e.map((e=>this._coordToFov(e[0])));return Math.min(...t)}_coordToFov(e){return this._spatial.radToDeg(2*Math.atan(e))}_interpolate(e,t,i){return(1-i)*e+i*t}}cf.componentName="bearing";class lf extends sf{constructor(e,t,i){super(e,t,i)}_activate(){const t=this._subscriptions;t.push(Ve(this._navigator.stateService.currentImage$.pipe(zt((e=>e.sequenceEdges$)),st((e=>e.cached))),this._configuration$).pipe(zt((t=>{let i=t[0],n=t[1],r=Math.max(0,Math.min(4,n.depth.sequence));return it(this._cache$(i.edges,e.NavigationDirection.Next,r),this._cache$(i.edges,e.NavigationDirection.Prev,r)).pipe(ct((e=>(console.error("Failed to cache sequence edges.",e),ie()))))}))).subscribe((()=>{}))),t.push(Ve(this._navigator.stateService.currentImage$.pipe(zt((e=>Ve(Ce(e),e.spatialEdges$.pipe(st((e=>e.cached))))))),this._configuration$).pipe(zt((([[t,i],n])=>{let r=i.edges,s=n.depth,a=Math.max(0,Math.min(2,s.spherical)),o=$u(t.cameraType)?0:Math.max(0,Math.min(3,s.step)),h=$u(t.cameraType)?0:Math.max(0,Math.min(1,s.turn)),c=this._cache$(r,e.NavigationDirection.Spherical,a);return it(this._cache$(r,e.NavigationDirection.StepForward,o),this._cache$(r,e.NavigationDirection.StepBackward,o),this._cache$(r,e.NavigationDirection.StepLeft,o),this._cache$(r,e.NavigationDirection.StepRight,o),c,this._cache$(r,e.NavigationDirection.TurnLeft,h),this._cache$(r,e.NavigationDirection.TurnRight,h),this._cache$(r,e.NavigationDirection.TurnU,h)).pipe(ct((e=>(console.error("Failed to cache spatial edges.",e),ie()))))}))).subscribe((()=>{})))}_deactivate(){this._subscriptions.unsubscribe()}_getDefaultConfiguration(){return{depth:{spherical:1,sequence:2,step:1,turn:0}}}_cache$(e,t,i){return at(Ce(e),Ce(i)).pipe(wt((e=>{let i=e[0],n=e[1],r=[];if(n>0)for(let e of i)e.data.direction===t&&r.push(at(this._navigator.graphService.cacheImage$(e.target).pipe(We((e=>this._imageToEdges$(e,t)))),Ce(n-1)));return ge(r).pipe(qe())})),$t(1))}_imageToEdges$(t,i){return([e.NavigationDirection.Next,e.NavigationDirection.Prev].indexOf(i)>-1?t.sequenceEdges$:t.spatialEdges$).pipe(St((e=>e.cached)),De((e=>e.edges)))}}lf.componentName="cache";class uf extends Pu{constructor(e){super(null!=e?e:"The request was cancelled."),Object.setPrototypeOf(this,uf.prototype),this.name="CancelMapillaryError"}}class df{constructor(e,t){this._spatial=new Du,this._minThresholdWidth=320,this._maxThresholdWidth=1480,this._minThresholdHeight=240,this._maxThresholdHeight=820,this._configure(e),this._resize(t),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(e){this._configure(e),this._reset()}resize(e){this._resize(e),this._reset()}angleToCoordinates(e){return[Math.cos(e),Math.sin(e)]}relativeAngleToCoordiantes(e,t){let i=this._spatial.wrapAngle(e-t);return this.angleToCoordinates(i)}_configure(e){this._minWidth=e.minWidth,this._maxWidth=this._getMaxWidth(e.minWidth,e.maxWidth)}_resize(e){this._elementWidth=e.width,this._elementHeight=e.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(e,t){let i=(e-this._minThresholdWidth)/(this._maxThresholdWidth-this._minThresholdWidth),n=(t-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(e){return.77*e}_getStepCircleDiameter(e){return.34*e}_getTurnCircleDiameter(e){return.3*e}_getOuterRadius(e){return.31*e}_getInnerRadius(e){return.125*e}_numberToCssPixels(e){return e+"px"}_getMaxWidth(e,t){return e>t?e:t}}class pf{constructor(t,i){this._isEdge=!1,this._spatial=new Du,this._calculator=new df(t,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=[e.NavigationDirection.StepForward,e.NavigationDirection.StepBackward,e.NavigationDirection.StepLeft,e.NavigationDirection.StepRight],this._turnDirections=[e.NavigationDirection.TurnLeft,e.NavigationDirection.TurnRight,e.NavigationDirection.TurnU],this._turnNames={},this._turnNames[e.NavigationDirection.TurnLeft]="mapillary-direction-turn-left",this._turnNames[e.NavigationDirection.TurnRight]="mapillary-direction-turn-right",this._turnNames[e.NavigationDirection.TurnU]="mapillary-direction-turn-around";let n=!!document.documentMode;this._isEdge=!n&&!!window.StyleMedia}get needsRender(){return this._needsRender}render(e){this._needsRender=!1;let t=this._rotation,i=[],n=[];return $u(this._image.cameraType)?i=i.concat(this._createSphericalArrows(e,t)):(i=i.concat(this._createPerspectiveToSphericalArrows(e,t)),i=i.concat(this._createStepArrows(e,t)),n=n.concat(this._createTurnArrows(e))),this._getContainer(i,n,t)}setEdges(e,t){this._setEdges(e,t),this._setNeedsRender()}setImage(e){this._image=e,this._clearEdges(),this._setNeedsRender()}setRenderCamera(e){let t=e.rotation;Math.abs(t.phi-this._rotation.phi)<this._epsilon||(this._rotation=t,this._setNeedsRender())}setConfiguration(e){let t=!1;this._highlightKey===e.highlightId&&this._distinguishSequence===e.distinguishSequence||(this._highlightKey=e.highlightId,this._distinguishSequence=e.distinguishSequence,t=!0),this._calculator.minWidth===e.minWidth&&this._calculator.maxWidth===e.maxWidth||(this._calculator.configure(e),t=!0),t&&this._setNeedsRender()}resize(e){this._calculator.resize(e),this._setNeedsRender()}_setNeedsRender(){null!=this._image&&(this._needsRender=!0)}_clearEdges(){this._stepEdges=[],this._turnEdges=[],this._sphericalEdges=[],this._sequenceEdgeKeys=[]}_setEdges(t,i){this._stepEdges=[],this._turnEdges=[],this._sphericalEdges=[],this._sequenceEdgeKeys=[];for(let i of t.edges){let t=i.data.direction;this._stepDirections.indexOf(t)>-1?this._stepEdges.push(i):this._turnDirections.indexOf(t)>-1?this._turnEdges.push(i):i.data.direction===e.NavigationDirection.Spherical&&this._sphericalEdges.push(i)}if(this._distinguishSequence&&null!=i){let e=this._sphericalEdges.concat(this._stepEdges).concat(this._turnEdges);for(let t of e){let e=t.target;for(let t of i.imageIds)if(t===e){this._sequenceEdgeKeys.push(e);break}}}}_createSphericalArrows(e,t){let i=[];for(let n of this._sphericalEdges)i.push(this._createVNodeByKey(e,n.target,n.data.worldMotionAzimuth,t,this._calculator.outerRadius,"mapillary-direction-arrow-spherical"));for(let n of this._stepEdges)i.push(this._createSphericalToPerspectiveArrow(e,n.target,n.data.worldMotionAzimuth,t,n.data.direction));return i}_createSphericalToPerspectiveArrow(t,i,n,r,s){let a=Math.PI/8,o=r.phi;switch(s){case e.NavigationDirection.StepBackward:o=r.phi-Math.PI;break;case e.NavigationDirection.StepLeft:o=r.phi+Math.PI/2;break;case e.NavigationDirection.StepRight:o=r.phi-Math.PI/2}return Math.abs(this._spatial.wrapAngle(n-o))<a?this._createVNodeByKey(t,i,n,r,this._calculator.outerRadius,"mapillary-direction-arrow-step"):this._createVNodeInactive(i,n,r)}_createPerspectiveToSphericalArrows(e,t){let i=[];for(let n of this._sphericalEdges)i.push(this._createVNodeByKey(e,n.target,n.data.worldMotionAzimuth,t,this._calculator.innerRadius,"mapillary-direction-arrow-spherical",!0));return i}_createStepArrows(e,t){let i=[];for(let n of this._stepEdges)i.push(this._createVNodeByDirection(e,n.target,n.data.worldMotionAzimuth,t,n.data.direction));return i}_createTurnArrows(e){let t=[];for(let i of this._turnEdges){let n=i.data.direction,r=this._turnNames[n];t.push(this._createVNodeByTurn(e,i.target,r,n))}return t}_createVNodeByKey(e,t,i,n,r,s,a){return this._createVNode(t,i,n,r,s,"mapillary-direction-circle",(i=>{e.moveTo$(t).subscribe(void 0,(e=>{e instanceof uf||console.error(e)}))}),a)}_createVNodeByDirection(e,t,i,n,r){return this._createVNode(t,i,n,this._calculator.outerRadius,"mapillary-direction-arrow-step","mapillary-direction-circle",(t=>{e.moveDir$(r).subscribe(void 0,(e=>{e instanceof uf||console.error(e)}))}))}_createVNodeByTurn(t,i,n,r){let s={height:this._calculator.turnCircleSizeCss,transform:"rotate(0)",width:this._calculator.turnCircleSizeCss};switch(r){case e.NavigationDirection.TurnLeft:s.left="5px",s.top="5px";break;case e.NavigationDirection.TurnRight:s.right="5px",s.top="5px";break;case e.NavigationDirection.TurnU:s.left="5px",s.bottom="5px"}let a={attributes:{"data-id":i},onclick:e=>{t.moveDir$(r).subscribe(void 0,(e=>{e instanceof uf||console.error(e)}))},style:s},o="mapillary-direction-turn-circle";this._sequenceEdgeKeys.indexOf(i)>-1&&(o+="-sequence"),this._highlightKey===i&&(o+="-highlight");let h=tf.h(`div.${n}`,{},[]);return tf.h("div."+o,a,[h])}_createVNodeInactive(e,t,i){return this._createVNode(e,t,i,this._calculator.outerRadius,"mapillary-direction-arrow-inactive","mapillary-direction-circle-inactive")}_createVNode(e,t,i,n,r,s,a,o){let h=this._calculator.angleToCoordinates(t-i.phi),c=Math.round(-n*h[1]+.5*this._calculator.containerWidth),l=Math.round(-n*h[0]+.5*this._calculator.containerHeight),u=this._calculator.relativeAngleToCoordiantes(t,i.phi),d=this._calculator.shadowOffset,p=`drop-shadow(${-d*u[1]}px ${d*u[0]}px 1px rgba(0,0,0,0.8))`,m={style:{"-webkit-filter":p,filter:p}},f=tf.h("div."+r,m,[]),g=-this._spatial.radToDeg(t-i.phi),_=o?`translate(${c}px, ${l}px) rotate(${g}deg) translateZ(-0.01px)`:`translate(${c}px, ${l}px) rotate(${g}deg)`,v={attributes:{"data-id":e},onclick:a,style:{height:this._calculator.stepCircleSizeCss,marginLeft:this._calculator.stepCircleMarginCss,marginTop:this._calculator.stepCircleMarginCss,transform:_,width:this._calculator.stepCircleSizeCss}};return this._sequenceEdgeKeys.indexOf(e)>-1&&(s+="-sequence"),this._highlightKey===e&&(s+="-highlight"),tf.h("div."+s,v,[f])}_getContainer(e,t,i){let n=this._isEdge?"rotateX(60deg)":`perspective(${this._calculator.containerWidthCss}) rotateX(60deg)`,r={oncontextmenu:e=>{e.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 tf.h("div.mapillary-direction-perspective",r,t.concat(e))}}class mf extends sf{constructor(e,t,i,n){super(e,t,i),this._renderer=n||new pf(this.defaultConfiguration,{height:t.container.offsetHeight,width:t.container.offsetWidth}),this._hoveredIdSubject$=new j,this._hoveredId$=this._hoveredIdSubject$.pipe(Dt())}fire(e,t){super.fire(e,t)}off(e,t){super.off(e,t)}on(e,t){super.on(e,t)}_activate(){const e=this._subscriptions;e.push(this._configuration$.subscribe((e=>{this._renderer.setConfiguration(e)}))),e.push(this._container.renderService.size$.subscribe((e=>{this._renderer.resize(e)}))),e.push(this._navigator.stateService.currentImage$.pipe(Ut((e=>{this._container.domRenderer.render$.next({name:this._name,vNode:tf.h("div",{},[])}),this._renderer.setImage(e)})),Vt(this._configuration$),zt((([e,t])=>Ve(e.spatialEdges$,t.distinguishSequence?this._navigator.graphService.cacheSequence$(e.sequenceId).pipe(ct((t=>(console.error(`Failed to cache sequence (${e.sequenceId})`,t),Ce(null))))):Ce(null))))).subscribe((([e,t])=>{this._renderer.setEdges(e,t)}))),e.push(this._container.renderService.renderCameraFrame$.pipe(Ut((e=>{this._renderer.setRenderCamera(e)})),De((()=>this._renderer)),st((e=>e.needsRender)),De((e=>({name:this._name,vNode:e.render(this._navigator)})))).subscribe(this._container.domRenderer.render$)),e.push(Ve(this._container.domRenderer.element$,this._container.renderService.renderCamera$,this._container.mouseService.mouseMove$.pipe(Ot(null)),this._container.mouseService.mouseUp$.pipe(Ot(null))).pipe(De((([e])=>{let t=e.getElementsByClassName("mapillary-direction-perspective");for(let e=0;e<t.length;e++){let i=t.item(e).querySelector(":hover");if(null!=i&&i.hasAttribute("data-id"))return i.getAttribute("data-id")}return null})),vt()).subscribe(this._hoveredIdSubject$)),e.push(this._hoveredId$.subscribe((e=>{const t="hover",i={id:e,target:this,type:t};this.fire(t,i)})))}_deactivate(){this._subscriptions.unsubscribe()}_getDefaultConfiguration(){return{distinguishSequence:!1,maxWidth:460,minWidth:260}}}mf.componentName="direction";class ff{}ff.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"},ff.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"},ff.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"},ff.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"},ff.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"},ff.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"},ff.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"},ff.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 gf{constructor(e,t){this._imagePlaneDepth=null!=e?e:200,this._imageSphereRadius=null!=t?t:200}createMesh(e,t){return $u(t.cameraType)?this._createImageSphere(e,t):ku(t.cameraType)?this._createImagePlaneFisheye(e,t):this._createImagePlane(e,t)}createFlatMesh(e,t,i,n,r,s){let a=this._createTexture(e.image),o=this._createDistortedPlaneMaterialParameters(t,a),h=new as(o),c=this._getFlatImagePlaneGeoFromBasic(t,i,n,r,s);return new es(c,h)}createCurtainMesh(e,t){return $u(t.cameraType)?this._createSphereCurtainMesh(e,t):ku(t.cameraType)?this._createCurtainMeshFisheye(e,t):this._createCurtainMesh(e,t)}createDistortedCurtainMesh(e,t){return this._createDistortedCurtainMesh(e,t)}_createCurtainMesh(e,t){let i=this._createTexture(e.image),n=this._createCurtainPlaneMaterialParameters(t,i),r=new as(n),s=this._useMesh(t,e)?this._getImagePlaneGeo(t,e):this._getRegularFlatImagePlaneGeo(t);return new es(s,r)}_createCurtainMeshFisheye(e,t){let i=this._createTexture(e.image),n=this._createCurtainPlaneMaterialParametersFisheye(t,i),r=new as(n),s=this._useMesh(t,e)?this._getImagePlaneGeoFisheye(t,e):this._getRegularFlatImagePlaneGeo(t);return new es(s,r)}_createDistortedCurtainMesh(e,t){let i=this._createTexture(e.image),n=this._createDistortedCurtainPlaneMaterialParameters(t,i),r=new as(n),s=this._getRegularFlatImagePlaneGeo(t);return new es(s,r)}_createSphereCurtainMesh(e,t){let i=this._createTexture(e.image),n=this._createCurtainSphereMaterialParameters(t,i),r=new as(n);return this._useMesh(t,e)?new es(this._getImageSphereGeo(t,e),r):new es(this._getFlatImageSphereGeo(t),r)}_createImageSphere(e,t){let i=this._createTexture(e.image),n=this._createSphereMaterialParameters(t,i),r=new as(n);return this._useMesh(t,e)?new es(this._getImageSphereGeo(t,e),r):new es(this._getFlatImageSphereGeo(t),r)}_createImagePlane(e,t){let i=this._createTexture(e.image),n=this._createPlaneMaterialParameters(t,i),r=new as(n),s=this._useMesh(t,e)?this._getImagePlaneGeo(t,e):this._getRegularFlatImagePlaneGeo(t);return new es(s,r)}_createImagePlaneFisheye(e,t){let i=this._createTexture(e.image),n=this._createPlaneMaterialParametersFisheye(t,i),r=new as(n),s=this._useMesh(t,e)?this._getImagePlaneGeoFisheye(t,e):this._getRegularFlatImagePlaneGeoFisheye(t);return new es(s,r)}_createSphereMaterialParameters(e,t){return{depthWrite:!1,fragmentShader:ff.spherical.fragment,side:2,transparent:!0,uniforms:{opacity:{value:1},projectorMat:{value:e.rt},projectorTex:{value:t}},vertexShader:ff.spherical.vertex}}_createCurtainSphereMaterialParameters(e,t){return{depthWrite:!1,fragmentShader:ff.sphericalCurtain.fragment,side:2,transparent:!0,uniforms:{curtain:{value:1},opacity:{value:1},projectorMat:{value:e.rt},projectorTex:{value:t}},vertexShader:ff.sphericalCurtain.vertex}}_createPlaneMaterialParameters(e,t){return{depthWrite:!1,fragmentShader:ff.perspective.fragment,side:2,transparent:!0,uniforms:{focal:{value:e.focal},k1:{value:e.ck1},k2:{value:e.ck2},opacity:{value:1},projectorMat:{value:e.basicRt},projectorTex:{value:t},radial_peak:{value:e.radialPeak?e.radialPeak:0},scale_x:{value:Math.max(e.basicHeight,e.basicWidth)/e.basicWidth},scale_y:{value:Math.max(e.basicWidth,e.basicHeight)/e.basicHeight}},vertexShader:ff.perspective.vertex}}_createPlaneMaterialParametersFisheye(e,t){return{depthWrite:!1,fragmentShader:ff.fisheye.fragment,side:2,transparent:!0,uniforms:{focal:{value:e.focal},k1:{value:e.ck1},k2:{value:e.ck2},opacity:{value:1},projectorMat:{value:e.basicRt},projectorTex:{value:t},radial_peak:{value:e.radialPeak?e.radialPeak:0},scale_x:{value:Math.max(e.basicHeight,e.basicWidth)/e.basicWidth},scale_y:{value:Math.max(e.basicWidth,e.basicHeight)/e.basicHeight}},vertexShader:ff.fisheye.vertex}}_createCurtainPlaneMaterialParametersFisheye(e,t){return{depthWrite:!1,fragmentShader:ff.fisheyeCurtain.fragment,side:2,transparent:!0,uniforms:{curtain:{value:1},focal:{value:e.focal},k1:{value:e.ck1},k2:{value:e.ck2},opacity:{value:1},projectorMat:{value:e.basicRt},projectorTex:{value:t},radial_peak:{value:e.radialPeak?e.radialPeak:0},scale_x:{value:Math.max(e.basicHeight,e.basicWidth)/e.basicWidth},scale_y:{value:Math.max(e.basicWidth,e.basicHeight)/e.basicHeight}},vertexShader:ff.fisheyeCurtain.vertex}}_createCurtainPlaneMaterialParameters(e,t){return{depthWrite:!1,fragmentShader:ff.perspectiveCurtain.fragment,side:2,transparent:!0,uniforms:{curtain:{value:1},focal:{value:e.focal},k1:{value:e.ck1},k2:{value:e.ck2},opacity:{value:1},projectorMat:{value:e.basicRt},projectorTex:{value:t},radial_peak:{value:e.radialPeak?e.radialPeak:0},scale_x:{value:Math.max(e.basicHeight,e.basicWidth)/e.basicWidth},scale_y:{value:Math.max(e.basicWidth,e.basicHeight)/e.basicHeight}},vertexShader:ff.perspectiveCurtain.vertex}}_createDistortedCurtainPlaneMaterialParameters(e,t){return{depthWrite:!1,fragmentShader:ff.perspectiveDistortedCurtain.fragment,side:2,transparent:!0,uniforms:{curtain:{value:1},opacity:{value:1},projectorMat:{value:e.projectorMatrix()},projectorTex:{value:t}},vertexShader:ff.perspectiveDistortedCurtain.vertex}}_createDistortedPlaneMaterialParameters(e,t){return{depthWrite:!1,fragmentShader:ff.perspectiveDistorted.fragment,side:2,transparent:!0,uniforms:{opacity:{value:1},projectorMat:{value:e.projectorMatrix()},projectorTex:{value:t}},vertexShader:ff.perspectiveDistorted.vertex}}_createTexture(e){let t=new Wi(e);return t.minFilter=Kt,t.needsUpdate=!0,t}_useMesh(e,t){return t.mesh.vertices.length&&e.hasValidScale}_getImageSphereGeo(e,t){const i=e.srtInverse;let n=5*e.scale,r=this._imageSphereRadius*e.scale,s=t.mesh.vertices,a=s.length/3,o=new Float32Array(s.length);for(let e=0;e<a;++e){let t=3*e,a=s[t+0],h=s[t+1],c=s[t+2],l=Math.sqrt(a*a+h*h+c*c),u=Math.max(n,Math.min(l,r))/l,d=new Ki(a*u,h*u,c*u);d.applyMatrix4(i),o[t+0]=d.x,o[t+1]=d.y,o[t+2]=d.z}let h=t.mesh.faces,c=new Uint16Array(h.length);for(let e=0;e<h.length;++e)c[e]=h[e];let l=new kr;return l.setAttribute("position",new Tr(o,3)),l.setIndex(new Tr(c,1)),l}_getImagePlaneGeo(e,t){const i=e.srtInverse;let n=5*e.scale,r=this._imagePlaneDepth*e.scale,s=t.mesh.vertices,a=s.length/3,o=new Float32Array(s.length);for(let e=0;e<a;++e){let t=3*e,a=s[t+0],h=s[t+1],c=s[t+2];e<4&&(a*=3,h*=3);let l=Math.max(n,Math.min(c,r)),u=l/c,d=new Ki(a*u,h*u,l);d.applyMatrix4(i),o[t+0]=d.x,o[t+1]=d.y,o[t+2]=d.z}let h=t.mesh.faces,c=new Uint16Array(h.length);for(let e=0;e<h.length;++e)c[e]=h[e];let l=new kr;return l.setAttribute("position",new Tr(o,3)),l.setIndex(new Tr(c,1)),l}_getImagePlaneGeoFisheye(e,t){const i=e.srtInverse;let n=5*e.scale,r=this._imagePlaneDepth*e.scale,s=t.mesh.vertices,a=s.length/3,o=new Float32Array(s.length);for(let e=0;e<a;++e){let t=3*e,a=s[t+0],h=s[t+1],c=s[t+2],l=Math.sqrt(a*a+h*h+c*c),u=Math.max(n,Math.min(l,r))/l,d=new Ki(a*u,h*u,c*u);d.applyMatrix4(i),o[t+0]=d.x,o[t+1]=d.y,o[t+2]=d.z}let h=t.mesh.faces,c=new Uint16Array(h.length);for(let e=0;e<h.length;++e)c[e]=h[e];let l=new kr;return l.setAttribute("position",new Tr(o,3)),l.setIndex(new Tr(c,1)),l}_getFlatImageSphereGeo(e){const t=new nl(this._imageSphereRadius,20,40),i=e.rt.clone().invert();return t.applyMatrix4(i),t}_getRegularFlatImagePlaneGeo(e){let t=e.width,i=e.height,n=Math.max(t,i),r=t/2/n,s=i/2/n;return this._getFlatImagePlaneGeo(e,r,s)}_getFlatImagePlaneGeo(e,t,i){let n=[];return n.push(e.unprojectSfM([-t,-i],this._imagePlaneDepth)),n.push(e.unprojectSfM([t,-i],this._imagePlaneDepth)),n.push(e.unprojectSfM([t,i],this._imagePlaneDepth)),n.push(e.unprojectSfM([-t,i],this._imagePlaneDepth)),this._createFlatGeometry(n)}_getRegularFlatImagePlaneGeoFisheye(e){let t=e.width,i=e.height,n=Math.max(t,i),r=t/2/n,s=i/2/n;return this._getFlatImagePlaneGeoFisheye(e,r,s)}_getFlatImagePlaneGeoFisheye(e,t,i){let n=[];return n.push(e.unprojectSfM([-t,-i],this._imagePlaneDepth)),n.push(e.unprojectSfM([t,-i],this._imagePlaneDepth)),n.push(e.unprojectSfM([t,i],this._imagePlaneDepth)),n.push(e.unprojectSfM([-t,i],this._imagePlaneDepth)),this._createFlatGeometry(n)}_getFlatImagePlaneGeoFromBasic(e,t,i,n,r){let s=[];return s.push(e.unprojectBasic([t,n],this._imagePlaneDepth)),s.push(e.unprojectBasic([i,n],this._imagePlaneDepth)),s.push(e.unprojectBasic([i,r],this._imagePlaneDepth)),s.push(e.unprojectBasic([t,r],this._imagePlaneDepth)),this._createFlatGeometry(s)}_createFlatGeometry(e){let t=new Float32Array(12);for(let i=0;i<e.length;i++){let n=3*i;t[n+0]=e[i][0],t[n+1]=e[i][1],t[n+2]=e[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 kr;return n.setAttribute("position",new Tr(t,3)),n.setIndex(new Tr(i,1)),n}}class _f{constructor(){this._planes={},this._planesOld={},this._planesPeriphery={},this._scene=new ch,this._sceneOld=new ch,this._scenePeriphery=new ch}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(e){this._dispose(this._planesOld,this.sceneOld);for(const e in this._planes){if(!this._planes.hasOwnProperty(e))continue;const t=this._planes[e];this._scene.remove(t),this._sceneOld.add(t)}for(const t in e)e.hasOwnProperty(t)&&this._scene.add(e[t]);this._planesOld=this._planes,this._planes=e}addImagePlanes(e){for(const t in e){if(!e.hasOwnProperty(t))continue;const i=e[t];this._scene.add(i),this._planes[t]=i}}addImagePlanesOld(e){for(const t in e){if(!e.hasOwnProperty(t))continue;const i=e[t];this._sceneOld.add(i),this._planesOld[t]=i}}setImagePlanes(e){this._clear(),this.addImagePlanes(e)}addPeripheryPlanes(e){for(const t in e){if(!e.hasOwnProperty(t))continue;const i=e[t];this._scenePeriphery.add(i),this._planesPeriphery[t]=i}}setPeripheryPlanes(e){this._clearPeriphery(),this.addPeripheryPlanes(e)}setImagePlanesOld(e){this._clearOld(),this.addImagePlanesOld(e)}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(e,t){for(const i in e){if(!e.hasOwnProperty(i))continue;const n=e[i];t.remove(n),n.geometry.dispose(),n.material.dispose();let r=n.material.uniforms.projectorTex.value;null!=r&&r.dispose()}}}class vf{constructor(){this._factory=new gf,this._scene=new _f,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(e,t){const i=this._factory.createMesh(e,t),n={};n[e.id]=i,this._scene.addPeripheryPlanes(n),this._needsRender=!0}clearPeripheryPlanes(){this._scene.setPeripheryPlanes({}),this._needsRender=!0}updateFrame(e){this._updateFrameId(e.id),this._needsRender=this._updateAlpha(e.state.alpha)||this._needsRender,this._needsRender=this._updateAlphaOld(e.state.alpha)||this._needsRender,this._needsRender=this._updateImagePlanes(e.state)||this._needsRender}setTextureProvider(e,t){if(e!==this._currentKey)return;let i=t.textureCreated$.subscribe((e=>{this._updateTexture(e)})),n=t.textureUpdated$.subscribe((e=>{this._needsRender=!0}));if(e in this._providerDisposers){(0,this._providerDisposers[e])(),delete this._providerDisposers[e]}this._providerDisposers[e]=()=>{i.unsubscribe(),n.unsubscribe(),t.dispose()}}updateTextureImage(e,t){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!==t.id)continue;let r=i[n].material.uniforms.projectorTex.value;r.image=e,r.needsUpdate=!0}}render(e,t){const i=this._scene.planes,n=this._scene.planesOld,r=this._scene.planesPeriphery,s=Object.keys(n).length?1:this._alpha,a=Object.keys(n).length?1:Math.floor(this._alpha);for(const e in i){if(!i.hasOwnProperty(e))continue;i[e].material.uniforms.opacity.value=s}for(const e in n){if(!n.hasOwnProperty(e))continue;n[e].material.uniforms.opacity.value=this._alphaOld}for(const e in r){if(!r.hasOwnProperty(e))continue;r[e].material.uniforms.opacity.value=a}t.render(this._scene.scenePeriphery,e),t.render(this._scene.scene,e),t.render(this._scene.sceneOld,e);for(const e in i){if(!i.hasOwnProperty(e))continue;i[e].material.uniforms.opacity.value=this._alpha}t.render(this._scene.scene,e)}clearNeedsRender(){this._needsRender=!1}dispose(){this._scene.clear()}_updateFrameId(e){this._frameId=e}_updateAlpha(e){return e!==this._alpha&&(this._alpha=e,!0)}_updateAlphaOld(e){return!(e<1||0===this._alphaOld)&&(this._alphaOld=Math.max(0,this._alphaOld-this._fadeOutSpeed),!0)}_updateImagePlanes(e){if(null==e.currentImage||e.currentImage.id===this._currentKey)return!1;let t=null!=e.previousImage?e.previousImage.id:null,i=e.currentImage.id;if(this._previousKey!==t&&this._previousKey!==i&&this._previousKey in this._providerDisposers){(0,this._providerDisposers[this._previousKey])(),delete this._providerDisposers[this._previousKey]}if(null!=t){if(t!==this._currentKey&&t!==this._previousKey){let i=this._factory.createMesh(e.previousImage,e.previousTransform);const n={};n[t]=i,this._scene.updateImagePlanes(n)}this._previousKey=t}this._currentKey=i;let n=this._factory.createMesh(e.currentImage,e.currentTransform);const r={};return r[i]=n,this._scene.updateImagePlanes(r),this._alphaOld=1,!0}_updateTexture(e){this._needsRender=!0;const t=this._scene.planes;for(const i in t){if(!t.hasOwnProperty(i))continue;let n=t[i].material,r=n.uniforms.projectorTex.value;n.uniforms.projectorTex.value=null,r.dispose(),n.uniforms.projectorTex.value=e}}_extend(e,...t){for(const i of t)for(const t in i)i.hasOwnProperty(t)&&(e[t]=i[t]);return e}}var yf;!function(e){e[e.Background=0]="Background",e[e.Opaque=1]="Opaque"}(yf||(yf={}));class bf{constructor(e){this._api=e,this._urls$=new Map}getImage$(e){let t;const i=new Promise(((e,i)=>{t=i}));return[k.create((n=>{this._api.data.getImageBuffer(e,i).then((e=>{t=null;const i=new Image;i.crossOrigin="Anonymous",i.onload=()=>{window.URL.revokeObjectURL(i.src),n.next(i),n.complete()},i.onerror=()=>{t=null,window.URL.revokeObjectURL(i.src),n.error(new Error("Failed to load image tile"))};const r=new Blob([e]);i.src=window.URL.createObjectURL(r)}),(e=>{t=null,n.error(e)}))})),()=>{t&&t()}]}getURLs$(e,t){const i=this._inventId(e,t);if(this._urls$.has(i))return this._urls$.get(i);const n={imageId:e,z:t},r=this._api.getImageTiles$(n).pipe(De((e=>e.node)),Mt((()=>{this._urls$.delete(i)})),It(),U());return this._urls$.set(i,r),r}_inventId(e,t){return`${e}-${t}`}}class xf{constructor(){this._tiles=new Map,this._urlLevels=new Set,this._urls=new Map}add(e,t){if(this._tiles.has(e))throw new Error(`Image tile already stored (${e})`);this._tiles.set(e,t)}addURLs(e,t){const i=this._urls;for(const e of t){const t=this.inventId(e);if(this._urls.has(t))throw new Error(`URL already stored (${t})`);i.set(t,e.url)}this._urlLevels.add(e)}dispose(){this._tiles.forEach((e=>window.URL.revokeObjectURL(e.src))),this._tiles.clear(),this._urls.clear(),this._urlLevels.clear()}get(e){return this._tiles.get(e)}getURL(e){return this._urls.get(e)}has(e){return this._tiles.has(e)}hasURL(e){return this._urls.has(e)}hasURLLevel(e){return this._urlLevels.has(e)}inventId(e){return`${e.z}-${e.x}-${e.y}`}}class wf{constructor(){this._viewportCoords=new hf}computeRegionOfInterest(e,t,i){const n=this._viewportBoundaryPoints(4),r=this._viewportPointsBoundingBox(n,e,i);this._clipBoundingBox(r);const s=2/t.width,a=2/t.height,o=[[-.5*s,.5*a],[.5*s,.5*a],[.5*s,-.5*a],[-.5*s,-.5*a]],h=this._viewportPointsBoundingBox(o,e,i),c=h.minX<h.maxX;return{bbox:r,pixelHeight:h.maxY-h.minY,pixelWidth:h.maxX-h.minX+(c?0:1)}}_viewportBoundaryPoints(e){const t=[],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],a=n[r];for(let i=0;i<e;++i)t.push([s[0]+a[0]*i/e,s[1]+a[1]*i/e])}return t}_viewportPointsBoundingBox(e,t,i){const n=e.map((e=>this._viewportCoords.viewportToBasic(e[0],e[1],i,t.perspective)));return $u(i.cameraType)?this._boundingBoxSpherical(n):this._boundingBox(n)}_boundingBox(e){const t={maxX:Number.NEGATIVE_INFINITY,maxY:Number.NEGATIVE_INFINITY,minX:Number.POSITIVE_INFINITY,minY:Number.POSITIVE_INFINITY};for(let i=0;i<e.length;++i)t.minX=Math.min(t.minX,e[i][0]),t.maxX=Math.max(t.maxX,e[i][0]),t.minY=Math.min(t.minY,e[i][1]),t.maxY=Math.max(t.maxY,e[i][1]);return t}_boundingBoxSpherical(e){const t=[],i=[];for(let n=0;n<e.length;++n)t.push(e[n][0]),i.push(e[n][1]);t.sort(((e,t)=>this._sign(e-t))),i.sort(((e,t)=>this._sign(e-t)));const n=this._intervalSpherical(t);return{maxX:n[1],maxY:i[i.length-1],minX:n[0],minY:i[0]}}_intervalSpherical(e){let t=0,i=-1;for(let n=0;n<e.length-1;++n){const r=e[n+1]-e[n];r>t&&(t=r,i=n)}return e[0]+1-e[e.length-1]>t?[e[0],e[e.length-1]]:[e[i+1],e[i]]}_clipBoundingBox(e){e.minX=Math.max(0,Math.min(1,e.minX)),e.maxX=Math.max(0,Math.min(1,e.maxX)),e.minY=Math.max(0,Math.min(1,e.minY)),e.maxY=Math.max(0,Math.min(1,e.maxY))}_sign(e){return e>0?1:e<0?-1:0}}function Mf(e,t,i){return Math.max(t,Math.min(i,e))}function Sf(e){return 1024/Tf(e)}function Tf(e){return Math.pow(2,e.z-e.max)}function Cf(e){return Math.ceil(function(e){const t=Math.max(e.w,e.h);return Math.log(t)/Math.log(2)}(e))}function Ef(e,t,i){const n=Sf(i),r=t.w,s=t.h,a=Math.ceil(r/n)-1,o=Math.ceil(s/n)-1;return{x:Mf(Math.floor(r*e[0]/n),0,a),y:Mf(Math.floor(s*e[1]/n),0,o)}}function Af(e,t,i){const n=1024*(1/Tf(i)),r=n*e.x,s=n*e.y,a=Math.min(n,t.w-r);return{h:Math.min(n,t.h-s),x:r,y:s,w:a}}function If(e,t,i){return i*e<=t&&t<i*(e+1)}function Rf(e,t){if(e.z===t.z)return e.x===t.x&&e.y===t.y;const i=e.z<t.z?e:t,n=e.z<t.z?t:e,r=1/Tf({max:n.z,z:i.z}),s=If(i.x,n.x,r),a=If(i.y,n.y,r);return s&&a}function Pf(e){return e.w>0&&e.h>0}class Lf{constructor(e,t,i,n,r,s,a){const o={h:i,w:t};Pf(o)||console.warn(`Original image size (${t}, ${i}) is invalid (${e}). Tiles will not be loaded.`),this._imageId=e,this._size=o,this._level={max:Cf(this._size),z:-1},this._holder=new rf,this._updated$=new j,this._createdSubject$=new j,this._created$=this._createdSubject$.pipe(Rt(1),U()),this._holder.push(this._created$.subscribe((()=>{}))),this._hasSubject$=new j,this._has$=this._hasSubject$.pipe(Ot(!1),Rt(1),U()),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=a,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((e=>e.unsubscribe())),this._subscriptions.clear();for(const e of this._aborts)e();this._aborts=[]}dispose(){this._disposed?console.warn(`Texture already disposed (${this._imageId})`):(this._urlSubscriptions.forEach((e=>e.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(e){if(!Pf(this._size))return;const t=1/e.pixelWidth,i=function(e,t,i){return Math.max(t,Math.min(i,Cf(e)))}({h:1/e.pixelHeight,w:t},11,this._level.max);i!==this._level.z&&(this.abort(),this._level.z=i,this._renderedLevel.clear(),this._rendered.forEach(((e,t)=>{e.z===i&&this._renderedLevel.add(t)}))),null==this._render&&this._initRender();const n=function(e,t,i,n){const r=[];if(e.x>t.x){const s=Sf(n),a=Math.ceil(i.w/s)-1;for(let t=e.x;t<=a;t++)r.push(t);for(let e=0;e<=t.x;e++)r.push(e)}else for(let i=e.x;i<=t.x;i++)r.push(i);const s=[];for(const i of r)for(let n=e.y;n<=t.y;n++)s.push({x:i,y:n});return s}(Ef([e.bbox.minX,e.bbox.minY],this._size,this._level),Ef([e.bbox.maxX,e.bbox.maxY],this._size,this._level),this._size,this._level);this._fetchTiles(i,n)}_fetchTile(e){const t=this._loader.getImage$(e.url),i=t[0],n=t[1];this._aborts.push(n);const r=this._store.inventId(e),s=i.subscribe((t=>{const i=Af(e,this._size,this._level);this._renderToTarget(i,t),this._subscriptions.delete(r),this._removeFromArray(n,this._aborts),this._markRendered(e),this._store.add(r,t),this._updated$.next(!0)}),(e=>{this._subscriptions.delete(r),this._removeFromArray(n,this._aborts),console.error(e)}));s.closed||this._subscriptions.set(r,s)}_fetchTiles(e,t){const i=(this._store.hasURLLevel(e)?Ce(void 0):this._loader.getURLs$(this._imageId,e).pipe(Ut((t=>{this._store.hasURLLevel(e)||this._store.addURLs(e,t)})))).subscribe((()=>{if(e===this._level.z){for(const i of t){const t={x:i.x,y:i.y,z:e,url:null},n=this._store.inventId(t);if(!this._renderedLevel.has(n)&&!this._subscriptions.has(n))if(this._store.has(n)){const e=Af(i,this._size,this._level);this._renderToTarget(e,this._store.get(n)),this._markRendered(t),this._updated$.next(!0)}else t.url=this._store.getURL(n),this._fetchTile(t)}this._urlSubscriptions.delete(e)}}),(t=>{this._urlSubscriptions.delete(e),console.error(t)}));i.closed||this._urlSubscriptions.set(e,i)}_initRender(){const e=this._size.w/2,t=this._size.h/2,i=new Ls(-e,e,t,-t,-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),a=r>s?1:r/s,o=Math.floor(a*this._size.w),h=Math.floor(a*this._size.h),c=new Zi(o,h,{depthBuffer:!1,format:ai,magFilter:Kt,minFilter:Kt,stencilBuffer:!1});this._render={camera:i,target:c};const l=Af({x:0,y:0},this._size,{max:this._level.max,z:0});this._renderToTarget(l,this._background),this._createdSubject$.next(c.texture),this._hasSubject$.next(!0)}_markRendered(e){const t=Array.from(this._rendered.entries()).filter((([t,i])=>i.z!==e.z));for(const[i,n]of t)Rf(e,n)&&this._rendered.delete(i);const i=this._store.inventId(e);this._rendered.set(i,e),this._renderedLevel.add(i)}_removeFromArray(e,t){const i=t.indexOf(e);-1!==i&&t.splice(i,1)}_renderToTarget(e,t){const i=new Wi(t);i.minFilter=Kt,i.needsUpdate=!0;const n=new ws(e.w,e.h),r=new wr({map:i,side:0}),s=new es(n,r);s.position.x=-this._size.w/2+e.x+e.w/2,s.position.y=this._size.h/2-e.y-e.h/2;const a=new ch;a.add(s);const o=this._renderer.getRenderTarget();this._renderer.resetState(),this._renderer.setRenderTarget(this._render.target),this._renderer.render(a,this._render.camera),this._renderer.setRenderTarget(o),a.remove(s),n.dispose(),r.dispose(),i.dispose()}}var Df,Nf,$f,kf;!function(e){e[e.Custom=0]="Custom",e[e.Earth=1]="Earth",e[e.Traversing=2]="Traversing",e[e.Waiting=3]="Waiting",e[e.WaitingInteractively=4]="WaitingInteractively"}(Df||(Df={}));class Of extends sf{constructor(e,t,i){super(e,t,i),this._imageTileLoader=new bf(i.api),this._roiCalculator=new wf,this._rendererOperation$=new j,this._rendererCreator$=new j,this._rendererDisposer$=new j,this._renderer$=this._rendererOperation$.pipe(Lt(((e,t)=>t(e)),null),st((e=>null!=e)),vt(void 0,(e=>e.frameId))),this._rendererCreator$.pipe(De((()=>e=>{if(null!=e)throw new Error("Multiple image plane states can not be created at the same time");return new vf}))).subscribe(this._rendererOperation$),this._rendererDisposer$.pipe(De((()=>e=>(e.dispose(),null)))).subscribe(this._rendererOperation$)}_activate(){const e=this._subscriptions;e.push(this._renderer$.pipe(De((e=>{const t={name:this._name,renderer:{frameId:e.frameId,needsRender:e.needsRender,render:e.render.bind(e),pass:yf.Background}};return e.clearNeedsRender(),t}))).subscribe(this._container.glRenderer.render$)),this._rendererCreator$.next(null),e.push(this._navigator.stateService.currentState$.pipe(De((e=>t=>(t.updateFrame(e),t)))).subscribe(this._rendererOperation$));const t=this._container.configurationService.imageTiling$.pipe(zt((e=>e?this._navigator.stateService.currentState$:new j)),vt(void 0,(e=>e.state.currentImage.id)),Vt(this._container.glRenderer.webGLRenderer$),De((([e,t])=>{const i=e.state,n=i.currentImage,r=i.currentTransform;return new Lf(n.id,r.basicWidth,r.basicHeight,n.image,this._imageTileLoader,new xf,t)})),Rt(1),U());e.push(t.subscribe((()=>{}))),e.push(t.pipe(De((e=>t=>(t.setTextureProvider(e.id,e),t)))).subscribe(this._rendererOperation$)),e.push(t.pipe(At()).subscribe((e=>{e[0].abort()})));const i=this._container.configurationService.imageTiling$.pipe(zt((e=>e?Ve(this._navigator.stateService.state$,this._navigator.stateService.inTranslation$):new j)),zt((([e,t])=>(e===Df.Traversing||e===Df.Waiting||e===Df.WaitingInteractively)&&!t?this._container.renderService.renderCameraFrame$:ie())),De((e=>({camera:e,height:e.size.height.valueOf(),lookat:e.camera.lookat.clone(),width:e.size.width.valueOf(),zoom:e.zoom.valueOf()}))),At(),De((([e,t])=>{const i=e.width===t.width&&e.height===t.height&&e.zoom===t.zoom&&e.lookat.equals(t.lookat);return{camera:t.camera,stalled:i}})),vt(((e,t)=>e.stalled===t.stalled)),st((e=>e.stalled)),Vt(this._container.renderService.size$,this._navigator.stateService.currentTransform$));e.push(t.pipe(zt((e=>i.pipe(De((([t,i,n])=>{const r=t.camera,s=(new hf).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),e]})),st((e=>!!e))))),st((e=>!e[1].disposed))).subscribe((([e,t])=>{t.setRegionOfInterest(e)})));const n=t.pipe(zt((e=>e.hasTexture$)),Ot(!1),Rt(1),U());e.push(n.subscribe((()=>{}))),e.push(this._navigator.panService.panImages$.pipe(st((e=>0===e.length)),De((()=>e=>(e.clearPeripheryPlanes(),e)))).subscribe(this._rendererOperation$));const r=this._navigator.panService.panImages$.pipe(zt((e=>ge(e).pipe(We((([e,t])=>Ve(this._navigator.graphService.cacheImage$(e.id).pipe(ct((t=>(console.error(`Failed to cache periphery image (${e.id})`,t),ie())))),Ce(t))))))),Dt());e.push(r.pipe(De((([e,t])=>i=>(i.addPeripheryPlane(e,t),i)))).subscribe(this._rendererOperation$)),e.push(r.pipe(We((([e])=>e.cacheImage$().pipe(ct((()=>ie()))))),De((e=>t=>(t.updateTextureImage(e.image,e),t)))).subscribe(this._rendererOperation$));const s=this._navigator.stateService.currentState$.pipe(De((e=>e.state.alpha<1)),vt()),a=Ve(this._container.mouseService.active$,this._container.touchService.active$,this._navigator.stateService.inMotion$,s).pipe(De((([e,t,i,n])=>!(e||t||i||n))),st((e=>e)));e.push(this._navigator.stateService.state$.pipe(zt((e=>e===Df.Traversing?this._navigator.panService.panImages$:ie())),zt((e=>a.pipe(Vt(this._container.renderService.renderCamera$,this._navigator.stateService.currentImage$,this._navigator.stateService.currentTransform$),We((([,t,i,n])=>Ce([t,i,n,e])))))),zt((([e,t,i,n])=>{const r=e.camera.lookat.clone().sub(e.camera.position),s=[(new Du).viewingDirection(t.rotation).angleTo(r),void 0],a=(new hf).viewportToBasic(0,0,i,e.perspective);a[0]>=0&&a[0]<=1&&a[1]>=0&&a[1]<=1&&(s[0]=Number.NEGATIVE_INFINITY);for(const[e]of n){const t=(new Du).viewingDirection(e.rotation).angleTo(r);t<s[0]&&(s[0]=t,s[1]=e.id)}return s[1]?this._navigator.moveTo$(s[1]).pipe(ct((()=>ie()))):ie()}))).subscribe())}_deactivate(){this._rendererDisposer$.next(null),this._subscriptions.unsubscribe()}_getDefaultConfiguration(){return{}}}Of.componentName="image";class zf{constructor(e,t,i){this._component=e,this._container=t,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 Ff extends zf{_enable(){const t=this._navigator.stateService.currentImage$.pipe(zt((e=>e.sequenceEdges$)));this._keyDownSubscription=this._container.keyboardService.keyDown$.pipe(Vt(t)).subscribe((([t,i])=>{let n=null;switch(t.keyCode){case 38:n=e.NavigationDirection.Next;break;case 40:n=e.NavigationDirection.Prev;break;default:return}if(t.preventDefault(),t.altKey&&!t.shiftKey&&i.cached)for(const e of i.edges)if(e.data.direction===n)return void this._navigator.moveTo$(e.target).subscribe(void 0,(e=>{e instanceof uf||console.error(e)}))}))}_disable(){this._keyDownSubscription.unsubscribe()}_getConfiguration(e){return{keySequenceNavigation:e}}}class Bf extends zf{constructor(e,t,i,n){super(e,t,i),this._spatial=n}_enable(){const t=this._navigator.stateService.currentImage$.pipe(zt((e=>e.spatialEdges$)));this._keyDownSubscription=this._container.keyboardService.keyDown$.pipe(Vt(t,this._navigator.stateService.currentState$)).subscribe((([t,i,n])=>{let r=$u(n.state.currentImage.cameraType),s=null;switch(t.keyCode){case 37:s=t.shiftKey&&!r?e.NavigationDirection.TurnLeft:e.NavigationDirection.StepLeft;break;case 38:s=t.shiftKey&&!r?e.NavigationDirection.Spherical:e.NavigationDirection.StepForward;break;case 39:s=t.shiftKey&&!r?e.NavigationDirection.TurnRight:e.NavigationDirection.StepRight;break;case 40:s=t.shiftKey&&!r?e.NavigationDirection.TurnU:e.NavigationDirection.StepBackward;break;default:return}if(t.preventDefault(),!(t.altKey||!i.cached||t.shiftKey&&r))if(r){const t={};t[e.NavigationDirection.StepBackward]=Math.PI,t[e.NavigationDirection.StepForward]=0,t[e.NavigationDirection.StepLeft]=Math.PI/2,t[e.NavigationDirection.StepRight]=-Math.PI/2;const r=this._rotationFromCamera(n.state.camera).phi,a=this._spatial.wrapAngle(r+t[s]),o=Math.PI/4,h=i.edges.filter((t=>t.data.direction===e.NavigationDirection.Spherical||t.data.direction===s));let c=Number.MAX_VALUE,l=null;for(const e of h){const t=Math.abs(this._spatial.wrapAngle(e.data.worldMotionAzimuth-a));t<Math.min(c,o)&&(c=t,l=e.target)}if(null==l)return;this._moveTo(l)}else this._moveDir(s,i)}))}_disable(){this._keyDownSubscription.unsubscribe()}_getConfiguration(e){return{keySpatialNavigation:e}}_moveDir(e,t){for(const i of t.edges)if(i.data.direction===e)return void this._moveTo(i.target)}_moveTo(e){this._navigator.moveTo$(e).subscribe(void 0,(e=>{e instanceof uf||console.error(e)}))}_rotationFromCamera(e){let t=e.lookat.clone().sub(e.position),i=t.clone().dot(e.up),n=t.clone().sub(e.up.clone().multiplyScalar(i));return{phi:Math.atan2(n.y,n.x),theta:Math.PI/2-this._spatial.angleToPlane(t.toArray(),[0,0,1])}}}class Uf extends zf{constructor(e,t,i,n){super(e,t,i),this._viewportCoords=n}_enable(){this._keyDownSubscription=this._container.keyboardService.keyDown$.pipe(Vt(this._container.renderService.renderCamera$,this._navigator.stateService.currentTransform$)).subscribe((([e,t,i])=>{if(e.altKey||e.ctrlKey||e.metaKey)return;let n=0;switch(e.key){case"+":n=1;break;case"-":n=-1;break;default:return}e.preventDefault();const r=this._viewportCoords.unprojectFromViewport(0,0,t.perspective),s=i.projectBasic(r.toArray());this._navigator.stateService.zoomIn(n,s)}))}_disable(){this._keyDownSubscription.unsubscribe()}_getConfiguration(e){return{keyZoom:e}}}class Vf extends zf{_enable(){this._keyDownSubscription=this._container.keyboardService.keyDown$.pipe(Vt(this._navigator.playService.playing$,this._navigator.playService.direction$,this._navigator.playService.speed$,this._navigator.stateService.currentImage$.pipe(zt((e=>e.sequenceEdges$))),this._navigator.stateService.state$.pipe(De((e=>e===Df.Earth)),vt()))).subscribe((([t,i,n,r,s,a])=>{if(!(t.altKey||t.ctrlKey||t.metaKey)){switch(t.key){case"D":if(!t.shiftKey)return;const o=i?null:n===e.NavigationDirection.Next?e.NavigationDirection.Prev:n===e.NavigationDirection.Prev?e.NavigationDirection.Next:null;null!=o&&this._navigator.playService.setDirection(o);break;case" ":if(t.shiftKey)return;if(!a)if(i)this._navigator.playService.stop();else for(let e of s.edges)e.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}t.preventDefault()}}))}_disable(){this._keyDownSubscription.unsubscribe()}_getConfiguration(e){return{keyPlay:e}}}class Hf extends sf{constructor(e,t,i){super(e,t,i),this._keyPlayHandler=new Vf(this,t,i),this._keySequenceNavigationHandler=new Ff(this,t,i),this._keySpatialNavigationHandler=new Bf(this,t,i,new Du),this._keyZoomHandler=new Uf(this,t,i,new hf)}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((e=>{e.keyPlay?this._keyPlayHandler.enable():this._keyPlayHandler.disable(),e.keySequenceNavigation?this._keySequenceNavigationHandler.enable():this._keySequenceNavigationHandler.disable(),e.keySpatialNavigation?this._keySpatialNavigationHandler.enable():this._keySpatialNavigationHandler.disable(),e.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}}}Hf.componentName="keyboard";class jf{constructor(e,t){this._needsRender=!1,this._interactiveObjects=[],this._markers={},this._objectMarkers={},this._raycaster=t||new su,this._scene=e||new ch}get markers(){return this._markers}get needsRender(){return this._needsRender}add(e,t){e.id in this._markers&&this._dispose(e.id),e.createGeometry(t),this._scene.add(e.geometry),this._markers[e.id]=e;for(let t of e.getInteractiveObjects())this._interactiveObjects.push(t),this._objectMarkers[t.uuid]=e.id;this._needsRender=!0}clear(){for(const e in this._markers)this._markers.hasOwnProperty&&this._dispose(e);this._needsRender=!0}get(e){return this._markers[e]}getAll(){return Object.keys(this._markers).map((e=>this._markers[e]))}has(e){return e in this._markers}intersectObjects([e,t],i){this._raycaster.setFromCamera(new zi(e,t),i);const n=this._raycaster.intersectObjects(this._interactiveObjects);for(const e of n)if(e.object.uuid in this._objectMarkers)return this._objectMarkers[e.object.uuid];return null}lerpAltitude(e,t,i){e in this._markers&&(this._markers[e].lerpAltitude(t,i),this._needsRender=!0)}remove(e){e in this._markers&&(this._dispose(e),this._needsRender=!0)}render(e,t){t.render(this._scene,e),this._needsRender=!1}update(e,t,i){if(!(e in this._markers))return;this._markers[e].updatePosition(t,i),this._needsRender=!0}_dispose(e){const t=this._markers[e];this._scene.remove(t.geometry);for(let i of t.getInteractiveObjects()){const t=this._interactiveObjects.indexOf(i);-1!==t?this._interactiveObjects.splice(t,1):console.warn(`Object does not exist (${i.id}) for ${e}`),delete this._objectMarkers[i.uuid]}t.disposeGeometry(),delete this._markers[e]}}class Gf extends sf{constructor(e,t,i){super(e,t,i),this._graphCalculator=new Mu,this._markerScene=new jf,this._markerSet=new Vu,this._viewportCoords=new hf,this._relativeGroundAltitude=-2}add(e){this._markerSet.add(e)}fire(e,t){super.fire(e,t)}get(e){return this._markerSet.get(e)}getAll(){return this._markerSet.getAll()}getMarkerIdAt(e){return new Promise(((t,i)=>{this._container.renderService.renderCamera$.pipe(St(),De((t=>{const i=this._viewportCoords.canvasToViewport(e[0],e[1],this._container.container);return this._markerScene.intersectObjects(i,t.perspective)}))).subscribe((e=>{t(e)}),(e=>{i(e)}))}))}has(e){return this._markerSet.has(e)}off(e,t){super.off(e,t)}on(e,t){super.on(e,t)}remove(e){this._markerSet.remove(e)}removeAll(){this._markerSet.removeAll()}_activate(){const e=this._navigator.stateService.currentState$.pipe(De((e=>e.state.camera.position.z+this._relativeGroundAltitude)),vt(((e,t)=>Math.abs(e-t)<.01)),Rt(1),U()),t=Ve(e,this._navigator.stateService.reference$).pipe(St(),De((()=>{})),Rt(1),U()),i=this._configuration$.pipe(De((e=>({visibleBBoxSize:Math.max(1,Math.min(200,e.visibleBBoxSize))})))),n=this._navigator.stateService.currentImage$.pipe(De((e=>e.lngLat)),Rt(1),U()),r=Ve(i,n).pipe(De((([e,t])=>this._graphCalculator.boundingBoxCorners(t,e.visibleBBoxSize/2))),Rt(1),U()),s=Ve(Ze(Ce(this._markerSet),this._markerSet.changed$),r).pipe(De((([e,t])=>e.search(t)))),a=this._subscriptions;a.push(t.pipe(zt((()=>s.pipe(Vt(this._navigator.stateService.reference$,e))))).subscribe((([e,t,i])=>{const n=this._markerScene,r=n.markers,s=Object.assign({},r);for(const a of e)if(a.id in r)delete s[a.id];else{const e=_u(a.lngLat.lng,a.lngLat.lat,t.alt+i,t.lng,t.lat,t.alt);n.add(a,e)}for(const e in s)s.hasOwnProperty(e)&&n.remove(e)}))),a.push(t.pipe(zt((()=>this._markerSet.updated$.pipe(Vt(r,this._navigator.stateService.reference$,e))))).subscribe((([e,[t,i],n,r])=>{const s=this._markerScene;for(const a of e){const e=s.has(a.id),o=a.lngLat.lat>t.lat&&a.lngLat.lat<i.lat&&a.lngLat.lng>t.lng&&a.lngLat.lng<i.lng;if(o){const e=_u(a.lngLat.lng,a.lngLat.lat,n.alt+r,n.lng,n.lat,n.alt);s.add(a,e)}else!o&&e&&s.remove(a.id)}}))),a.push(this._navigator.stateService.reference$.pipe($t(1),Vt(e)).subscribe((([e,t])=>{const i=this._markerScene;for(const n of i.getAll()){const r=_u(n.lngLat.lng,n.lngLat.lat,e.alt+t,e.lng,e.lat,e.alt);i.update(n.id,r)}}))),a.push(e.pipe($t(1),Vt(this._navigator.stateService.reference$,n)).subscribe((([e,t,i])=>{const n=this._markerScene,r=_u(i.lng,i.lat,t.alt+e,t.lng,t.lat,t.alt);for(const i of n.getAll()){const s=_u(i.lngLat.lng,i.lngLat.lat,t.alt+e,t.lng,t.lat,t.alt),a=s[0]-r[0],o=s[1]-r[1],h=Math.sqrt(a*a+o*o);h>50||n.lerpAltitude(i.id,e,Math.min(1,Math.max(0,1.2-1.2*h/50)))}}))),a.push(this._navigator.stateService.currentState$.pipe(De((e=>{const t=this._markerScene;return{name:this._name,renderer:{frameId:e.id,needsRender:t.needsRender,render:t.render.bind(t),pass:yf.Opaque}}}))).subscribe(this._container.glRenderer.render$));const o=Ve(this._container.renderService.renderCamera$,this._container.mouseService.mouseMove$).pipe(De((([e,t])=>{const i=this._container.container,[n,r]=this._viewportCoords.canvasPosition(t,i),s=this._viewportCoords.canvasToViewport(n,r,i);return this._markerScene.intersectObjects(s,e.perspective)})),Rt(1),U()),h=this._container.mouseService.filtered$(this._name,this._container.mouseService.mouseDragStart$).pipe(De((()=>!0))),c=this._container.mouseService.filtered$(this._name,this._container.mouseService.mouseDragEnd$).pipe(De((()=>!1))),l=it(h,c).pipe(Ot(!1));a.push(it(h.pipe(Vt(o)),Ve(c,Ce(null))).pipe(Ot([!1,null]),At()).subscribe((([e,t])=>{const i=t[0],n=i?"markerdragstart":"markerdragend",r=i?t[1]:e[1],s={marker:this._markerScene.get(r),target:this,type:n};this.fire(n,s)})));const u=it(this._container.mouseService.mouseDown$.pipe(De((()=>!0))),this._container.mouseService.documentMouseUp$.pipe(De((()=>!1)))).pipe(Ot(!1));a.push(Ve(this._container.mouseService.active$,o.pipe(vt()),u,l).pipe(De((([e,t,i,n])=>!e&&null!=t&&i||n)),vt()).subscribe((e=>{e?(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(Vt(o,this._container.renderService.renderCamera$),De((([e,t,i])=>{const n=this._markerScene.get(t),r=this._container.container,[s,a]=this._viewportCoords.projectToCanvas(n.geometry.position.toArray(),r,i.perspective),[o,h]=this._viewportCoords.canvasPosition(e,r);return[n,[o-s,h-a],i]})),Rt(1),U());a.push(this._container.mouseService.filtered$(this._name,this._container.mouseService.mouseDrag$).pipe(Vt(d,this._navigator.stateService.reference$,i)).subscribe((([e,[t,i,n],r,s])=>{if(!this._markerScene.has(t.id))return;const a=this._container.container,[o,h]=this._viewportCoords.canvasPosition(e,a),c=o-i[0],l=h-i[1],[u,d]=this._viewportCoords.canvasToViewport(c,l,a),p=new Ki(u,d,1).unproject(n.perspective).sub(n.perspective.position).normalize(),m=Math.min(this._relativeGroundAltitude/p.z,s.visibleBBoxSize/2-.1);if(m<0)return;const f=p.clone().multiplyScalar(m).add(n.perspective.position);f.z=n.perspective.position.z+this._relativeGroundAltitude;const[g,_]=vu(f.x,f.y,f.z,r.lng,r.lat,r.alt);this._markerScene.update(t.id,f.toArray(),{lat:_,lng:g}),this._markerSet.update(t);const v="markerposition",y={marker:t,target:this,type:v};this.fire(v,y)})))}_deactivate(){this._subscriptions.unsubscribe(),this._markerScene.clear()}_getDefaultConfiguration(){return{visibleBBoxSize:100}}}function Wf(e,t){return e.x<=Math.max(t.p1.x,t.p2.x)&&e.x>=Math.min(t.p1.x,t.p2.x)&&e.y>=Math.max(t.p1.y,t.p2.y)&&e.y>=Math.min(t.p1.y,t.p2.y)}function qf(e,t){const i=e.p2.x-e.p1.x,n=e.p2.y-e.p1.y,r=t.p2.x-t.p1.x,s=t.p2.y-t.p1.y,a=i*s-n*r;return a*a<1e-10*(i*i+n*n)*(r*r+s*s)}function Xf(e,t,i){const n=(t.y-e.y)*(i.x-t.x)-(i.y-t.y)*(t.x-e.x);return(r=n)>0?1:r<0?-1:0;var r}function Zf(e,t){if(qf(e,t))return!1;const i=Xf(e.p1,e.p2,t.p1),n=Xf(e.p1,e.p2,t.p2),r=Xf(t.p1,t.p2,e.p1),s=Xf(t.p1,t.p2,e.p2);return i!==n&&r!==s||(!(0!==i||!Wf(t.p1,e))||(!(0!==n||!Wf(t.p2,e))||(!(0!==r||!Wf(e.p1,t))||!(0!==s||!Wf(e.p2,t)))))}function Yf(e,t){if(qf(e,t))return;const i=e.p1.x,n=e.p2.x,r=e.p1.y,s=e.p2.y,a=t.p1.x,o=t.p2.x,h=t.p1.y,c=t.p2.y,l=(i-n)*(h-c)-(r-s)*(a-o);return{x:((i*s-r*n)*(a-o)-(i-n)*(a*c-h*o))/l,y:((i*s-r*n)*(h-c)-(r-s)*(a*c-h*o))/l}}function Jf(e,t){return e>=-1&&e<=1&&t>=-1&&t<=1}function Kf(e,t){return e>=0&&e<=1&&t>=0&&t<=1}function Qf(e,t,i){const n=function(e){let t=[],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],a=n[r];for(let i=0;i<e;++i)t.push([s[0]+a[0]*i/e,s[1]+a[1]*i/e])}return t}(100).map((n=>i.basicToViewportSafe(n[0],n[1],e,t))),r=[],s=[{x:-1,y:1},{x:1,y:1},{x:1,y:-1},{x:-1,y:-1}],a=[!1,!1,!1,!1];for(let e=0;e<n.length;e++){const t=n[e],i=n[(e+1)%n.length];if(null===t)continue;if(null===i){Jf(t[0],t[1])&&r.push(t);continue}const[o,h]=t,[c,l]=i;if(Jf(o,h))if(Jf(c,l))r.push(t);else for(let e=0;e<4;e++){const i={p1:{x:o,y:h},p2:{x:c,y:l}},n={p1:s[e],p2:s[(e+1)%4]};if(Zf(i,n)){const s=Yf(i,n);r.push(t,[s.x,s.y]),a[e]=!0}}}const[o,h]=i.viewportToBasic(-1,1,e,t),[c,l]=i.viewportToBasic(1,1,e,t),[u,d]=i.viewportToBasic(1,-1,e,t),[p,m]=i.viewportToBasic(-1,-1,e,t);Kf(o,h)&&(a[3]=a[0]=!0),Kf(c,l)&&(a[0]=a[1]=!0),Kf(u,d)&&(a[1]=a[2]=!0),Kf(p,m)&&(a[2]=a[3]=!0);const f=[-1,-1,1,1];for(let e of r){const t=e[0],i=e[1];t>f[1]&&(f[1]=t),t<f[3]&&(f[3]=t),i>f[0]&&(f[0]=i),i<f[2]&&(f[2]=i)}const g=[1,1,-1,-1],_=[];for(let e=0;e<4;e++)a[e]?_.push(0):_.push(Math.abs(g[e]-f[e]));return _}Gf.componentName="marker";class eg extends zf{constructor(e,t,i,n,r){super(e,t,i),this._spatial=r,this._viewportCoords=n}_enable(){const e=this._navigator.stateService.currentState$.pipe(De((e=>e.state.alpha<1)),vt());this._bounceSubscription=Ve(e,this._navigator.stateService.inTranslation$,this._container.mouseService.active$,this._container.touchService.active$).pipe(De((e=>e[0]||e[1]||e[2]||e[3])),vt(),zt((e=>e?ie():Ve(this._container.renderService.renderCamera$,this._navigator.stateService.currentTransform$.pipe(St())))),Vt(this._navigator.panService.panImages$)).subscribe((([[e,t],i])=>{if(!t.hasValidScale&&e.camera.focal<.1)return;if(0===e.perspective.aspect||e.perspective.aspect===Number.POSITIVE_INFINITY)return;const n=Qf(t,e.perspective,this._viewportCoords),r=this._viewportCoords.viewportToBasic(0,0,t,e.perspective);(r[0]<0||r[0]>1)&&i.length>0&&(n[0]=n[2]=0);for(const[,t]of i){const i=Qf(t,e.perspective,this._viewportCoords);for(let e=1;e<n.length;e+=2)i[e]<n[e]&&(n[e]=i[e])}if(Math.max(...n)<.01)return;const s=n[1]-n[3],a=n[0]-n[2],o=this._viewportCoords.unprojectFromViewport(0,0,e.perspective).sub(e.perspective.position),h=this._viewportCoords.unprojectFromViewport(s,0,e.perspective).sub(e.perspective.position),c=this._viewportCoords.unprojectFromViewport(0,a,e.perspective).sub(e.perspective.position);let l=(s>0?1:-1)*h.angleTo(o),u=(a>0?1:-1)*c.angleTo(o);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 tg{static filteredPairwiseMouseDrag$(e,t){return this._filteredPairwiseMouseDrag$(e,t,t.mouseDragStart$,t.mouseDrag$,t.mouseDragEnd$)}static filteredPairwiseMouseRightDrag$(e,t){return this._filteredPairwiseMouseDrag$(e,t,t.mouseRightDragStart$,t.mouseRightDrag$,t.mouseRightDragEnd$)}static _filteredPairwiseMouseDrag$(e,t,i,n,r){return t.filtered$(e,i).pipe(zt((i=>it(Ze(Ce(i),t.filtered$(e,n)),t.filtered$(e,r).pipe(De((()=>null)))).pipe(Bt((e=>!!e)),Ot(null)))),At(),st((e=>null!=e[0]&&null!=e[1])))}}class ig extends zf{constructor(e,t,i,n,r){super(e,t,i),this._spatial=r,this._viewportCoords=n}_enable(){let e=this._container.mouseService.filtered$(this._component.name,this._container.mouseService.mouseDragStart$).pipe(De((()=>!0)),Dt()),t=this._container.mouseService.filtered$(this._component.name,this._container.mouseService.mouseDragEnd$).pipe(De((()=>!1)),Dt());this._activeMouseSubscription=it(e,t).subscribe(this._container.mouseService.activate$);const i=it(e,t).pipe(zt((e=>e?this._container.mouseService.documentMouseMove$:ie())));this._preventDefaultSubscription=it(i,this._container.touchService.touchMove$).subscribe((e=>{e.preventDefault()}));let n=this._container.touchService.singleTouchDragStart$.pipe(De((()=>!0))),r=this._container.touchService.singleTouchDragEnd$.pipe(De((()=>!1)));this._activeTouchSubscription=it(n,r).subscribe(this._container.touchService.activate$);const s=this._navigator.stateService.currentState$.pipe(De((e=>$u(e.state.currentImage.cameraType)||e.state.imagesAhead<1)),vt(),zt((e=>{if(!e)return ie();const t=tg.filteredPairwiseMouseDrag$(this._component.name,this._container.mouseService),i=it(this._container.touchService.singleTouchDragStart$,this._container.touchService.singleTouchDrag$,this._container.touchService.singleTouchDragEnd$.pipe(De((()=>null)))).pipe(De((e=>null!=e&&e.touches.length>0?e.touches[0]:null)),At(),st((e=>null!=e[0]&&null!=e[1])));return it(t,i)})),Vt(this._container.renderService.renderCamera$,this._navigator.stateService.currentTransform$,this._navigator.panService.panImages$),De((([e,t,i,n])=>{let r=e[0],s=e[1],a=s.clientX-r.clientX,o=s.clientY-r.clientY,h=this._container.container,[c,l]=this._viewportCoords.canvasPosition(s,h),u=this._viewportCoords.unprojectFromCanvas(c,l,h,t.perspective).sub(t.perspective.position),d=this._viewportCoords.unprojectFromCanvas(c-a,l,h,t.perspective).sub(t.perspective.position),p=this._viewportCoords.unprojectFromCanvas(c,l-o,h,t.perspective).sub(t.perspective.position),m=(a>0?1:-1)*d.angleTo(u),f=(o>0?-1:1)*p.angleTo(u);const g=Qf(i,t.perspective,this._viewportCoords);for(const[,e]of n){const i=Qf(e,t.perspective,this._viewportCoords);for(let e=0;e<g.length;e++)i[e]<g[e]&&(g[e]=i[e])}return g[0]>0&&f<0&&(f/=Math.max(1,200*g[0])),g[2]>0&&f>0&&(f/=Math.max(1,200*g[2])),g[1]>0&&m<0&&(m/=Math.max(1,200*g[1])),g[3]>0&&m>0&&(m/=Math.max(1,200*g[3])),{phi:m,theta:f}})),Dt());var a;this._rotateWithoutInertiaSubscription=s.subscribe((e=>{this._navigator.stateService.rotateWithoutInertia(e)})),this._rotateSubscription=s.pipe(Lt(((e,t)=>(this._drainBuffer(e),e.push([Date.now(),t]),e)),[]),(a=it(this._container.mouseService.filtered$(this._component.name,this._container.mouseService.mouseDragEnd$),this._container.touchService.singleTouchDragEnd$),F((function(e,t){var i=!1,n=null;e.subscribe(new B(t,(function(e){i=!0,n=e}))),a.subscribe(new B(t,(function(){if(i){i=!1;var e=n;n=null,t.next(e)}}),w))}))),De((e=>{const t=this._drainBuffer(e.slice()),i={phi:0,theta:0};for(const e of t)i.phi+=e[1].phi,i.theta+=e[1].theta;const n=t.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((e=>{this._navigator.stateService.rotate(e)}))}_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(e){return{dragPan:e}}_drainBuffer(e){const t=Date.now();for(;e.length>0&&t-e[0][0]>50;)e.shift();return e}}class ng extends zf{constructor(e,t,i,n,r){super(e,t,i),this._spatial=r,this._viewportCoords=n,this._subscriptions=new rf}_enable(){const e=this._navigator.stateService.state$.pipe(De((e=>e===Df.Earth)),Rt(1),U()),t=this._subscriptions;t.push(e.pipe(zt((e=>e?this._container.mouseService.mouseWheel$:ie()))).subscribe((e=>{e.preventDefault()}))),t.push(e.pipe(zt((e=>e?tg.filteredPairwiseMouseDrag$(this._component.name,this._container.mouseService).pipe(st((([e,t])=>!(e.ctrlKey&&t.ctrlKey)))):ie())),Vt(this._container.renderService.renderCamera$,this._navigator.stateService.currentTransform$),De((([[e,t],i,n])=>{const r=[0,0,1],s=[0,0,-2],a=this._planeIntersection(t,r,s,i.perspective,this._container.container),o=this._planeIntersection(e,r,s,i.perspective,this._container.container);if(!a||!o)return null;return(new Ki).subVectors(a,o).multiplyScalar(-1).toArray()})),st((e=>!!e))).subscribe((e=>{this._navigator.stateService.truck(e)}))),t.push(e.pipe(zt((e=>e?tg.filteredPairwiseMouseDrag$(this._component.name,this._container.mouseService).pipe(st((([e,t])=>e.ctrlKey&&t.ctrlKey))):ie())),De((([e,t])=>this._mousePairToRotation(e,t)))).subscribe((e=>{this._navigator.stateService.orbit(e)}))),t.push(e.pipe(zt((e=>e?tg.filteredPairwiseMouseRightDrag$(this._component.name,this._container.mouseService).pipe(st((([e,t])=>!e.ctrlKey&&!t.ctrlKey))):ie())),De((([e,t])=>this._mousePairToRotation(e,t)))).subscribe((e=>{this._navigator.stateService.orbit(e)}))),t.push(e.pipe(zt((e=>e?this._container.mouseService.filteredWheel$(this._component.name,this._container.mouseService.mouseWheel$):ie())),De((e=>{let t=e.deltaY;1===e.deltaMode?t*=40:2===e.deltaMode&&(t*=800);return-t/this._viewportCoords.containerToCanvas(this._container.container)[1]}))).subscribe((e=>{this._navigator.stateService.dolly(e)})))}_disable(){this._subscriptions.unsubscribe()}_getConfiguration(){return{}}_eventToViewport(e,t){const i=this._viewportCoords.canvasPosition(e,t);return this._viewportCoords.canvasToViewport(i[0],i[1],t)}_mousePairToRotation(e,t){const[i,n]=this._eventToViewport(t,this._container.container),[r,s]=this._eventToViewport(e,this._container.container);return{phi:(r-i)*Math.PI,theta:(n-s)*Math.PI/2}}_planeIntersection(e,t,i,n,r){const[s,a]=this._viewportCoords.canvasPosition(e,r),o=this._viewportCoords.unprojectFromCanvas(s,a,r,n).sub(n.position).normalize();if(Math.abs(this._spatial.angleToPlane(o.toArray(),t))<Math.PI/90)return null;const h=n.position.clone(),c=(new Ki).fromArray(t),l=(new Ki).fromArray(i),u=(new Ki).subVectors(l,h).dot(c)/o.clone().dot(c),d=(new Ki).addVectors(h,o.multiplyScalar(u));return this._viewportCoords.worldToCamera(d.toArray(),n)[2]>0?null:d}}class rg extends zf{constructor(e,t,i,n){super(e,t,i),this._viewportCoords=n}_enable(){this._container.mouseService.claimWheel(this._component.name,0),this._preventDefaultSubscription=this._container.mouseService.mouseWheel$.subscribe((e=>{e.preventDefault()})),this._zoomSubscription=this._container.mouseService.filteredWheel$(this._component.name,this._container.mouseService.mouseWheel$).pipe(Vt(this._navigator.stateService.currentState$,((e,t)=>[e,t])),st((e=>{let t=e[1].state;return $u(t.currentImage.cameraType)||t.imagesAhead<1})),De((e=>e[0])),Vt(this._container.renderService.renderCamera$,this._navigator.stateService.currentTransform$,((e,t,i)=>[e,t,i]))).subscribe((e=>{let t=e[0],i=e[1],n=e[2],r=this._container.container,[s,a]=this._viewportCoords.canvasPosition(t,r),o=this._viewportCoords.unprojectFromCanvas(s,a,r,i.perspective),h=n.projectBasic(o.toArray()),c=t.deltaY;1===t.deltaMode?c*=40:2===t.deltaMode&&(c*=800);let l=-3*c/this._viewportCoords.containerToCanvas(r)[1];this._navigator.stateService.zoomIn(l,h)}))}_disable(){this._container.mouseService.unclaimWheel(this._component.name),this._preventDefaultSubscription.unsubscribe(),this._zoomSubscription.unsubscribe(),this._preventDefaultSubscription=null,this._zoomSubscription=null}_getConfiguration(e){return{scrollZoom:e}}}class sg extends zf{constructor(e,t,i,n){super(e,t,i),this._viewportCoords=n}_enable(){this._preventDefaultSubscription=this._container.touchService.pinch$.subscribe((e=>{e.originalEvent.preventDefault()}));let e=this._container.touchService.pinchStart$.pipe(De((e=>!0))),t=this._container.touchService.pinchEnd$.pipe(De((e=>!1)));this._activeSubscription=it(e,t).subscribe(this._container.touchService.activate$),this._zoomSubscription=this._container.touchService.pinch$.pipe(Vt(this._navigator.stateService.currentState$),st((e=>{let t=e[1].state;return $u(t.currentImage.cameraType)||t.imagesAhead<1})),De((e=>e[0])),Vt(this._container.renderService.renderCamera$,this._navigator.stateService.currentTransform$)).subscribe((([e,t,i])=>{let n=this._container.container,[r,s]=this._viewportCoords.canvasPosition(e,n),a=this._viewportCoords.unprojectFromCanvas(r,s,n,t.perspective),o=i.projectBasic(a.toArray());const[h,c]=this._viewportCoords.containerToCanvas(n);let l=3*e.distanceChange/Math.min(h,c);this._navigator.stateService.zoomIn(l,o)}))}_disable(){this._activeSubscription.unsubscribe(),this._preventDefaultSubscription.unsubscribe(),this._zoomSubscription.unsubscribe(),this._preventDefaultSubscription=null,this._zoomSubscription=null}_getConfiguration(e){return{touchZoom:e}}}class ag extends sf{constructor(e,t,i){super(e,t,i);const n=new Du,r=new hf;this._bounceHandler=new eg(this,t,i,r,n),this._dragPanHandler=new ig(this,t,i,r,n),this._earthControlHandler=new ng(this,t,i,r,n),this._scrollZoomHandler=new rg(this,t,i,r),this._touchZoomHandler=new sg(this,t,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((e=>{e.dragPan?this._dragPanHandler.enable():this._dragPanHandler.disable(),e.earthControl?this._earthControlHandler.enable():this._earthControlHandler.disable(),e.scrollZoom?this._scrollZoomHandler.enable():this._scrollZoomHandler.disable(),e.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}}}ag.componentName="pointer";class og{constructor(e){this._document=e||document}get document(){return this._document}createElement(e,t,i){const n=this._document.createElement(e);return t&&(n.className=t),i&&i.appendChild(n),n}}class hg extends sf{constructor(e,t,i,n){super(e,t,i),this._dom=n||new og,this._popups=[],this._added$=new j,this._popups$=new j}add(e){for(const t of e)-1===this._popups.indexOf(t)&&(this._popups.push(t),this._activated&&t.setParentContainer(this._popupContainer));this._added$.next(e),this._popups$.next(this._popups)}getAll(){return this._popups.slice()}remove(e){for(const t of e)this._remove(t);this._popups$.next(this._popups)}removeAll(){for(const e of this._popups.slice())this._remove(e);this._popups$.next(this._popups)}_activate(){this._popupContainer=this._dom.createElement("div","mapillary-popup-container",this._container.container);for(const e of this._popups)e.setParentContainer(this._popupContainer);const e=this._subscriptions;e.push(Ve(this._container.renderService.renderCamera$,this._container.renderService.size$,this._navigator.stateService.currentTransform$).subscribe((([e,t,i])=>{for(const n of this._popups)n.update(e,t,i)})));const t=this._popups$.pipe(Ot(this._popups),zt((e=>ge(e).pipe(We((e=>e.changed$))))),De((e=>[e])));e.push(it(this._added$,t).pipe(Vt(this._container.renderService.renderCamera$,this._container.renderService.size$,this._navigator.stateService.currentTransform$)).subscribe((([e,t,i,n])=>{for(const r of e)r.update(t,i,n)})))}_deactivate(){this._subscriptions.unsubscribe();for(const e of this._popups)e.remove();this._container.container.removeChild(this._popupContainer),delete this._popupContainer}_getDefaultConfiguration(){return{}}_remove(e){const t=this._popups.indexOf(e);if(-1===t)return;const i=this._popups.splice(t,1)[0];this._activated&&i.remove()}}hg.componentName="popup",function(e){e[e.Sequence=0]="Sequence",e[e.Spatial=1]="Spatial"}(Nf||(Nf={})),function(e){e[e.Default=0]="Default",e[e.Playback=1]="Playback",e[e.Timeline=2]="Timeline"}($f||($f={}));class cg{constructor(e){this._container=e,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=$f.Default,this._speed=.5,this._changingSpeed=!1,this._index=null,this._changingPosition=!1,this._mouseEnterDirection$=new j,this._mouseLeaveDirection$=new j,this._notifyChanged$=new j,this._notifyChangingPositionChanged$=new j,this._notifySpeedChanged$=new j,this._notifyIndexChanged$=new j}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=it(this._container.mouseService.documentMouseUp$,this._container.touchService.touchEnd$.pipe(st((e=>0===e.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=$f.Default,this._changingSubscription.unsubscribe(),this._changingSubscription=null)}render(e,t,i,n,r,s,a,o,h){if(!1===t.visible)return tf.h("div.mapillary-sequence-container",{},[]);const c=this._createStepper(e,t,a,i,o,h),l=this._createSequenceControls(i),u=this._createPlaybackControls(i,n,o,t),d=this._createTimelineControls(i,r,s);return tf.h("div.mapillary-sequence-container",[c,l,u,d])}getContainerWidth(e,t){let i=t.minWidth,n=t.maxWidth;n<i&&(n=i);let r=(e.width-this._minThresholdWidth)/(this._maxThresholdWidth-this._minThresholdWidth),s=(e.height-this._minThresholdHeight)/(this._maxThresholdHeight-this._minThresholdHeight);return i+Math.max(0,Math.min(1,Math.min(r,s)))*(n-i)}_createPositionInput(e,t){this._index=e;const i=e=>{this._index=Number(e.target.value),this._notifyIndexChanged$.next(this._index)},n=this._container.domContainer.getBoundingClientRect(),r=e=>{e.stopPropagation(),this._setChangingPosition(!0)},s=e=>{!0===this._changingPosition&&e.stopPropagation()},a={max:null!=t?t:1,min:0,onchange:i,oninput:i,onkeydown:e=>{"ArrowDown"!==e.key&&"ArrowLeft"!==e.key&&"ArrowRight"!==e.key&&"ArrowUp"!==e.key||e.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!=e?e:0},o=null==e||null==t||t<=1;o&&(a.disabled="true");const h=tf.h("input.mapillary-sequence-position",a,[]),c=o?".mapillary-sequence-position-container-inactive":".mapillary-sequence-position-container";return tf.h("div"+c,[h])}_createSpeedInput(e){this._speed=e;const t=e=>{this._speed=Number(e.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=e=>{this._changingSpeed=!0,e.stopPropagation()},s=e=>{!0===this._changingSpeed&&e.stopPropagation()},a=tf.h("input.mapillary-sequence-speed",{max:1e3,min:0,onchange:t,oninput:t,onkeydown:e=>{"ArrowDown"!==e.key&&"ArrowLeft"!==e.key&&"ArrowRight"!==e.key&&"ArrowUp"!==e.key||e.preventDefault()},onpointerdown:r,onpointermove:s,ontouchmove:s,ontouchstart:r,style:{width:`${n}px`},type:"range",value:1e3*e},[]);return tf.h("div.mapillary-sequence-speed-container",[a])}_createPlaybackControls(t,i,n,r){if(this._mode!==$f.Playback)return tf.h("div.mapillary-sequence-playback",[]);const s=tf.h("div.mapillary-sequence-switch-icon.mapillary-sequence-icon-visible",[]),a=r.direction===e.NavigationDirection.Next?e.NavigationDirection.Prev:e.NavigationDirection.Next,o=r.playing,h={onclick:()=>{o||n.configure({direction:a})}},c=r.playing?".mapillary-sequence-switch-button-inactive":".mapillary-sequence-switch-button",l=tf.h("div"+c,h,[s]),u=tf.h("div.mapillary-sequence-slow-icon.mapillary-sequence-icon-visible",[]),d=tf.h("div.mapillary-sequence-slow-container",[u]),p=tf.h("div.mapillary-sequence-fast-icon.mapillary-sequence-icon-visible",[]),m=tf.h("div.mapillary-sequence-fast-container",[p]),f=tf.h("div.mapillary-sequence-close-icon.mapillary-sequence-icon-visible",[]),g={onclick:()=>{this._mode=$f.Default,this._notifyChanged$.next(this)}},_=tf.h("div.mapillary-sequence-close-button",g,[f]),v=[l,d,this._createSpeedInput(i),m,_],y={style:{top:`${Math.round(t/this._stepperDefaultWidth*this._defaultHeight+10)}px`}};return tf.h("div.mapillary-sequence-playback",y,v)}_createPlayingButton(t,i,n,r,s){let a=r.direction===e.NavigationDirection.Next&&null!=t||r.direction===e.NavigationDirection.Prev&&null!=i;a=a&&n;let o={onclick:r.playing?()=>{s.stop()}:a?()=>{s.play()}:null},h={};r.direction===e.NavigationDirection.Prev&&(h.style={transform:"rotate(180deg) translate(50%, 50%)"});let c=tf.h("div.mapillary-sequence-icon",h,[]),l=r.playing?"mapillary-sequence-stop":a?"mapillary-sequence-play":"mapillary-sequence-play-inactive";return tf.h("div."+l,o,[c])}_createSequenceControls(e){const t=Math.round(8/this._stepperDefaultWidth*e),i={onclick:()=>{this._expandControls=!this._expandControls,this._mode=$f.Default,this._notifyChanged$.next(this)},style:{"border-bottom-right-radius":`${t}px`,"border-top-right-radius":`${t}px`}},n=tf.h("div.mapillary-sequence-expander-bar",[]),r=tf.h("div.mapillary-sequence-expander-button",i,[n]),s=this._mode===$f.Playback?".mapillary-sequence-fast-icon-gray.mapillary-sequence-icon-visible":".mapillary-sequence-fast-icon",a=tf.h("div"+s,[]),o={onclick:()=>{this._mode=this._mode===$f.Playback?$f.Default:$f.Playback,this._notifyChanged$.next(this)}},h=tf.h("div.mapillary-sequence-playback-button",o,[a]),c=this._mode===$f.Timeline?".mapillary-sequence-timeline-icon-gray.mapillary-sequence-icon-visible":".mapillary-sequence-timeline-icon",l=tf.h("div"+c,[]),u={onclick:()=>{this._mode=this._mode===$f.Timeline?$f.Default:$f.Timeline,this._notifyChanged$.next(this)}},d=tf.h("div.mapillary-sequence-timeline-button",u,[l]),p={style:{height:this._defaultHeight/this._stepperDefaultWidth*e+"px",transform:`translate(${e/2+2}px, 0)`,width:this._controlsDefaultWidth/this._stepperDefaultWidth*e+"px"}},m=".mapillary-sequence-controls"+(this._expandControls?".mapillary-sequence-controls-expanded":"");return tf.h("div"+m,p,[h,d,r])}_createSequenceArrows(t,i,n,r,s){let a={onclick:null!=t?()=>{s.moveDir$(e.NavigationDirection.Next).subscribe(void 0,(e=>{e instanceof uf||console.error(e)}))}:null,onpointerenter:()=>{this._mouseEnterDirection$.next(e.NavigationDirection.Next)},onpointerleave:()=>{this._mouseLeaveDirection$.next(e.NavigationDirection.Next)}};const o=Math.round(8/this._stepperDefaultWidth*n);let h={onclick:null!=i?()=>{s.moveDir$(e.NavigationDirection.Prev).subscribe(void 0,(e=>{e instanceof uf||console.error(e)}))}:null,onpointerenter:()=>{this._mouseEnterDirection$.next(e.NavigationDirection.Prev)},onpointerleave:()=>{this._mouseLeaveDirection$.next(e.NavigationDirection.Prev)},style:{"border-bottom-left-radius":`${o}px`,"border-top-left-radius":`${o}px`}},c=this._getStepClassName(e.NavigationDirection.Next,t,r.highlightId),l=this._getStepClassName(e.NavigationDirection.Prev,i,r.highlightId),u=tf.h("div.mapillary-sequence-icon",[]),d=tf.h("div.mapillary-sequence-icon",[]);return[tf.h("div."+l,h,[d]),tf.h("div."+c,a,[u])]}_createStepper(t,i,n,r,s,a){let o=null,h=null;for(let i of t.edges)i.data.direction===e.NavigationDirection.Next&&(o=i.target),i.data.direction===e.NavigationDirection.Prev&&(h=i.target);const c=this._createPlayingButton(o,h,n,i,s),l=this._createSequenceArrows(o,h,r,i,a);l.splice(1,0,c);const u={oncontextmenu:e=>{e.preventDefault()},style:{height:this._defaultHeight/this._stepperDefaultWidth*r+"px",width:r+"px"}};return tf.h("div.mapillary-sequence-stepper",u,l)}_createTimelineControls(e,t,i){if(this._mode!==$f.Timeline)return tf.h("div.mapillary-sequence-timeline",[]);const n=this._createPositionInput(t,i),r=tf.h("div.mapillary-sequence-close-icon.mapillary-sequence-icon-visible",[]),s={onclick:()=>{this._mode=$f.Default,this._notifyChanged$.next(this)}},a=tf.h("div.mapillary-sequence-close-button",s,[r]),o={style:{top:`${Math.round(e/this._stepperDefaultWidth*this._defaultHeight+10)}px`}};return tf.h("div.mapillary-sequence-timeline",o,[n,a])}_getStepClassName(t,i,n){let r=t===e.NavigationDirection.Next?"mapillary-sequence-step-next":"mapillary-sequence-step-prev";return null==i?r+="-inactive":n===i&&(r+="-highlight"),r}_setChangingPosition(e){this._changingPosition=e,this._notifyChangingPositionChanged$.next(e)}}class lg extends sf{constructor(e,t,i,n,r){super(e,t,i),this._sequenceDOMRenderer=n||new cg(t),this._scheduler=r,this._containerWidth$=new j,this._hoveredIdSubject$=new j,this._hoveredId$=this._hoveredIdSubject$.pipe(Dt()),this._navigator.playService.playing$.pipe($t(1),Vt(this._configuration$)).subscribe((([e,t])=>{const i="playing",n={playing:e,target:this,type:i};this.fire(i,n),e!==t.playing&&(e?this.play():this.stop())})),this._navigator.playService.direction$.pipe($t(1),Vt(this._configuration$)).subscribe((([e,t])=>{e!==t.direction&&this.configure({direction:e})}))}fire(e,t){super.fire(e,t)}off(e,t){super.off(e,t)}on(e,t){super.on(e,t)}play(){this.configure({playing:!0})}stop(){this.configure({playing:!1})}_activate(){this._sequenceDOMRenderer.activate();const e=this._navigator.stateService.currentImage$.pipe(zt((e=>e.sequenceEdges$)),Rt(1),U()),t=this._navigator.stateService.currentImage$.pipe(vt(void 0,(e=>e.sequenceId)),zt((e=>Ze(Ce(null),this._navigator.graphService.cacheSequence$(e.sequenceId).pipe(Pt(3),ct((e=>(console.error("Failed to cache sequence",e),Ce(null)))))))),Ot(null),Rt(1),U()),i=this._subscriptions;i.push(t.subscribe());const n=this._sequenceDOMRenderer.index$.pipe(Vt(t),De((([e,t])=>null!=t?t.imageIds[e]:null)),st((e=>!!e)),vt(),It(),U());i.push(it(n.pipe(ft(100,this._scheduler)),n.pipe(ot(400,this._scheduler))).pipe(vt(),zt((e=>this._navigator.moveTo$(e).pipe(ct((()=>ie())))))).subscribe()),i.push(this._sequenceDOMRenderer.changingPositionChanged$.pipe(st((e=>e))).subscribe((()=>{this._navigator.graphService.setGraphMode(Nf.Sequence)}))),i.push(this._sequenceDOMRenderer.changingPositionChanged$.pipe(st((e=>!e))).subscribe((()=>{this._navigator.graphService.setGraphMode(Nf.Spatial)}))),this._navigator.graphService.graphMode$.pipe(zt((e=>e===Nf.Spatial?this._navigator.stateService.currentImage$.pipe(_t(2)):ie())),st((e=>!e.spatialEdges.cached)),zt((e=>this._navigator.graphService.cacheImage$(e.id).pipe(ct((()=>ie())))))).subscribe(),i.push(this._sequenceDOMRenderer.changingPositionChanged$.pipe(st((e=>e))).subscribe((()=>{this._navigator.playService.stop()}))),i.push(Ve(this._navigator.graphService.graphMode$,this._sequenceDOMRenderer.changingPositionChanged$.pipe(Ot(!1),vt())).pipe(Vt(this._navigator.stateService.currentImage$),zt((([[e,t],i])=>t&&e===Nf.Sequence?this._navigator.graphService.cacheSequenceImages$(i.sequenceId,i.id).pipe(Pt(3),ct((e=>(console.error("Failed to cache sequence images.",e),ie())))):ie()))).subscribe());const r=t.pipe(zt((e=>{if(!e)return Ce({index:null,max:null});let t=!0;return this._sequenceDOMRenderer.changingPositionChanged$.pipe(Ot(!1),vt(),zt((e=>{const i=!e&&t?0:1;return t=!1,e?n:this._navigator.stateService.currentImage$.pipe(De((e=>e.id)),vt(),$t(i))})),De((t=>{const i=e.imageIds.indexOf(t);return-1===i?{index:null,max:null}:{index:i,max:e.imageIds.length-1}})))}))),s=this._navigator.stateService.state$.pipe(De((e=>e===Df.Earth)),vt());i.push(Ve(e,this._configuration$,this._containerWidth$,this._sequenceDOMRenderer.changed$.pipe(Ot(this._sequenceDOMRenderer)),this._navigator.playService.speed$,r,s).pipe(De((([e,t,i,,n,r,s])=>{const a=this._sequenceDOMRenderer.render(e,t,i,n,r.index,r.max,!s,this,this._navigator);return{name:this._name,vNode:a}}))).subscribe(this._container.domRenderer.render$)),i.push(this._sequenceDOMRenderer.speed$.subscribe((e=>{this._navigator.playService.setSpeed(e)}))),i.push(this._configuration$.pipe(De((e=>e.direction)),vt()).subscribe((e=>{this._navigator.playService.setDirection(e)}))),i.push(Ve(this._container.renderService.size$,this._configuration$.pipe(vt(((e,t)=>e[0]===t[0]&&e[1]===t[1]),(e=>[e.minWidth,e.maxWidth])))).pipe(De((([e,t])=>this._sequenceDOMRenderer.getContainerWidth(e,t)))).subscribe(this._containerWidth$)),i.push(this._configuration$.pipe(De((e=>e.playing)),vt()).subscribe((e=>{e?this._navigator.playService.play():this._navigator.playService.stop()}))),i.push(this._sequenceDOMRenderer.mouseEnterDirection$.pipe(zt((t=>Ze(e.pipe(De((e=>{for(let i of e.edges)if(i.data.direction===t)return i.target;return null})),Ft(this._sequenceDOMRenderer.mouseLeaveDirection$)),Ce(null)))),vt()).subscribe(this._hoveredIdSubject$)),i.push(this._hoveredId$.subscribe((e=>{const t="hover",i={id:e,target:this,type:t};this.fire(t,i)})))}_deactivate(){this._subscriptions.unsubscribe(),this._sequenceDOMRenderer.deactivate()}_getDefaultConfiguration(){return{direction:e.NavigationDirection.Next,maxWidth:108,minWidth:70,playing:!1,visible:!0}}}lg.componentName="sequence",e.SliderConfigurationMode=void 0,(kf=e.SliderConfigurationMode||(e.SliderConfigurationMode={}))[kf.Motion=0]="Motion",kf[kf.Stationary=1]="Stationary";class ug{constructor(e,t,i,n,r,s,a,o,h,c){this._orientation=this._getValue(e,1);let l=null!=a?a.width:4,u=null!=a?a.height:3,d=this._orientation<5;this._width=this._getValue(t,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?t:i,this._basicHeight=d?i:t;const p=this._getCameraParameters(h,c),m=p[0],f=p[1],g=p[2];this._focal=this._getValue(m,1),this._scale=this._getValue(n,0),this._worldToCamera=this.createWorldToCamera(r,s),this._worldToCameraInverse=(new Rn).copy(this._worldToCamera).invert(),this._scaledWorldToCamera=this._createScaledWorldToCamera(this._worldToCamera,this._scale),this._scaledWorldToCameraInverse=(new Rn).copy(this._scaledWorldToCamera).invert(),this._basicWorldToCamera=this._createBasicWorldToCamera(this._worldToCamera,e),this._textureScale=o||[1,1],this._ck1=f||0,this._ck2=g||0,this._cameraType=c||"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 e=this._worldToCamera.elements;switch(this._orientation){case 1:return new Ki(-e[1],-e[5],-e[9]);case 3:return new Ki(e[1],e[5],e[9]);case 6:return new Ki(-e[0],-e[4],-e[8]);case 8:return new Ki(e[0],e[4],e[8]);default:return new Ki(-e[1],-e[5],-e[9])}}projectorMatrix(){let e=this._normalizedToTextureMatrix(),t=this._focal,i=(new Rn).set(t,0,0,0,0,t,0,0,0,0,0,0,0,0,1,0);return e.multiply(i),e.multiply(this._worldToCamera),e}projectBasic(e){let t=this.projectSfM(e);return this._sfmToBasic(t)}unprojectBasic(e,t,i){let n=this._basicToSfm(e);return this.unprojectSfM(n,t,i)}projectSfM(e){let t=new Xi(e[0],e[1],e[2],1);return t.applyMatrix4(this._worldToCamera),this._bearingToSfm([t.x,t.y,t.z])}unprojectSfM(e,t,i){const n=this._sfmToBearing(e),r=(i&&!$u(this._cameraType)?new Xi(t*n[0]/n[2],t*n[1]/n[2],t,1):new Xi(t*n[0],t*n[1],t*n[2],1)).applyMatrix4(this._worldToCameraInverse);return[r.x/r.w,r.y/r.w,r.z/r.w]}_sfmToBearing(e){if($u(this._cameraType)){let t=2*e[0]*Math.PI,i=2*-e[1]*Math.PI;return[Math.cos(i)*Math.sin(t),-Math.sin(i),Math.cos(i)*Math.cos(t)]}if(ku(this._cameraType)){let[t,i]=[e[0]/this._focal,e[1]/this._focal];const n=Math.sqrt(t*t+i*i);let r=n/this._distortionFromDistortedRadius(n,this._ck1,this._ck2,this._radialPeak),s=Math.cos(r),a=Math.sin(r);const o=n>1e-8?1/n:1;return[a*t*o,a*i*o,s]}{let[t,i]=[e[0]/this._focal,e[1]/this._focal];const n=Math.sqrt(t*t+i*i);let r=this._distortionFromDistortedRadius(n,this._ck1,this._ck2,this._radialPeak);let s=new Ki(t/r,i/r,1);return s.normalize(),[s.x,s.y,s.z]}}_distortionFromDistortedRadius(e,t,i,n){let r=1;for(let s=0;s<10;s++){let s=e/r;s>n&&(s=n),r=1+t*Math.pow(s,2)+i*Math.pow(s,4)}return r}_bearingToSfm(e){if($u(this._cameraType)){let t=e[0],i=e[1],n=e[2],r=Math.atan2(t,n),s=Math.atan2(-i,Math.sqrt(t*t+n*n));return[r/(2*Math.PI),-s/(2*Math.PI)]}if(ku(this._cameraType)){if(e[2]>0){const[t,i,n]=e,r=Math.sqrt(t*t+i*i);let s=Math.atan2(r,n);s>this._radialPeak&&(s=this._radialPeak);const a=1+Math.pow(s,2)*(this._ck1+Math.pow(s,2)*this._ck2),o=this._focal*a*s/r;return[o*t,o*i]}return[e[0]<0?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,e[1]<0?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY]}if(e[2]>0){let[t,i]=[e[0]/e[2],e[1]/e[2]],n=t*t+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*t,this._focal*s*i]}return[e[0]<0?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,e[1]<0?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY]}_basicToSfm(e){let t,i;switch(this._orientation){case 1:t=e[0],i=e[1];break;case 3:t=1-e[0],i=1-e[1];break;case 6:t=e[1],i=1-e[0];break;case 8:t=1-e[1],i=e[0];break;default:t=e[0],i=e[1]}let n=this._width,r=this._height,s=Math.max(n,r);return[t*n/s-n/s/2,i*r/s-r/s/2]}_sfmToBasic(e){let t,i,n=this._width,r=this._height,s=Math.max(n,r),a=(e[0]+n/s/2)/n*s,o=(e[1]+r/s/2)/r*s;switch(this._orientation){case 1:t=a,i=o;break;case 3:t=1-a,i=1-o;break;case 6:t=1-o,i=a;break;case 8:t=o,i=1-a;break;default:t=a,i=o}return[t,i]}_getValue(e,t){return null!=e&&e>0?e:t}_getCameraParameters(e,t){if($u(t))return[];if(!e||0===e.length)return[1,0,0];const i=3-e.length;return i<=0?e:e.concat(new Array(i).fill(0))}createWorldToCamera(e,t){const i=new Ki(e[0],e[1],e[2]),n=i.length();n>0&&i.normalize();const r=new Rn;return r.makeRotationAxis(i,n),r.setPosition(new Ki(t[0],t[1],t[2])),r}_createScaledWorldToCamera(e,t){const i=e.clone(),n=i.elements;return n[12]=t*n[12],n[13]=t*n[13],n[14]=t*n[14],i.scale(new Ki(t,t,t)),i}_createBasicWorldToCamera(e,t){const i=new Ki(0,0,1);let n=0;switch(t){case 3:n=Math.PI;break;case 6:n=Math.PI/2;break;case 8:n=3*Math.PI/2}return(new Rn).makeRotationAxis(i,n).multiply(e)}_getRadialPeak(e,t){const i=5*t,n=3*e,r=Math.pow(n,2)-4*i*1;if(r<0)return;const s=(-n-Math.sqrt(r))/2/i,a=(-n+Math.sqrt(r))/2/i,o=Math.min(s,a),h=Math.max(s,a);return o>0?Math.sqrt(o):h>0?Math.sqrt(h):void 0}_normalizedToTextureMatrix(){const e=Math.max(this._width,this._height),t=this._orientation<5?this._textureScale[0]:this._textureScale[1],i=this._orientation<5?this._textureScale[1]:this._textureScale[0],n=e/this._width*t,r=e/this._height*i;switch(this._orientation){case 1:return(new Rn).set(n,0,0,.5,0,-r,0,.5,0,0,1,0,0,0,0,1);case 3:return(new Rn).set(-n,0,0,.5,0,r,0,.5,0,0,1,0,0,0,0,1);case 6:return(new Rn).set(0,-r,0,.5,-n,0,0,.5,0,0,1,0,0,0,0,1);case 8:return(new Rn).set(0,r,0,.5,n,0,0,.5,0,0,1,0,0,0,0,1);default:return(new Rn).set(n,0,0,.5,0,-r,0,.5,0,0,1,0,0,0,0,1)}}}class dg{constructor(){this._factory=new gf,this._scene=new _f,this._spatial=new Du,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(e,t){this._setTextureProvider(e,this._currentKey,t,this._currentProviderDisposers,this._updateTexture.bind(this))}setTextureProviderPrev(e,t){this._setTextureProvider(e,this._previousKey,t,this._previousProviderDisposers,this._updateTexturePrev.bind(this))}update(e,t){this._updateFrameId(e.id),this._updateImagePlanes(e.state,t)}updateCurtain(e){this._curtain!==e&&(this._curtain=e,this._updateCurtain(),this._needsRender=!0)}updateTexture(e,t){const i=t.id===this._currentKey?this._scene.planes:t.id===this._previousKey?this._scene.planesOld:{};if(0!==Object.keys(i).length){this._needsRender=!0;for(const t in i){if(!i.hasOwnProperty(t))continue;let n=i[t].material.uniforms.projectorTex.value;n.image=e,n.needsUpdate=!0}}}updateTextureImage(e,t){if(this._currentKey!==t.id)return;this._needsRender=!0;const i=this._scene.planes;for(const t in i){if(!i.hasOwnProperty(t))continue;let n=i[t].material.uniforms.projectorTex.value;n.image=e,n.needsUpdate=!0}}render(e,t){this.disabled||t.render(this._scene.sceneOld,e),t.render(this._scene.scene,e),this._needsRender=!1}dispose(){this._scene.clear();for(const e in this._currentProviderDisposers)this._currentProviderDisposers.hasOwnProperty(e)&&this._currentProviderDisposers[e]();for(const e in this._previousProviderDisposers)this._previousProviderDisposers.hasOwnProperty(e)&&this._previousProviderDisposers[e]();this._currentProviderDisposers={},this._previousProviderDisposers={}}_getBasicCorners(e,t){let i,n;return e>t?(i=.5,n=.5*e/t):(i=.5*t/e,n=.5),[[.5-i,.5-n],[.5+i,.5+n]]}_setDisabled(e){this._disabled=null==e.currentImage||null==e.previousImage||$u(e.currentImage.cameraType)&&!$u(e.previousImage.cameraType)}_setTextureProvider(e,t,i,n,r){if(e!==t)return;let s=i.textureCreated$.subscribe(r),a=i.textureUpdated$.subscribe((e=>{this._needsRender=!0}));if(e in n){(0,n[e])(),delete n[e]}n[e]=()=>{s.unsubscribe(),a.unsubscribe(),i.dispose()}}_updateCurtain(){const e=this._scene.planes;for(const t in e){if(!e.hasOwnProperty(t))continue;let i=e[t].material;i.uniforms.curtain&&(i.uniforms.curtain.value=this._curtain)}}_updateFrameId(e){this._frameId=e}_updateImagePlanes(t,i){const n=null!=t.currentImage&&this._currentKey!==t.currentImage.id,r=null!=t.previousImage&&this._previousKey!==t.previousImage.id,s=this._mode!==i;if(!(n||r||s))return;this._setDisabled(t),this._needsRender=!0,this._mode=i;const a=t.motionless||i===e.SliderConfigurationMode.Stationary||$u(t.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 e=t.previousImage;this._previousKey=e.id;const i=t.currentTransform.rt.elements;let n=[i[12],i[13],i[14]];const r=t.currentTransform.basicAspect,s=t.previousTransform.basicAspect,o=r>s?[1,s/r]:[r/s,1];let h=t.currentImage.rotation,c=t.currentImage.width,l=t.currentImage.height;$u(e.cameraType)&&(h=t.previousImage.rotation,n=this._spatial.rotate(this._spatial.opticalCenter(t.currentImage.rotation,n).toArray(),h).multiplyScalar(-1).toArray(),c=t.previousImage.width,l=t.previousImage.height);const u=new ug(t.currentImage.exifOrientation,c,l,t.currentImage.scale,h,n,e.image,o,t.currentImage.cameraParameters,t.currentImage.cameraType);let d;if($u(e.cameraType))d=this._factory.createMesh(e,a||$u(t.currentImage.cameraType)?u:t.previousTransform);else if(a){const[[e,i],[n,a]]=this._getBasicCorners(r,s);d=this._factory.createFlatMesh(t.previousImage,u,e,n,i,a)}else d=this._factory.createMesh(t.previousImage,t.previousTransform);const p={};p[e.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=t.currentImage.id;const e={};$u(t.currentImage.cameraType)?e[t.currentImage.id]=this._factory.createCurtainMesh(t.currentImage,t.currentTransform):e[t.currentImage.id]=a?this._factory.createDistortedCurtainMesh(t.currentImage,t.currentTransform):this._factory.createCurtainMesh(t.currentImage,t.currentTransform),this._scene.setImagePlanes(e),this._updateCurtain()}}_updateTexture(e){this._needsRender=!0;const t=this._scene.planes;for(const i in t){if(!t.hasOwnProperty(i))continue;let n=t[i].material,r=n.uniforms.projectorTex.value;n.uniforms.projectorTex.value=null,r.dispose(),n.uniforms.projectorTex.value=e}}_updateTexturePrev(e){this._needsRender=!0;const t=this._scene.planesOld;for(const i in t){if(!t.hasOwnProperty(i))continue;let n=t[i].material,r=n.uniforms.projectorTex.value;n.uniforms.projectorTex.value=null,r.dispose(),n.uniforms.projectorTex.value=e}}}class pg{constructor(e){this._container=e,this._interacting=!1,this._notifyModeChanged$=new j,this._notifyPositionChanged$=new j,this._stopInteractionSubscription=null}get mode$(){return this._notifyModeChanged$}get position$(){return this._notifyPositionChanged$}activate(){this._stopInteractionSubscription||(this._stopInteractionSubscription=it(this._container.mouseService.documentMouseUp$,this._container.touchService.touchEnd$.pipe(st((e=>0===e.touches.length)))).subscribe((e=>{this._interacting&&(this._interacting=!1)})))}deactivate(){this._stopInteractionSubscription&&(this._interacting=!1,this._stopInteractionSubscription.unsubscribe(),this._stopInteractionSubscription=null)}render(e,t,i,n,r){const s=[];if(r){s.push(tf.h("div.mapillary-slider-border",[]));const r=!(i||n);r&&(s.push(this._createModeButton(t)),s.push(this._createModeButton2d(t))),s.push(this._createPositionInput(e,r))}const a=this._container.domContainer.getBoundingClientRect(),o=Math.max(215,Math.min(400,a.width-100));return tf.h("div.mapillary-slider-container",{style:{width:`${o}px`}},s)}_createModeButton(t){const i={onclick:()=>{t!==e.SliderConfigurationMode.Motion&&this._notifyModeChanged$.next(e.SliderConfigurationMode.Motion)}},n=t===e.SliderConfigurationMode.Stationary?"mapillary-slider-mode-button-inactive":"mapillary-slider-mode-button";return tf.h("div."+n,i,[tf.h("div.mapillary-slider-mode-icon",[])])}_createModeButton2d(t){const i={onclick:()=>{t!==e.SliderConfigurationMode.Stationary&&this._notifyModeChanged$.next(e.SliderConfigurationMode.Stationary)}},n=t===e.SliderConfigurationMode.Motion?"mapillary-slider-mode-button-2d-inactive":"mapillary-slider-mode-button-2d";return tf.h("div."+n,i,[tf.h("div.mapillary-slider-mode-icon-2d",[])])}_createPositionInput(e,t){const i=e=>{this._notifyPositionChanged$.next(Number(e.target.value)/1e3)},n=e=>{this._interacting=!0,e.stopPropagation()},r=e=>{this._interacting&&e.stopPropagation()},s=this._container.domContainer.getBoundingClientRect(),a=Math.max(215,Math.min(400,s.width-105))-84+(t?0:52),o=tf.h("input.mapillary-slider-position",{max:1e3,min:0,onchange:i,oninput:i,onkeydown:e=>{"ArrowDown"!==e.key&&"ArrowLeft"!==e.key&&"ArrowRight"!==e.key&&"ArrowUp"!==e.key||e.preventDefault()},onpointerdown:n,onpointermove:r,ontouchmove:r,ontouchstart:n,style:{width:`${a}px`},type:"range",value:1e3*e},[]);return tf.h("div.mapillary-slider-position-container",[o])}}class mg extends sf{constructor(e,t,i,n){super(e,t,i),this._viewportCoords=n||new hf,this._domRenderer=new pg(t),this._imageTileLoader=new bf(i.api),this._roiCalculator=new wf,this._spatial=new Du,this._glRendererOperation$=new j,this._glRendererCreator$=new j,this._glRendererDisposer$=new j,this._glRenderer$=this._glRendererOperation$.pipe(Lt(((e,t)=>t(e)),null),st((e=>null!=e)),vt(void 0,(e=>e.frameId))),this._glRendererCreator$.pipe(De((()=>e=>{if(null!=e)throw new Error("Multiple slider states can not be created at the same time");return new dg}))).subscribe(this._glRendererOperation$),this._glRendererDisposer$.pipe(De((()=>e=>(e.dispose(),null)))).subscribe(this._glRendererOperation$)}_activate(){const t=this._subscriptions;t.push(this._domRenderer.mode$.subscribe((e=>{this.configure({mode:e})}))),t.push(this._glRenderer$.pipe(De((e=>({name:this._name,renderer:{frameId:e.frameId,needsRender:e.needsRender,render:e.render.bind(e),pass:yf.Background}})))).subscribe(this._container.glRenderer.render$));const i=Ze(this.configuration$.pipe(De((e=>null!=e.initialPosition?e.initialPosition:1)),St()),this._domRenderer.position$),n=this.configuration$.pipe(De((e=>e.mode)),vt()),r=this._navigator.stateService.currentState$.pipe(De((e=>e.state.motionless)),vt()),s=this._navigator.stateService.currentState$.pipe(De((e=>$u(e.state.currentImage.cameraType))),vt()),a=Ve(this._configuration$.pipe(De((e=>e.sliderVisible))),this._navigator.stateService.currentState$.pipe(De((e=>!(null==e.state.currentImage||null==e.state.previousImage||$u(e.state.currentImage.cameraType)&&!$u(e.state.previousImage.cameraType)))),vt())).pipe(De((([e,t])=>e&&t)),vt());this._waitSubscription=Ve(n,r,s,a).pipe(Vt(this._navigator.stateService.state$)).subscribe((([[t,i,n,r],s])=>{const a=r&&(i||t===e.SliderConfigurationMode.Stationary||n);a&&s!==Df.WaitingInteractively?this._navigator.stateService.waitInteractively():a||s===Df.Waiting||this._navigator.stateService.wait()})),t.push(Ve(i,n,r,s,a).subscribe((([t,i,n,r])=>{n||i===e.SliderConfigurationMode.Stationary||r?this._navigator.stateService.moveTo(1):this._navigator.stateService.moveTo(t)}))),t.push(Ve(i,n,r,s,a,this._container.renderService.size$).pipe(De((([e,t,i,n,r])=>({name:this._name,vNode:this._domRenderer.render(e,t,i,n,r)})))).subscribe(this._container.domRenderer.render$)),this._glRendererCreator$.next(null),t.push(Ve(i,s,a,this._container.renderService.renderCamera$,this._navigator.stateService.currentTransform$).pipe(De((([e,t,i,n,r])=>{if(!t)return i?e:1;const s=this._viewportCoords.viewportToBasic(-1.15,0,r,n.perspective),a=this._viewportCoords.viewportToBasic(1.15,0,r,n.perspective),o=a[0]<s[0]?a[0]+1:a[0],h=s[0]+e*(o-s[0]);return h>1?h-1:h})),De((e=>t=>(t.updateCurtain(e),t)))).subscribe(this._glRendererOperation$)),t.push(Ve(this._navigator.stateService.currentState$,n).pipe(De((([e,t])=>i=>(i.update(e,t),i)))).subscribe(this._glRendererOperation$)),t.push(this._configuration$.pipe(st((e=>null!=e.ids)),zt((e=>at(at(this._catchCacheImage$(e.ids.background),this._catchCacheImage$(e.ids.foreground)).pipe(De((e=>({background:e[0],foreground:e[1]})))),this._navigator.stateService.currentState$.pipe(St())).pipe(De((e=>({images:e[0],state:e[1].state}))))))).subscribe((e=>{null!=e.state.currentImage&&null!=e.state.previousImage&&e.state.currentImage.id===e.images.foreground.id&&e.state.previousImage.id===e.images.background.id||(e.state.currentImage.id!==e.images.background.id?e.state.currentImage.id!==e.images.foreground.id||1!==e.state.trajectory.length?(this._navigator.stateService.setImages([e.images.background]),this._navigator.stateService.setImages([e.images.foreground])):this._navigator.stateService.prependImages([e.images.background]):this._navigator.stateService.setImages([e.images.foreground]))}),(e=>{console.error(e)})));const o=this._container.configurationService.imageTiling$.pipe(zt((e=>e?this._navigator.stateService.currentState$:new j)),vt(void 0,(e=>e.state.currentImage.id)),Vt(this._container.glRenderer.webGLRenderer$,this._container.renderService.size$),De((([e,t,i])=>{const n=e.state;Math.max(i.width,i.height);const r=n.currentImage,s=n.currentTransform;return new Lf(r.id,s.basicWidth,s.basicHeight,r.image,this._imageTileLoader,new xf,t)})),Rt(1),U());t.push(o.subscribe((()=>{}))),t.push(o.pipe(De((e=>t=>(t.setTextureProvider(e.id,e),t)))).subscribe(this._glRendererOperation$)),t.push(o.pipe(At()).subscribe((e=>{e[0].abort()})));const h=this._container.configurationService.imageTiling$.pipe(zt((e=>e?Ve(this._container.renderService.renderCameraFrame$,this._container.renderService.size$.pipe(ft(250))):new j)),De((([e,t])=>[e.camera.position.clone(),e.camera.lookat.clone(),e.zoom.valueOf(),t.height.valueOf(),t.width.valueOf()])),At(),kt((e=>e[1][2]-e[0][2]<0||0===e[1][2])),De((e=>{let t=e[0][0].equals(e[1][0]),i=e[0][1].equals(e[1][1]),n=e[0][2]===e[1][2],r=e[0][3]===e[1][3],s=e[0][4]===e[1][4];return t&&i&&n&&r&&s})),vt(),st((e=>e)),zt((()=>this._container.renderService.renderCameraFrame$.pipe(St()))),Vt(this._container.renderService.size$,this._navigator.stateService.currentTransform$));t.push(o.pipe(zt((e=>h.pipe(De((([t,i,n])=>[this._roiCalculator.computeRegionOfInterest(t,i,n),e]))))),st((e=>!e[1].disposed))).subscribe((e=>{let t=e[0];e[1].setRegionOfInterest(t)})));const c=o.pipe(zt((e=>e.hasTexture$)),Ot(!1),Rt(1),U());t.push(c.subscribe((()=>{})));const l=this._container.configurationService.imageTiling$.pipe(zt((e=>e?this._navigator.stateService.currentState$:new j)),st((e=>!!e.state.previousImage)),vt(void 0,(e=>e.state.previousImage.id)),Vt(this._container.glRenderer.webGLRenderer$,this._container.renderService.size$),De((([e,t,i])=>{const n=e.state,r=n.previousImage,s=n.previousTransform;return new Lf(r.id,s.basicWidth,s.basicHeight,r.image,this._imageTileLoader,new xf,t)})),Rt(1),U());t.push(l.subscribe((()=>{}))),t.push(l.pipe(De((e=>t=>(t.setTextureProviderPrev(e.id,e),t)))).subscribe(this._glRendererOperation$)),t.push(l.pipe(At()).subscribe((e=>{e[0].abort()})));const u=this._container.configurationService.imageTiling$.pipe(zt((e=>e?Ve(this._container.renderService.renderCameraFrame$,this._container.renderService.size$.pipe(ft(250))):new j)),De((([e,t])=>[e.camera.position.clone(),e.camera.lookat.clone(),e.zoom.valueOf(),t.height.valueOf(),t.width.valueOf()])),At(),kt((e=>e[1][2]-e[0][2]<0||0===e[1][2])),De((e=>{let t=e[0][0].equals(e[1][0]),i=e[0][1].equals(e[1][1]),n=e[0][2]===e[1][2],r=e[0][3]===e[1][3],s=e[0][4]===e[1][4];return t&&i&&n&&r&&s})),vt(),st((e=>e)),zt((()=>this._container.renderService.renderCameraFrame$.pipe(St()))),Vt(this._container.renderService.size$,this._navigator.stateService.currentTransform$));t.push(l.pipe(zt((e=>u.pipe(De((([t,i,n])=>[this._roiCalculator.computeRegionOfInterest(t,i,n),e]))))),st((e=>!e[1].disposed)),Vt(this._navigator.stateService.currentState$)).subscribe((([[e,t],i])=>{let n=null;if($u(i.state.previousImage.cameraType))if($u(i.state.currentImage.cameraType)){const t=this._spatial.viewingDirection(i.state.currentImage.rotation),r=this._spatial.viewingDirection(i.state.previousImage.rotation),s=this._spatial.angleBetweenVector2(t.x,t.y,r.x,r.y)/(2*Math.PI);n={bbox:{maxX:this._spatial.wrap(e.bbox.maxX+s,0,1),maxY:e.bbox.maxY,minX:this._spatial.wrap(e.bbox.minX+s,0,1),minY:e.bbox.minY},pixelHeight:e.pixelHeight,pixelWidth:e.pixelWidth}}else{const t=this._spatial.viewingDirection(i.state.currentImage.rotation),r=this._spatial.viewingDirection(i.state.previousImage.rotation),s=this._spatial.angleBetweenVector2(t.x,t.y,r.x,r.y)/(2*Math.PI),a=this._spatial.angleToPlane(t.toArray(),[0,0,1]),o=(this._spatial.angleToPlane(r.toArray(),[0,0,1])-a)/(2*Math.PI),h=i.state.currentTransform,c=Math.max(h.basicWidth,h.basicHeight),l=c>0?2*Math.atan(.5*h.basicWidth/(c*h.focal)):Math.PI/3,u=c>0?2*Math.atan(.5*h.basicHeight/(c*h.focal)):Math.PI/3,d=l/(2*Math.PI),p=u/Math.PI,m=(e.bbox.maxX-e.bbox.minX)*d,f=(e.bbox.maxY-e.bbox.minY)*p,g=e.pixelWidth*d,_=e.pixelHeight*p,v=(e.bbox.minX+e.bbox.maxX)/2-.5,y=(e.bbox.minY+e.bbox.maxY)/2-.5,b=.5+s+d*v-m/2,x=.5+s+d*v+m/2,w=.5+o+p*y-f/2,M=.5+o+p*y+f/2;n={bbox:{maxX:this._spatial.wrap(x,0,1),maxY:M,minX:this._spatial.wrap(b,0,1),minY:w},pixelHeight:_,pixelWidth:g}}else{const t=i.state.currentTransform.basicAspect,r=i.state.previousTransform.basicAspect,[[s,a],[o,h]]=this._getBasicCorners(t,r),c=o-s,l=h-a,u=e.pixelWidth/c,d=e.pixelHeight/l,p=(c-1)/(2*c)+e.bbox.minX/c,m=(c-1)/(2*c)+e.bbox.maxX/c,f=(l-1)/(2*l)+e.bbox.minY/l,g={maxX:m,maxY:(l-1)/(2*l)+e.bbox.maxY/l,minX:p,minY:f};this._clipBoundingBox(g),n={bbox:g,pixelHeight:d,pixelWidth:u}}t.setRegionOfInterest(n)})));const d=l.pipe(zt((e=>e.hasTexture$)),Ot(!1),Rt(1),U());t.push(d.subscribe((()=>{})))}_deactivate(){this._waitSubscription.unsubscribe(),this._navigator.stateService.state$.pipe(St()).subscribe((e=>{e!==Df.Traversing&&this._navigator.stateService.traverse()})),this._glRendererDisposer$.next(null),this._domRenderer.deactivate(),this._subscriptions.unsubscribe(),this.configure({ids:null})}_getDefaultConfiguration(){return{initialPosition:1,mode:e.SliderConfigurationMode.Motion,sliderVisible:!0}}_catchCacheImage$(e){return this._navigator.graphService.cacheImage$(e).pipe(ct((t=>(console.error(`Failed to cache slider image (${e})`,t),ie()))))}_getBasicCorners(e,t){let i,n;return e>t?(i=.5,n=.5*e/t):(i=.5*t/e,n=.5),[[.5-i,.5-n],[.5+i,.5+n]]}_clipBoundingBox(e){e.minX=Math.max(0,Math.min(1,e.minX)),e.maxX=Math.max(0,Math.min(1,e.maxX)),e.minY=Math.max(0,Math.min(1,e.minY)),e.maxY=Math.max(0,Math.min(1,e.maxY))}}mg.componentName="slider";class fg{constructor(t,i){this._subscriptions=new rf,this._graphService=t,this._stateService=i;const n=this._subscriptions;this._directionSubject$=new j,this._direction$=this._directionSubject$.pipe(Ot(e.NavigationDirection.Next),Rt(1),U()),n.push(this._direction$.subscribe()),this._playing=!1,this._playingSubject$=new j,this._playing$=this._playingSubject$.pipe(Ot(this._playing),Rt(1),U()),n.push(this._playing$.subscribe()),this._speed=.5,this._speedSubject$=new j,this._speed$=this._speedSubject$.pipe(Ot(this._speed),Rt(1),U()),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 t=this._setSpeed(this._speed);this._stateService.setSpeed(t),this._graphModeSubscription=this._speed$.pipe(De((e=>e>fg.sequenceSpeed?Nf.Sequence:Nf.Spatial)),vt()).subscribe((e=>{this._graphService.setGraphMode(e)})),this._cacheSubscription=Ve(this._stateService.currentImage$.pipe(De((e=>[e.sequenceId,e.id])),vt(void 0,(([e])=>e))),this._graphService.graphMode$,this._direction$).pipe(zt((([[t,i],n,r])=>{if(r!==e.NavigationDirection.Next&&r!==e.NavigationDirection.Prev)return Ce([void 0,r]);return Ve((n===Nf.Sequence?this._graphService.cacheSequenceImages$(t,i):this._graphService.cacheSequence$(t)).pipe(Pt(3),ct((e=>(console.error(e),Ce(void 0))))),Ce(r))})),zt((([t,i])=>{if(void 0===t)return ie();const n=t.imageIds.slice();return i===e.NavigationDirection.Prev&&n.reverse(),this._stateService.currentState$.pipe(De((e=>[e.state.trajectory[e.state.trajectory.length-1].id,e.state.imagesAhead])),Lt((([e,t],[i,r])=>{void 0===e&&(e=i);const s=n.length-1;if(r>=this._imagesAhead||n[s]===e)return[e,[]];const a=n.indexOf(i),o=n.indexOf(e)+1,h=Math.min(s,a+this._imagesAhead-r)+1;return h<=o?[e,[]]:[n[h-1],n.slice(o,h)]}),[void 0,[]]),We((([e,t])=>ge(t))))})),We((e=>this._graphService.cacheImage$(e).pipe(ct((()=>ie())))),6)).subscribe(),this._playingSubscription=this._stateService.currentState$.pipe(st((e=>e.state.imagesAhead<this._imagesAhead)),vt(void 0,(e=>e.state.lastImage.id)),De((e=>{const t=e.state.lastImage,i=e.state.trajectory;let n;for(let e=i.length-2;e>=0;e--){const r=i[e];if(r.sequenceId!==t.sequenceId)break;if(r.capturedAt!==t.capturedAt){n=r.capturedAt<t.capturedAt;break}}return[e.state.lastImage,n]})),Vt(this._direction$),zt((([[t,i],n])=>at(([e.NavigationDirection.Next,e.NavigationDirection.Prev].indexOf(n)>-1?t.sequenceEdges$:t.spatialEdges$).pipe(St((e=>e.cached)),Pe(15e3)),Ce(n)).pipe(De((([e,t])=>{for(let i of e.edges)if(i.data.direction===t)return i.target;return null})),zt((e=>null!=e?this._graphService.cacheImage$(e):ie())))))).subscribe((e=>{this._stateService.appendImagess([e])}),(e=>{console.error(e),this.stop()})),this._clearSubscription=this._stateService.currentImage$.pipe(ht(1,10)).subscribe((e=>{this._stateService.clearPriorImages()})),this._setPlaying(!0);const i=this._stateService.currentState$.pipe(De((e=>e.state)),vt((([e,t],[i,n])=>e===i&&t===n),(e=>[e.currentImage.id,e.lastImage.id])),st((e=>e.currentImage.id===e.lastImage.id&&e.currentIndex===e.trajectory.length-1)),De((e=>e.currentImage)));this._stopSubscription=Ve(i,this._direction$).pipe(zt((([t,i])=>{const n=([e.NavigationDirection.Next,e.NavigationDirection.Prev].indexOf(i)>-1?t.sequenceEdges$:t.spatialEdges$).pipe(St((e=>e.cached)),Pe(15e3),ct((e=>(console.error(e),Ce({cached:!1,edges:[]})))));return Ve(Ce(i),n).pipe(De((([e,t])=>{for(const i of t.edges)if(i.data.direction===e)return!0;return!1})))})),We((e=>e||!this._bridging$?Ce(e):this._bridging$.pipe(De((e=>null!=e)),ct((e=>(console.error(e),Ce(!1))))))),St((e=>!e))).subscribe(void 0,void 0,(()=>{this.stop()})),this._stopSubscription.closed&&(this._stopSubscription=null),this._earthSubscription=this._stateService.state$.pipe(De((e=>e===Df.Earth)),vt(),St((e=>e))).subscribe(void 0,void 0,(()=>{this.stop()})),this._earthSubscription.closed&&(this._earthSubscription=null)}dispose(){this.stop(),this._subscriptions.unsubscribe()}setDirection(e){this._directionSubject$.next(e)}setSpeed(e){if((e=Math.max(0,Math.min(1,e)))===this._speed)return;const t=this._setSpeed(e);this._playing&&this._stateService.setSpeed(t),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(Nf.Spatial),this._setPlaying(!1))}_mapSpeed(e){const t=2*e-1;return Math.pow(10,t)-.2*t}_mapImagesAhead(e){return Math.round(Math.max(10,Math.min(50,8+6*e)))}_setPlaying(e){this._playing=e,this._playingSubject$.next(e)}_setSpeed(e){this._speed=e;const t=this._mapSpeed(this._speed);return this._imagesAhead=this._mapImagesAhead(t),t}}var gg,_g;fg.sequenceSpeed=.54,e.CameraVisualizationMode=void 0,(gg=e.CameraVisualizationMode||(e.CameraVisualizationMode={}))[gg.Hidden=0]="Hidden",gg[gg.Homogeneous=1]="Homogeneous",gg[gg.Cluster=2]="Cluster",gg[gg.ConnectedComponent=3]="ConnectedComponent",gg[gg.Sequence=4]="Sequence",e.OriginalPositionMode=void 0,(_g=e.OriginalPositionMode||(e.OriginalPositionMode={}))[_g.Hidden=0]="Hidden",_g[_g.Altitude=1]="Altitude",_g[_g.Flat=2]="Flat";class vg extends tc{constructor(e){super(),this._originalSize=e.originalSize;const{cluster:t,color:i,scale:n,translation:r}=e;this._makeAttributes(t),this.material.size=n*this._originalSize,this.setColor(i),this.matrixAutoUpdate=!1,this.position.fromArray(r),this.updateMatrix(),this.updateMatrixWorld(!1)}dispose(){this.geometry.dispose(),this.material.dispose()}setColor(e){this.material.vertexColors=null==e,this.material.color=new xr(e),this.material.needsUpdate=!0}resize(e){this.material.size=e*this._originalSize,this.material.needsUpdate=!0}_makeAttributes(e){const t=[],i=[],n=e.points;for(const e in n){if(!n.hasOwnProperty(e))continue;const r=n[e];t.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 Tr(new Float32Array(t),3)),r.setAttribute("color",new Tr(new Float32Array(i),3))}}class yg extends Wh{constructor(e){super(),this._makeAttributes(e),this.matrixAutoUpdate=!1,this.updateMatrix(),this.updateMatrixWorld(!1)}dispose(){this.geometry.dispose(),this.material.dispose()}_makeAttributes(e){const t=e.slice();t.push(e[0]);let i=0;const n=new Float32Array(3*(e.length+1));for(const e of t)n[i++]=e[0],n[i++]=e[1],n[i++]=e[2];this.geometry.setAttribute("position",new Tr(n,3))}}function bg(e,t){return e===t}function xg(e){const t=function(e){return Math.pow(2,e)}(e)/2;return{min:[-t,-t,-t],max:[t,t,t]}}class wg{constructor(e,t,i,n){this.level=e,this.leafLevel=t,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(e){const t=this;if(!t.boundingBox.containsPoint(e.position))throw new Error("Item not contained in node");if(bg(t.level,t.leafLevel))return t.items.push(e),this;for(const i of t.children)if(i.boundingBox.containsPoint(e.position))return i.add(e);for(const i of t._generateBoundingBoxes())if(i.containsPoint(e.position)){return new wg(t.level-1,t.leafLevel,i,t).add(e)}throw new Error("Item not contained in children")}intersect(e,t,i){if(e.intersectBox(this.boundingBox,t))if(bg(this.level,this.leafLevel))i.push(this);else for(const n of this.children)n.intersect(e,t,i)}remove(e){const t=this.items.indexOf(e);if(t<0)throw new Error(`Item does not exist ${e.uuid}`);this.items.splice(t,1)}traverse(){const e=this;if(!e.isEmpty)return;const t=e.parent;if(!t)return;const i=t.children.indexOf(e);if(i<0)throw new Error("Corrupt octree");t.children.splice(i,1),this.parent=null,t.traverse()}_generateBoundingBoxes(){const e=this.boundingBox.min,t=(this.boundingBox.max.x-e.x)/2,i=[[e.x,e.y+t,e.z+t],[e.x+t,e.y+t,e.z+t],[e.x,e.y,e.z+t],[e.x+t,e.y,e.z+t],[e.x,e.y+t,e.z],[e.x+t,e.y+t,e.z],[e.x,e.y,e.z],[e.x+t,e.y,e.z]],n=[];for(const[e,r,s]of i)n.push(new tn(new Ki(e,r,s),new Ki(e+t,r+t,s+t)));return n}}class Mg{constructor(e,t){if(this.rootLevel=e,this.leafLevel=t,t>e)throw new Error;this._index=new Map,this._root=this._makeRoot()}get root(){return this._root}add(e){if(!this.root.boundingBox.containsPoint(e.position))return void console.warn(`Object outside bounding box ${e.uuid}`);const t=this._root.add(e);this._index.set(e.uuid,t)}has(e){return this._index.has(e.uuid)}intersect(e){const t=[],i=new Ki;return this._root.intersect(e,i,t),t.map((e=>e.items)).reduce(((e,t)=>(e.push(...t),e)),[])}reset(){this._root=this._makeRoot(),this._index.clear()}remove(e){if(!this.has(e))throw new Error(`Frame does not exist ${e.uuid}`);const t=this._index.get(e.uuid);t.remove(e),t.traverse(),this._index.delete(e.uuid)}_makeRoot(){const e=this.rootLevel,t=xg(e),i=new tn((new Ki).fromArray(t.min),(new Ki).fromArray(t.max));return new wg(e,this.leafLevel,i)}}class Sg{constructor(e,t){this._objects=[],this._objectImageMap=new Map,this._octree=null!=e?e:new Mg(14,6),this._raycaster=null!=t?t:new su,this._interactiveLayer=1,this._raycaster=t||new su(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(e,t){const i=e.uuid;this._objectImageMap.set(i,t),this._objects.push(e),this._octree.add(e)}intersectObjects(e,t){this._raycaster.setFromCamera((new zi).fromArray(e),t);const i=this._octree.intersect(this.raycaster.ray),n=this._raycaster.intersectObjects(i),r=this._objectImageMap;for(const e of n){const t=e.object.uuid;if(r.has(t))return r.get(t)}return null}remove(e){const t=this._objects,i=t.indexOf(e);if(-1!==i){const n=t.splice(i,1);for(const e of n)this._objectImageMap.delete(e.uuid);this._octree.remove(e)}else console.warn("Object does not exist")}resetIntersectionThreshold(e){this._raycaster.params.Line.threshold=e?this._largeLineThreshold:this._lineThreshold}}class Tg extends Wh{constructor(e){super(e.geometry,e.material);const t=e.mode,i=e.originalOrigin,n=e.transform.unprojectBasic([0,0],0);this._relativeAltitude=i[2]-n[2],this._makeAttributes(n,i,t),this.matrixAutoUpdate=!1,this.position.fromArray(n),this.updateMatrix(),this.updateMatrixWorld(!1)}dispose(){this.geometry.dispose(),this.material.dispose()}setMode(e){const t=this.geometry.attributes.position;t.array[5]=this._modeToAltitude(e),t.needsUpdate=!0,this.geometry.computeBoundingSphere()}_makeAttributes(e,t,i){const n=new Float32Array(6);n[0]=0,n[1]=0,n[2]=0,n[3]=t[0]-e[0],n[4]=t[1]-e[1],n[5]=this._modeToAltitude(i);const r=new Tr(n,3);this.geometry.setAttribute("position",r),r.needsUpdate=!0,this.geometry.computeBoundingSphere()}_modeToAltitude(t){return t===e.OriginalPositionMode.Altitude?this._relativeAltitude:0}}class Cg extends Zh{constructor(e){super(e.geometry,e.material);const t=e.color,i=e.size,n=e.scale,r=e.transform,s=r.unprojectBasic([0,0],0),a=this._makePositions(i,r,s);this._makeAttributes(a,t),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(e){return this._updateColorAttribute(e),this}resize(e){return this.scale.set(e,e,e),this.updateMatrix(),this.updateMatrixWorld(!1),this}_makeAttributes(e,t){const i=this.geometry,n=new Tr(new Float32Array(e),3);i.setAttribute("position",n),n.needsUpdate=!0;const r=new Tr(new Float32Array(e.length),3);i.setAttribute("color",r),this._updateColorAttribute(t)}_updateColorAttribute(e){const[t,i,n]=new xr(e).toArray(),r=this.geometry.attributes.color,s=r.array,a=s.length;let o=0;for(let e=0;e<a;e++)s[o++]=t,s[o++]=i,s[o++]=n;r.needsUpdate=!0}}class Eg extends Cg{_makePositions(e,t,i){const n=[];n.push(...this._makeAxis(e,t,i)),n.push(...this._makeLat(.5,10,e,t,i));for(const r of[0,.25,.5,.75])n.push(...this._makeLng(r,10,e,t,i));return n}_makeAxis(e,t,i){const n=t.unprojectBasic([.5,1],.8*e),r=t.unprojectBasic([.5,0],1.2*e);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(e,t,i,n,r){const s=.8*i,[a,o,h]=r,c=[],l=n.unprojectBasic([0,e],s);l[0]-=a,l[1]-=o,l[2]-=h,c.push(...l);for(let i=1;i<=t;i++){const r=n.unprojectBasic([i/t,e],s);r[0]-=a,r[1]-=o,r[2]-=h,c.push(...r,...r)}return c.push(...l),c}_makeLng(e,t,i,n,r){const s=.8*i,[a,o,h]=r,c=[],l=n.unprojectBasic([e,0],s);l[0]-=a,l[1]-=o,l[2]-=h,c.push(...l);for(let i=0;i<=t;i++){const r=n.unprojectBasic([e,i/t],s);r[0]-=a,r[1]-=o,r[2]-=h,c.push(...r,...r)}return c.push(...l),c}}class Ag extends Cg{_makePositions(e,t,i){const n=[];return n.push(...this._makeDiags(e,t,i)),n.push(...this._makeFrame(e,8,t,i)),n}_makeDiags(e,t,i){const[n,r,s]=i,a=[0,0,0],o=[];for(const i of[[0,0],[1,0],[1,1],[0,1]]){const h=t.unprojectBasic(i,e);h[0]-=n,h[1]-=r,h[2]-=s,o.push(...a,...h)}return o}_makeFrame(e,t,i,n){const r=[];r.push(...this._subsample([0,1],[0,0],t)),r.push(...this._subsample([0,0],[1,0],t)),r.push(...this._subsample([1,0],[1,1],t));const[s,a,o]=n,h=[];for(const t of r){const n=i.unprojectBasic(t,e);n[0]-=s,n[1]-=a,n[2]-=o,h.push(...n)}return h}_interpolate(e,t,i){return e+i*(t-e)}_subsample(e,t,i){if(i<1)return[e,t];const n=[];n.push(e);for(let r=0;r<=i;r++){const s=[];for(let n=0;n<3;n++)s.push(this._interpolate(e[n],t[n],r/(i+1)));n.push(s),n.push(s)}return n.push(t),n}}function Ig(e,t,i){const[n,r,s]=t,[a,o,h]=vu(n,r,s,i.lng,i.lat,i.alt);return _u(a,o,h,e.lng,e.lat,e.alt)}class Rg{constructor(e,t,i){this.id=e,this._scene=t,this._intersection=i,this.cameras=new tr,this.keys=[],this._positionLines={},this._positions=new tr,this._cameraFrames={},this._clusters=new Map,this._connectedComponents=new Map,this._sequences=new Map,this._props={},this.clusterVisibles={},this._frameMaterial=new Bh({fog:!1,vertexColors:!0}),this._positionMaterial=new Bh({fog:!1,color:16711680}),this._scene.add(this.cameras,this._positions)}addImage(e){const t=e.image,i=t.id;if(this.hasImage(i))throw new Error(`Image exists ${i}`);const n=e.idMap.ccId;this._connectedComponents.has(n)||this._connectedComponents.set(n,[]);const r=e.idMap.clusterId;this._clusters.has(r)||this._clusters.set(r,[]);const s=e.idMap.sequenceId;this._sequences.has(s)||this._sequences.set(s,[]),this._props[i]={image:t,ids:{ccId:n,clusterId:r,sequenceId:s}},this.keys.push(i)}applyCameraColor(e,t){this._cameraFrames[e].setColor(t)}applyCameraSize(e){for(const t of this.cameras.children)t.resize(e)}applyFilter(e){var t;const i=this.clusterVisibles;for(const e in i)i.hasOwnProperty(e)&&(i[e]=!1);const n=this._cameraFrames,r=this._positionLines,s=this._intersection.interactiveLayer;for(const a of Object.values(this._props)){const o=a.image,h=e(o),c=o.id;r[c].visible=h;const l=n[c];this._setCameraVisibility(l,h,s),i[t=a.ids.clusterId]||(i[t]=h)}}applyPositionMode(t){this._positions.visible=t!==e.OriginalPositionMode.Hidden;for(const e of this._positions.children)e.setMode(t)}dispose(){this._disposeCameras(),this._disposePositions(),this._scene=null,this._intersection=null}getCamerasByMode(t){if(t===e.CameraVisualizationMode.Cluster)return this._clusters;if(t===e.CameraVisualizationMode.ConnectedComponent)return this._connectedComponents;if(t===e.CameraVisualizationMode.Sequence)return this._sequences;const i=e.CameraVisualizationMode,n=i[i.Homogeneous],r=new Map;return r.set(n,this.cameras.children),r}getColorId(t,i){const n=this._props[t],r=e.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(e){return-1!==this.keys.indexOf(e)}resetReference(e,t){const i=this._cameraFrames;for(const n in i){if(!i.hasOwnProperty(n))continue;const r=i[n];r.position.fromArray(Ig(e,r.position.toArray(),t))}const n=this._positionLines;for(const i in n){if(!n.hasOwnProperty(i))continue;const r=n[i];r.position.fromArray(Ig(e,r.position.toArray(),t))}}visualize(e){var t,i;const n=e.id,r=e.visible,s=e.transform,a={color:e.color,material:this._frameMaterial,scale:e.scale,size:e.maxSize,transform:s},o=$u(s.cameraType)?new Eg(a):new Ag(a),h=this._intersection.interactiveLayer;this._setCameraVisibility(o,r,h),this.cameras.add(o),this._cameraFrames[n]=o;this._intersection.add(o,n);const c=this._props[n].ids;(t=this.clusterVisibles)[i=c.clusterId]||(t[i]=r),this._connectedComponents.get(c.ccId).push(o),this._clusters.get(c.clusterId).push(o),this._sequences.get(c.sequenceId).push(o);const l={material:this._positionMaterial,mode:e.positionMode,originalOrigin:e.originalPosition,transform:s},u=new Tg(l);u.visible=r,this._positions.add(u),this._positionLines[n]=u}_disposeCameras(){const e=this._intersection,t=this.cameras;for(const i of t.children.slice())i.dispose(),e.remove(i),t.remove(i);this._scene.remove(this.cameras)}_disposePositions(){const e=this._positions;for(const t of e.children.slice())t.dispose(),e.remove(t);this._scene.remove(this._positions)}_setCameraVisibility(e,t,i){e.visible=t,t?e.layers.enable(i):e.layers.disable(i)}}class Pg{constructor(){this._colors=new Map;const t=e.CameraVisualizationMode;this._colors.set(t[t.Homogeneous],"#FFFFFF")}getColor(e){const t=this._colors;return t.has(e)||t.set(e,this._randomColor()),t.get(e)}_randomColor(){return`hsl(${Math.floor(360*Math.random())}, 100%, 50%)`}}function Lg(t){return t!==e.CameraVisualizationMode.Hidden}var Dg;e.PointVisualizationMode=void 0,(Dg=e.PointVisualizationMode||(e.PointVisualizationMode={}))[Dg.Hidden=0]="Hidden",Dg[Dg.Original=1]="Original",Dg[Dg.Cluster=2]="Cluster";class Ng{constructor(t,i){this._rayNearScale=1.1,this._originalPointSize=2,this._originalCameraSize=2,this._imageCellMap=new Map,this._scene=i||new ch,this._scene.autoUpdate=!1,this._intersection=new Sg,this._assets=new Pg,this._needsRender=!1,this._images={},this._cells={},this._cellClusters={},this._clusters={},this._cameraVisualizationMode=t.cameraVisualizationMode?t.cameraVisualizationMode:e.CameraVisualizationMode.Homogeneous,this._cameraSize=t.cameraSize,this._pointSize=t.pointSize,this._pointVisualizationMode=t.pointVisualizationMode?t.pointVisualizationMode:e.PointVisualizationMode.Original,this._positionMode=t.originalPositionMode,this._cellsVisible=t.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,i,n){if(this.hasCluster(t.id,n))return;const r=t.id;if(!(r in this._clusters)){this._clusters[r]={points:new tr,cellIds:[]};const n=this._getClusterVisible(r),s=this._clusters[r],a=this._pointVisualizationMode===e.PointVisualizationMode.Cluster?this._assets.getColor(r):null,o=new vg({cluster:t,color:a,originalSize:this._originalPointSize,scale:this._pointSize,translation:i});s.points.visible=n,s.points.add(o),this._scene.add(s.points)}-1===this._clusters[r].cellIds.indexOf(n)&&this._clusters[r].cellIds.push(n),n in this._cellClusters||(this._cellClusters[n]={keys:[]}),-1===this._cellClusters[n].keys.indexOf(r)&&this._cellClusters[n].keys.push(r),this._needsRender=!0}addImage(e,t,i,n){var r,s,a;const o=e.id,h={clusterId:null!==(r=e.clusterId)&&void 0!==r?r:"NO_CLUSTER_ID",sequenceId:null!==(s=e.sequenceId)&&void 0!==s?s:"NO_SEQUENCE_ID",ccId:null!==(a=e.mergeId)&&void 0!==a?a:"NO_MERGE_ID"};if(!(n in this._images)){const e=new Rg(n,this._scene,this._intersection);e.cameras.visible=Lg(this._cameraVisualizationMode),e.applyPositionMode(this._positionMode),this._images[n]=e}const c=this._images[n];if(c.hasImage(o))return;c.addImage({idMap:h,image:e});const l=c.getColorId(o,this._cameraVisualizationMode),u=this._assets.getColor(l),d=this._filter(e);if(c.visualize({id:o,color:u,positionMode:this._positionMode,scale:this._cameraSize,transform:t,visible:d,maxSize:this._originalCameraSize,originalPosition:i}),this._imageCellMap.set(o,n),o===this._selectedId&&this._highlight(o,this._colors.select,this._cameraVisualizationMode),h.clusterId in this._clusters){const e=this._getClusterVisible(h.clusterId);this._clusters[h.clusterId].points.visible=e}this._needsRender=!0}addCell(e,t){if(this.hasCell(t))return;const i=new yg(e);this._cells[t]=new tr,this._cells[t].visible=this._cellsVisible,this._cells[t].add(i),this._scene.add(this._cells[t]),this._needsRender=!0}deactivate(){this._filter=()=>!0,this._selectedId=null,this._hoveredId=null,this.uncache()}hasCluster(e,t){return e in this._clusters&&-1!==this._clusters[e].cellIds.indexOf(t)}hasCell(e){return e in this._cells}hasImage(e,t){return t in this._images&&this._images[t].hasImage(e)}render(e,t){t.render(this._scene,e),this._needsRender=!1}resetReference(e,t){const i=this._clusters;for(const n in i){if(!i.hasOwnProperty(n))continue;const r=i[n];r.points.position.fromArray(Ig(e,r.points.position.toArray(),t))}const n=this._cells;for(const i in n){if(!n.hasOwnProperty(i))continue;const r=n[i];r.position.fromArray(Ig(e,r.position.toArray(),t))}const r=this._images;for(const i in r){if(!r.hasOwnProperty(i))continue;r[i].resetReference(e,t)}}setCameraSize(e){if(Math.abs(e-this._cameraSize)<.001)return;const t=this._images;for(const i of Object.keys(t))t[i].applyCameraSize(e);this._intersection.raycaster.near=this._getNear(e),this._cameraSize=e,this._needsRender=!0}setFilter(t){this._filter=t;const i={};for(const e of Object.values(this._images)){e.applyFilter(t);const n=e.clusterVisibles;for(const e in n)n.hasOwnProperty(e)&&(e in i||(i[e]=!1),i[e]||(i[e]=n[e]))}const n=this._pointVisualizationMode!==e.PointVisualizationMode.Hidden;for(const e in i){if(!i.hasOwnProperty(e))continue;i[e]&&(i[e]=n);const t=i[e];e in this._clusters&&(this._clusters[e].points.visible=t)}this._needsRender=!0}setHoveredImage(e){if(null!=e&&!this._imageCellMap.has(e))throw new Pu(`Image does not exist: ${e}`);this._hoveredId!==e&&(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(e,this._colors.hover,this._cameraVisualizationMode),this._hoveredId=e)}setNavigationState(e){this._intersection.resetIntersectionThreshold(e)}setPointSize(e){if(Math.abs(e-this._pointSize)<.001)return;const t=this._clusters;for(const i in t)if(t.hasOwnProperty(i))for(const n of t[i].points.children)n.resize(e);this._pointSize=e,this._needsRender=!0}setPointVisualizationMode(t){if(t!==this._pointVisualizationMode){this._pointVisualizationMode=t;for(const i in this._clusters){if(!this._clusters.hasOwnProperty(i))continue;const n=this._clusters[i];n.points.visible=this._getClusterVisible(i);for(const r of n.points.children){const n=t===e.PointVisualizationMode.Cluster?this._assets.getColor(i):null;r.setColor(n)}}this._needsRender=!0}}setPositionMode(e){if(e!==this._positionMode){for(const t of Object.values(this._images))t.applyPositionMode(e);this._positionMode=e,this._needsRender=!0}}setSelectedImage(e){this._selectedId!==e&&(this._needsRender=!0,null!=this._selectedId&&this._resetCameraColor(this._selectedId),this._highlight(e,this._colors.select,this._cameraVisualizationMode),this._selectedId=e)}setCellVisibility(e){if(e!==this._cellsVisible){for(const t in this._cells)this._cells.hasOwnProperty(t)&&(this._cells[t].visible=e);this._cellsVisible=e,this._needsRender=!0}}setCameraVisualizationMode(e){if(e===this._cameraVisualizationMode)return;const t=Lg(e),i=this._assets;for(const n of Object.values(this._images)){n.cameras.visible=t;n.getCamerasByMode(e).forEach(((e,t)=>{const n=i.getColor(t);for(const t of e)t.setColor(n)}))}this._highlight(this._hoveredId,this._colors.hover,e),this._highlight(this._selectedId,this._colors.select,e),this._cameraVisualizationMode=e,this._needsRender=!0}uncache(e){for(const t of Object.keys(this._cellClusters))e&&-1!==e.indexOf(t)||this._disposeReconstruction(t);for(const t of Object.keys(this._images)){if(e&&-1!==e.indexOf(t))continue;const i=this._imageCellMap,n=this._images[t].keys;for(const e of n)i.delete(e);this._images[t].dispose(),delete this._images[t]}for(const t of Object.keys(this._cells))e&&-1!==e.indexOf(t)||this._disposeCell(t);this._needsRender=!0}_getClusterVisible(t){if(this._pointVisualizationMode===e.PointVisualizationMode.Hidden)return!1;let i=!1;for(const e of Object.values(this._images)){const n=e.clusterVisibles;t in n&&(i||(i=n[t]))}return i}_disposePoints(e){for(const t of this._cellClusters[e].keys){if(!(t in this._clusters))continue;const i=this._clusters[t].cellIds.indexOf(e);if(-1!==i&&(this._clusters[t].cellIds.splice(i,1),!(this._clusters[t].cellIds.length>0))){for(const e of this._clusters[t].points.children.slice())e.dispose();this._scene.remove(this._clusters[t].points),delete this._clusters[t]}}}_disposeReconstruction(e){this._disposePoints(e),delete this._cellClusters[e]}_disposeCell(e){const t=this._cells[e];for(const e of t.children.slice())e.dispose(),t.remove(e);this._scene.remove(t),delete this._cells[e]}_getNear(e){const t=this._rayNearScale*this._originalCameraSize*e;return Math.max(1,t)}_resetCameraColor(e){const t=this._imageCellMap;if(null==e||!t.has(e))return;const i=t.get(e),n=this._images[i],r=n.getColorId(e,this._cameraVisualizationMode),s=this._assets.getColor(r);n.applyCameraColor(e,s)}_highlight(t,i,n){const r=this._imageCellMap;if(null==t||!r.has(t))return;const s=r.get(t);i=n===e.CameraVisualizationMode.Homogeneous?i:"#FFFFFF",this._images[s].applyCameraColor(t,i)}}class $g{constructor(e,t){this._graphService=e,this._data=t,this._cells={},this._cacheRequests={},this._clusters={},this._clusterCells={},this._cellClusters={},this._cachingCells$={},this._cachingClusters$={}}cacheClusters$(e){if(!this.hasCell(e))throw new Error("Cannot cache reconstructions of a non-existing cell.");if(this.hasClusters(e))throw new Error("Cannot cache reconstructions that already exists.");if(this.isCachingClusters(e))return this._cachingClusters$[e];const t=this.getCell(e).filter((e=>!!e.clusterId&&!!e.clusterUrl)).map((e=>({key:e.clusterId,url:e.clusterUrl}))),i=Array.from(new Map(t.map((e=>[e.key,e]))).values());let n;this._cellClusters[e]=i,this._cacheRequests[e]=[];const r=new Promise(((e,t)=>{n=t}));return this._cacheRequests[e].push(n),this._cachingClusters$[e]=this._cacheClusters$(i,e,r).pipe(Mt((()=>{e in this._cachingClusters$&&delete this._cachingClusters$[e],e in this._cacheRequests&&delete this._cacheRequests[e]})),It(),U()),this._cachingClusters$[e]}cacheCell$(e){if(this.hasCell(e))throw new Error("Cannot cache cell that already exists.");return this.isCachingCell(e)||(this._cachingCells$[e]=this._graphService.cacheCell$(e).pipe(ct((e=>(console.error(e),ie()))),st((()=>!(e in this._cells))),Ut((t=>{this._cells[e]=[],this._cells[e].push(...t),delete this._cachingCells$[e]})),Mt((()=>{e in this._cachingCells$&&delete this._cachingCells$[e]})),It(),U())),this._cachingCells$[e]}isCachingClusters(e){return e in this._cachingClusters$}isCachingCell(e){return e in this._cachingCells$}hasClusters(e){if(e in this._cachingClusters$||!(e in this._cellClusters))return!1;for(const t of this._cellClusters[e])if(!(t.key in this._clusters))return!1;return!0}hasCell(e){return!(e in this._cachingCells$)&&e in this._cells}getClusters(e){return e in this._cellClusters?this._cellClusters[e].map((e=>this._clusters[e.key])).filter((e=>!!e)):[]}getCell(e){return e in this._cells?this._cells[e]:[]}uncache(e){for(let t of Object.keys(this._cacheRequests))if(!e||-1===e.indexOf(t)){for(const e of this._cacheRequests[t])e();delete this._cacheRequests[t]}for(let t of Object.keys(this._cellClusters))if(!e||-1===e.indexOf(t)){for(const e of this._cellClusters[t]){if(!(e.key in this._clusterCells))continue;const i=this._clusterCells[e.key].indexOf(t);-1!==i&&(this._clusterCells[e.key].splice(i,1),this._clusterCells[e.key].length>0||(delete this._clusterCells[e.key],delete this._clusters[e.key]))}delete this._cellClusters[t]}for(let t of Object.keys(this._cells))e&&-1!==e.indexOf(t)||delete this._cells[t]}updateCell$(e){if(!this.hasCell(e))throw new Error("Cannot update cell that does not exists.");return this._graphService.cacheCell$(e).pipe(ct((e=>(console.error(e),ie()))),st((()=>e in this._cells)),Ut((t=>{this._cells[e]=[],this._cells[e].push(...t)})),It(),U())}updateClusters$(e){if(!this.hasCell(e))throw new Error("Cannot update reconstructions of a non-existing cell.");if(!this.hasClusters(e))throw new Error("Cannot update reconstructions for cell that is not cached.");const t=this.getCell(e).filter((e=>!!e.clusterId&&!!e.clusterUrl)).map((e=>({key:e.clusterId,url:e.clusterUrl}))),i=Array.from(new Map(t.map((e=>[e.key,e]))).values()).filter((e=>!(e.key in this._clusters)));return this._cellClusters[e].push(...i),this._cacheClusters$(i,e,null)}_cacheClusters$(e,t,i){return ge(e).pipe(We((e=>this._hasCluster(e.key)?Ce(this._getCluster(e.key)):this._getCluster$(e.url,e.key,i).pipe(ct((e=>(e instanceof uf||console.error(e),ie()))))),6),st((()=>t in this._cellClusters)),Ut((e=>{this._hasCluster(e.id)||(this._clusters[e.id]=e),e.id in this._clusterCells||(this._clusterCells[e.id]=[]),-1===this._clusterCells[e.id].indexOf(t)&&this._clusterCells[e.id].push(t)})))}_getCluster(e){return this._clusters[e]}_getCluster$(e,t,i){return k.create((n=>{this._data.getCluster(e,i).then((e=>{e.id=t,n.next(e),n.complete()}),(e=>{n.error(e)}))}))}_hasCluster(e){return e in this._clusters}}function kg(e,t,i){const n=new Set;return n.add(e),Og(n,[e],0,t,i),Array.from(n)}function Og(e,t,i,n,r){if(i>=n)return;const s=[];for(const e of t){const t=r.getAdjacent(e);s.push(...t)}const a=[];for(const t of s)e.has(t)||(e.add(t),a.push(t));Og(e,a,i+1,n,r)}class zg extends sf{constructor(e,t,i){super(e,t,i),this._cache=new $g(i.graphService,i.api.data),this._scene=new Ng(this._getDefaultConfiguration()),this._viewportCoords=new hf,this._spatial=new Du}getFrameIdAt(e){return new Promise(((t,i)=>{this._container.renderService.renderCamera$.pipe(St(),De((t=>{const i=this._viewportCoords.canvasToViewport(e[0],e[1],this._container.container);return this._scene.intersection.intersectObjects(i,t.perspective)}))).subscribe((e=>{t(e)}),(e=>{i(e)}))}))}_activate(){this._navigator.cacheService.configure({cellDepth:3});const t=this._subscriptions;t.push(this._navigator.stateService.reference$.pipe(At()).subscribe((([e,t])=>{this._scene.resetReference(t,e)}))),t.push(this._navigator.graphService.filter$.subscribe((e=>{this._scene.setFilter(e)})));const i=this._container.renderService.bearing$.pipe(De((e=>6*Math.floor(e/6))),vt(),Rt(1),U()),n=this._navigator.stateService.currentImage$.pipe(De((e=>this._navigator.api.data.geometry.lngLatToCellId(e.originalLngLat))),vt(),Rt(1),U()),r=this._configuration$.pipe(De((e=>this._spatial.clamp(e.cellGridDepth,1,3))),vt(),Rt(1),U()),s=Ve(this._navigator.playService.playing$,this._navigator.playService.speed$).pipe(De((([e,t])=>e&&t>fg.sequenceSpeed)),vt(),Rt(1),U()),a=this._navigator.stateService.state$.pipe(De((e=>function(e){return e===Df.Custom||e===Df.Earth}(e))),vt(),Rt(1),U());t.push(a.subscribe((e=>{this._scene.setNavigationState(e)})));const o=Ve(a,s,i,r,this._navigator.stateService.currentImage$).pipe(vt((([e,t,i,n,r],[s,a,o,h,c])=>{if(e!==s)return!1;const l=r.id===c.id&&t===a&&n===h;return e?l:l&&i===o})),dt((([e,t,i,n,r])=>{if(e){const e=this._navigator.api.data.geometry,i=e.lngLatToCellId(r.originalLngLat);return Ce(t?[i]:kg(i,n,e))}const s=t?30:90;return Ce(this._cellsInFov(r,i,s))})),zt((e=>ge(e).pipe(We((e=>(this._cache.hasCell(e)?Ce(this._cache.getCell(e)):this._cache.cacheCell$(e)).pipe(De((t=>({id:e,images:t}))))),6)))));t.push(o.pipe(Vt(this._navigator.stateService.reference$)).subscribe((([e,t])=>{this._scene.hasCell(e.id)||this._scene.addCell(this._cellToTopocentric(e.id,t),e.id)}))),t.push(o.pipe(Vt(this._navigator.stateService.reference$)).subscribe((([e,t])=>{this._addSceneImages(e,t)}))),t.push(o.pipe(dt((e=>{const t=e.id;let i;return i=this._cache.hasClusters(t)?ge(this._cache.getClusters(t)):this._cache.isCachingClusters(t)?this._cache.cacheClusters$(t).pipe(Ct(null,{}),zt((()=>ge(this._cache.getClusters(t))))):this._cache.hasCell(t)?this._cache.cacheClusters$(t):ie(),Ve(Ce(t),i)})),Vt(this._navigator.stateService.reference$)).subscribe((([[e,t],i])=>{this._scene.hasCluster(t.id,e)||this._scene.addCluster(t,this._computeTranslation(t,i),e)}))),t.push(this._configuration$.pipe(De((t=>{var i;t.cameraSize=this._spatial.clamp(t.cameraSize,.01,1),t.pointSize=this._spatial.clamp(t.pointSize,.01,1);const n=t.pointsVisible?null!==(i=t.pointVisualizationMode)&&void 0!==i?i:e.PointVisualizationMode.Original:e.PointVisualizationMode.Hidden;return{cameraSize:t.cameraSize,cameraVisualizationMode:t.cameraVisualizationMode,cellsVisible:t.cellsVisible,originalPositionMode:t.originalPositionMode,pointSize:t.pointSize,pointVisualizationMode:n}})),vt(((e,t)=>e.cameraSize===t.cameraSize&&e.cameraVisualizationMode===t.cameraVisualizationMode&&e.cellsVisible===t.cellsVisible&&e.originalPositionMode===t.originalPositionMode&&e.pointSize===t.pointSize&&e.pointVisualizationMode===t.pointVisualizationMode))).subscribe((e=>{this._scene.setCameraSize(e.cameraSize);const t=e.cameraVisualizationMode;this._scene.setCameraVisualizationMode(t),this._scene.setCellVisibility(e.cellsVisible),this._scene.setPointSize(e.pointSize);const i=e.pointVisualizationMode;this._scene.setPointVisualizationMode(i);const n=e.originalPositionMode;this._scene.setPositionMode(n)}))),t.push(Ve(n,r).subscribe((([e,t])=>{const i=kg(e,t,this._navigator.api.data.geometry);this._scene.uncache(i),this._cache.uncache(i)}))),t.push(this._navigator.playService.playing$.pipe(zt((e=>e?ie():this._container.mouseService.dblClick$)),Vt(this._container.renderService.renderCamera$),zt((([e,t])=>{const i=this._container.container,[n,r]=this._viewportCoords.canvasPosition(e,i),s=this._viewportCoords.canvasToViewport(n,r,i),a=this._scene.intersection.intersectObjects(s,t.perspective);return a?this._navigator.moveTo$(a).pipe(ct((()=>ie()))):ie()}))).subscribe());const h=Ve(this._configuration$,this._navigator.stateService.state$).pipe(De((([e,t])=>(e.cameraSize=this._spatial.clamp(e.cameraSize,.01,1),{size:e.cameraSize,visible:Lg(e.cameraVisualizationMode),state:t}))),vt(((e,t)=>e.size===t.size&&e.visible===t.visible&&e.state===t.state))),c=this._container.mouseService.mouseMove$.pipe(Rt(1),U());t.push(c.subscribe());const l=it(this._container.mouseService.mouseEnter$,this._container.mouseService.mouseLeave$,this._container.mouseService.windowBlur$);t.push(Ve(this._navigator.playService.playing$,l,a,this._navigator.graphService.filter$).pipe(zt((([e,t])=>e||"pointerenter"!==t.type?Ve(Ce(t),Ce(null),Ce(null)):Ve(Ze(c.pipe(_t(1)),this._container.mouseService.mouseMove$),this._container.renderService.renderCamera$,h)))).subscribe((([e,t])=>{if("pointermove"!==e.type)return void this._scene.setHoveredImage(null);const i=this._container.container,[n,r]=this._viewportCoords.canvasPosition(e,i),s=this._viewportCoords.canvasToViewport(n,r,i),a=this._scene.intersection.intersectObjects(s,t.perspective);this._scene.setHoveredImage(a)}))),t.push(this._navigator.stateService.currentId$.subscribe((e=>{this._scene.setSelectedImage(e)}))),t.push(this._navigator.stateService.currentState$.pipe(De((e=>{const t=this._scene;return{name:this._name,renderer:{frameId:e.id,needsRender:t.needsRender,render:t.render.bind(t),pass:yf.Opaque}}}))).subscribe(this._container.glRenderer.render$));const u=this._navigator.graphService.dataAdded$.pipe(st((e=>this._cache.hasCell(e))),We((e=>this._cache.updateCell$(e).pipe(De((t=>({id:e,images:t}))),Vt(this._navigator.stateService.reference$)))),It(),U());t.push(u.subscribe((([e,t])=>{this._addSceneImages(e,t)}))),t.push(u.pipe(dt((([e])=>{const t=e.id,i=this._cache;let n;return n=i.hasClusters(t)?i.updateClusters$(t):i.isCachingClusters(t)?this._cache.cacheClusters$(t).pipe(Ct(null,{}),zt((()=>ge(i.updateClusters$(t))))):ie(),Ve(Ce(t),n)})),Vt(this._navigator.stateService.reference$)).subscribe((([[e,t],i])=>{this._scene.hasCluster(t.id,e)||this._scene.addCluster(t,this._computeTranslation(t,i),e)})))}_deactivate(){this._subscriptions.unsubscribe(),this._cache.uncache(),this._scene.deactivate(),this._navigator.cacheService.configure()}_getDefaultConfiguration(){return{cameraSize:.1,cameraVisualizationMode:e.CameraVisualizationMode.Homogeneous,cellGridDepth:1,originalPositionMode:e.OriginalPositionMode.Hidden,pointSize:.1,pointsVisible:!0,pointVisualizationMode:e.PointVisualizationMode.Original,cellsVisible:!1}}_addSceneImages(e,t){const i=e.id,n=e.images;for(const e of n)this._scene.hasImage(e.id,i)||this._scene.addImage(e,this._createTransform(e,t),this._computeOriginalPosition(e,t),i)}_cellsInFov(e,t,i){const n=this._spatial,r=this._navigator.api.data.geometry,s=r.lngLatToCellId(e.originalLngLat),a=[s],o=i/2,h=r.getAdjacent(s);for(const i of h){const s=r.getVertices(i);for(const r of s){const[s,h]=_u(r.lng,r.lat,0,e.lngLat.lng,e.lngLat.lat,0),c=Math.atan2(h,s),l=n.radToDeg(n.azimuthalToBearing(c));Math.abs(l-t)<o&&a.push(i)}}return a}_computeOriginalPosition(e,t){return _u(e.originalLngLat.lng,e.originalLngLat.lat,null!=e.originalAltitude?e.originalAltitude:e.computedAltitude,t.lng,t.lat,t.alt)}_cellToTopocentric(e,t){return this._navigator.api.data.geometry.getVertices(e).map((e=>_u(e.lng,e.lat,-2,t.lng,t.lat,t.alt)))}_computeTranslation(e,t){return _u(e.reference.lng,e.reference.lat,e.reference.alt,t.lng,t.lat,t.alt)}_createTransform(e,t){const i=Ou({alt:e.computedAltitude,lat:e.lngLat.lat,lng:e.lngLat.lng},e.rotation,t);return new ug(e.exifOrientation,e.width,e.height,e.scale,e.rotation,i,void 0,void 0,e.cameraParameters,e.cameraType)}}zg.componentName="spatial";class Fg{constructor(){this._notifyChanged$=new j}get changed$(){return this._notifyChanged$}}class Bg extends Pu{constructor(e){super(null!=e?e:"The provided geometry value is incorrect"),Object.setPrototypeOf(this,Bg.prototype),this.name="GeometryTagError"}}class Ug extends Fg{constructor(e){super();if(e.length<2)throw new Bg("A points geometry must have two or more positions.");this._points=[];for(const t of e){if(t[0]<0||t[0]>1||t[1]<0||t[1]>1)throw new Bg("Basic coordinates of points must be on the interval [0, 1].");this._points.push(t.slice())}}get points(){return this._points}addPoint2d(e){const t=[Math.max(0,Math.min(1,e[0])),Math.max(0,Math.min(1,e[1]))];this._points.push(t),this._notifyChanged$.next(this)}getPoint2d(e){return this._points[e].slice()}removePoint2d(e){if(e<0||e>=this._points.length||this._points.length<3)throw new Bg("Index for removed point must be valid.");this._points.splice(e,1),this._notifyChanged$.next(this)}setVertex2d(e,t,i){this.setPoint2d(e,t,i)}setPoint2d(e,t,i){const n=[Math.max(0,Math.min(1,t[0])),Math.max(0,Math.min(1,t[1]))];this._points[e]=n,this._notifyChanged$.next(this)}getPoints3d(e){return this._getPoints3d(this._points,e)}getPoint3d(e,t){return t.unprojectBasic(this._points[e],200)}getPoints2d(){return this._points.slice()}getCentroid2d(e){if(!e)throw new Bg("Get centroid must be called with a transform for points geometries.");const[t,i,n,r]=this.getRect2d(e);return[t<n?(t+n)/2:(t+n+1)/2%1,(i+r)/2]}getCentroid3d(e){let t=this.getCentroid2d();return e.unprojectBasic(t,200)}getRect2d(e){let t=1,i=0,n=1,r=0;const s=this._points;for(const e of s)e[0]<t&&(t=e[0]),e[0]>i&&(i=e[0]),e[1]<n&&(n=e[1]),e[1]>r&&(r=e[1]);if($u(e.cameraType)){const e=[];for(let t=0;t<s.length;t++)e[t]=t;e.sort(((e,t)=>s[e][0]<s[t][0]?-1:s[e][0]>s[t][0]?1:e<t?-1:1));let n=s[e[0]][0]+1-s[e[e.length-1]][0],r=0;for(let t=0;t<e.length-1;t++){const i=e[t],a=e[t+1],o=s[a][0]-s[i][0];o>n&&(n=o,r=t+1)}r>0&&(t=s[e[r]][0],i=s[e[r-1]][0])}return[t,n,i,r]}setCentroid2d(e,t){throw new Error("Not implemented")}_getPoints3d(e,t){return e.map((e=>t.unprojectBasic(e,200)))}}class Vg{constructor(e,t,i){this._geometry=e,this._transform=t,this._viewportCoords=i||new hf,this._aborted$=new j,this._created$=new j,this._glObjectsChanged$=new j,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(De((()=>this)))}dispose(){this._geometryChangedSubscription.unsubscribe()}_canvasToTransform(e){return`translate(-50%,-50%) translate(${Math.round(e[0])}px,${Math.round(e[1])}px)`}_colorToBackground(e){return"#"+("000000"+e.toString(16)).substr(-6)}_createOutine(e,t){const i=this._getLinePositions(e),n=new kr;n.setAttribute("position",new Tr(i,3));const r=new Bh({color:t,linewidth:1});return new Wh(n,r)}_disposeLine(e){null!=e&&(e.geometry.dispose(),e.material.dispose())}_getLinePositions(e){const t=e.length,i=new Float32Array(3*t);for(let n=0;n<t;++n){const t=3*n,r=e[n];i[t]=r[0],i[t+1]=r[1],i[t+2]=r[2]}return i}}var Hg={exports:{}};function jg(e,t,i){i=i||2;var n,r,s,a,o,h,c,l=t&&t.length,u=l?t[0]*i:e.length,d=Gg(e,0,u,i,!0),p=[];if(!d||d.next===d.prev)return p;if(l&&(d=function(e,t,i,n){var r,s,a,o=[];for(r=0,s=t.length;r<s;r++)(a=Gg(e,t[r]*n,r<s-1?t[r+1]*n:e.length,n,!1))===a.next&&(a.steiner=!0),o.push(i_(a));for(o.sort(Kg),r=0;r<o.length;r++)i=Wg(i=Qg(o[r],i),i.next);return i}(e,t,d,i)),e.length>80*i){n=s=e[0],r=a=e[1];for(var m=i;m<u;m+=i)(o=e[m])<n&&(n=o),(h=e[m+1])<r&&(r=h),o>s&&(s=o),h>a&&(a=h);c=0!==(c=Math.max(s-n,a-r))?1/c:0}return qg(d,p,i,n,r,c),p}function Gg(e,t,i,n,r){var s,a;if(r===f_(e,t,i,n)>0)for(s=t;s<i;s+=n)a=d_(s,e[s],e[s+1],a);else for(s=i-n;s>=t;s-=n)a=d_(s,e[s],e[s+1],a);return a&&a_(a,a.next)&&(p_(a),a=a.next),a}function Wg(e,t){if(!e)return e;t||(t=e);var i,n=e;do{if(i=!1,n.steiner||!a_(n,n.next)&&0!==s_(n.prev,n,n.next))n=n.next;else{if(p_(n),(n=t=n.prev)===n.next)break;i=!0}}while(i||n!==t);return t}function qg(e,t,i,n,r,s,a){if(e){!a&&s&&function(e,t,i,n){var r=e;do{null===r.z&&(r.z=t_(r.x,r.y,t,i,n)),r.prevZ=r.prev,r.nextZ=r.next,r=r.next}while(r!==e);r.prevZ.nextZ=null,r.prevZ=null,function(e){var t,i,n,r,s,a,o,h,c=1;do{for(i=e,e=null,s=null,a=0;i;){for(a++,n=i,o=0,t=0;t<c&&(o++,n=n.nextZ);t++);for(h=c;o>0||h>0&&n;)0!==o&&(0===h||!n||i.z<=n.z)?(r=i,i=i.nextZ,o--):(r=n,n=n.nextZ,h--),s?s.nextZ=r:e=r,r.prevZ=s,s=r;i=n}s.nextZ=null,c*=2}while(a>1)}(r)}(e,n,r,s);for(var o,h,c=e;e.prev!==e.next;)if(o=e.prev,h=e.next,s?Zg(e,n,r,s):Xg(e))t.push(o.i/i),t.push(e.i/i),t.push(h.i/i),p_(e),e=h.next,c=h.next;else if((e=h)===c){a?1===a?qg(e=Yg(Wg(e),t,i),t,i,n,r,s,2):2===a&&Jg(e,t,i,n,r,s):qg(Wg(e),t,i,n,r,s,1);break}}}function Xg(e){var t=e.prev,i=e,n=e.next;if(s_(t,i,n)>=0)return!1;for(var r=e.next.next;r!==e.prev;){if(n_(t.x,t.y,i.x,i.y,n.x,n.y,r.x,r.y)&&s_(r.prev,r,r.next)>=0)return!1;r=r.next}return!0}function Zg(e,t,i,n){var r=e.prev,s=e,a=e.next;if(s_(r,s,a)>=0)return!1;for(var o=r.x<s.x?r.x<a.x?r.x:a.x:s.x<a.x?s.x:a.x,h=r.y<s.y?r.y<a.y?r.y:a.y:s.y<a.y?s.y:a.y,c=r.x>s.x?r.x>a.x?r.x:a.x:s.x>a.x?s.x:a.x,l=r.y>s.y?r.y>a.y?r.y:a.y:s.y>a.y?s.y:a.y,u=t_(o,h,t,i,n),d=t_(c,l,t,i,n),p=e.prevZ,m=e.nextZ;p&&p.z>=u&&m&&m.z<=d;){if(p!==e.prev&&p!==e.next&&n_(r.x,r.y,s.x,s.y,a.x,a.y,p.x,p.y)&&s_(p.prev,p,p.next)>=0)return!1;if(p=p.prevZ,m!==e.prev&&m!==e.next&&n_(r.x,r.y,s.x,s.y,a.x,a.y,m.x,m.y)&&s_(m.prev,m,m.next)>=0)return!1;m=m.nextZ}for(;p&&p.z>=u;){if(p!==e.prev&&p!==e.next&&n_(r.x,r.y,s.x,s.y,a.x,a.y,p.x,p.y)&&s_(p.prev,p,p.next)>=0)return!1;p=p.prevZ}for(;m&&m.z<=d;){if(m!==e.prev&&m!==e.next&&n_(r.x,r.y,s.x,s.y,a.x,a.y,m.x,m.y)&&s_(m.prev,m,m.next)>=0)return!1;m=m.nextZ}return!0}function Yg(e,t,i){var n=e;do{var r=n.prev,s=n.next.next;!a_(r,s)&&o_(r,n,n.next,s)&&l_(r,s)&&l_(s,r)&&(t.push(r.i/i),t.push(n.i/i),t.push(s.i/i),p_(n),p_(n.next),n=e=s),n=n.next}while(n!==e);return Wg(n)}function Jg(e,t,i,n,r,s){var a=e;do{for(var o=a.next.next;o!==a.prev;){if(a.i!==o.i&&r_(a,o)){var h=u_(a,o);return a=Wg(a,a.next),h=Wg(h,h.next),qg(a,t,i,n,r,s),void qg(h,t,i,n,r,s)}o=o.next}a=a.next}while(a!==e)}function Kg(e,t){return e.x-t.x}function Qg(e,t){var i=function(e,t){var i,n=t,r=e.x,s=e.y,a=-1/0;do{if(s<=n.y&&s>=n.next.y&&n.next.y!==n.y){var o=n.x+(s-n.y)*(n.next.x-n.x)/(n.next.y-n.y);if(o<=r&&o>a){if(a=o,o===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!==t);if(!i)return null;if(r===a)return i;var h,c=i,l=i.x,u=i.y,d=1/0;n=i;do{r>=n.x&&n.x>=l&&r!==n.x&&n_(s<u?r:a,s,l,u,s<u?a:r,s,n.x,n.y)&&(h=Math.abs(s-n.y)/(r-n.x),l_(n,e)&&(h<d||h===d&&(n.x>i.x||n.x===i.x&&e_(i,n)))&&(i=n,d=h)),n=n.next}while(n!==c);return i}(e,t);if(!i)return t;var n=u_(i,e),r=Wg(i,i.next);return Wg(n,n.next),t===i?r:t}function e_(e,t){return s_(e.prev,e,t.prev)<0&&s_(t.next,e,e.next)<0}function t_(e,t,i,n,r){return(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e=32767*(e-i)*r)|e<<8))|e<<4))|e<<2))|e<<1))|(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t=32767*(t-n)*r)|t<<8))|t<<4))|t<<2))|t<<1))<<1}function i_(e){var t=e,i=e;do{(t.x<i.x||t.x===i.x&&t.y<i.y)&&(i=t),t=t.next}while(t!==e);return i}function n_(e,t,i,n,r,s,a,o){return(r-a)*(t-o)-(e-a)*(s-o)>=0&&(e-a)*(n-o)-(i-a)*(t-o)>=0&&(i-a)*(s-o)-(r-a)*(n-o)>=0}function r_(e,t){return e.next.i!==t.i&&e.prev.i!==t.i&&!function(e,t){var i=e;do{if(i.i!==e.i&&i.next.i!==e.i&&i.i!==t.i&&i.next.i!==t.i&&o_(i,i.next,e,t))return!0;i=i.next}while(i!==e);return!1}(e,t)&&(l_(e,t)&&l_(t,e)&&function(e,t){var i=e,n=!1,r=(e.x+t.x)/2,s=(e.y+t.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!==e);return n}(e,t)&&(s_(e.prev,e,t.prev)||s_(e,t.prev,t))||a_(e,t)&&s_(e.prev,e,e.next)>0&&s_(t.prev,t,t.next)>0)}function s_(e,t,i){return(t.y-e.y)*(i.x-t.x)-(t.x-e.x)*(i.y-t.y)}function a_(e,t){return e.x===t.x&&e.y===t.y}function o_(e,t,i,n){var r=c_(s_(e,t,i)),s=c_(s_(e,t,n)),a=c_(s_(i,n,e)),o=c_(s_(i,n,t));return r!==s&&a!==o||(!(0!==r||!h_(e,i,t))||(!(0!==s||!h_(e,n,t))||(!(0!==a||!h_(i,e,n))||!(0!==o||!h_(i,t,n)))))}function h_(e,t,i){return t.x<=Math.max(e.x,i.x)&&t.x>=Math.min(e.x,i.x)&&t.y<=Math.max(e.y,i.y)&&t.y>=Math.min(e.y,i.y)}function c_(e){return e>0?1:e<0?-1:0}function l_(e,t){return s_(e.prev,e,e.next)<0?s_(e,t,e.next)>=0&&s_(e,e.prev,t)>=0:s_(e,t,e.prev)<0||s_(e,e.next,t)<0}function u_(e,t){var i=new m_(e.i,e.x,e.y),n=new m_(t.i,t.x,t.y),r=e.next,s=t.prev;return e.next=t,t.prev=e,i.next=r,r.prev=i,n.next=i,i.prev=n,s.next=n,n.prev=s,n}function d_(e,t,i,n){var r=new m_(e,t,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 p_(e){e.next.prev=e.prev,e.prev.next=e.next,e.prevZ&&(e.prevZ.nextZ=e.nextZ),e.nextZ&&(e.nextZ.prevZ=e.prevZ)}function m_(e,t,i){this.i=e,this.x=t,this.y=i,this.prev=null,this.next=null,this.z=null,this.prevZ=null,this.nextZ=null,this.steiner=!1}function f_(e,t,i,n){for(var r=0,s=t,a=i-n;s<i;s+=n)r+=(e[a]-e[s])*(e[s+1]+e[a+1]),a=s;return r}Hg.exports=jg,Hg.exports.default=jg,jg.deviation=function(e,t,i,n){var r=t&&t.length,s=r?t[0]*i:e.length,a=Math.abs(f_(e,0,s,i));if(r)for(var o=0,h=t.length;o<h;o++){var c=t[o]*i,l=o<h-1?t[o+1]*i:e.length;a-=Math.abs(f_(e,c,l,i))}var u=0;for(o=0;o<n.length;o+=3){var d=n[o]*i,p=n[o+1]*i,m=n[o+2]*i;u+=Math.abs((e[d]-e[m])*(e[p+1]-e[d+1])-(e[d]-e[p])*(e[m+1]-e[d+1]))}return 0===a&&0===u?0:Math.abs((u-a)/a)},jg.flatten=function(e){for(var t=e[0][0].length,i={vertices:[],holes:[],dimensions:t},n=0,r=0;r<e.length;r++){for(var s=0;s<e[r].length;s++)for(var a=0;a<t;a++)i.vertices.push(e[r][s][a]);r>0&&(n+=e[r-1].length,i.holes.push(n))}return i};var g_=Hg.exports,__={exports:{}};function v_(e,t){return e<t?-1:e>t?1:0}var y_=cd(Object.freeze({__proto__:null,default:class{constructor(e=[],t=v_){if(this.data=e,this.length=this.data.length,this.compare=t,this.length>0)for(let e=(this.length>>1)-1;e>=0;e--)this._down(e)}push(e){this.data.push(e),this.length++,this._up(this.length-1)}pop(){if(0===this.length)return;const e=this.data[0],t=this.data.pop();return this.length--,this.length>0&&(this.data[0]=t,this._down(0)),e}peek(){return this.data[0]}_up(e){const{data:t,compare:i}=this,n=t[e];for(;e>0;){const r=e-1>>1,s=t[r];if(i(n,s)>=0)break;t[e]=s,e=r}t[e]=n}_down(e){const{data:t,compare:i}=this,n=this.length>>1,r=t[e];for(;e<n;){let n=1+(e<<1),s=t[n];const a=n+1;if(a<this.length&&i(t[a],s)<0&&(n=a,s=t[a]),i(s,r)>=0)break;t[e]=s,e=n}t[e]=r}}}));function b_(e,t,i){var n,r,s,a;t=t||1;for(var o=0;o<e[0].length;o++){var h=e[0][o];(!o||h[0]<n)&&(n=h[0]),(!o||h[1]<r)&&(r=h[1]),(!o||h[0]>s)&&(s=h[0]),(!o||h[1]>a)&&(a=h[1])}var c=s-n,l=a-r,u=Math.min(c,l),d=u/2;if(0===u){var p=[n,r];return p.distance=0,p}for(var m=new y_(void 0,x_),f=n;f<s;f+=u)for(var g=r;g<a;g+=u)m.push(new w_(f+d,g+d,d,e));var _=function(e){for(var t=0,i=0,n=0,r=e[0],s=0,a=r.length,o=a-1;s<a;o=s++){var h=r[s],c=r[o],l=h[0]*c[1]-c[0]*h[1];i+=(h[0]+c[0])*l,n+=(h[1]+c[1])*l,t+=3*l}return 0===t?new w_(r[0][0],r[0][1],0,e):new w_(i/t,n/t,0,e)}(e),v=new w_(n+c/2,r+l/2,0,e);v.d>_.d&&(_=v);for(var y=m.length;m.length;){var b=m.pop();b.d>_.d&&(_=b,i&&console.log("found best %d after %d probes",Math.round(1e4*b.d)/1e4,y)),b.max-_.d<=t||(d=b.h/2,m.push(new w_(b.x-d,b.y-d,d,e)),m.push(new w_(b.x+d,b.y-d,d,e)),m.push(new w_(b.x-d,b.y+d,d,e)),m.push(new w_(b.x+d,b.y+d,d,e)),y+=4)}i&&(console.log("num probes: "+y),console.log("best distance: "+_.d));var x=[_.x,_.y];return x.distance=_.d,x}function x_(e,t){return t.max-e.max}function w_(e,t,i,n){this.x=e,this.y=t,this.h=i,this.d=function(e,t,i){for(var n=!1,r=1/0,s=0;s<i.length;s++)for(var a=i[s],o=0,h=a.length,c=h-1;o<h;c=o++){var l=a[o],u=a[c];l[1]>t!=u[1]>t&&e<(u[0]-l[0])*(t-l[1])/(u[1]-l[1])+l[0]&&(n=!n),r=Math.min(r,M_(e,t,l,u))}return 0===r?0:(n?1:-1)*Math.sqrt(r)}(e,t,n),this.max=this.d+this.h*Math.SQRT2}function M_(e,t,i,n){var r=i[0],s=i[1],a=n[0]-r,o=n[1]-s;if(0!==a||0!==o){var h=((e-r)*a+(t-s)*o)/(a*a+o*o);h>1?(r=n[0],s=n[1]):h>0&&(r+=a*h,s+=o*h)}return(a=e-r)*a+(o=t-s)*o}y_.default&&(y_=y_.default),__.exports=b_,__.exports.default=b_;var S_=__.exports;function T_(e,t){return e>t?1:e<t?-1:0}class C_{constructor(e=T_,t=!1){this._compare=e,this._root=null,this._size=0,this._noDuplicates=!!t}rotateLeft(e){var t=e.right;t&&(e.right=t.left,t.left&&(t.left.parent=e),t.parent=e.parent),e.parent?e===e.parent.left?e.parent.left=t:e.parent.right=t:this._root=t,t&&(t.left=e),e.parent=t}rotateRight(e){var t=e.left;t&&(e.left=t.right,t.right&&(t.right.parent=e),t.parent=e.parent),e.parent?e===e.parent.left?e.parent.left=t:e.parent.right=t:this._root=t,t&&(t.right=e),e.parent=t}_splay(e){for(;e.parent;){var t=e.parent;t.parent?t.left===e&&t.parent.left===t?(this.rotateRight(t.parent),this.rotateRight(t)):t.right===e&&t.parent.right===t?(this.rotateLeft(t.parent),this.rotateLeft(t)):t.left===e&&t.parent.right===t?(this.rotateRight(t),this.rotateLeft(t)):(this.rotateLeft(t),this.rotateRight(t)):t.left===e?this.rotateRight(t):this.rotateLeft(t)}}splay(e){for(var t,i,n,r,s;e.parent;)(i=(t=e.parent).parent)&&i.parent?((n=i.parent).left===i?n.left=e:n.right=e,e.parent=n):(e.parent=null,this._root=e),r=e.left,s=e.right,e===t.left?(i&&(i.left===t?(t.right?(i.left=t.right,i.left.parent=i):i.left=null,t.right=i,i.parent=t):(r?(i.right=r,r.parent=i):i.right=null,e.left=i,i.parent=e)),s?(t.left=s,s.parent=t):t.left=null,e.right=t,t.parent=e):(i&&(i.right===t?(t.left?(i.right=t.left,i.right.parent=i):i.right=null,t.left=i,i.parent=t):(s?(i.left=s,s.parent=i):i.left=null,e.right=i,i.parent=e)),r?(t.right=r,r.parent=t):t.right=null,e.left=t,t.parent=e)}replace(e,t){e.parent?e===e.parent.left?e.parent.left=t:e.parent.right=t:this._root=t,t&&(t.parent=e.parent)}minNode(e=this._root){if(e)for(;e.left;)e=e.left;return e}maxNode(e=this._root){if(e)for(;e.right;)e=e.right;return e}insert(e,t){var i=this._root,n=null,r=this._compare;if(this._noDuplicates)for(;i;){if(n=i,0===r(i.key,e))return;i=r(i.key,e)<0?i.right:i.left}else for(;i;)n=i,i=r(i.key,e)<0?i.right:i.left;return i={key:e,data:t,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(e){for(var t=this._root,i=this._compare;t;){var n=i(t.key,e);if(n<0)t=t.right;else{if(!(n>0))return t;t=t.left}}return null}contains(e){for(var t=this._root,i=this._compare;t;){var n=i(e,t.key);if(0===n)return!0;t=n<0?t.left:t.right}return!1}remove(e){var t=this.find(e);if(!t)return!1;if(this.splay(t),t.left)if(t.right){var i=this.minNode(t.right);i.parent!==t&&(this.replace(i,i.right),i.right=t.right,i.right.parent=i),this.replace(t,i),i.left=t.left,i.left.parent=i}else this.replace(t,t.left);else this.replace(t,t.right);return this._size--,!0}removeNode(e){if(!e)return!1;if(this.splay(e),e.left)if(e.right){var t=this.minNode(e.right);t.parent!==e&&(this.replace(t,t.right),t.right=e.right,t.right.parent=t),this.replace(e,t),t.left=e.left,t.left.parent=t}else this.replace(e,e.left);else this.replace(e,e.right);return this._size--,!0}erase(e){var t=this.find(e);if(t){this.splay(t);var i=t.left,n=t.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 e=this._root,t=null;if(e){for(;e.left;)e=e.left;t={key:e.key,data:e.data},this.remove(e.key)}return t}next(e){var t=e;if(t)if(t.right)for(t=t.right;t&&t.left;)t=t.left;else for(t=e.parent;t&&t.right===e;)e=t,t=t.parent;return t}prev(e){var t=e;if(t)if(t.left)for(t=t.left;t&&t.right;)t=t.right;else for(t=e.parent;t&&t.left===e;)e=t,t=t.parent;return t}forEach(e){for(var t=this._root,i=[],n=!1,r=0;!n;)t?(i.push(t),t=t.left):i.length>0?(e(t=i.pop(),r++),t=t.right):n=!0;return this}range(e,t,i,n){const r=[],s=this._compare;let a,o=this._root;for(;0!==r.length||o;)if(o)r.push(o),o=o.left;else{if(o=r.pop(),a=s(o.key,t),a>0)break;if(s(o.key,e)>=0&&i.call(n,o))return this;o=o.right}return this}keys(){for(var e=this._root,t=[],i=[],n=!1;!n;)e?(t.push(e),e=e.left):t.length>0?(e=t.pop(),i.push(e.key),e=e.right):n=!0;return i}values(){for(var e=this._root,t=[],i=[],n=!1;!n;)e?(t.push(e),e=e.left):t.length>0?(e=t.pop(),i.push(e.data),e=e.right):n=!0;return i}at(e){for(var t=this._root,i=[],n=!1,r=0;!n;)if(t)i.push(t),t=t.left;else if(i.length>0){if(t=i.pop(),r===e)return t;r++,t=t.right}else n=!0;return null}load(e=[],t=[],i=!1){if(0!==this._size)throw new Error("bulk-load: tree is not empty");const n=e.length;return i&&A_(e,t,0,n-1,this._compare),this._root=E_(null,e,t,0,n),this._size=n,this}min(){var e=this.minNode(this._root);return e?e.key:null}max(){var e=this.maxNode(this._root);return e?e.key:null}isEmpty(){return null===this._root}get size(){return this._size}static createTree(e,t,i,n,r){return new C_(i,r).load(e,t,n)}}function E_(e,t,i,n,r){const s=r-n;if(s>0){const a=n+Math.floor(s/2),o={key:t[a],data:i[a],parent:e};return o.left=E_(o,t,i,n,a),o.right=E_(o,t,i,a+1,r),o}return null}function A_(e,t,i,n,r){if(i>=n)return;const s=e[i+n>>1];let a=i-1,o=n+1;for(;;){do{a++}while(r(e[a],s)<0);do{o--}while(r(e[o],s)>0);if(a>=o)break;let i=e[a];e[a]=e[o],e[o]=i,i=t[a],t[a]=t[o],t[o]=i}A_(e,t,i,o,r),A_(e,t,o+1,n,r)}function I_(e,t,i){null===t?(e.inOut=!1,e.otherInOut=!0):(e.isSubject===t.isSubject?(e.inOut=!t.inOut,e.otherInOut=t.otherInOut):(e.inOut=!t.otherInOut,e.otherInOut=t.isVertical()?!t.inOut:t.inOut),t&&(e.prevInResult=!R_(t,i)||t.isVertical()?t.prevInResult:t));let n=R_(e,i);e.resultTransition=n?function(e,t){let i,n=!e.inOut,r=!e.otherInOut;switch(t){case 0:i=n&&r;break;case 1:i=n||r;break;case 3:i=n^r;break;case 2:i=e.isSubject?n&&!r:r&&!n}return i?1:-1}(e,i):0}function R_(e,t){switch(e.type){case 0:switch(t){case 0:return!e.otherInOut;case 1:return e.otherInOut;case 2:return e.isSubject&&e.otherInOut||!e.isSubject&&!e.otherInOut;case 3:return!0}break;case 2:return 0===t||1===t;case 3:return 2===t;case 1:return!1}return!1}class P_{constructor(e,t,i,n,r){this.left=t,this.point=e,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(e){const t=this.point,i=this.otherEvent.point;return this.left?(t[0]-e[0])*(i[1]-e[1])-(i[0]-e[0])*(t[1]-e[1])>0:(i[0]-e[0])*(t[1]-e[1])-(t[0]-e[0])*(i[1]-e[1])>0}isAbove(e){return!this.isBelow(e)}isVertical(){return this.point[0]===this.otherEvent.point[0]}get inResult(){return 0!==this.resultTransition}clone(){const e=new P_(this.point,this.left,this.otherEvent,this.isSubject,this.type);return e.contourId=this.contourId,e.resultTransition=this.resultTransition,e.prevInResult=this.prevInResult,e.isExteriorRing=this.isExteriorRing,e.inOut=this.inOut,e.otherInOut=this.otherInOut,e}}function L_(e,t){return e[0]===t[0]&&e[1]===t[1]}const D_=134217729;function N_(e,t,i,n,r){let s,a,o,h,c=t[0],l=n[0],u=0,d=0;l>c==l>-c?(s=c,c=t[++u]):(s=l,l=n[++d]);let p=0;if(u<e&&d<i)for(l>c==l>-c?(a=c+s,o=s-(a-c),c=t[++u]):(a=l+s,o=s-(a-l),l=n[++d]),s=a,0!==o&&(r[p++]=o);u<e&&d<i;)l>c==l>-c?(a=s+c,h=a-s,o=s-(a-h)+(c-h),c=t[++u]):(a=s+l,h=a-s,o=s-(a-h)+(l-h),l=n[++d]),s=a,0!==o&&(r[p++]=o);for(;u<e;)a=s+c,h=a-s,o=s-(a-h)+(c-h),c=t[++u],s=a,0!==o&&(r[p++]=o);for(;d<i;)a=s+l,h=a-s,o=s-(a-h)+(l-h),l=n[++d],s=a,0!==o&&(r[p++]=o);return 0===s&&0!==p||(r[p++]=s),p}function $_(e){return new Float64Array(e)}const k_=$_(4),O_=$_(8),z_=$_(12),F_=$_(16),B_=$_(4);function U_(e,t,i,n,r,s){const a=(t-s)*(i-r),o=(e-r)*(n-s),h=a-o;if(0===a||0===o||a>0!=o>0)return h;const c=Math.abs(a+o);return Math.abs(h)>=33306690738754716e-32*c?h:-function(e,t,i,n,r,s,a){let o,h,c,l,u,d,p,m,f,g,_,v,y,b,x,w,M,S;const T=e-r,C=i-r,E=t-s,A=n-s;b=T*A,d=D_*T,p=d-(d-T),m=T-p,d=D_*A,f=d-(d-A),g=A-f,x=m*g-(b-p*f-m*f-p*g),w=E*C,d=D_*E,p=d-(d-E),m=E-p,d=D_*C,f=d-(d-C),g=C-f,M=m*g-(w-p*f-m*f-p*g),_=x-M,u=x-_,k_[0]=x-(_+u)+(u-M),v=b+_,u=v-b,y=b-(v-u)+(_-u),_=y-w,u=y-_,k_[1]=y-(_+u)+(u-w),S=v+_,u=S-v,k_[2]=v-(S-u)+(_-u),k_[3]=S;let I=function(e,t){let i=t[0];for(let n=1;n<e;n++)i+=t[n];return i}(4,k_),R=22204460492503146e-32*a;if(I>=R||-I>=R)return I;if(u=e-T,o=e-(T+u)+(u-r),u=i-C,c=i-(C+u)+(u-r),u=t-E,h=t-(E+u)+(u-s),u=n-A,l=n-(A+u)+(u-s),0===o&&0===h&&0===c&&0===l)return I;if(R=11093356479670487e-47*a+33306690738754706e-32*Math.abs(I),I+=T*l+A*o-(E*c+C*h),I>=R||-I>=R)return I;b=o*A,d=D_*o,p=d-(d-o),m=o-p,d=D_*A,f=d-(d-A),g=A-f,x=m*g-(b-p*f-m*f-p*g),w=h*C,d=D_*h,p=d-(d-h),m=h-p,d=D_*C,f=d-(d-C),g=C-f,M=m*g-(w-p*f-m*f-p*g),_=x-M,u=x-_,B_[0]=x-(_+u)+(u-M),v=b+_,u=v-b,y=b-(v-u)+(_-u),_=y-w,u=y-_,B_[1]=y-(_+u)+(u-w),S=v+_,u=S-v,B_[2]=v-(S-u)+(_-u),B_[3]=S;const P=N_(4,k_,4,B_,O_);b=T*l,d=D_*T,p=d-(d-T),m=T-p,d=D_*l,f=d-(d-l),g=l-f,x=m*g-(b-p*f-m*f-p*g),w=E*c,d=D_*E,p=d-(d-E),m=E-p,d=D_*c,f=d-(d-c),g=c-f,M=m*g-(w-p*f-m*f-p*g),_=x-M,u=x-_,B_[0]=x-(_+u)+(u-M),v=b+_,u=v-b,y=b-(v-u)+(_-u),_=y-w,u=y-_,B_[1]=y-(_+u)+(u-w),S=v+_,u=S-v,B_[2]=v-(S-u)+(_-u),B_[3]=S;const L=N_(P,O_,4,B_,z_);b=o*l,d=D_*o,p=d-(d-o),m=o-p,d=D_*l,f=d-(d-l),g=l-f,x=m*g-(b-p*f-m*f-p*g),w=h*c,d=D_*h,p=d-(d-h),m=h-p,d=D_*c,f=d-(d-c),g=c-f,M=m*g-(w-p*f-m*f-p*g),_=x-M,u=x-_,B_[0]=x-(_+u)+(u-M),v=b+_,u=v-b,y=b-(v-u)+(_-u),_=y-w,u=y-_,B_[1]=y-(_+u)+(u-w),S=v+_,u=S-v,B_[2]=v-(S-u)+(_-u),B_[3]=S;const D=N_(L,z_,4,B_,F_);return F_[D-1]}(e,t,i,n,r,s,c)}function V_(e,t,i){const n=U_(e[0],e[1],t[0],t[1],i[0],i[1]);return n>0?-1:n<0?1:0}function H_(e,t){const i=e.point,n=t.point;return i[0]>n[0]?1:i[0]<n[0]?-1:i[1]!==n[1]?i[1]>n[1]?1:-1:function(e,t,i,n){if(e.left!==t.left)return e.left?1:-1;if(0!==V_(i,e.otherEvent.point,t.otherEvent.point))return e.isBelow(t.otherEvent.point)?-1:1;return!e.isSubject&&t.isSubject?1:-1}(e,t,i)}function j_(e,t,i){const n=new P_(t,!1,e,e.isSubject),r=new P_(t,!0,e.otherEvent,e.isSubject);return L_(e.point,e.otherEvent.point)&&console.warn("what is that, a collapsed segment?",e),n.contourId=r.contourId=e.contourId,H_(r,e.otherEvent)>0&&(e.otherEvent.left=!0,r.left=!1),e.otherEvent.otherEvent=r,e.otherEvent=n,i.push(r),i.push(n),i}function G_(e,t){return e[0]*t[1]-e[1]*t[0]}function W_(e,t){return e[0]*t[0]+e[1]*t[1]}function q_(e,t,i){const n=function(e,t,i,n,r){const s=[t[0]-e[0],t[1]-e[1]],a=[n[0]-i[0],n[1]-i[1]];function o(e,t,i){return[e[0]+t*i[0],e[1]+t*i[1]]}const h=[i[0]-e[0],i[1]-e[1]];let c=G_(s,a),l=c*c;const u=W_(s,s);if(l>0){const t=G_(h,a)/c;if(t<0||t>1)return null;const n=G_(h,s)/c;return n<0||n>1?null:0===t||1===t?r?null:[o(e,t,s)]:0===n||1===n?r?null:[o(i,n,a)]:[o(e,t,s)]}if(c=G_(h,s),l=c*c,l>0)return null;const d=W_(s,h)/u,p=d+W_(s,a)/u,m=Math.min(d,p),f=Math.max(d,p);return m<=1&&f>=0?1===m?r?null:[o(e,m>0?m:0,s)]:0===f?r?null:[o(e,f<1?f:1,s)]:r&&0===m&&1===f?null:[o(e,m>0?m:0,s),o(e,f<1?f:1,s)]:null}(e.point,e.otherEvent.point,t.point,t.otherEvent.point),r=n?n.length:0;if(0===r)return 0;if(1===r&&(L_(e.point,t.point)||L_(e.otherEvent.point,t.otherEvent.point)))return 0;if(2===r&&e.isSubject===t.isSubject)return 0;if(1===r)return L_(e.point,n[0])||L_(e.otherEvent.point,n[0])||j_(e,n[0],i),L_(t.point,n[0])||L_(t.otherEvent.point,n[0])||j_(t,n[0],i),1;const s=[];let a=!1,o=!1;return L_(e.point,t.point)?a=!0:1===H_(e,t)?s.push(t,e):s.push(e,t),L_(e.otherEvent.point,t.otherEvent.point)?o=!0:1===H_(e.otherEvent,t.otherEvent)?s.push(t.otherEvent,e.otherEvent):s.push(e.otherEvent,t.otherEvent),a&&o||a?(t.type=1,e.type=t.inOut===e.inOut?2:3,a&&!o&&j_(s[1].otherEvent,s[0].point,i),2):o?(j_(s[0],s[1].point,i),3):s[0]!==s[3].otherEvent?(j_(s[0],s[1].point,i),j_(s[1],s[2].point,i),3):(j_(s[0],s[1].point,i),j_(s[3].otherEvent,s[2].point,i),3)}function X_(e,t){if(e===t)return 0;if(0!==V_(e.point,e.otherEvent.point,t.point)||0!==V_(e.point,e.otherEvent.point,t.otherEvent.point))return L_(e.point,t.point)?e.isBelow(t.otherEvent.point)?-1:1:e.point[0]===t.point[0]?e.point[1]<t.point[1]?-1:1:1===H_(e,t)?t.isAbove(e.point)?-1:1:e.isBelow(t.point)?-1:1;if(e.isSubject!==t.isSubject)return e.isSubject?-1:1;{let i=e.point,n=t.point;if(i[0]===n[0]&&i[1]===n[1])return i=e.otherEvent.point,n=t.otherEvent.point,i[0]===n[0]&&i[1]===n[1]?0:e.contourId>t.contourId?1:-1}return 1===H_(e,t)?1:-1}class Z_{constructor(){this.points=[],this.holeIds=[],this.holeOf=null,this.depth=null}isExterior(){return null==this.holeOf}}function Y_(e,t,i,n){let r,s=e+1,a=t[e].point;const o=t.length;for(s<o&&(r=t[s].point);s<o&&r[0]===a[0]&&r[1]===a[1];){if(!i[s])return s;s++,r=t[s].point}for(s=e-1;i[s]&&s>n;)s--;return s}function J_(e,t,i){const n=new Z_;if(null!=e.prevInResult){const r=e.prevInResult,s=r.outputContourId;if(r.resultTransition>0){const e=t[s];if(null!=e.holeOf){const r=e.holeOf;t[r].holeIds.push(i),n.holeOf=r,n.depth=t[s].depth}else t[s].holeIds.push(i),n.holeOf=s,n.depth=t[s].depth+1}else n.holeOf=null,n.depth=t[s].depth}else n.holeOf=null,n.depth=0;return n}function K_(e){let t,i;const n=function(e){let t,i,n,r;const s=[];for(i=0,n=e.length;i<n;i++)t=e[i],(t.left&&t.inResult||!t.left&&t.otherEvent.inResult)&&s.push(t);let a=!1;for(;!a;)for(a=!0,i=0,n=s.length;i<n;i++)i+1<n&&1===H_(s[i],s[i+1])&&(r=s[i],s[i]=s[i+1],s[i+1]=r,a=!1);for(i=0,n=s.length;i<n;i++)t=s[i],t.otherPos=i;for(i=0,n=s.length;i<n;i++)t=s[i],t.left||(r=t.otherPos,t.otherPos=t.otherEvent.otherPos,t.otherEvent.otherPos=r);return s}(e),r={},s=[];for(t=0,i=n.length;t<i;t++){if(r[t])continue;const e=s.length,i=J_(n[t],s,e),a=t=>{r[t]=!0,n[t].outputContourId=e};let o=t,h=t;const c=n[t].point;for(i.points.push(c);a(o),o=n[o].otherPos,a(o),i.points.push(n[o].point),o=Y_(o,n,r,h),o!=h;);s.push(i)}return s}var Q_={exports:{}};function ev(e,t){if(!(this instanceof ev))return new ev(e,t);if(this.data=e||[],this.length=this.data.length,this.compare=t||tv,this.length>0)for(var i=(this.length>>1)-1;i>=0;i--)this._down(i)}function tv(e,t){return e<t?-1:e>t?1:0}Q_.exports=ev,Q_.exports.default=ev,ev.prototype={push:function(e){this.data.push(e),this.length++,this._up(this.length-1)},pop:function(){if(0!==this.length){var e=this.data[0];return this.length--,this.length>0&&(this.data[0]=this.data[this.length],this._down(0)),this.data.pop(),e}},peek:function(){return this.data[0]},_up:function(e){for(var t=this.data,i=this.compare,n=t[e];e>0;){var r=e-1>>1,s=t[r];if(i(n,s)>=0)break;t[e]=s,e=r}t[e]=n},_down:function(e){for(var t=this.data,i=this.compare,n=this.length>>1,r=t[e];e<n;){var s=1+(e<<1),a=s+1,o=t[s];if(a<this.length&&i(t[a],o)<0&&(s=a,o=t[a]),i(o,r)>=0)break;t[e]=o,e=s}t[e]=r}};var iv=Q_.exports;const nv=Math.max,rv=Math.min;let sv=0;function av(e,t,i,n,r,s){let a,o,h,c,l,u;for(a=0,o=e.length-1;a<o;a++){if(h=e[a],c=e[a+1],l=new P_(h,!1,void 0,t),u=new P_(c,!1,l,t),l.otherEvent=u,h[0]===c[0]&&h[1]===c[1])continue;l.contourId=u.contourId=i,s||(l.isExteriorRing=!1,u.isExteriorRing=!1),H_(l,u)>0?u.left=!0:l.left=!0;const o=h[0],d=h[1];r[0]=rv(r[0],o),r[1]=rv(r[1],d),r[2]=nv(r[2],o),r[3]=nv(r[3],d),n.push(l),n.push(u)}}const ov=[];function hv(e,t,i){"number"==typeof e[0][0][0]&&(e=[e]),"number"==typeof t[0][0][0]&&(t=[t]);let n=function(e,t,i){let n=null;return e.length*t.length==0&&(0===i?n=ov:2===i?n=e:1!==i&&3!==i||(n=0===e.length?t:e)),n}(e,t,i);if(n)return n===ov?null:n;const r=[1/0,1/0,-1/0,-1/0],s=[1/0,1/0,-1/0,-1/0],a=function(e,t,i,n,r){const s=new iv(null,H_);let a,o,h,c,l,u;for(h=0,c=e.length;h<c;h++)for(a=e[h],l=0,u=a.length;l<u;l++)o=0===l,o&&sv++,av(a[l],!0,sv,s,i,o);for(h=0,c=t.length;h<c;h++)for(a=t[h],l=0,u=a.length;l<u;l++)o=0===l,2===r&&(o=!1),o&&sv++,av(a[l],!1,sv,s,n,o);return s}(e,t,r,s,i);if(n=function(e,t,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=ov:2===r?s=e:1!==r&&3!==r||(s=e.concat(t))),s}(e,t,r,s,i),n)return n===ov?null:n;const o=K_(function(e,t,i,n,r,s){const a=new C_(X_),o=[],h=Math.min(n[2],r[2]);let c,l,u;for(;0!==e.length;){let t=e.pop();if(o.push(t),0===s&&t.point[0]>h||2===s&&t.point[0]>n[2])break;if(t.left){l=c=a.insert(t),u=a.minNode(),c=c!==u?a.prev(c):null,l=a.next(l);const i=c?c.key:null;let n;if(I_(t,i,s),l&&2===q_(t,l.key,e)&&(I_(t,i,s),I_(t,l.key,s)),c&&2===q_(c.key,t,e)){let e=c;e=e!==u?a.prev(e):null,n=e?e.key:null,I_(i,n,s),I_(t,i,s)}}else t=t.otherEvent,l=c=a.find(t),c&&l&&(c=c!==u?a.prev(c):null,l=a.next(l),a.remove(t),l&&c&&q_(c.key,l.key,e))}return o}(a,0,0,r,s,i)),h=[];for(let e=0;e<o.length;e++){let t=o[e];if(t.isExterior()){let e=[t.points];for(let i=0;i<t.holeIds.length;i++){let n=t.holeIds[i];e.push(o[n].points)}h.push(e)}}return h}class cv extends Fg{constructor(){super(),this._subsampleThreshold=.005}_getPoleOfInaccessibility2d(e){return S_([e],.03)}_project(e,t){const i=this._createCamera(t.upVector().toArray(),t.unprojectSfM([0,0],0),t.unprojectSfM([0,0],10));return this._deunproject(e,t,i)}_subsample(e,t=this._subsampleThreshold){const i=[],n=e.length;for(let r=0;r<n;r++){const s=e[r],a=e[(r+1)%n];i.push(s);const o=Math.sqrt(Math.pow(a[0]-s[0],2)+Math.pow(a[1]-s[1],2)),h=Math.floor(o/t),c=1/(h+1);for(let e=1;e<=h;e++){const t=e*c,n=[(1-t)*s[0]+t*a[0],(1-t)*s[1]+t*a[1]];i.push(n)}}return i}_triangulate(e,t,i,n){let r=[e.slice(0,-1)];for(let e of null!=i?i:[])r.push(e.slice(0,-1));let s=t.slice(0,-1);for(let e of null!=n?n:[])s=s.concat(e.slice(0,-1));let a=g_.flatten(r),o=g_(a.vertices,a.holes,a.dimensions),h=[];for(let e=0;e<o.length;++e){let t=s[o[e]];h.push(t[0]),h.push(t[1]),h.push(t[2])}return h}_triangulateSpherical(e,t,i){const n=[],r=1e-9;for(let s=0;s<3;s++)for(let a=0;a<3;a++){const o=s/3+(0===s?-1e-9:r),h=a/3+(0===a?-1e-9:r),c=(s+1)/3+r,l=(a+1)/3+r,u=[[o,h],[o,l],[c,l],[c,h],[o,h]],d=[(2*s+1)/6,(2*a+1)/6];n.push(...this._triangulateSubarea(e,t,u,d,i))}return n}_unproject(e,t,i=200){return e.map((e=>t.unprojectBasic(e,i)))}_createCamera(e,t,i){const n=new os;return n.up.copy((new Ki).fromArray(e)),n.position.copy((new Ki).fromArray(t)),n.lookAt((new Ki).fromArray(i)),n.updateMatrix(),n.updateMatrixWorld(!0),n}_deunproject(e,t,i){return e.map((e=>{const n=t.unprojectBasic(e,1e4),r=new Ki(n[0],n[1],n[2]).applyMatrix4(i.matrixWorldInverse);return[r.x/r.z,r.y/r.z]}))}_triangulateSubarea(e,t,i,n,r){const s=hv([e,...t],[i],0);if(!s)return[];const a=[],o=this._subsampleThreshold,h=this._createCamera(r.upVector().toArray(),r.unprojectSfM([0,0],0),r.unprojectBasic(n,10));for(const e of s){const t=this._subsample(e[0],o),i=this._deunproject(t,r,h),n=this._unproject(t,r),s=[],c=[];for(let t=1;t<e.length;t++){let i=this._subsample(e[t],o);const n=this._deunproject(i,r,h),a=this._unproject(i,r);s.push(n),c.push(a)}a.push(...this._triangulate(i,n,s,c))}return a}}class lv extends cv{constructor(e){if(super(),4!==e.length)throw new Bg("Rectangle needs to have four values.");if(e[1]>e[3])throw new Bg("Basic Y coordinates values can not be inverted.");for(let t of e)if(t<0||t>1)throw new Bg("Basic coordinates must be on the interval [0, 1].");this._anchorIndex=void 0,this._rect=e.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(e){if(void 0!==this._anchorIndex)throw new Bg("Anchor indexing is already initialized.");if(e<0||e>3)throw new Bg(`Invalid anchor index: ${e}.`);this._anchorIndex=void 0===e?0:e}terminateAnchorIndexing(){this._anchorIndex=void 0}setOppositeVertex2d(e,t){if(void 0===this._anchorIndex)throw new Bg("Anchor indexing needs to be initialized.");const i=[Math.max(0,Math.min(1,e[0])),Math.max(0,Math.min(1,e[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($u(t.cameraType)){const e=this._anchorIndex<2?i[0]-n[2]:i[0]-n[0];!this._inverted&&this._anchorIndex<2&&i[0]<.25&&n[2]>.75&&e<-.5||!this._inverted&&this._anchorIndex>=2&&i[0]<.25&&n[2]>.75&&e<-.5?(this._inverted=!0,this._anchorIndex=r[1]>i[1]?0:1):this._inverted&&this._anchorIndex>=2&&i[0]<.25&&n[0]>.75&&e<-.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&&e>.5||!this._inverted&&this._anchorIndex<2&&i[0]>.75&&n[0]<.25&&e>.5?(this._inverted=!0,this._anchorIndex=r[1]>i[1]?3:2):this._inverted&&this._anchorIndex<2&&i[0]>.75&&n[2]<.25&&e>.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 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]),(!this._inverted&&t[0]>t[2]||this._inverted&&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]}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 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]),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]}this._notifyChanged$.next(this)}setVertex2d(e,t,i){let n=this._rect.slice(),r=[Math.max(0,Math.min(1,t[0])),Math.max(0,Math.min(1,t[1]))],s=[];if(0===e?(s[0]=r[0],s[1]=n[1],s[2]=n[2],s[3]=r[1]):1===e?(s[0]=r[0],s[1]=r[1],s[2]=n[2],s[3]=n[3]):2===e?(s[0]=n[0],s[1]=r[1],s[2]=r[0],s[3]=n[3]):3===e&&(s[0]=n[0],s[1]=n[1],s[2]=r[0],s[3]=r[1]),$u(i.cameraType)){let t=e<2&&r[0]>.75&&n[0]<.25||e>=2&&this._inverted&&r[0]>.75&&n[2]<.25,i=e<2&&this._inverted&&r[0]<.25&&n[0]>.75||e>=2&&r[0]<.25&&n[2]>.75;t||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(e,t){let i=this._rect.slice(),n=i[0],r=this._inverted?i[2]+1:i[2],s=i[1],a=i[3],o=n+(r-n)/2,h=s+(a-s)/2,c=0;if($u(t.cameraType))c=this._inverted?e[0]+1-o:e[0]-o;else{let t=-n,i=1-r;c=Math.max(t,Math.min(i,e[0]-o))}let l=-s,u=1-a,d=Math.max(l,Math.min(u,e[1]-h));this._rect[0]=i[0]+c,this._rect[1]=i[1]+d,this._rect[2]=i[2]+c,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(e){return this._getPoints2d().map((t=>e.unprojectBasic(t,200)))}getVertex2d(e){return this._rectToVertices2d(this._rect)[e]}getNonAdjustedVertex2d(e){return this._rectToNonAdjustedVertices2d(this._rect)[e]}getVertex3d(e,t){return t.unprojectBasic(this._rectToVertices2d(this._rect)[e],200)}getVertices2d(){return this._rectToVertices2d(this._rect)}getVertices3d(e){return this._rectToVertices2d(this._rect).map((t=>e.unprojectBasic(t,200)))}getCentroid2d(){const e=this._rect;return[(e[0]+(this._inverted?e[2]+1:e[2]))/2,(e[1]+e[3])/2]}getCentroid3d(e){const t=this.getCentroid2d();return e.unprojectBasic(t,200)}getPoleOfInaccessibility2d(){return this._getPoleOfInaccessibility2d(this._rectToVertices2d(this._rect))}getPoleOfInaccessibility3d(e){let t=this._getPoleOfInaccessibility2d(this._rectToVertices2d(this._rect));return e.unprojectBasic(t,200)}getTriangles3d(e){return $u(e.cameraType)?[]:this._triangulate(this._project(this._getPoints2d(),e),this.getPoints3d(e))}validate(e){let t=this._rect;return!(!this._inverted&&e[0]<t[0]||e[0]-t[2]>.25||e[1]<t[1])}_getPoints2d(){let e=this._rectToVertices2d(this._rect),t=e.length-1,i=[];for(let n=0;n<t;++n){let t=e[n][0],r=e[n][1],s=(e[n+1][0]-t)/9,a=(e[n+1][1]-r)/9;for(let e=0;e<10;++e){let n=[t+e*s,r+e*a];i.push(n)}}return i}_rectToVertices2d(e){return[[e[0],e[3]],[e[0],e[1]],[this._inverted?e[2]+1:e[2],e[1]],[this._inverted?e[2]+1:e[2],e[3]],[e[0],e[3]]]}_rectToNonAdjustedVertices2d(e){return[[e[0],e[3]],[e[0],e[1]],[e[2],e[1]],[e[2],e[3]],[e[0],e[3]]]}}class uv extends Vg{constructor(e,t,i,n){super(e,i,n),this._options={color:null==t.color?16777215:t.color,indicateCompleter:null==t.indicateCompleter||t.indicateCompleter},this._rectGeometry=new lv(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(e,t){const i={offsetHeight:t.height,offsetWidth:t.width},n=[],r=this._geometry.getPoints2d(),s=r.length;for(let t=0;t<s-1;t++){const a=t,[o,h]=r[t],c=this._viewportCoords.basicToCanvasSafe(o,h,i,this._transform,e);if(!c)continue;const l=e=>{e.stopPropagation(),this._aborted$.next(this)},u=e=>{e.stopPropagation(),this._geometry.removePoint2d(a)},d=this._canvasToTransform(c),p={onclick:0===t&&s<3?l:u,style:{transform:d}};n.push(tf.h("div.mapillary-tag-interactor",p,[]));const m={style:{background:this._colorToBackground(this._options.color),transform:d}};n.push(tf.h("div.mapillary-tag-vertex",m,[]))}if(s>2&&!0===this._options.indicateCompleter){const[t,r]=this._geometry.getCentroid2d(this._transform),s=this._viewportCoords.basicToCanvasSafe(t,r,i,this._transform,e);if(s){const e=e=>{e.stopPropagation(),this._geometry.removePoint2d(this._geometry.points.length-1),this._created$.next(this)},t=this._canvasToTransform(s),i={onclick:e,style:{transform:t}};n.push(tf.h("div.mapillary-tag-completer.mapillary-tag-larger",i,[]));const r={style:{background:this._colorToBackground(this._options.color),transform:t}};n.push(tf.h("div.mapillary-tag-vertex.mapillary-tag-larger",r,[]));const a={style:{transform:t}};n.push(tf.h("div.mapillary-tag-dot",a,[]))}}return n}_onGeometryChanged(){this._disposeObjects(),this._rectGeometry=new lv(this._geometry.getRect2d(this._transform)),this._createGlObjects()}_createGlObjects(){this._glObjects=[];const e=this._rectGeometry.getPoints3d(this._transform);this._outline=this._createOutine(e,this._options.color),this._glObjects.push(this._outline)}_disposeObjects(){this._disposeLine(this._outline),this._outline=null,this._glObjects=null}}class dv extends cv{constructor(e,t){super();let i=e.length;if(i<3)throw new Bg("A polygon must have three or more positions.");if(e[0][0]!==e[i-1][0]||e[0][1]!==e[i-1][1])throw new Bg("First and last positions must be equivalent.");this._polygon=[];for(let t of e){if(t[0]<0||t[0]>1||t[1]<0||t[1]>1)throw new Bg("Basic coordinates of polygon must be on the interval [0, 1].");this._polygon.push(t.slice())}if(this._holes=[],null!=t)for(let e=0;e<t.length;e++){let i=t[e],n=i.length;if(n<3)throw new Bg("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 Bg("First and last positions of hole must be equivalent.");this._holes.push([]);for(let t of i){if(t[0]<0||t[0]>1||t[1]<0||t[1]>1)throw new Bg("Basic coordinates of hole must be on the interval [0, 1].");this._holes[e].push(t.slice())}}}get polygon(){return this._polygon}get holes(){return this._holes}addVertex2d(e){let t=[Math.max(0,Math.min(1,e[0])),Math.max(0,Math.min(1,e[1]))];this._polygon.splice(this._polygon.length-1,0,t),this._notifyChanged$.next(this)}getVertex2d(e){return this._polygon[e].slice()}removeVertex2d(e){if(e<0||e>=this._polygon.length||this._polygon.length<4)throw new Bg("Index for removed vertex must be valid.");if(e>0&&e<this._polygon.length-1)this._polygon.splice(e,1);else{this._polygon.splice(0,1),this._polygon.pop();let e=this._polygon[0].slice();this._polygon.push(e)}this._notifyChanged$.next(this)}setVertex2d(e,t,i){let n=[Math.max(0,Math.min(1,t[0])),Math.max(0,Math.min(1,t[1]))];0===e||e===this._polygon.length-1?(this._polygon[0]=n.slice(),this._polygon[this._polygon.length-1]=n.slice()):this._polygon[e]=n.slice(),this._notifyChanged$.next(this)}setCentroid2d(e,t){let i=this._polygon.map((e=>e[0])),n=this._polygon.map((e=>e[1])),r=Math.min.apply(Math,i),s=Math.max.apply(Math,i),a=Math.min.apply(Math,n),o=Math.max.apply(Math,n),h=this.getCentroid2d(),c=-r,l=1-s,u=-a,d=1-o,p=Math.max(c,Math.min(l,e[0]-h[0])),m=Math.max(u,Math.min(d,e[1]-h[1]));for(let e of this._polygon)e[0]+=p,e[1]+=m;this._notifyChanged$.next(this)}getPoints3d(e){return this._getPoints3d(this._subsample(this._polygon),e)}getVertex3d(e,t){return t.unprojectBasic(this._polygon[e],200)}getVertices2d(){return this._polygon.slice()}getVertices3d(e){return this._getPoints3d(this._polygon,e)}getHolePoints3d(e){return this._holes.map((t=>this._getPoints3d(this._subsample(t),e)))}getHoleVertices3d(e){return this._holes.map((t=>this._getPoints3d(t,e)))}getCentroid2d(){let e=this._polygon,t=0,i=0,n=0;for(let r=0;r<e.length-1;r++){let s=e[r][0],a=e[r][1],o=e[r+1][0],h=e[r+1][1],c=s*h-o*a;t+=c,i+=(s+o)*c,n+=(a+h)*c}return t/=2,i/=6*t,n/=6*t,[i,n]}getCentroid3d(e){let t=this.getCentroid2d();return e.unprojectBasic(t,200)}get3dDomainTriangles3d(e){return this._triangulate(this._project(this._polygon,e),this.getVertices3d(e),this._holes.map((t=>this._project(t,e))),this.getHoleVertices3d(e))}getTriangles3d(e){if($u(e.cameraType))return this._triangulateSpherical(this._polygon.slice(),this.holes.slice(),e);const t=this._project(this._subsample(this._polygon),e),i=this.getPoints3d(e),n=this._holes.map((t=>this._project(this._subsample(t),e))),r=this.getHolePoints3d(e);return this._triangulate(t,i,n,r)}getPoleOfInaccessibility2d(){return this._getPoleOfInaccessibility2d(this._polygon.slice())}getPoleOfInaccessibility3d(e){let t=this._getPoleOfInaccessibility2d(this._polygon.slice());return e.unprojectBasic(t,200)}_getPoints3d(e,t){return e.map((e=>t.unprojectBasic(e,200)))}}class pv extends Vg{constructor(e,t,i,n){super(e,i,n),this._options={color:null==t.color?16777215:t.color},this._createGlObjects()}create(){if(this._geometry instanceof lv)this._created$.next(this);else if(this._geometry instanceof dv){const e=this._geometry;e.removeVertex2d(e.polygon.length-2),this._created$.next(this)}}dispose(){super.dispose(),this._disposeLine(this._outline),this._disposeObjects()}getDOMObjects(e,t){const i=[],n={offsetHeight:t.height,offsetWidth:t.width},r=e=>{e.stopPropagation(),this._aborted$.next(this)};if(this._geometry instanceof lv){const t=this._geometry.anchorIndex,s=void 0===t?1:t,[a,o]=this._geometry.getVertex2d(s),h=this._viewportCoords.basicToCanvasSafe(a,o,n,this._transform,e);if(null!=h){const e=this._colorToBackground(this._options.color),t=this._canvasToTransform(h),n={style:{background:e,transform:t}},s={onclick:r,style:{transform:t}};i.push(tf.h("div.mapillary-tag-interactor",s,[])),i.push(tf.h("div.mapillary-tag-vertex",n,[]))}}else if(this._geometry instanceof dv){const t=this._geometry,[s,a]=t.getVertex2d(0),o=this._viewportCoords.basicToCanvasSafe(s,a,n,this._transform,e);if(null!=o){const e={onclick:t.polygon.length>4?e=>{e.stopPropagation(),t.removeVertex2d(t.polygon.length-2),this._created$.next(this)}:r,style:{transform:this._canvasToTransform(o)}},n=t.polygon.length>4?"mapillary-tag-completer":"mapillary-tag-interactor";i.push(tf.h("div."+n,e,[]))}if(t.polygon.length>3){const[r,s]=t.getVertex2d(t.polygon.length-3),a=this._viewportCoords.basicToCanvasSafe(r,s,n,this._transform,e);if(null!=a){const e={onclick:e=>{e.stopPropagation(),t.removeVertex2d(t.polygon.length-3)},style:{transform:this._canvasToTransform(a)}};i.push(tf.h("div.mapillary-tag-interactor",e,[]))}}const h=t.polygon.slice();h.splice(-2,2);for(const t of h){const r=this._viewportCoords.basicToCanvasSafe(t[0],t[1],n,this._transform,e);if(null!=r){const e={style:{background:this._colorToBackground(this._options.color),transform:this._canvasToTransform(r)}};i.push(tf.h("div.mapillary-tag-vertex",e,[]))}}}return i}addPoint(e){if(this._geometry instanceof lv){if(!this._geometry.validate(e))return;this._created$.next(this)}else if(this._geometry instanceof dv){this._geometry.addVertex2d(e)}}_onGeometryChanged(){this._disposeLine(this._outline),this._disposeObjects(),this._createGlObjects()}_disposeObjects(){this._outline=null,this._glObjects=[]}_createGlObjects(){const e=this._geometry instanceof lv?this._geometry.getPoints3d(this._transform):this._geometry.getVertices3d(this._transform);this._outline=this._createOutine(e,this._options.color),this._glObjects=[this._outline]}}class mv{constructor(e,t){this._component=e,this._navigator=t,this._tagOperation$=new j,this._createPoints$=new j,this._createPolygon$=new j,this._createRect$=new j,this._delete$=new j,this._tag$=this._tagOperation$.pipe(Lt(((e,t)=>t(e)),null),Dt()),this._replayedTag$=this._tag$.pipe(Rt(1),U()),this._replayedTag$.subscribe(),this._createPoints$.pipe(Vt(this._component.configuration$,this._navigator.stateService.currentTransform$),De((([e,t,i])=>()=>{const n=new Ug([[e[0],e[1]],[e[0],e[1]]]);return new uv(n,{color:t.createColor,indicateCompleter:t.indicatePointsCompleter},i)}))).subscribe(this._tagOperation$),this._createRect$.pipe(Vt(this._component.configuration$,this._navigator.stateService.currentTransform$),De((([e,t,i])=>()=>{const n=new lv([e[0],e[1],e[0],e[1]]);return new pv(n,{color:t.createColor},i)}))).subscribe(this._tagOperation$),this._createPolygon$.pipe(Vt(this._component.configuration$,this._navigator.stateService.currentTransform$),De((([e,t,i])=>()=>{const n=new dv([[e[0],e[1]],[e[0],e[1]],[e[0],e[1]]]);return new pv(n,{color:t.createColor},i)}))).subscribe(this._tagOperation$),this._delete$.pipe(De((()=>()=>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 fv{render(e,t,i,n,r){let s=[];for(const t of e)s=s.concat(t.getDOMObjects(i,n,r));return null!=t&&(s=s.concat(t.getDOMObjects(n,r))),tf.h("div.mapillary-tag-container",{},s)}clear(){return tf.h("div",{},[])}}class gv{constructor(e,t){this._createTag=null,this._needsRender=!1,this._raycaster=t||new su,this._scene=e||new ch,this._objectTags={},this._retrievableObjects=[],this._tags={}}get needsRender(){return this._needsRender}add(e){for(let t of e)t.tag.id in this._tags&&this._remove(t.tag.id),this._add(t);this._needsRender=!0}addCreateTag(e){for(const t of e.glObjects)this._scene.add(t);this._createTag={tag:e,objects:e.glObjects},this._needsRender=!0}clear(){for(const e of Object.keys(this._tags))this._remove(e);this._needsRender=!1}get(e){return this.has(e)?this._tags[e].tag:void 0}has(e){return e in this._tags}hasCreateTag(){return null!=this._createTag}intersectObjects([e,t],i){this._raycaster.setFromCamera(new zi(e,t),i);const n=this._raycaster.intersectObjects(this._retrievableObjects),r=[];for(const e of n)e.object.uuid in this._objectTags&&r.push(this._objectTags[e.object.uuid]);return r}remove(e){for(const t of e)this._remove(t);this._needsRender=!0}removeAll(){for(const e of Object.keys(this._tags))this._remove(e);this._needsRender=!0}removeCreateTag(){if(null!=this._createTag){for(const e of this._createTag.objects)this._scene.remove(e);this._createTag.tag.dispose(),this._createTag=null,this._needsRender=!0}}render(e,t){t.render(this._scene,e),this._needsRender=!1}update(){this._needsRender=!0}updateCreateTagObjects(e){if(this._createTag.tag!==e)throw new Error("Create tags do not have the same reference.");for(let e of this._createTag.objects)this._scene.remove(e);for(const t of e.glObjects)this._scene.add(t);this._createTag.objects=e.glObjects,this._needsRender=!0}updateObjects(e){const t=e.tag.id;if(this._tags[t].tag!==e)throw new Error("Tags do not have the same reference.");const i=this._tags[t];this._removeObjects(i),delete this._tags[t],this._add(e),this._needsRender=!0}_add(e){const t=e.tag.id,i={tag:e,objects:[],retrievableObjects:[]};this._tags[t]=i;for(const t of e.getGLObjects())i.objects.push(t),this._scene.add(t);for(const t of e.getRetrievableObjects())i.retrievableObjects.push(t),this._retrievableObjects.push(t),this._objectTags[t.uuid]=e.tag.id}_remove(e){const t=this._tags[e];this._removeObjects(t),t.tag.dispose(),delete this._tags[e]}_removeObjects(e){for(const t of e.objects)this._scene.remove(t);for(const t of e.retrievableObjects){const e=this._retrievableObjects.indexOf(t);-1!==e&&this._retrievableObjects.splice(e,1)}}}var _v,vv,yv,bv;e.TagMode=void 0,(_v=e.TagMode||(e.TagMode={}))[_v.Default=0]="Default",_v[_v.CreatePoint=1]="CreatePoint",_v[_v.CreatePoints=2]="CreatePoints",_v[_v.CreatePolygon=3]="CreatePolygon",_v[_v.CreateRect=4]="CreateRect",_v[_v.CreateRectDrag=5]="CreateRectDrag",function(e){e[e.None=0]="None",e[e.Centroid=1]="Centroid",e[e.Vertex=2]="Vertex"}(vv||(vv={}));class xv{constructor(e,t,i){this._tag=e,this._transform=t,this._viewportCoords=i||new hf,this._glObjectsChanged$=new j,this._interact$=new j}get glObjectsChanged$(){return this._glObjectsChanged$}get interact$(){return this._interact$}get tag(){return this._tag}}class wv extends xv{constructor(e,t){super(e,t),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(e){return"#"+("000000"+e.toString(16)).substr(-6)}_createFill(){let e=this._getTriangles(),t=new Float32Array(e),i=new kr;i.setAttribute("position",new Tr(t,3)),i.computeBoundingSphere();let n=new wr({side:2,transparent:!0});return this._updateFillMaterial(n),new es(i,n)}_createLine(e){let t=this._getLinePositions(e),i=new kr;i.setAttribute("position",new Tr(t,3)),i.computeBoundingSphere();let n=new Bh;this._updateLineBasicMaterial(n);const r=new Wh(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(e){let t=e.length,i=new Float32Array(3*t);for(let n=0;n<t;++n){let t=3*n,r=e[n];i[t+0]=r[0],i[t+1]=r[1],i[t+2]=r[2]}return i}_interact(e,t,i){return n=>{let r=n.offsetX-n.target.offsetWidth/2,s=n.offsetY-n.target.offsetHeight/2;this._interact$.next({cursor:t,offsetX:r,offsetY:s,operation:e,tag:this._tag,vertexIndex:i})}}_updateFillGeometry(){let e=this._getTriangles(),t=new Float32Array(e),i=this._fill.geometry,n=i.getAttribute("position");n.array.length===t.length?(n.set(t),n.needsUpdate=!0):(i.deleteAttribute("position"),i.setAttribute("position",new Tr(t,3))),i.computeBoundingSphere()}_updateLine(e,t){let i=this._getLinePositions(t),n=e.geometry,r=n.getAttribute("position");r.set(i),r.needsUpdate=!0,n.computeBoundingSphere()}_updateOulineGeometry(){this._updateLine(this._outline,this._getPoints3d())}}class Mv extends wv{constructor(e,t){super(e,t),this._rectGeometry=new lv(this._tag.geometry.getRect2d(t)),this._fill=$u(t.cameraType)?null:this._createFill(),this._outline=this._tag.lineWidth>=1?this._createOutline():null}dispose(){super.dispose(),this._disposeFill(),this._disposeOutline()}getDOMObjects(e,t,i){const n=[],r={offsetHeight:i.height,offsetWidth:i.width};if(!this._tag.editable)return n;const s=this._colorToCss(this._tag.lineColor),a=this._tag.geometry.getPoints2d();for(let e=0;e<a.length;e++){const[i,o]=a[e],h=this._viewportCoords.basicToCanvasSafe(i,o,r,this._transform,t);if(null==h)continue;const c="crosshair",l=this._interact(vv.Vertex,c,e),u=`translate(-50%, -50%) translate(${Math.round(h[0])}px,${Math.round(h[1])}px)`,d={onpointerdown:l,style:{background:s,transform:u,cursor:c}};if(n.push(tf.h("div.mapillary-tag-resizer",d,[])),!this._tag.indicateVertices)continue;const p={style:{background:s,transform:u}};n.push(tf.h("div.mapillary-tag-vertex",p,[]))}return n}getGLObjects(){const e=[];return null!=this._fill&&e.push(this._fill),null!=this._outline&&e.push(this._outline),e}getRetrievableObjects(){return null!=this._fill?[this._fill]:[]}_onGeometryChanged(){this._rectGeometry=new lv(this._tag.geometry.getRect2d(this._transform)),null!=this._fill&&this._updateFillGeometry(),null!=this._outline&&this._updateOulineGeometry()}_onTagChanged(){let e=!1;return null!=this._fill&&this._updateFillMaterial(this._fill.material),null==this._outline?this._tag.lineWidth>=1&&(this._outline=this._createOutline(),e=!0):this._updateOutlineMaterial(),e}_getPoints3d(){return this._rectGeometry.getPoints3d(this._transform)}_getTriangles(){return this._rectGeometry.getTriangles3d(this._transform)}_updateFillMaterial(e){e.color=new xr(this._tag.fillColor),e.opacity=this._tag.fillOpacity,e.needsUpdate=!0}_updateLineBasicMaterial(e){e.color=new xr(this._tag.lineColor),e.linewidth=Math.max(this._tag.lineWidth,1),e.visible=this._tag.lineWidth>=1&&this._tag.lineOpacity>0,e.opacity=this._tag.lineOpacity,e.transparent=this._tag.lineOpacity<1,e.needsUpdate=!0}_updateOutlineMaterial(){let e=this._outline.material;this._updateLineBasicMaterial(e)}}class Sv extends nf{constructor(e,t){super(),this._id=e,this._geometry=t,this._notifyChanged$=new j,this._notifyChanged$.subscribe((e=>{const t={target:this,type:"tag"};this.fire("tag",t)})),this._geometry.changed$.subscribe((e=>{const t="geometry",i={target:this,type:t};this.fire(t,i)}))}get id(){return this._id}get geometry(){return this._geometry}get changed$(){return this._notifyChanged$}get geometryChanged$(){return this._geometry.changed$.pipe(De((()=>this)),Dt())}fire(e,t){super.fire(e,t)}off(e,t){super.off(e,t)}on(e,t){super.on(e,t)}}class Tv extends Sv{constructor(e,t,i){super(e,t),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(e){this._editable=e,this._notifyChanged$.next(this)}get fillColor(){return this._fillColor}set fillColor(e){this._fillColor=e,this._notifyChanged$.next(this)}get fillOpacity(){return this._fillOpacity}set fillOpacity(e){this._fillOpacity=e,this._notifyChanged$.next(this)}get geometry(){return this._geometry}get indicateVertices(){return this._indicateVertices}set indicateVertices(e){this._indicateVertices=e,this._notifyChanged$.next(this)}get lineColor(){return this._lineColor}set lineColor(e){this._lineColor=e,this._notifyChanged$.next(this)}get lineOpacity(){return this._lineOpacity}set lineOpacity(e){this._lineOpacity=e,this._notifyChanged$.next(this)}get lineWidth(){return this._lineWidth}set lineWidth(e){this._lineWidth=e,this._notifyChanged$.next(this)}setOptions(e){this._editable=null==e.editable?this._editable:e.editable,this._indicateVertices=null==e.indicateVertices?this._indicateVertices:e.indicateVertices,this._lineColor=null==e.lineColor?this._lineColor:e.lineColor,this._lineWidth=null==e.lineWidth?this._lineWidth:e.lineWidth,this._fillColor=null==e.fillColor?this._fillColor:e.fillColor,this._fillOpacity=null==e.fillOpacity?this._fillOpacity:e.fillOpacity,this._notifyChanged$.next(this)}}e.TagDomain=void 0,(yv=e.TagDomain||(e.TagDomain={}))[yv.TwoDimensional=0]="TwoDimensional",yv[yv.ThreeDimensional=1]="ThreeDimensional";class Cv extends wv{constructor(t,i){super(t,i),this._fill=$u(i.cameraType)?t.domain===e.TagDomain.TwoDimensional&&t.geometry instanceof dv?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(e,t,i){const n=[],r=this._tag.geometry instanceof lv,s=!$u(this._transform.cameraType),a={offsetHeight:i.height,offsetWidth:i.width};if(null!=this._tag.icon&&(r||s)){const[i,r]=this._tag.geometry instanceof lv?this._tag.geometry.getVertex2d(this._tag.iconIndex):this._tag.geometry.getPoleOfInaccessibility2d(),s=this._viewportCoords.basicToCanvasSafe(i,r,a,this._transform,t);if(null!=s){const t=()=>{this._interact$.next({offsetX:0,offsetY:0,operation:vv.None,tag:this._tag})};if(e.loaded){const i=e.getDOMSprite(this._tag.icon,this._tag.iconFloat),r={onclick:e=>{e.stopPropagation(),this._tag.click$.next(this._tag)},onpointerdown:t,style:{transform:`translate(${Math.round(s[0])}px,${Math.round(s[1])}px)`}};n.push(tf.h("div.mapillary-tag-symbol",r,[i]))}}}else if(null!=this._tag.text&&(r||s)){const[e,i]=this._tag.geometry instanceof lv?this._tag.geometry.getVertex2d(3):this._tag.geometry.getPoleOfInaccessibility2d(),r=this._viewportCoords.basicToCanvasSafe(e,i,a,this._transform,t);if(null!=r){const e=Math.round(r[0]),t=Math.round(r[1]),i=this._tag.geometry instanceof lv?`translate(${e}px,${t}px)`:`translate(-50%, -50%) translate(${e}px,${t}px)`,s={onpointerdown:()=>{this._interact$.next({offsetX:0,offsetY:0,operation:vv.None,tag:this._tag})},style:{color:this._colorToCss(this._tag.textColor),transform:i},textContent:this._tag.text};n.push(tf.h("span.mapillary-tag-symbol",s,[]))}}if(!this._tag.editable)return n;const o=this._colorToCss(this._tag.lineColor);if(this._tag.geometry instanceof lv){const[e,i]=this._tag.geometry.getCentroid2d(),r=this._viewportCoords.basicToCanvasSafe(e,i,a,this._transform,t);if(null!=r){const e={onpointerdown:this._interact(vv.Centroid,"move"),style:{background:o,transform:`translate(-50%, -50%) translate(${Math.round(r[0])}px,${Math.round(r[1])}px)`}};n.push(tf.h("div.mapillary-tag-mover",e,[]))}}const h=this._tag.geometry.getVertices2d();for(let e=0;e<h.length-1;e++){if(r&&(null!=this._tag.icon&&e===this._tag.iconIndex||null==this._tag.icon&&null!=this._tag.text&&3===e))continue;const[i,s]=h[e],c=this._viewportCoords.basicToCanvasSafe(i,s,a,this._transform,t);if(null==c)continue;const l=r?e%2==0?"nesw-resize":"nwse-resize":"crosshair",u=this._interact(vv.Vertex,l,e),d=`translate(-50%, -50%) translate(${Math.round(c[0])}px,${Math.round(c[1])}px)`,p={onpointerdown:u,style:{background:o,transform:d,cursor:l}};if(n.push(tf.h("div.mapillary-tag-resizer",p,[])),!this._tag.indicateVertices)continue;const m={style:{background:o,transform:d}};n.push(tf.h("div.mapillary-tag-vertex",m,[]))}return n}getGLObjects(){const e=[];null!=this._fill&&e.push(this._fill);for(const t of this._holes)e.push(t);return null!=this._outline&&e.push(this._outline),e}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 e=!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(),e=!0):(this._updateHoleMaterials(),this._updateOutlineMaterial()),e}_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(e){e.color=new xr(this._tag.fillColor),e.opacity=this._tag.fillOpacity,e.needsUpdate=!0}_updateLineBasicMaterial(e){e.color=new xr(this._tag.lineColor),e.linewidth=Math.max(this._tag.lineWidth,1),e.visible=this._tag.lineWidth>=1&&this._tag.lineOpacity>0,e.opacity=this._tag.lineOpacity,e.transparent=this._tag.lineOpacity<1,e.needsUpdate=!0}_createHoles(){let e=[];if(this._tag.geometry instanceof dv){let t=this._getHoles3d();for(let i of t){let t=this._createLine(i);e.push(t)}}return e}_disposeHoles(){for(let e of this._holes)e.geometry.dispose(),e.material.dispose();this._holes=[]}_getHoles3d(){const e=this._tag.geometry;return this._in3dDomain()?e.getHoleVertices3d(this._transform):e.getHolePoints3d(this._transform)}_in3dDomain(){return this._tag.geometry instanceof dv&&this._tag.domain===e.TagDomain.ThreeDimensional}_updateHoleGeometries(){let e=this._getHoles3d();if(e.length!==this._holes.length)throw new Error("Changing the number of holes is not supported.");for(let t=0;t<this._holes.length;t++){let i=e[t],n=this._holes[t];this._updateLine(n,i)}}_updateHoleMaterials(){for(const e of this._holes)this._updateLineBasicMaterial(e.material)}_updateOutlineMaterial(){this._updateLineBasicMaterial(this._outline.material)}}e.Alignment=void 0,(bv=e.Alignment||(e.Alignment={}))[bv.Bottom=0]="Bottom",bv[bv.BottomLeft=1]="BottomLeft",bv[bv.BottomRight=2]="BottomRight",bv[bv.Center=3]="Center",bv[bv.Left=4]="Left",bv[bv.Right=5]="Right",bv[bv.Top=6]="Top",bv[bv.TopLeft=7]="TopLeft",bv[bv.TopRight=8]="TopRight";class Ev extends Sv{constructor(t,i,n){super(t,i);const r=null!=(n=n||{}).domain&&i instanceof dv?n.domain:e.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?e.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 j,this._click$.subscribe((()=>{const e="click",t={target:this,type:e};this.fire(e,t)}))}get click$(){return this._click$}get domain(){return this._domain}get editable(){return this._editable}set editable(e){this._twoDimensionalPolygon(this._domain,this._geometry)||(this._editable=e,this._notifyChanged$.next(this))}get fillColor(){return this._fillColor}set fillColor(e){this._fillColor=e,this._notifyChanged$.next(this)}get fillOpacity(){return this._fillOpacity}set fillOpacity(e){this._fillOpacity=e,this._notifyChanged$.next(this)}get geometry(){return this._geometry}get icon(){return this._icon}set icon(e){this._icon=e,this._notifyChanged$.next(this)}get iconFloat(){return this._iconFloat}set iconFloat(e){this._iconFloat=e,this._notifyChanged$.next(this)}get iconIndex(){return this._iconIndex}set iconIndex(e){this._iconIndex=e,this._notifyChanged$.next(this)}get indicateVertices(){return this._indicateVertices}set indicateVertices(e){this._indicateVertices=e,this._notifyChanged$.next(this)}get lineColor(){return this._lineColor}set lineColor(e){this._lineColor=e,this._notifyChanged$.next(this)}get lineOpacity(){return this._lineOpacity}set lineOpacity(e){this._lineOpacity=e,this._notifyChanged$.next(this)}get lineWidth(){return this._lineWidth}set lineWidth(e){this._lineWidth=e,this._notifyChanged$.next(this)}get text(){return this._text}set text(e){this._text=e,this._notifyChanged$.next(this)}get textColor(){return this._textColor}set textColor(e){this._textColor=e,this._notifyChanged$.next(this)}fire(e,t){super.fire(e,t)}off(e,t){super.off(e,t)}on(e,t){super.on(e,t)}setOptions(e){const t=this._twoDimensionalPolygon(this._domain,this._geometry);this._editable=t||null==e.editable?this._editable:e.editable,this._icon=void 0===e.icon?this._icon:e.icon,this._iconFloat=null==e.iconFloat?this._iconFloat:e.iconFloat,this._iconIndex=null==e.iconIndex?this._iconIndex:e.iconIndex,this._indicateVertices=null==e.indicateVertices?this._indicateVertices:e.indicateVertices,this._lineColor=null==e.lineColor?this._lineColor:e.lineColor,this._lineWidth=null==e.lineWidth?this._lineWidth:e.lineWidth,this._fillColor=null==e.fillColor?this._fillColor:e.fillColor,this._fillOpacity=null==e.fillOpacity?this._fillOpacity:e.fillOpacity,this._text=void 0===e.text?this._text:e.text,this._textColor=null==e.textColor?this._textColor:e.textColor,this._notifyChanged$.next(this)}_twoDimensionalPolygon(t,i){return t!==e.TagDomain.ThreeDimensional&&i instanceof dv}}class Av extends xv{dispose(){}getDOMObjects(t,i,n){const r=this._tag,s={offsetHeight:n.height,offsetWidth:n.width},a=[],[o,h]=r.geometry.getCentroid2d(),c=this._viewportCoords.basicToCanvasSafe(o,h,s,this._transform,i);if(null!=c){const i=e=>{this._interact$.next({offsetX:0,offsetY:0,operation:vv.None,tag:r})},n=Math.round(c[0]),s=Math.round(c[1]);if(null!=r.icon){if(t.loaded){const o=t.getDOMSprite(r.icon,e.Alignment.Bottom),h={onpointerdown:i,style:{pointerEvents:"all",transform:`translate(${n}px,${s+8}px)`}};a.push(tf.h("div",h,[o]))}}else if(null!=r.text){const e=`translate(-50%,0%) translate(${n}px,${s+8}px)`,t={onpointerdown:i,style:{color:this._colorToCss(r.textColor),transform:e},textContent:r.text};a.push(tf.h("span.mapillary-tag-symbol",t,[]))}const o=this._interact(vv.Centroid,r,"move"),h=this._colorToCss(r.color),l=`translate(-50%,-50%) translate(${n}px,${s}px)`;if(r.editable){let e={onpointerdown:o,style:{background:h,transform:l}};a.push(tf.h("div.mapillary-tag-spot-interactor",e,[]))}const u={style:{background:h,transform:l}};a.push(tf.h("div.mapillary-tag-vertex",u,[]))}return a}getGLObjects(){return[]}getRetrievableObjects(){return[]}_colorToCss(e){return"#"+("000000"+e.toString(16)).substr(-6)}_interact(e,t,i,n){return r=>{const s=r.offsetX-r.target.offsetWidth/2,a=r.offsetY-r.target.offsetHeight/2;this._interact$.next({cursor:i,offsetX:s,offsetY:a,operation:e,tag:t,vertexIndex:n})}}}class Iv extends Sv{constructor(e,t,i){super(e,t),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(e){this._color=e,this._notifyChanged$.next(this)}get editable(){return this._editable}set editable(e){this._editable=e,this._notifyChanged$.next(this)}get icon(){return this._icon}set icon(e){this._icon=e,this._notifyChanged$.next(this)}get text(){return this._text}set text(e){this._text=e,this._notifyChanged$.next(this)}get textColor(){return this._textColor}set textColor(e){this._textColor=e,this._notifyChanged$.next(this)}setOptions(e){this._color=null==e.color?this._color:e.color,this._editable=null==e.editable?this._editable:e.editable,this._icon=void 0===e.icon?this._icon:e.icon,this._text=void 0===e.text?this._text:e.text,this._textColor=null==e.textColor?this._textColor:e.textColor,this._notifyChanged$.next(this)}}class Rv{constructor(){this._active=!1,this._hash={},this._hashDeactivated={},this._notifyChanged$=new j}get active(){return this._active}get changed$(){return this._notifyChanged$}activate(e){if(!this._active){for(const t in this._hashDeactivated){if(!this._hashDeactivated.hasOwnProperty(t))continue;const i=this._hashDeactivated[t];this._add(i,e)}this._hashDeactivated={},this._active=!0,this._notifyChanged$.next(this)}}deactivate(){if(this._active){for(const e in this._hash)this._hash.hasOwnProperty(e)&&(this._hashDeactivated[e]=this._hash[e].tag);this._hash={},this._active=!1}}add(e,t){this._assertActivationState(!0);for(const i of e)this._add(i,t);this._notifyChanged$.next(this)}addDeactivated(e){this._assertActivationState(!1);for(const t of e){if(!(t instanceof Ev||t instanceof Iv||t instanceof Tv))throw new Error("Tag type not supported");this._hashDeactivated[t.id]=t}}get(e){return this.has(e)?this._hash[e]:void 0}getAll(){const e=this._hash;return Object.keys(e).map((t=>e[t]))}getAllDeactivated(){const e=this._hashDeactivated;return Object.keys(e).map((t=>e[t]))}getDeactivated(e){return this.hasDeactivated(e)?this._hashDeactivated[e]:void 0}has(e){return e in this._hash}hasDeactivated(e){return e in this._hashDeactivated}remove(e){this._assertActivationState(!0);const t=this._hash;for(const i of e)i in t&&delete t[i];this._notifyChanged$.next(this)}removeAll(){this._assertActivationState(!0),this._hash={},this._notifyChanged$.next(this)}removeAllDeactivated(){this._assertActivationState(!1),this._hashDeactivated={}}removeDeactivated(e){this._assertActivationState(!1);const t=this._hashDeactivated;for(const i of e)i in t&&delete t[i]}_add(e,t){if(e instanceof Ev)this._hash[e.id]=new Cv(e,t);else if(e instanceof Iv)this._hash[e.id]=new Av(e,t);else{if(!(e instanceof Tv))throw new Error("Tag type not supported");this._hash[e.id]=new Mv(e,t)}}_assertActivationState(e){if(e!==this._active)throw new Error("Tag set not in correct state for operation.")}}class Pv extends Fg{constructor(e){super();let t=e[0],i=e[1];if(t<0||t>1||i<0||i>1)throw new Bg("Basic coordinates must be on the interval [0, 1].");this._point=e.slice()}get point(){return this._point}getCentroid2d(){return this._point.slice()}getCentroid3d(e){return e.unprojectBasic(this._point,200)}setCentroid2d(e,t){let i=[Math.max(0,Math.min(1,e[0])),Math.max(0,Math.min(1,e[1]))];this._point[0]=i[0],this._point[1]=i[1],this._notifyChanged$.next(this)}}class Lv extends zf{constructor(e,t,i,n){super(e,t,i),this._name=`${this._component.name}-${this._getNameExtension()}`,this._viewportCoords=n}_getConfiguration(e){return{}}_mouseEventToBasic(e,t,i,n,r,s){r=null!=r?r:0,s=null!=s?s:0;const[a,o]=this._viewportCoords.canvasPosition(e,t);return this._viewportCoords.canvasToBasic(a-r,o-s,t,n,i.perspective)}}class Dv extends Lv{constructor(e,t,i,n,r){super(e,t,i,n),this._tagCreator=r,this._geometryCreated$=new j}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(e){const t=e[0],i=e[1];return 0<=t&&t<=1&&0<=i&&i<=1}_mouseEventToBasic$(e){return e.pipe(Vt(this._container.renderService.renderCamera$,this._navigator.stateService.currentTransform$),De((([e,t,i])=>this._mouseEventToBasic(e,this._container.container,t,i))))}}class Nv extends Dv{_enableCreate(){this._container.mouseService.deferPixels(this._name,4),this._geometryCreatedSubscription=this._mouseEventToBasic$(this._container.mouseService.proximateClick$).pipe(st(this._validateBasic),De((e=>new Pv(e)))).subscribe(this._geometryCreated$)}_disableCreate(){this._container.mouseService.undeferPixels(this._name),this._geometryCreatedSubscription.unsubscribe()}_getNameExtension(){return"create-point"}}class $v extends Dv{_enableCreate(){this._container.mouseService.deferPixels(this._name,4);const e=this._navigator.stateService.currentTransform$.pipe(De((()=>{})),Rt(1),U());this._deleteSubscription=e.pipe($t(1)).subscribe(this._tagCreator.delete$);const t=this._mouseEventToBasic$(this._container.mouseService.proximateClick$).pipe(Dt());this._createSubscription=e.pipe(zt((()=>t.pipe(st(this._validateBasic),_t(1))))).subscribe(this._create$),this._setVertexSubscription=this._tagCreator.tag$.pipe(zt((e=>e?Ve(Ce(e),it(this._container.mouseService.mouseMove$,this._container.mouseService.domMouseMove$),this._container.renderService.renderCamera$,this._navigator.stateService.currentTransform$):ie()))).subscribe((([e,t,i,n])=>{const r=this._mouseEventToBasic(t,this._container.container,i,n);this._setVertex2d(e,r,n)})),this._addPointSubscription=this._tagCreator.tag$.pipe(zt((e=>e?Ve(Ce(e),t):ie()))).subscribe((([e,t])=>{this._addPoint(e,t)})),this._geometryCreateSubscription=this._tagCreator.tag$.pipe(zt((e=>e?e.created$.pipe(De((e=>e.geometry))):ie()))).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 kv extends $v{get _create$(){return this._tagCreator.createPoints$}_addPoint(e,t){e.geometry.addPoint2d(t)}_getNameExtension(){return"create-points"}_setVertex2d(e,t,i){e.geometry.setPoint2d(e.geometry.points.length-1,t,i)}}class Ov extends $v{get _create$(){return this._tagCreator.createPolygon$}_addPoint(e,t){e.addPoint(t)}_getNameExtension(){return"create-polygon"}_setVertex2d(e,t,i){e.geometry.setVertex2d(e.geometry.polygon.length-2,t,i)}}class zv extends $v{get _create$(){return this._tagCreator.createRect$}_addPoint(e,t){const i=e.geometry;i.validate(t)||(t=i.getNonAdjustedVertex2d(3)),e.addPoint(t)}_enable(){super._enable(),this._initializeAnchorIndexingSubscription=this._tagCreator.tag$.pipe(st((e=>!!e))).subscribe((e=>{e.geometry.initializeAnchorIndexing()}))}_disable(){super._disable(),this._initializeAnchorIndexingSubscription.unsubscribe()}_getNameExtension(){return"create-rect"}_setVertex2d(e,t,i){e.geometry.setOppositeVertex2d(t,i)}}class Fv extends Dv{_enableCreate(){this._container.mouseService.claimMouse(this._name,2),this._deleteSubscription=this._navigator.stateService.currentTransform$.pipe(De((e=>null)),$t(1)).subscribe(this._tagCreator.delete$),this._createSubscription=this._mouseEventToBasic$(this._container.mouseService.filtered$(this._name,this._container.mouseService.mouseDragStart$)).pipe(st(this._validateBasic)).subscribe(this._tagCreator.createRect$),this._initializeAnchorIndexingSubscription=this._tagCreator.tag$.pipe(st((e=>!!e))).subscribe((e=>{e.geometry.initializeAnchorIndexing()}));const e=Ve(it(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(Vt(this._navigator.stateService.currentTransform$),De((([[e,t],i])=>this._mouseEventToBasic(e,this._container.container,t,i))));this._setVertexSubscription=this._tagCreator.tag$.pipe(zt((t=>t?Ve(Ce(t),e,this._navigator.stateService.currentTransform$):ie()))).subscribe((([e,t,i])=>{e.geometry.setOppositeVertex2d(t,i)}));const t=this._container.mouseService.mouseDragEnd$.pipe(Vt(this._mouseEventToBasic$(this._container.mouseService.filtered$(this._name,this._container.mouseService.mouseDrag$)).pipe(st(this._validateBasic)),((e,t)=>t)),Dt());this._addPointSubscription=this._tagCreator.tag$.pipe(zt((e=>e?Ve(Ce(e),t):ie()))).subscribe((([e,t])=>{const i=e.geometry;i.validate(t)||(t=i.getNonAdjustedVertex2d(3)),e.addPoint(t)})),this._geometryCreatedSubscription=this._tagCreator.tag$.pipe(zt((e=>e?e.created$.pipe(De((e=>e.geometry))):ie()))).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 Bv extends Lv{constructor(e,t,i,n,r){super(e,t,i,n),this._tagSet=r}_enable(){const e=this._tagSet.changed$.pipe(De((e=>e.getAll())),zt((e=>ge(e).pipe(We((e=>e.interact$))))),zt((e=>Ze(Ce(e),this._container.mouseService.documentMouseUp$.pipe(De((()=>({offsetX:0,offsetY:0,operation:vv.None,tag:null}))),St())))),Dt());it(this._container.mouseService.mouseMove$,this._container.mouseService.domMouseMove$).pipe(Dt()),this._claimMouseSubscription=e.pipe(zt((e=>e.tag?this._container.mouseService.domMouseDragStart$:ie()))).subscribe((()=>{this._container.mouseService.claimMouse(this._name,3)})),this._cursorSubscription=e.pipe(De((e=>e.cursor)),vt()).subscribe((e=>{const t=["crosshair","move","nesw-resize","nwse-resize"];for(const e of t)this._container.container.classList.remove(`component-tag-edit-${e}`);e&&this._container.container.classList.add(`component-tag-edit-${e}`)})),this._unclaimMouseSubscription=this._container.mouseService.filtered$(this._name,this._container.mouseService.domMouseDragEnd$).subscribe((e=>{this._container.mouseService.unclaimMouse(this._name)})),this._preventDefaultSubscription=e.pipe(zt((e=>e.tag?this._container.mouseService.documentMouseMove$:ie()))).subscribe((e=>{e.preventDefault()})),this._updateGeometrySubscription=e.pipe(zt((e=>{if(e.operation===vv.None||!e.tag)return ie();return Ve(this._container.mouseService.filtered$(this._name,this._container.mouseService.domMouseDrag$).pipe(st((e=>this._viewportCoords.insideElement(e,this._container.container)))),this._container.renderService.renderCamera$).pipe(Vt(Ce(e),this._navigator.stateService.currentTransform$,(([e,t],i,n)=>[e,t,i,n])))}))).subscribe((([e,t,i,n])=>{const r=this._mouseEventToBasic(e,this._container.container,t,n,i.offsetX,i.offsetY),s=i.tag.geometry;i.operation===vv.Centroid?s.setCentroid2d(r,n):i.operation===vv.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 Uv extends sf{constructor(e,t,i){super(e,t,i),this._tagDomRenderer=new fv,this._tagScene=new gv,this._tagSet=new Rv,this._tagCreator=new mv(this,i),this._viewportCoords=new hf,this._createHandlers={CreatePoint:new Nv(this,t,i,this._viewportCoords,this._tagCreator),CreatePoints:new kv(this,t,i,this._viewportCoords,this._tagCreator),CreatePolygon:new Ov(this,t,i,this._viewportCoords,this._tagCreator),CreateRect:new zv(this,t,i,this._viewportCoords,this._tagCreator),CreateRectDrag:new Fv(this,t,i,this._viewportCoords,this._tagCreator),Default:void 0},this._editVertexHandler=new Bv(this,t,i,this._viewportCoords,this._tagSet),this._renderTags$=this._tagSet.changed$.pipe(De((e=>{const t=e.getAll();return t.sort(((e,t)=>{const i=e.tag.id,n=t.tag.id;return i<n?-1:i>n?1:0})),t})),Dt()),this._tagChanged$=this._renderTags$.pipe(zt((e=>ge(e).pipe(We((e=>it(e.tag.changed$,e.tag.geometryChanged$)))))),Dt()),this._renderTagGLChanged$=this._renderTags$.pipe(zt((e=>ge(e).pipe(We((e=>e.glObjectsChanged$))))),Dt()),this._createGeometryChanged$=this._tagCreator.tag$.pipe(zt((e=>null!=e?e.geometryChanged$:ie())),Dt()),this._createGLObjectsChanged$=this._tagCreator.tag$.pipe(zt((e=>null!=e?e.glObjectsChanged$:ie())),Dt()),this._creatingConfiguration$=this._configuration$.pipe(vt(((e,t)=>e.mode===t.mode),(e=>({createColor:e.createColor,mode:e.mode}))),Rt(1),U()),this._creatingConfiguration$.subscribe((e=>{const t="tagmode",i={mode:e.mode,target:this,type:t};this.fire(t,i)}))}add(e){this._activated?this._navigator.stateService.currentTransform$.pipe(St()).subscribe((t=>{this._tagSet.add(e,t);const i=e.map((e=>this._tagSet.get(e.id)));this._tagScene.add(i)})):this._tagSet.addDeactivated(e)}calculateRect(e){return new Promise(((t,i)=>{this._navigator.stateService.currentTransform$.pipe(St(),De((t=>e.getRect2d(t)))).subscribe((e=>{t(e)}),(e=>{i(e)}))}))}create(){this._tagCreator.replayedTag$.pipe(St(),st((e=>!!e))).subscribe((e=>{e.create()}))}changeMode(e){this.configure({mode:e})}fire(e,t){super.fire(e,t)}get(e){if(this._activated){const t=this._tagSet.get(e);return void 0!==t?t.tag:void 0}return this._tagSet.getDeactivated(e)}getAll(){return this.activated?this._tagSet.getAll().map((e=>e.tag)):this._tagSet.getAllDeactivated()}getTagIdsAt(e){return new Promise(((t,i)=>{this._container.renderService.renderCamera$.pipe(St(),De((t=>{const i=this._viewportCoords.canvasToViewport(e[0],e[1],this._container.container);return this._tagScene.intersectObjects(i,t.perspective)}))).subscribe((e=>{t(e)}),(e=>{i(e)}))}))}has(e){return this._activated?this._tagSet.has(e):this._tagSet.hasDeactivated(e)}off(e,t){super.off(e,t)}on(e,t){super.on(e,t)}remove(e){this._activated?(this._tagSet.remove(e),this._tagScene.remove(e)):this._tagSet.removeDeactivated(e)}removeAll(){this._activated?(this._tagSet.removeAll(),this._tagScene.removeAll()):this._tagSet.removeAllDeactivated()}_activate(){this._editVertexHandler.enable();const t=ge(Object.keys(this._createHandlers)).pipe(De((e=>this._createHandlers[e])),st((e=>!!e)),We((e=>e.geometryCreated$)),Dt()),i=this._subscriptions;i.push(t.subscribe((e=>{const t="geometrycreate",i={geometry:e,target:this,type:t};this.fire(t,i)}))),i.push(this._tagCreator.tag$.pipe(kt((e=>null==e)),vt()).subscribe((e=>{const t=null!=e?"tagcreatestart":"tagcreateend",i={target:this,type:t};this.fire(t,i)}))),i.push(t.subscribe((()=>{this.changeMode(e.TagMode.Default)}))),i.push(this._creatingConfiguration$.subscribe((t=>{this._disableCreateHandlers();const i=e.TagMode[t.mode],n=this._createHandlers[i];n&&n.enable()}))),i.push(this._renderTags$.subscribe((()=>{const e="tags",t={target:this,type:e};this.fire(e,t)}))),i.push(this._tagCreator.tag$.pipe(zt((e=>null!=e?e.aborted$.pipe(De((()=>null))):ie()))).subscribe((()=>{this.changeMode(e.TagMode.Default)}))),i.push(this._tagCreator.tag$.subscribe((e=>{this._tagScene.hasCreateTag()&&this._tagScene.removeCreateTag(),null!=e&&this._tagScene.addCreateTag(e)}))),i.push(this._createGLObjectsChanged$.subscribe((e=>{this._tagScene.updateCreateTagObjects(e)}))),i.push(this._renderTagGLChanged$.subscribe((e=>{this._tagScene.updateObjects(e)}))),i.push(this._tagChanged$.subscribe((()=>{this._tagScene.update()}))),i.push(Ve(this._renderTags$.pipe(Ot([]),Ut((()=>{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(Ot(null)),it(this._tagCreator.tag$,this._createGeometryChanged$).pipe(Ot(null))).pipe(De((([e,t,i,n,,r])=>({name:this._name,vNode:this._tagDomRenderer.render(e,r,i,t.perspective,n)})))).subscribe(this._container.domRenderer.render$)),i.push(this._navigator.stateService.currentState$.pipe(De((e=>{const t=this._tagScene;return{name:this._name,renderer:{frameId:e.id,needsRender:t.needsRender,render:t.render.bind(t),pass:yf.Opaque}}}))).subscribe(this._container.glRenderer.render$)),this._navigator.stateService.currentTransform$.pipe(St()).subscribe((e=>{this._tagSet.activate(e),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:e.TagMode.Default}}_disableCreateHandlers(){const e=this._createHandlers;for(const t in e){if(!e.hasOwnProperty(t))continue;const i=e[t];i&&i.disable()}}}Uv.componentName="tag";class Vv extends sf{constructor(e,t,i){super(e,t,i),this._viewportCoords=new hf,this._zoomDelta$=new j}_activate(){const t=this._subscriptions;t.push(Ve(this._navigator.stateService.currentState$,this._navigator.stateService.state$,this._configuration$,this._container.renderService.size$).pipe(De((([t,i,n,r])=>{const s=t.state.zoom,a=tf.h("div.mapillary-zoom-in-icon",[]),o=s>=3||i===Df.Waiting?tf.h("div.mapillary-zoom-in-button-inactive",[a]):tf.h("div.mapillary-zoom-in-button",{onclick:()=>{this._zoomDelta$.next(1)}},[a]),h=tf.h("div.mapillary-zoom-out-icon",[]),c=s<=0||i===Df.Waiting?tf.h("div.mapillary-zoom-out-button-inactive",[h]):tf.h("div.mapillary-zoom-out-button",{onclick:()=>{this._zoomDelta$.next(-1)}},[h]),l=n.size===e.ComponentSize.Small||n.size===e.ComponentSize.Automatic&&r.width<640?".mapillary-zoom-compact":"";return{name:this._name,vNode:tf.h("div.mapillary-zoom-container"+l,{oncontextmenu:e=>{e.preventDefault()}},[o,c])}}))).subscribe(this._container.domRenderer.render$)),t.push(this._zoomDelta$.pipe(Vt(this._container.renderService.renderCamera$,this._navigator.stateService.currentTransform$)).subscribe((([e,t,i])=>{const n=this._viewportCoords.unprojectFromViewport(0,0,t.perspective),r=i.projectBasic(n.toArray());this._navigator.stateService.zoomIn(e,r)})))}_deactivate(){this._subscriptions.unsubscribe()}_getDefaultConfiguration(){return{size:e.ComponentSize.Automatic}}}Vv.componentName="zoom";class Hv extends sf{constructor(e,t,i,n){super(e,t,i),this._canvasId=`${t.id}-${this._name}`,this._dom=n||new og}_activate(){const e=this._container.domRenderer.element$.pipe(De((()=>this._dom.document.getElementById(this._canvasId))),st((e=>!!e)),De((e=>{const t=e.parentElement,i=t.offsetWidth;return[e,{height:t.offsetHeight,width:i}]})),vt(((e,t)=>e.height===t.height&&e.width===t.width),(([,e])=>e)));this._subscriptions.push(Ve(e,this._navigator.stateService.currentImage$).subscribe((([[e,t],i])=>{e.width=t.width,e.height=t.height,e.getContext("2d").drawImage(i.image,0,0,t.width,t.height)}))),this._container.domRenderer.renderAdaptive$.next({name:this._name,vNode:tf.h(`canvas#${this._canvasId}`,[])})}_deactivate(){this._subscriptions.unsubscribe()}_getDefaultConfiguration(){return{}}}Hv.componentName="imagefallback";class jv extends sf{constructor(t,i,n){super(t,i,n),this._seqNames={},this._seqNames[e.NavigationDirection[e.NavigationDirection.Prev]]="-prev",this._seqNames[e.NavigationDirection[e.NavigationDirection.Next]]="-next",this._spaTopNames={},this._spaTopNames[e.NavigationDirection[e.NavigationDirection.TurnLeft]]="-turn-left",this._spaTopNames[e.NavigationDirection[e.NavigationDirection.StepLeft]]="-left",this._spaTopNames[e.NavigationDirection[e.NavigationDirection.StepForward]]="-forward",this._spaTopNames[e.NavigationDirection[e.NavigationDirection.StepRight]]="-right",this._spaTopNames[e.NavigationDirection[e.NavigationDirection.TurnRight]]="-turn-right",this._spaBottomNames={},this._spaBottomNames[e.NavigationDirection[e.NavigationDirection.TurnU]]="-turn-around",this._spaBottomNames[e.NavigationDirection[e.NavigationDirection.StepBackward]]="-backward"}_activate(){this._subscriptions.push(Ve(this._navigator.stateService.currentImage$,this._configuration$).pipe(zt((([e,t])=>Ve(t.sequence?e.sequenceEdges$.pipe(De((e=>e.edges.map((e=>e.data.direction))))):Ce([]),!$u(e.cameraType)&&t.spatial?e.spatialEdges$.pipe(De((e=>e.edges.map((e=>e.data.direction))))):Ce([])).pipe(De((([e,t])=>e.concat(t)))))),De((e=>{const t=this._createArrowRow(this._seqNames,e),i=this._createArrowRow(this._spaTopNames,e),n=this._createArrowRow(this._spaBottomNames,e),r=tf.h("div.mapillary-navigation-sequence",t),s=tf.h("div.NavigationSpatialTop",i),a=tf.h("div.mapillary-navigation-spatial-bottom",n),o=tf.h("div.mapillary-navigation-spatial",[s,a]);return{name:this._name,vNode:tf.h("div.NavigationContainer",[r,o])}}))).subscribe(this._container.domRenderer.render$))}_deactivate(){this._subscriptions.unsubscribe()}_getDefaultConfiguration(){return{sequence:!0,spatial:!0}}_createArrowRow(t,i){const n=[];for(const r in t){if(!t.hasOwnProperty(r))continue;const s=e.NavigationDirection[r];-1!==i.indexOf(s)?n.push(this._createVNode(s,t[r],"visible")):n.push(this._createVNode(s,t[r],"hidden"))}return n}_createVNode(e,t,i){return tf.h(`span.mapillary-navigation-button.mapillary-navigation${t}`,{onclick:()=>{this._navigator.moveDir$(e).subscribe(void 0,(e=>{e instanceof uf||console.error(e)}))},style:{visibility:i}},[])}}jv.componentName="navigationfallback";function Gv(e){let t=e.length;for(;--t>=0;)e[t]=0}const Wv=256,qv=286,Xv=30,Zv=15,Yv=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]),Jv=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]),Kv=new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7]),Qv=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),ey=new Array(576);Gv(ey);const ty=new Array(60);Gv(ty);const iy=new Array(512);Gv(iy);const ny=new Array(256);Gv(ny);const ry=new Array(29);Gv(ry);const sy=new Array(Xv);function ay(e,t,i,n,r){this.static_tree=e,this.extra_bits=t,this.extra_base=i,this.elems=n,this.max_length=r,this.has_stree=e&&e.length}let oy,hy,cy;function ly(e,t){this.dyn_tree=e,this.max_code=0,this.stat_desc=t}Gv(sy);const uy=e=>e<256?iy[e]:iy[256+(e>>>7)],dy=(e,t)=>{e.pending_buf[e.pending++]=255&t,e.pending_buf[e.pending++]=t>>>8&255},py=(e,t,i)=>{e.bi_valid>16-i?(e.bi_buf|=t<<e.bi_valid&65535,dy(e,e.bi_buf),e.bi_buf=t>>16-e.bi_valid,e.bi_valid+=i-16):(e.bi_buf|=t<<e.bi_valid&65535,e.bi_valid+=i)},my=(e,t,i)=>{py(e,i[2*t],i[2*t+1])},fy=(e,t)=>{let i=0;do{i|=1&e,e>>>=1,i<<=1}while(--t>0);return i>>>1},gy=(e,t,i)=>{const n=new Array(16);let r,s,a=0;for(r=1;r<=Zv;r++)n[r]=a=a+i[r-1]<<1;for(s=0;s<=t;s++){let t=e[2*s+1];0!==t&&(e[2*s]=fy(n[t]++,t))}},_y=e=>{let t;for(t=0;t<qv;t++)e.dyn_ltree[2*t]=0;for(t=0;t<Xv;t++)e.dyn_dtree[2*t]=0;for(t=0;t<19;t++)e.bl_tree[2*t]=0;e.dyn_ltree[512]=1,e.opt_len=e.static_len=0,e.last_lit=e.matches=0},vy=e=>{e.bi_valid>8?dy(e,e.bi_buf):e.bi_valid>0&&(e.pending_buf[e.pending++]=e.bi_buf),e.bi_buf=0,e.bi_valid=0},yy=(e,t,i,n)=>{const r=2*t,s=2*i;return e[r]<e[s]||e[r]===e[s]&&n[t]<=n[i]},by=(e,t,i)=>{const n=e.heap[i];let r=i<<1;for(;r<=e.heap_len&&(r<e.heap_len&&yy(t,e.heap[r+1],e.heap[r],e.depth)&&r++,!yy(t,n,e.heap[r],e.depth));)e.heap[i]=e.heap[r],i=r,r<<=1;e.heap[i]=n},xy=(e,t,i)=>{let n,r,s,a,o=0;if(0!==e.last_lit)do{n=e.pending_buf[e.d_buf+2*o]<<8|e.pending_buf[e.d_buf+2*o+1],r=e.pending_buf[e.l_buf+o],o++,0===n?my(e,r,t):(s=ny[r],my(e,s+Wv+1,t),a=Yv[s],0!==a&&(r-=ry[s],py(e,r,a)),n--,s=uy(n),my(e,s,i),a=Jv[s],0!==a&&(n-=sy[s],py(e,n,a)))}while(o<e.last_lit);my(e,256,t)},wy=(e,t)=>{const i=t.dyn_tree,n=t.stat_desc.static_tree,r=t.stat_desc.has_stree,s=t.stat_desc.elems;let a,o,h,c=-1;for(e.heap_len=0,e.heap_max=573,a=0;a<s;a++)0!==i[2*a]?(e.heap[++e.heap_len]=c=a,e.depth[a]=0):i[2*a+1]=0;for(;e.heap_len<2;)h=e.heap[++e.heap_len]=c<2?++c:0,i[2*h]=1,e.depth[h]=0,e.opt_len--,r&&(e.static_len-=n[2*h+1]);for(t.max_code=c,a=e.heap_len>>1;a>=1;a--)by(e,i,a);h=s;do{a=e.heap[1],e.heap[1]=e.heap[e.heap_len--],by(e,i,1),o=e.heap[1],e.heap[--e.heap_max]=a,e.heap[--e.heap_max]=o,i[2*h]=i[2*a]+i[2*o],e.depth[h]=(e.depth[a]>=e.depth[o]?e.depth[a]:e.depth[o])+1,i[2*a+1]=i[2*o+1]=h,e.heap[1]=h++,by(e,i,1)}while(e.heap_len>=2);e.heap[--e.heap_max]=e.heap[1],((e,t)=>{const i=t.dyn_tree,n=t.max_code,r=t.stat_desc.static_tree,s=t.stat_desc.has_stree,a=t.stat_desc.extra_bits,o=t.stat_desc.extra_base,h=t.stat_desc.max_length;let c,l,u,d,p,m,f=0;for(d=0;d<=Zv;d++)e.bl_count[d]=0;for(i[2*e.heap[e.heap_max]+1]=0,c=e.heap_max+1;c<573;c++)l=e.heap[c],d=i[2*i[2*l+1]+1]+1,d>h&&(d=h,f++),i[2*l+1]=d,l>n||(e.bl_count[d]++,p=0,l>=o&&(p=a[l-o]),m=i[2*l],e.opt_len+=m*(d+p),s&&(e.static_len+=m*(r[2*l+1]+p)));if(0!==f){do{for(d=h-1;0===e.bl_count[d];)d--;e.bl_count[d]--,e.bl_count[d+1]+=2,e.bl_count[h]--,f-=2}while(f>0);for(d=h;0!==d;d--)for(l=e.bl_count[d];0!==l;)u=e.heap[--c],u>n||(i[2*u+1]!==d&&(e.opt_len+=(d-i[2*u+1])*i[2*u],i[2*u+1]=d),l--)}})(e,t),gy(i,c,e.bl_count)},My=(e,t,i)=>{let n,r,s=-1,a=t[1],o=0,h=7,c=4;for(0===a&&(h=138,c=3),t[2*(i+1)+1]=65535,n=0;n<=i;n++)r=a,a=t[2*(n+1)+1],++o<h&&r===a||(o<c?e.bl_tree[2*r]+=o:0!==r?(r!==s&&e.bl_tree[2*r]++,e.bl_tree[32]++):o<=10?e.bl_tree[34]++:e.bl_tree[36]++,o=0,s=r,0===a?(h=138,c=3):r===a?(h=6,c=3):(h=7,c=4))},Sy=(e,t,i)=>{let n,r,s=-1,a=t[1],o=0,h=7,c=4;for(0===a&&(h=138,c=3),n=0;n<=i;n++)if(r=a,a=t[2*(n+1)+1],!(++o<h&&r===a)){if(o<c)do{my(e,r,e.bl_tree)}while(0!=--o);else 0!==r?(r!==s&&(my(e,r,e.bl_tree),o--),my(e,16,e.bl_tree),py(e,o-3,2)):o<=10?(my(e,17,e.bl_tree),py(e,o-3,3)):(my(e,18,e.bl_tree),py(e,o-11,7));o=0,s=r,0===a?(h=138,c=3):r===a?(h=6,c=3):(h=7,c=4)}};let Ty=!1;const Cy=(e,t,i,n)=>{py(e,0+(n?1:0),3),((e,t,i,n)=>{vy(e),n&&(dy(e,i),dy(e,~i)),e.pending_buf.set(e.window.subarray(t,t+i),e.pending),e.pending+=i})(e,t,i,!0)};var Ey={_tr_init:e=>{Ty||((()=>{let e,t,i,n,r;const s=new Array(16);for(i=0,n=0;n<28;n++)for(ry[n]=i,e=0;e<1<<Yv[n];e++)ny[i++]=n;for(ny[i-1]=n,r=0,n=0;n<16;n++)for(sy[n]=r,e=0;e<1<<Jv[n];e++)iy[r++]=n;for(r>>=7;n<Xv;n++)for(sy[n]=r<<7,e=0;e<1<<Jv[n]-7;e++)iy[256+r++]=n;for(t=0;t<=Zv;t++)s[t]=0;for(e=0;e<=143;)ey[2*e+1]=8,e++,s[8]++;for(;e<=255;)ey[2*e+1]=9,e++,s[9]++;for(;e<=279;)ey[2*e+1]=7,e++,s[7]++;for(;e<=287;)ey[2*e+1]=8,e++,s[8]++;for(gy(ey,287,s),e=0;e<Xv;e++)ty[2*e+1]=5,ty[2*e]=fy(e,5);oy=new ay(ey,Yv,257,qv,Zv),hy=new ay(ty,Jv,0,Xv,Zv),cy=new ay(new Array(0),Kv,0,19,7)})(),Ty=!0),e.l_desc=new ly(e.dyn_ltree,oy),e.d_desc=new ly(e.dyn_dtree,hy),e.bl_desc=new ly(e.bl_tree,cy),e.bi_buf=0,e.bi_valid=0,_y(e)},_tr_stored_block:Cy,_tr_flush_block:(e,t,i,n)=>{let r,s,a=0;e.level>0?(2===e.strm.data_type&&(e.strm.data_type=(e=>{let t,i=4093624447;for(t=0;t<=31;t++,i>>>=1)if(1&i&&0!==e.dyn_ltree[2*t])return 0;if(0!==e.dyn_ltree[18]||0!==e.dyn_ltree[20]||0!==e.dyn_ltree[26])return 1;for(t=32;t<Wv;t++)if(0!==e.dyn_ltree[2*t])return 1;return 0})(e)),wy(e,e.l_desc),wy(e,e.d_desc),a=(e=>{let t;for(My(e,e.dyn_ltree,e.l_desc.max_code),My(e,e.dyn_dtree,e.d_desc.max_code),wy(e,e.bl_desc),t=18;t>=3&&0===e.bl_tree[2*Qv[t]+1];t--);return e.opt_len+=3*(t+1)+5+5+4,t})(e),r=e.opt_len+3+7>>>3,s=e.static_len+3+7>>>3,s<=r&&(r=s)):r=s=i+5,i+4<=r&&-1!==t?Cy(e,t,i,n):4===e.strategy||s===r?(py(e,2+(n?1:0),3),xy(e,ey,ty)):(py(e,4+(n?1:0),3),((e,t,i,n)=>{let r;for(py(e,t-257,5),py(e,i-1,5),py(e,n-4,4),r=0;r<n;r++)py(e,e.bl_tree[2*Qv[r]+1],3);Sy(e,e.dyn_ltree,t-1),Sy(e,e.dyn_dtree,i-1)})(e,e.l_desc.max_code+1,e.d_desc.max_code+1,a+1),xy(e,e.dyn_ltree,e.dyn_dtree)),_y(e),n&&vy(e)},_tr_tally:(e,t,i)=>(e.pending_buf[e.d_buf+2*e.last_lit]=t>>>8&255,e.pending_buf[e.d_buf+2*e.last_lit+1]=255&t,e.pending_buf[e.l_buf+e.last_lit]=255&i,e.last_lit++,0===t?e.dyn_ltree[2*i]++:(e.matches++,t--,e.dyn_ltree[2*(ny[i]+Wv+1)]++,e.dyn_dtree[2*uy(t)]++),e.last_lit===e.lit_bufsize-1),_tr_align:e=>{py(e,2,3),my(e,256,ey),(e=>{16===e.bi_valid?(dy(e,e.bi_buf),e.bi_buf=0,e.bi_valid=0):e.bi_valid>=8&&(e.pending_buf[e.pending++]=255&e.bi_buf,e.bi_buf>>=8,e.bi_valid-=8)})(e)}};var Ay=(e,t,i,n)=>{let r=65535&e|0,s=e>>>16&65535|0,a=0;for(;0!==i;){a=i>2e3?2e3:i,i-=a;do{r=r+t[n++]|0,s=s+r|0}while(--a);r%=65521,s%=65521}return r|s<<16|0};const Iy=new Uint32Array((()=>{let e,t=[];for(var i=0;i<256;i++){e=i;for(var n=0;n<8;n++)e=1&e?3988292384^e>>>1:e>>>1;t[i]=e}return t})());var Ry=(e,t,i,n)=>{const r=Iy,s=n+i;e^=-1;for(let i=n;i<s;i++)e=e>>>8^r[255&(e^t[i])];return-1^e},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"},Ly={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:Dy,_tr_stored_block:Ny,_tr_flush_block:$y,_tr_tally:ky,_tr_align:Oy}=Ey,{Z_NO_FLUSH:zy,Z_PARTIAL_FLUSH:Fy,Z_FULL_FLUSH:By,Z_FINISH:Uy,Z_BLOCK:Vy,Z_OK:Hy,Z_STREAM_END:jy,Z_STREAM_ERROR:Gy,Z_DATA_ERROR:Wy,Z_BUF_ERROR:qy,Z_DEFAULT_COMPRESSION:Xy,Z_FILTERED:Zy,Z_HUFFMAN_ONLY:Yy,Z_RLE:Jy,Z_FIXED:Ky,Z_DEFAULT_STRATEGY:Qy,Z_UNKNOWN:eb,Z_DEFLATED:tb}=Ly,ib=258,nb=262,rb=103,sb=113,ab=666,ob=(e,t)=>(e.msg=Py[t],t),hb=e=>(e<<1)-(e>4?9:0),cb=e=>{let t=e.length;for(;--t>=0;)e[t]=0};let lb=(e,t,i)=>(t<<e.hash_shift^i)&e.hash_mask;const ub=e=>{const t=e.state;let i=t.pending;i>e.avail_out&&(i=e.avail_out),0!==i&&(e.output.set(t.pending_buf.subarray(t.pending_out,t.pending_out+i),e.next_out),e.next_out+=i,t.pending_out+=i,e.total_out+=i,e.avail_out-=i,t.pending-=i,0===t.pending&&(t.pending_out=0))},db=(e,t)=>{$y(e,e.block_start>=0?e.block_start:-1,e.strstart-e.block_start,t),e.block_start=e.strstart,ub(e.strm)},pb=(e,t)=>{e.pending_buf[e.pending++]=t},mb=(e,t)=>{e.pending_buf[e.pending++]=t>>>8&255,e.pending_buf[e.pending++]=255&t},fb=(e,t,i,n)=>{let r=e.avail_in;return r>n&&(r=n),0===r?0:(e.avail_in-=r,t.set(e.input.subarray(e.next_in,e.next_in+r),i),1===e.state.wrap?e.adler=Ay(e.adler,t,r,i):2===e.state.wrap&&(e.adler=Ry(e.adler,t,r,i)),e.next_in+=r,e.total_in+=r,r)},gb=(e,t)=>{let i,n,r=e.max_chain_length,s=e.strstart,a=e.prev_length,o=e.nice_match;const h=e.strstart>e.w_size-nb?e.strstart-(e.w_size-nb):0,c=e.window,l=e.w_mask,u=e.prev,d=e.strstart+ib;let p=c[s+a-1],m=c[s+a];e.prev_length>=e.good_match&&(r>>=2),o>e.lookahead&&(o=e.lookahead);do{if(i=t,c[i+a]===m&&c[i+a-1]===p&&c[i]===c[s]&&c[++i]===c[s+1]){s+=2,i++;do{}while(c[++s]===c[++i]&&c[++s]===c[++i]&&c[++s]===c[++i]&&c[++s]===c[++i]&&c[++s]===c[++i]&&c[++s]===c[++i]&&c[++s]===c[++i]&&c[++s]===c[++i]&&s<d);if(n=ib-(d-s),s=d-ib,n>a){if(e.match_start=t,a=n,n>=o)break;p=c[s+a-1],m=c[s+a]}}}while((t=u[t&l])>h&&0!=--r);return a<=e.lookahead?a:e.lookahead},_b=e=>{const t=e.w_size;let i,n,r,s,a;do{if(s=e.window_size-e.lookahead-e.strstart,e.strstart>=t+(t-nb)){e.window.set(e.window.subarray(t,t+t),0),e.match_start-=t,e.strstart-=t,e.block_start-=t,n=e.hash_size,i=n;do{r=e.head[--i],e.head[i]=r>=t?r-t:0}while(--n);n=t,i=n;do{r=e.prev[--i],e.prev[i]=r>=t?r-t:0}while(--n);s+=t}if(0===e.strm.avail_in)break;if(n=fb(e.strm,e.window,e.strstart+e.lookahead,s),e.lookahead+=n,e.lookahead+e.insert>=3)for(a=e.strstart-e.insert,e.ins_h=e.window[a],e.ins_h=lb(e,e.ins_h,e.window[a+1]);e.insert&&(e.ins_h=lb(e,e.ins_h,e.window[a+3-1]),e.prev[a&e.w_mask]=e.head[e.ins_h],e.head[e.ins_h]=a,a++,e.insert--,!(e.lookahead+e.insert<3)););}while(e.lookahead<nb&&0!==e.strm.avail_in)},vb=(e,t)=>{let i,n;for(;;){if(e.lookahead<nb){if(_b(e),e.lookahead<nb&&t===zy)return 1;if(0===e.lookahead)break}if(i=0,e.lookahead>=3&&(e.ins_h=lb(e,e.ins_h,e.window[e.strstart+3-1]),i=e.prev[e.strstart&e.w_mask]=e.head[e.ins_h],e.head[e.ins_h]=e.strstart),0!==i&&e.strstart-i<=e.w_size-nb&&(e.match_length=gb(e,i)),e.match_length>=3)if(n=ky(e,e.strstart-e.match_start,e.match_length-3),e.lookahead-=e.match_length,e.match_length<=e.max_lazy_match&&e.lookahead>=3){e.match_length--;do{e.strstart++,e.ins_h=lb(e,e.ins_h,e.window[e.strstart+3-1]),i=e.prev[e.strstart&e.w_mask]=e.head[e.ins_h],e.head[e.ins_h]=e.strstart}while(0!=--e.match_length);e.strstart++}else e.strstart+=e.match_length,e.match_length=0,e.ins_h=e.window[e.strstart],e.ins_h=lb(e,e.ins_h,e.window[e.strstart+1]);else n=ky(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++;if(n&&(db(e,!1),0===e.strm.avail_out))return 1}return e.insert=e.strstart<2?e.strstart:2,t===Uy?(db(e,!0),0===e.strm.avail_out?3:4):e.last_lit&&(db(e,!1),0===e.strm.avail_out)?1:2},yb=(e,t)=>{let i,n,r;for(;;){if(e.lookahead<nb){if(_b(e),e.lookahead<nb&&t===zy)return 1;if(0===e.lookahead)break}if(i=0,e.lookahead>=3&&(e.ins_h=lb(e,e.ins_h,e.window[e.strstart+3-1]),i=e.prev[e.strstart&e.w_mask]=e.head[e.ins_h],e.head[e.ins_h]=e.strstart),e.prev_length=e.match_length,e.prev_match=e.match_start,e.match_length=2,0!==i&&e.prev_length<e.max_lazy_match&&e.strstart-i<=e.w_size-nb&&(e.match_length=gb(e,i),e.match_length<=5&&(e.strategy===Zy||3===e.match_length&&e.strstart-e.match_start>4096)&&(e.match_length=2)),e.prev_length>=3&&e.match_length<=e.prev_length){r=e.strstart+e.lookahead-3,n=ky(e,e.strstart-1-e.prev_match,e.prev_length-3),e.lookahead-=e.prev_length-1,e.prev_length-=2;do{++e.strstart<=r&&(e.ins_h=lb(e,e.ins_h,e.window[e.strstart+3-1]),i=e.prev[e.strstart&e.w_mask]=e.head[e.ins_h],e.head[e.ins_h]=e.strstart)}while(0!=--e.prev_length);if(e.match_available=0,e.match_length=2,e.strstart++,n&&(db(e,!1),0===e.strm.avail_out))return 1}else if(e.match_available){if(n=ky(e,0,e.window[e.strstart-1]),n&&db(e,!1),e.strstart++,e.lookahead--,0===e.strm.avail_out)return 1}else e.match_available=1,e.strstart++,e.lookahead--}return e.match_available&&(n=ky(e,0,e.window[e.strstart-1]),e.match_available=0),e.insert=e.strstart<2?e.strstart:2,t===Uy?(db(e,!0),0===e.strm.avail_out?3:4):e.last_lit&&(db(e,!1),0===e.strm.avail_out)?1:2};function bb(e,t,i,n,r){this.good_length=e,this.max_lazy=t,this.nice_length=i,this.max_chain=n,this.func=r}const xb=[new bb(0,0,0,0,((e,t)=>{let i=65535;for(i>e.pending_buf_size-5&&(i=e.pending_buf_size-5);;){if(e.lookahead<=1){if(_b(e),0===e.lookahead&&t===zy)return 1;if(0===e.lookahead)break}e.strstart+=e.lookahead,e.lookahead=0;const n=e.block_start+i;if((0===e.strstart||e.strstart>=n)&&(e.lookahead=e.strstart-n,e.strstart=n,db(e,!1),0===e.strm.avail_out))return 1;if(e.strstart-e.block_start>=e.w_size-nb&&(db(e,!1),0===e.strm.avail_out))return 1}return e.insert=0,t===Uy?(db(e,!0),0===e.strm.avail_out?3:4):(e.strstart>e.block_start&&(db(e,!1),e.strm.avail_out),1)})),new bb(4,4,8,4,vb),new bb(4,5,16,8,vb),new bb(4,6,32,32,vb),new bb(4,4,16,16,yb),new bb(8,16,32,32,yb),new bb(8,16,128,128,yb),new bb(8,32,128,256,yb),new bb(32,128,258,1024,yb),new bb(32,258,258,4096,yb)];function wb(){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=tb,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),cb(this.dyn_ltree),cb(this.dyn_dtree),cb(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),cb(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new Uint16Array(573),cb(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 Mb=e=>{if(!e||!e.state)return ob(e,Gy);e.total_in=e.total_out=0,e.data_type=eb;const t=e.state;return t.pending=0,t.pending_out=0,t.wrap<0&&(t.wrap=-t.wrap),t.status=t.wrap?42:sb,e.adler=2===t.wrap?0:1,t.last_flush=zy,Dy(t),Hy},Sb=e=>{const t=Mb(e);var i;return t===Hy&&((i=e.state).window_size=2*i.w_size,cb(i.head),i.max_lazy_match=xb[i.level].max_lazy,i.good_match=xb[i.level].good_length,i.nice_match=xb[i.level].nice_length,i.max_chain_length=xb[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),t},Tb=(e,t,i,n,r,s)=>{if(!e)return Gy;let a=1;if(t===Xy&&(t=6),n<0?(a=0,n=-n):n>15&&(a=2,n-=16),r<1||r>9||i!==tb||n<8||n>15||t<0||t>9||s<0||s>Ky)return ob(e,Gy);8===n&&(n=9);const o=new wb;return e.state=o,o.strm=e,o.wrap=a,o.gzhead=null,o.w_bits=n,o.w_size=1<<o.w_bits,o.w_mask=o.w_size-1,o.hash_bits=r+7,o.hash_size=1<<o.hash_bits,o.hash_mask=o.hash_size-1,o.hash_shift=~~((o.hash_bits+3-1)/3),o.window=new Uint8Array(2*o.w_size),o.head=new Uint16Array(o.hash_size),o.prev=new Uint16Array(o.w_size),o.lit_bufsize=1<<r+6,o.pending_buf_size=4*o.lit_bufsize,o.pending_buf=new Uint8Array(o.pending_buf_size),o.d_buf=1*o.lit_bufsize,o.l_buf=3*o.lit_bufsize,o.level=t,o.strategy=s,o.method=i,Sb(e)};var Cb={deflateInit:(e,t)=>Tb(e,t,tb,15,8,Qy),deflateInit2:Tb,deflateReset:Sb,deflateResetKeep:Mb,deflateSetHeader:(e,t)=>e&&e.state?2!==e.state.wrap?Gy:(e.state.gzhead=t,Hy):Gy,deflate:(e,t)=>{let i,n;if(!e||!e.state||t>Vy||t<0)return e?ob(e,Gy):Gy;const r=e.state;if(!e.output||!e.input&&0!==e.avail_in||r.status===ab&&t!==Uy)return ob(e,0===e.avail_out?qy:Gy);r.strm=e;const s=r.last_flush;if(r.last_flush=t,42===r.status)if(2===r.wrap)e.adler=0,pb(r,31),pb(r,139),pb(r,8),r.gzhead?(pb(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)),pb(r,255&r.gzhead.time),pb(r,r.gzhead.time>>8&255),pb(r,r.gzhead.time>>16&255),pb(r,r.gzhead.time>>24&255),pb(r,9===r.level?2:r.strategy>=Yy||r.level<2?4:0),pb(r,255&r.gzhead.os),r.gzhead.extra&&r.gzhead.extra.length&&(pb(r,255&r.gzhead.extra.length),pb(r,r.gzhead.extra.length>>8&255)),r.gzhead.hcrc&&(e.adler=Ry(e.adler,r.pending_buf,r.pending,0)),r.gzindex=0,r.status=69):(pb(r,0),pb(r,0),pb(r,0),pb(r,0),pb(r,0),pb(r,9===r.level?2:r.strategy>=Yy||r.level<2?4:0),pb(r,3),r.status=sb);else{let t=tb+(r.w_bits-8<<4)<<8,i=-1;i=r.strategy>=Yy||r.level<2?0:r.level<6?1:6===r.level?2:3,t|=i<<6,0!==r.strstart&&(t|=32),t+=31-t%31,r.status=sb,mb(r,t),0!==r.strstart&&(mb(r,e.adler>>>16),mb(r,65535&e.adler)),e.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&&(e.adler=Ry(e.adler,r.pending_buf,r.pending-i,i)),ub(e),i=r.pending,r.pending!==r.pending_buf_size));)pb(r,255&r.gzhead.extra[r.gzindex]),r.gzindex++;r.gzhead.hcrc&&r.pending>i&&(e.adler=Ry(e.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&&(e.adler=Ry(e.adler,r.pending_buf,r.pending-i,i)),ub(e),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,pb(r,n)}while(0!==n);r.gzhead.hcrc&&r.pending>i&&(e.adler=Ry(e.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&&(e.adler=Ry(e.adler,r.pending_buf,r.pending-i,i)),ub(e),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,pb(r,n)}while(0!==n);r.gzhead.hcrc&&r.pending>i&&(e.adler=Ry(e.adler,r.pending_buf,r.pending-i,i)),0===n&&(r.status=rb)}else r.status=rb;if(r.status===rb&&(r.gzhead.hcrc?(r.pending+2>r.pending_buf_size&&ub(e),r.pending+2<=r.pending_buf_size&&(pb(r,255&e.adler),pb(r,e.adler>>8&255),e.adler=0,r.status=sb)):r.status=sb),0!==r.pending){if(ub(e),0===e.avail_out)return r.last_flush=-1,Hy}else if(0===e.avail_in&&hb(t)<=hb(s)&&t!==Uy)return ob(e,qy);if(r.status===ab&&0!==e.avail_in)return ob(e,qy);if(0!==e.avail_in||0!==r.lookahead||t!==zy&&r.status!==ab){let i=r.strategy===Yy?((e,t)=>{let i;for(;;){if(0===e.lookahead&&(_b(e),0===e.lookahead)){if(t===zy)return 1;break}if(e.match_length=0,i=ky(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++,i&&(db(e,!1),0===e.strm.avail_out))return 1}return e.insert=0,t===Uy?(db(e,!0),0===e.strm.avail_out?3:4):e.last_lit&&(db(e,!1),0===e.strm.avail_out)?1:2})(r,t):r.strategy===Jy?((e,t)=>{let i,n,r,s;const a=e.window;for(;;){if(e.lookahead<=ib){if(_b(e),e.lookahead<=ib&&t===zy)return 1;if(0===e.lookahead)break}if(e.match_length=0,e.lookahead>=3&&e.strstart>0&&(r=e.strstart-1,n=a[r],n===a[++r]&&n===a[++r]&&n===a[++r])){s=e.strstart+ib;do{}while(n===a[++r]&&n===a[++r]&&n===a[++r]&&n===a[++r]&&n===a[++r]&&n===a[++r]&&n===a[++r]&&n===a[++r]&&r<s);e.match_length=ib-(s-r),e.match_length>e.lookahead&&(e.match_length=e.lookahead)}if(e.match_length>=3?(i=ky(e,1,e.match_length-3),e.lookahead-=e.match_length,e.strstart+=e.match_length,e.match_length=0):(i=ky(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++),i&&(db(e,!1),0===e.strm.avail_out))return 1}return e.insert=0,t===Uy?(db(e,!0),0===e.strm.avail_out?3:4):e.last_lit&&(db(e,!1),0===e.strm.avail_out)?1:2})(r,t):xb[r.level].func(r,t);if(3!==i&&4!==i||(r.status=ab),1===i||3===i)return 0===e.avail_out&&(r.last_flush=-1),Hy;if(2===i&&(t===Fy?Oy(r):t!==Vy&&(Ny(r,0,0,!1),t===By&&(cb(r.head),0===r.lookahead&&(r.strstart=0,r.block_start=0,r.insert=0))),ub(e),0===e.avail_out))return r.last_flush=-1,Hy}return t!==Uy?Hy:r.wrap<=0?jy:(2===r.wrap?(pb(r,255&e.adler),pb(r,e.adler>>8&255),pb(r,e.adler>>16&255),pb(r,e.adler>>24&255),pb(r,255&e.total_in),pb(r,e.total_in>>8&255),pb(r,e.total_in>>16&255),pb(r,e.total_in>>24&255)):(mb(r,e.adler>>>16),mb(r,65535&e.adler)),ub(e),r.wrap>0&&(r.wrap=-r.wrap),0!==r.pending?Hy:jy)},deflateEnd:e=>{if(!e||!e.state)return Gy;const t=e.state.status;return 42!==t&&69!==t&&73!==t&&91!==t&&t!==rb&&t!==sb&&t!==ab?ob(e,Gy):(e.state=null,t===sb?ob(e,Wy):Hy)},deflateSetDictionary:(e,t)=>{let i=t.length;if(!e||!e.state)return Gy;const n=e.state,r=n.wrap;if(2===r||1===r&&42!==n.status||n.lookahead)return Gy;if(1===r&&(e.adler=Ay(e.adler,t,i,0)),n.wrap=0,i>=n.w_size){0===r&&(cb(n.head),n.strstart=0,n.block_start=0,n.insert=0);let e=new Uint8Array(n.w_size);e.set(t.subarray(i-n.w_size,i),0),t=e,i=n.w_size}const s=e.avail_in,a=e.next_in,o=e.input;for(e.avail_in=i,e.next_in=0,e.input=t,_b(n);n.lookahead>=3;){let e=n.strstart,t=n.lookahead-2;do{n.ins_h=lb(n,n.ins_h,n.window[e+3-1]),n.prev[e&n.w_mask]=n.head[n.ins_h],n.head[n.ins_h]=e,e++}while(--t);n.strstart=e,n.lookahead=2,_b(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,e.next_in=a,e.input=o,e.avail_in=s,n.wrap=r,Hy},deflateInfo:"pako deflate (from Nodeca project)"};const Eb=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);var Ab=function(e){const t=Array.prototype.slice.call(arguments,1);for(;t.length;){const i=t.shift();if(i){if("object"!=typeof i)throw new TypeError(i+"must be non-object");for(const t in i)Eb(i,t)&&(e[t]=i[t])}}return e},Ib=e=>{let t=0;for(let i=0,n=e.length;i<n;i++)t+=e[i].length;const i=new Uint8Array(t);for(let t=0,n=0,r=e.length;t<r;t++){let r=e[t];i.set(r,n),n+=r.length}return i};let Rb=!0;try{String.fromCharCode.apply(null,new Uint8Array(1))}catch(e){Rb=!1}const Pb=new Uint8Array(256);for(let e=0;e<256;e++)Pb[e]=e>=252?6:e>=248?5:e>=240?4:e>=224?3:e>=192?2:1;Pb[254]=Pb[254]=1;var Lb=e=>{if("function"==typeof TextEncoder&&TextEncoder.prototype.encode)return(new TextEncoder).encode(e);let t,i,n,r,s,a=e.length,o=0;for(r=0;r<a;r++)i=e.charCodeAt(r),55296==(64512&i)&&r+1<a&&(n=e.charCodeAt(r+1),56320==(64512&n)&&(i=65536+(i-55296<<10)+(n-56320),r++)),o+=i<128?1:i<2048?2:i<65536?3:4;for(t=new Uint8Array(o),s=0,r=0;s<o;r++)i=e.charCodeAt(r),55296==(64512&i)&&r+1<a&&(n=e.charCodeAt(r+1),56320==(64512&n)&&(i=65536+(i-55296<<10)+(n-56320),r++)),i<128?t[s++]=i:i<2048?(t[s++]=192|i>>>6,t[s++]=128|63&i):i<65536?(t[s++]=224|i>>>12,t[s++]=128|i>>>6&63,t[s++]=128|63&i):(t[s++]=240|i>>>18,t[s++]=128|i>>>12&63,t[s++]=128|i>>>6&63,t[s++]=128|63&i);return t},Db=(e,t)=>{const i=t||e.length;if("function"==typeof TextDecoder&&TextDecoder.prototype.decode)return(new TextDecoder).decode(e.subarray(0,t));let n,r;const s=new Array(2*i);for(r=0,n=0;n<i;){let t=e[n++];if(t<128){s[r++]=t;continue}let a=Pb[t];if(a>4)s[r++]=65533,n+=a-1;else{for(t&=2===a?31:3===a?15:7;a>1&&n<i;)t=t<<6|63&e[n++],a--;a>1?s[r++]=65533:t<65536?s[r++]=t:(t-=65536,s[r++]=55296|t>>10&1023,s[r++]=56320|1023&t)}}return((e,t)=>{if(t<65534&&e.subarray&&Rb)return String.fromCharCode.apply(null,e.length===t?e:e.subarray(0,t));let i="";for(let n=0;n<t;n++)i+=String.fromCharCode(e[n]);return i})(s,r)},Nb=(e,t)=>{(t=t||e.length)>e.length&&(t=e.length);let i=t-1;for(;i>=0&&128==(192&e[i]);)i--;return i<0||0===i?t:i+Pb[e[i]]>t?i:t};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 kb=Object.prototype.toString,{Z_NO_FLUSH:Ob,Z_SYNC_FLUSH:zb,Z_FULL_FLUSH:Fb,Z_FINISH:Bb,Z_OK:Ub,Z_STREAM_END:Vb,Z_DEFAULT_COMPRESSION:Hb,Z_DEFAULT_STRATEGY:jb,Z_DEFLATED:Gb}=Ly;function Wb(e){this.options=Ab({level:Hb,method:Gb,chunkSize:16384,windowBits:15,memLevel:8,strategy:jb},e||{});let t=this.options;t.raw&&t.windowBits>0?t.windowBits=-t.windowBits:t.gzip&&t.windowBits>0&&t.windowBits<16&&(t.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,t.level,t.method,t.windowBits,t.memLevel,t.strategy);if(i!==Ub)throw new Error(Py[i]);if(t.header&&Cb.deflateSetHeader(this.strm,t.header),t.dictionary){let e;if(e="string"==typeof t.dictionary?Lb(t.dictionary):"[object ArrayBuffer]"===kb.call(t.dictionary)?new Uint8Array(t.dictionary):t.dictionary,i=Cb.deflateSetDictionary(this.strm,e),i!==Ub)throw new Error(Py[i]);this._dict_set=!0}}Wb.prototype.push=function(e,t){const i=this.strm,n=this.options.chunkSize;let r,s;if(this.ended)return!1;for(s=t===~~t?t:!0===t?Bb:Ob,"string"==typeof e?i.input=Lb(e):"[object ArrayBuffer]"===kb.call(e)?i.input=new Uint8Array(e):i.input=e,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===zb||s===Fb)&&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===Vb)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===Ub;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},Wb.prototype.onData=function(e){this.chunks.push(e)},Wb.prototype.onEnd=function(e){e===Ub&&(this.result=Ib(this.chunks)),this.chunks=[],this.err=e,this.msg=this.strm.msg};var qb=function(e,t){let i,n,r,s,a,o,h,c,l,u,d,p,m,f,g,_,v,y,b,x,w,M,S,T;const C=e.state;i=e.next_in,S=e.input,n=i+(e.avail_in-5),r=e.next_out,T=e.output,s=r-(t-e.avail_out),a=r+(e.avail_out-257),o=C.dmax,h=C.wsize,c=C.whave,l=C.wnext,u=C.window,d=C.hold,p=C.bits,m=C.lencode,f=C.distcode,g=(1<<C.lenbits)-1,_=(1<<C.distbits)-1;e:do{p<15&&(d+=S[i++]<<p,p+=8,d+=S[i++]<<p,p+=8),v=m[d&g];t: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=m[(65535&v)+(d&(1<<y)-1)];continue t}if(32&y){C.mode=12;break e}e.msg="invalid literal/length code",C.mode=30;break e}b=65535&v,y&=15,y&&(p<y&&(d+=S[i++]<<p,p+=8),b+=d&(1<<y)-1,d>>>=y,p-=y),p<15&&(d+=S[i++]<<p,p+=8,d+=S[i++]<<p,p+=8),v=f[d&_];i:for(;;){if(y=v>>>24,d>>>=y,p-=y,y=v>>>16&255,!(16&y)){if(0==(64&y)){v=f[(65535&v)+(d&(1<<y)-1)];continue i}e.msg="invalid distance code",C.mode=30;break e}if(x=65535&v,y&=15,p<y&&(d+=S[i++]<<p,p+=8,p<y&&(d+=S[i++]<<p,p+=8)),x+=d&(1<<y)-1,x>o){e.msg="invalid distance too far back",C.mode=30;break e}if(d>>>=y,p-=y,y=r-s,x>y){if(y=x-y,y>c&&C.sane){e.msg="invalid distance too far back",C.mode=30;break e}if(w=0,M=u,0===l){if(w+=h-y,y<b){b-=y;do{T[r++]=u[w++]}while(--y);w=r-x,M=T}}else if(l<y){if(w+=h+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,M=T}}}else if(w+=l-y,y<b){b-=y;do{T[r++]=u[w++]}while(--y);w=r-x,M=T}for(;b>2;)T[r++]=M[w++],T[r++]=M[w++],T[r++]=M[w++],b-=3;b&&(T[r++]=M[w++],b>1&&(T[r++]=M[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<a);b=p>>3,i-=b,p-=b<<3,d&=(1<<p)-1,e.next_in=i,e.next_out=r,e.avail_in=i<n?n-i+5:5-(i-n),e.avail_out=r<a?a-r+257:257-(r-a),C.hold=d,C.bits=p};const Xb=15,Zb=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]),Yb=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]),Jb=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]),Kb=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 Qb=(e,t,i,n,r,s,a,o)=>{const h=o.bits;let c,l,u,d,p,m,f=0,g=0,_=0,v=0,y=0,b=0,x=0,w=0,M=0,S=0,T=null,C=0;const E=new Uint16Array(16),A=new Uint16Array(16);let I,R,P,L=null,D=0;for(f=0;f<=Xb;f++)E[f]=0;for(g=0;g<n;g++)E[t[i+g]]++;for(y=h,v=Xb;v>=1&&0===E[v];v--);if(y>v&&(y=v),0===v)return r[s++]=20971520,r[s++]=20971520,o.bits=1,0;for(_=1;_<v&&0===E[_];_++);for(y<_&&(y=_),w=1,f=1;f<=Xb;f++)if(w<<=1,w-=E[f],w<0)return-1;if(w>0&&(0===e||1!==v))return-1;for(A[1]=0,f=1;f<Xb;f++)A[f+1]=A[f]+E[f];for(g=0;g<n;g++)0!==t[i+g]&&(a[A[t[i+g]]++]=g);if(0===e?(T=L=a,m=19):1===e?(T=Zb,C-=257,L=Yb,D-=257,m=256):(T=Jb,L=Kb,m=-1),S=0,g=0,f=_,p=s,b=y,x=0,u=-1,M=1<<y,d=M-1,1===e&&M>852||2===e&&M>592)return 1;for(;;){I=f-x,a[g]<m?(R=0,P=a[g]):a[g]>m?(R=L[D+a[g]],P=T[C+a[g]]):(R=96,P=0),c=1<<f-x,l=1<<b,_=l;do{l-=c,r[p+(S>>x)+l]=I<<24|R<<16|P|0}while(0!==l);for(c=1<<f-1;S&c;)c>>=1;if(0!==c?(S&=c-1,S+=c):S=0,g++,0==--E[f]){if(f===v)break;f=t[i+a[g]]}if(f>y&&(S&d)!==u){for(0===x&&(x=y),p+=_,b=f-x,w=1<<b;b+x<v&&(w-=E[b+x],!(w<=0));)b++,w<<=1;if(M+=1<<b,1===e&&M>852||2===e&&M>592)return 1;u=S&d,r[u]=y<<24|b<<16|p-s|0}}return 0!==S&&(r[p+S]=f-x<<24|64<<16|0),o.bits=y,0};const{Z_FINISH:ex,Z_BLOCK:tx,Z_TREES:ix,Z_OK:nx,Z_STREAM_END:rx,Z_NEED_DICT:sx,Z_STREAM_ERROR:ax,Z_DATA_ERROR:ox,Z_MEM_ERROR:hx,Z_BUF_ERROR:cx,Z_DEFLATED:lx}=Ly,ux=12,dx=30,px=e=>(e>>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24);function mx(){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 fx=e=>{if(!e||!e.state)return ax;const t=e.state;return e.total_in=e.total_out=t.total=0,e.msg="",t.wrap&&(e.adler=1&t.wrap),t.mode=1,t.last=0,t.havedict=0,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new Int32Array(852),t.distcode=t.distdyn=new Int32Array(592),t.sane=1,t.back=-1,nx},gx=e=>{if(!e||!e.state)return ax;const t=e.state;return t.wsize=0,t.whave=0,t.wnext=0,fx(e)},_x=(e,t)=>{let i;if(!e||!e.state)return ax;const n=e.state;return t<0?(i=0,t=-t):(i=1+(t>>4),t<48&&(t&=15)),t&&(t<8||t>15)?ax:(null!==n.window&&n.wbits!==t&&(n.window=null),n.wrap=i,n.wbits=t,gx(e))},vx=(e,t)=>{if(!e)return ax;const i=new mx;e.state=i,i.window=null;const n=_x(e,t);return n!==nx&&(e.state=null),n};let yx,bx,xx=!0;const wx=e=>{if(xx){yx=new Int32Array(512),bx=new Int32Array(32);let t=0;for(;t<144;)e.lens[t++]=8;for(;t<256;)e.lens[t++]=9;for(;t<280;)e.lens[t++]=7;for(;t<288;)e.lens[t++]=8;for(Qb(1,e.lens,0,288,yx,0,e.work,{bits:9}),t=0;t<32;)e.lens[t++]=5;Qb(2,e.lens,0,32,bx,0,e.work,{bits:5}),xx=!1}e.lencode=yx,e.lenbits=9,e.distcode=bx,e.distbits=5},Mx=(e,t,i,n)=>{let r;const s=e.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(t.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(t.subarray(i-n,i-n+r),s.wnext),(n-=r)?(s.window.set(t.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 Sx={inflateReset:gx,inflateReset2:_x,inflateResetKeep:fx,inflateInit:e=>vx(e,15),inflateInit2:vx,inflate:(e,t)=>{let i,n,r,s,a,o,h,c,l,u,d,p,m,f,g,_,v,y,b,x,w,M,S=0;const T=new Uint8Array(4);let C,E;const A=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]);if(!e||!e.state||!e.output||!e.input&&0!==e.avail_in)return ax;i=e.state,i.mode===ux&&(i.mode=13),a=e.next_out,r=e.output,h=e.avail_out,s=e.next_in,n=e.input,o=e.avail_in,c=i.hold,l=i.bits,u=o,d=h,M=nx;e:for(;;)switch(i.mode){case 1:if(0===i.wrap){i.mode=13;break}for(;l<16;){if(0===o)break e;o--,c+=n[s++]<<l,l+=8}if(2&i.wrap&&35615===c){i.check=0,T[0]=255&c,T[1]=c>>>8&255,i.check=Ry(i.check,T,2,0),c=0,l=0,i.mode=2;break}if(i.flags=0,i.head&&(i.head.done=!1),!(1&i.wrap)||(((255&c)<<8)+(c>>8))%31){e.msg="incorrect header check",i.mode=dx;break}if((15&c)!==lx){e.msg="unknown compression method",i.mode=dx;break}if(c>>>=4,l-=4,w=8+(15&c),0===i.wbits)i.wbits=w;else if(w>i.wbits){e.msg="invalid window size",i.mode=dx;break}i.dmax=1<<i.wbits,e.adler=i.check=1,i.mode=512&c?10:ux,c=0,l=0;break;case 2:for(;l<16;){if(0===o)break e;o--,c+=n[s++]<<l,l+=8}if(i.flags=c,(255&i.flags)!==lx){e.msg="unknown compression method",i.mode=dx;break}if(57344&i.flags){e.msg="unknown header flags set",i.mode=dx;break}i.head&&(i.head.text=c>>8&1),512&i.flags&&(T[0]=255&c,T[1]=c>>>8&255,i.check=Ry(i.check,T,2,0)),c=0,l=0,i.mode=3;case 3:for(;l<32;){if(0===o)break e;o--,c+=n[s++]<<l,l+=8}i.head&&(i.head.time=c),512&i.flags&&(T[0]=255&c,T[1]=c>>>8&255,T[2]=c>>>16&255,T[3]=c>>>24&255,i.check=Ry(i.check,T,4,0)),c=0,l=0,i.mode=4;case 4:for(;l<16;){if(0===o)break e;o--,c+=n[s++]<<l,l+=8}i.head&&(i.head.xflags=255&c,i.head.os=c>>8),512&i.flags&&(T[0]=255&c,T[1]=c>>>8&255,i.check=Ry(i.check,T,2,0)),c=0,l=0,i.mode=5;case 5:if(1024&i.flags){for(;l<16;){if(0===o)break e;o--,c+=n[s++]<<l,l+=8}i.length=c,i.head&&(i.head.extra_len=c),512&i.flags&&(T[0]=255&c,T[1]=c>>>8&255,i.check=Ry(i.check,T,2,0)),c=0,l=0}else i.head&&(i.head.extra=null);i.mode=6;case 6:if(1024&i.flags&&(p=i.length,p>o&&(p=o),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=Ry(i.check,n,p,s)),o-=p,s+=p,i.length-=p),i.length))break e;i.length=0,i.mode=7;case 7:if(2048&i.flags){if(0===o)break e;p=0;do{w=n[s+p++],i.head&&w&&i.length<65536&&(i.head.name+=String.fromCharCode(w))}while(w&&p<o);if(512&i.flags&&(i.check=Ry(i.check,n,p,s)),o-=p,s+=p,w)break e}else i.head&&(i.head.name=null);i.length=0,i.mode=8;case 8:if(4096&i.flags){if(0===o)break e;p=0;do{w=n[s+p++],i.head&&w&&i.length<65536&&(i.head.comment+=String.fromCharCode(w))}while(w&&p<o);if(512&i.flags&&(i.check=Ry(i.check,n,p,s)),o-=p,s+=p,w)break e}else i.head&&(i.head.comment=null);i.mode=9;case 9:if(512&i.flags){for(;l<16;){if(0===o)break e;o--,c+=n[s++]<<l,l+=8}if(c!==(65535&i.check)){e.msg="header crc mismatch",i.mode=dx;break}c=0,l=0}i.head&&(i.head.hcrc=i.flags>>9&1,i.head.done=!0),e.adler=i.check=0,i.mode=ux;break;case 10:for(;l<32;){if(0===o)break e;o--,c+=n[s++]<<l,l+=8}e.adler=i.check=px(c),c=0,l=0,i.mode=11;case 11:if(0===i.havedict)return e.next_out=a,e.avail_out=h,e.next_in=s,e.avail_in=o,i.hold=c,i.bits=l,sx;e.adler=i.check=1,i.mode=ux;case ux:if(t===tx||t===ix)break e;case 13:if(i.last){c>>>=7&l,l-=7&l,i.mode=27;break}for(;l<3;){if(0===o)break e;o--,c+=n[s++]<<l,l+=8}switch(i.last=1&c,c>>>=1,l-=1,3&c){case 0:i.mode=14;break;case 1:if(wx(i),i.mode=20,t===ix){c>>>=2,l-=2;break e}break;case 2:i.mode=17;break;case 3:e.msg="invalid block type",i.mode=dx}c>>>=2,l-=2;break;case 14:for(c>>>=7&l,l-=7&l;l<32;){if(0===o)break e;o--,c+=n[s++]<<l,l+=8}if((65535&c)!=(c>>>16^65535)){e.msg="invalid stored block lengths",i.mode=dx;break}if(i.length=65535&c,c=0,l=0,i.mode=15,t===ix)break e;case 15:i.mode=16;case 16:if(p=i.length,p){if(p>o&&(p=o),p>h&&(p=h),0===p)break e;r.set(n.subarray(s,s+p),a),o-=p,s+=p,h-=p,a+=p,i.length-=p;break}i.mode=ux;break;case 17:for(;l<14;){if(0===o)break e;o--,c+=n[s++]<<l,l+=8}if(i.nlen=257+(31&c),c>>>=5,l-=5,i.ndist=1+(31&c),c>>>=5,l-=5,i.ncode=4+(15&c),c>>>=4,l-=4,i.nlen>286||i.ndist>30){e.msg="too many length or distance symbols",i.mode=dx;break}i.have=0,i.mode=18;case 18:for(;i.have<i.ncode;){for(;l<3;){if(0===o)break e;o--,c+=n[s++]<<l,l+=8}i.lens[A[i.have++]]=7&c,c>>>=3,l-=3}for(;i.have<19;)i.lens[A[i.have++]]=0;if(i.lencode=i.lendyn,i.lenbits=7,C={bits:i.lenbits},M=Qb(0,i.lens,0,19,i.lencode,0,i.work,C),i.lenbits=C.bits,M){e.msg="invalid code lengths set",i.mode=dx;break}i.have=0,i.mode=19;case 19:for(;i.have<i.nlen+i.ndist;){for(;S=i.lencode[c&(1<<i.lenbits)-1],g=S>>>24,_=S>>>16&255,v=65535&S,!(g<=l);){if(0===o)break e;o--,c+=n[s++]<<l,l+=8}if(v<16)c>>>=g,l-=g,i.lens[i.have++]=v;else{if(16===v){for(E=g+2;l<E;){if(0===o)break e;o--,c+=n[s++]<<l,l+=8}if(c>>>=g,l-=g,0===i.have){e.msg="invalid bit length repeat",i.mode=dx;break}w=i.lens[i.have-1],p=3+(3&c),c>>>=2,l-=2}else if(17===v){for(E=g+3;l<E;){if(0===o)break e;o--,c+=n[s++]<<l,l+=8}c>>>=g,l-=g,w=0,p=3+(7&c),c>>>=3,l-=3}else{for(E=g+7;l<E;){if(0===o)break e;o--,c+=n[s++]<<l,l+=8}c>>>=g,l-=g,w=0,p=11+(127&c),c>>>=7,l-=7}if(i.have+p>i.nlen+i.ndist){e.msg="invalid bit length repeat",i.mode=dx;break}for(;p--;)i.lens[i.have++]=w}}if(i.mode===dx)break;if(0===i.lens[256]){e.msg="invalid code -- missing end-of-block",i.mode=dx;break}if(i.lenbits=9,C={bits:i.lenbits},M=Qb(1,i.lens,0,i.nlen,i.lencode,0,i.work,C),i.lenbits=C.bits,M){e.msg="invalid literal/lengths set",i.mode=dx;break}if(i.distbits=6,i.distcode=i.distdyn,C={bits:i.distbits},M=Qb(2,i.lens,i.nlen,i.ndist,i.distcode,0,i.work,C),i.distbits=C.bits,M){e.msg="invalid distances set",i.mode=dx;break}if(i.mode=20,t===ix)break e;case 20:i.mode=21;case 21:if(o>=6&&h>=258){e.next_out=a,e.avail_out=h,e.next_in=s,e.avail_in=o,i.hold=c,i.bits=l,qb(e,d),a=e.next_out,r=e.output,h=e.avail_out,s=e.next_in,n=e.input,o=e.avail_in,c=i.hold,l=i.bits,i.mode===ux&&(i.back=-1);break}for(i.back=0;S=i.lencode[c&(1<<i.lenbits)-1],g=S>>>24,_=S>>>16&255,v=65535&S,!(g<=l);){if(0===o)break e;o--,c+=n[s++]<<l,l+=8}if(_&&0==(240&_)){for(y=g,b=_,x=v;S=i.lencode[x+((c&(1<<y+b)-1)>>y)],g=S>>>24,_=S>>>16&255,v=65535&S,!(y+g<=l);){if(0===o)break e;o--,c+=n[s++]<<l,l+=8}c>>>=y,l-=y,i.back+=y}if(c>>>=g,l-=g,i.back+=g,i.length=v,0===_){i.mode=26;break}if(32&_){i.back=-1,i.mode=ux;break}if(64&_){e.msg="invalid literal/length code",i.mode=dx;break}i.extra=15&_,i.mode=22;case 22:if(i.extra){for(E=i.extra;l<E;){if(0===o)break e;o--,c+=n[s++]<<l,l+=8}i.length+=c&(1<<i.extra)-1,c>>>=i.extra,l-=i.extra,i.back+=i.extra}i.was=i.length,i.mode=23;case 23:for(;S=i.distcode[c&(1<<i.distbits)-1],g=S>>>24,_=S>>>16&255,v=65535&S,!(g<=l);){if(0===o)break e;o--,c+=n[s++]<<l,l+=8}if(0==(240&_)){for(y=g,b=_,x=v;S=i.distcode[x+((c&(1<<y+b)-1)>>y)],g=S>>>24,_=S>>>16&255,v=65535&S,!(y+g<=l);){if(0===o)break e;o--,c+=n[s++]<<l,l+=8}c>>>=y,l-=y,i.back+=y}if(c>>>=g,l-=g,i.back+=g,64&_){e.msg="invalid distance code",i.mode=dx;break}i.offset=v,i.extra=15&_,i.mode=24;case 24:if(i.extra){for(E=i.extra;l<E;){if(0===o)break e;o--,c+=n[s++]<<l,l+=8}i.offset+=c&(1<<i.extra)-1,c>>>=i.extra,l-=i.extra,i.back+=i.extra}if(i.offset>i.dmax){e.msg="invalid distance too far back",i.mode=dx;break}i.mode=25;case 25:if(0===h)break e;if(p=d-h,i.offset>p){if(p=i.offset-p,p>i.whave&&i.sane){e.msg="invalid distance too far back",i.mode=dx;break}p>i.wnext?(p-=i.wnext,m=i.wsize-p):m=i.wnext-p,p>i.length&&(p=i.length),f=i.window}else f=r,m=a-i.offset,p=i.length;p>h&&(p=h),h-=p,i.length-=p;do{r[a++]=f[m++]}while(--p);0===i.length&&(i.mode=21);break;case 26:if(0===h)break e;r[a++]=i.length,h--,i.mode=21;break;case 27:if(i.wrap){for(;l<32;){if(0===o)break e;o--,c|=n[s++]<<l,l+=8}if(d-=h,e.total_out+=d,i.total+=d,d&&(e.adler=i.check=i.flags?Ry(i.check,r,d,a-d):Ay(i.check,r,d,a-d)),d=h,(i.flags?c:px(c))!==i.check){e.msg="incorrect data check",i.mode=dx;break}c=0,l=0}i.mode=28;case 28:if(i.wrap&&i.flags){for(;l<32;){if(0===o)break e;o--,c+=n[s++]<<l,l+=8}if(c!==(4294967295&i.total)){e.msg="incorrect length check",i.mode=dx;break}c=0,l=0}i.mode=29;case 29:M=rx;break e;case dx:M=ox;break e;case 31:return hx;case 32:default:return ax}return e.next_out=a,e.avail_out=h,e.next_in=s,e.avail_in=o,i.hold=c,i.bits=l,(i.wsize||d!==e.avail_out&&i.mode<dx&&(i.mode<27||t!==ex))&&Mx(e,e.output,e.next_out,d-e.avail_out),u-=e.avail_in,d-=e.avail_out,e.total_in+=u,e.total_out+=d,i.total+=d,i.wrap&&d&&(e.adler=i.check=i.flags?Ry(i.check,r,d,e.next_out-d):Ay(i.check,r,d,e.next_out-d)),e.data_type=i.bits+(i.last?64:0)+(i.mode===ux?128:0)+(20===i.mode||15===i.mode?256:0),(0===u&&0===d||t===ex)&&M===nx&&(M=cx),M},inflateEnd:e=>{if(!e||!e.state)return ax;let t=e.state;return t.window&&(t.window=null),e.state=null,nx},inflateGetHeader:(e,t)=>{if(!e||!e.state)return ax;const i=e.state;return 0==(2&i.wrap)?ax:(i.head=t,t.done=!1,nx)},inflateSetDictionary:(e,t)=>{const i=t.length;let n,r,s;return e&&e.state?(n=e.state,0!==n.wrap&&11!==n.mode?ax:11===n.mode&&(r=1,r=Ay(r,t,i,0),r!==n.check)?ox:(s=Mx(e,t,i,i),s?(n.mode=31,hx):(n.havedict=1,nx))):ax},inflateInfo:"pako inflate (from Nodeca project)"};var Tx=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:Ex,Z_FINISH:Ax,Z_OK:Ix,Z_STREAM_END:Rx,Z_NEED_DICT:Px,Z_STREAM_ERROR:Lx,Z_DATA_ERROR:Dx,Z_MEM_ERROR:Nx}=Ly;function $x(e){this.options=Ab({chunkSize:65536,windowBits:15,to:""},e||{});const t=this.options;t.raw&&t.windowBits>=0&&t.windowBits<16&&(t.windowBits=-t.windowBits,0===t.windowBits&&(t.windowBits=-15)),!(t.windowBits>=0&&t.windowBits<16)||e&&e.windowBits||(t.windowBits+=32),t.windowBits>15&&t.windowBits<48&&0==(15&t.windowBits)&&(t.windowBits|=15),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new $b,this.strm.avail_out=0;let i=Sx.inflateInit2(this.strm,t.windowBits);if(i!==Ix)throw new Error(Py[i]);if(this.header=new Tx,Sx.inflateGetHeader(this.strm,this.header),t.dictionary&&("string"==typeof t.dictionary?t.dictionary=Lb(t.dictionary):"[object ArrayBuffer]"===Cx.call(t.dictionary)&&(t.dictionary=new Uint8Array(t.dictionary)),t.raw&&(i=Sx.inflateSetDictionary(this.strm,t.dictionary),i!==Ix)))throw new Error(Py[i])}function kx(e,t){const i=new $x(t);if(i.push(e),i.err)throw i.msg||Py[i.err];return i.result}$x.prototype.push=function(e,t){const i=this.strm,n=this.options.chunkSize,r=this.options.dictionary;let s,a,o;if(this.ended)return!1;for(a=t===~~t?t:!0===t?Ax:Ex,"[object ArrayBuffer]"===Cx.call(e)?i.input=new Uint8Array(e):i.input=e,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=Sx.inflate(i,a),s===Px&&r&&(s=Sx.inflateSetDictionary(i,r),s===Ix?s=Sx.inflate(i,a):s===Dx&&(s=Px));i.avail_in>0&&s===Rx&&i.state.wrap>0&&0!==e[i.next_in];)Sx.inflateReset(i),s=Sx.inflate(i,a);switch(s){case Lx:case Dx:case Px:case Nx:return this.onEnd(s),this.ended=!0,!1}if(o=i.avail_out,i.next_out&&(0===i.avail_out||s===Rx))if("string"===this.options.to){let e=Nb(i.output,i.next_out),t=i.next_out-e,r=Db(i.output,e);i.next_out=t,i.avail_out=n-t,t&&i.output.set(i.output.subarray(e,e+t),0),this.onData(r)}else this.onData(i.output.length===i.next_out?i.output:i.output.subarray(0,i.next_out));if(s!==Ix||0!==o){if(s===Rx)return s=Sx.inflateEnd(this.strm),this.onEnd(s),this.ended=!0,!0;if(0===i.avail_in)break}}return!0},$x.prototype.onData=function(e){this.chunks.push(e)},$x.prototype.onEnd=function(e){e===Ix&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=Ib(this.chunks)),this.chunks=[],this.err=e,this.msg=this.strm.msg};var Ox={Inflate:$x,inflate:kx,inflateRaw:function(e,t){return(t=t||{}).raw=!0,kx(e,t)},ungzip:kx,constants:Ly};const{Inflate:zx,inflate:Fx,inflateRaw:Bx,ungzip:Ux}=Ox;var Vx=Fx,Hx={
+/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */
+read:function(e,t,i,n,r){var s,a,o=8*r-n-1,h=(1<<o)-1,c=h>>1,l=-7,u=i?r-1:0,d=i?-1:1,p=e[t+u];for(u+=d,s=p&(1<<-l)-1,p>>=-l,l+=o;l>0;s=256*s+e[t+u],u+=d,l-=8);for(a=s&(1<<-l)-1,s>>=-l,l+=n;l>0;a=256*a+e[t+u],u+=d,l-=8);if(0===s)s=1-c;else{if(s===h)return a?NaN:1/0*(p?-1:1);a+=Math.pow(2,n),s-=c}return(p?-1:1)*a*Math.pow(2,s-n)},write:function(e,t,i,n,r,s){var a,o,h,c=8*s-r-1,l=(1<<c)-1,u=l>>1,d=23===r?Math.pow(2,-24)-Math.pow(2,-77):0,p=n?0:s-1,m=n?1:-1,f=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(o=isNaN(t)?1:0,a=l):(a=Math.floor(Math.log(t)/Math.LN2),t*(h=Math.pow(2,-a))<1&&(a--,h*=2),(t+=a+u>=1?d/h:d*Math.pow(2,1-u))*h>=2&&(a++,h/=2),a+u>=l?(o=0,a=l):a+u>=1?(o=(t*h-1)*Math.pow(2,r),a+=u):(o=t*Math.pow(2,u-1)*Math.pow(2,r),a=0));r>=8;e[i+p]=255&o,p+=m,o/=256,r-=8);for(a=a<<r|o,c+=r;c>0;e[i+p]=255&a,p+=m,a/=256,c-=8);e[i+p-m]|=128*f}},jx=Wx,Gx=Hx;function Wx(e){this.buf=ArrayBuffer.isView&&ArrayBuffer.isView(e)?e:new Uint8Array(e||0),this.pos=0,this.type=0,this.length=this.buf.length}Wx.Varint=0,Wx.Fixed64=1,Wx.Bytes=2,Wx.Fixed32=5;var qx=4294967296,Xx=1/qx,Zx="undefined"==typeof TextDecoder?null:new TextDecoder("utf8");function Yx(e){return e.type===Wx.Bytes?e.readVarint()+e.pos:e.pos+1}function Jx(e,t,i){return i?4294967296*t+(e>>>0):4294967296*(t>>>0)+(e>>>0)}function Kx(e,t,i){var n=t<=16383?1:t<=2097151?2:t<=268435455?3:Math.floor(Math.log(t)/(7*Math.LN2));i.realloc(n);for(var r=i.pos-1;r>=e;r--)i.buf[r+n]=i.buf[r]}function Qx(e,t){for(var i=0;i<e.length;i++)t.writeVarint(e[i])}function ew(e,t){for(var i=0;i<e.length;i++)t.writeSVarint(e[i])}function tw(e,t){for(var i=0;i<e.length;i++)t.writeFloat(e[i])}function iw(e,t){for(var i=0;i<e.length;i++)t.writeDouble(e[i])}function nw(e,t){for(var i=0;i<e.length;i++)t.writeBoolean(e[i])}function rw(e,t){for(var i=0;i<e.length;i++)t.writeFixed32(e[i])}function sw(e,t){for(var i=0;i<e.length;i++)t.writeSFixed32(e[i])}function aw(e,t){for(var i=0;i<e.length;i++)t.writeFixed64(e[i])}function ow(e,t){for(var i=0;i<e.length;i++)t.writeSFixed64(e[i])}function hw(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16)+16777216*e[t+3]}function cw(e,t,i){e[i]=t,e[i+1]=t>>>8,e[i+2]=t>>>16,e[i+3]=t>>>24}function lw(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16)+(e[t+3]<<24)}function uw(e){const t=Vx(e,{to:"string"});return JSON.parse(t)}function dw(e,t){return pw(e,"GET","arraybuffer",[],null,t)}function pw(e,t,i,n,r,s){const a=new XMLHttpRequest,o=new Promise(((s,o)=>{a.open(t,e,!0);for(const e of n)a.setRequestHeader(e.name,e.value);a.responseType=i,a.timeout=15e3,a.onload=()=>{var t;if(200!==a.status){const i=null!==(t=a.response)&&void 0!==t?t:new Pu(`Response status error: ${e}`);o(i)}a.response||o(new Pu(`Response empty: ${e}`)),s(a.response)},a.onerror=()=>{o(new Pu(`Request error: ${e}`))},a.ontimeout=()=>{o(new Pu(`Request timeout: ${e}`))},a.onabort=()=>{o(new Pu(`Request aborted: ${e}`))},a.send("POST"===t?r:null)}));return s&&s.catch((()=>{a.abort()})),o}function mw(e){return new jx(e).readFields(fw,{faces:[],vertices:[]})}function fw(e,t,i){1===e?t.vertices.push(i.readFloat()):2===e?t.faces.push(i.readVarint()):console.warn(`Unsupported pbf tag (${e})`)}Wx.prototype={destroy:function(){this.buf=null},readFields:function(e,t,i){for(i=i||this.length;this.pos<i;){var n=this.readVarint(),r=n>>3,s=this.pos;this.type=7&n,e(r,t,this),this.pos===s&&this.skip(n)}return t},readMessage:function(e,t){return this.readFields(e,t,this.readVarint()+this.pos)},readFixed32:function(){var e=hw(this.buf,this.pos);return this.pos+=4,e},readSFixed32:function(){var e=lw(this.buf,this.pos);return this.pos+=4,e},readFixed64:function(){var e=hw(this.buf,this.pos)+hw(this.buf,this.pos+4)*qx;return this.pos+=8,e},readSFixed64:function(){var e=hw(this.buf,this.pos)+lw(this.buf,this.pos+4)*qx;return this.pos+=8,e},readFloat:function(){var e=Gx.read(this.buf,this.pos,!0,23,4);return this.pos+=4,e},readDouble:function(){var e=Gx.read(this.buf,this.pos,!0,52,8);return this.pos+=8,e},readVarint:function(e){var t,i,n=this.buf;return t=127&(i=n[this.pos++]),i<128?t:(t|=(127&(i=n[this.pos++]))<<7,i<128?t:(t|=(127&(i=n[this.pos++]))<<14,i<128?t:(t|=(127&(i=n[this.pos++]))<<21,i<128?t:function(e,t,i){var n,r,s=i.buf;if(r=s[i.pos++],n=(112&r)>>4,r<128)return Jx(e,n,t);if(r=s[i.pos++],n|=(127&r)<<3,r<128)return Jx(e,n,t);if(r=s[i.pos++],n|=(127&r)<<10,r<128)return Jx(e,n,t);if(r=s[i.pos++],n|=(127&r)<<17,r<128)return Jx(e,n,t);if(r=s[i.pos++],n|=(127&r)<<24,r<128)return Jx(e,n,t);if(r=s[i.pos++],n|=(1&r)<<31,r<128)return Jx(e,n,t);throw new Error("Expected varint not more than 10 bytes")}(t|=(15&(i=n[this.pos]))<<28,e,this))))},readVarint64:function(){return this.readVarint(!0)},readSVarint:function(){var e=this.readVarint();return e%2==1?(e+1)/-2:e/2},readBoolean:function(){return Boolean(this.readVarint())},readString:function(){var e=this.readVarint()+this.pos,t=this.pos;return this.pos=e,e-t>=12&&Zx?function(e,t,i){return Zx.decode(e.subarray(t,i))}(this.buf,t,e):function(e,t,i){var n="",r=t;for(;r<i;){var s,a,o,h=e[r],c=null,l=h>239?4:h>223?3:h>191?2:1;if(r+l>i)break;1===l?h<128&&(c=h):2===l?128==(192&(s=e[r+1]))&&(c=(31&h)<<6|63&s)<=127&&(c=null):3===l?(s=e[r+1],a=e[r+2],128==(192&s)&&128==(192&a)&&((c=(15&h)<<12|(63&s)<<6|63&a)<=2047||c>=55296&&c<=57343)&&(c=null)):4===l&&(s=e[r+1],a=e[r+2],o=e[r+3],128==(192&s)&&128==(192&a)&&128==(192&o)&&((c=(15&h)<<18|(63&s)<<12|(63&a)<<6|63&o)<=65535||c>=1114112)&&(c=null)),null===c?(c=65533,l=1):c>65535&&(c-=65536,n+=String.fromCharCode(c>>>10&1023|55296),c=56320|1023&c),n+=String.fromCharCode(c),r+=l}return n}(this.buf,t,e)},readBytes:function(){var e=this.readVarint()+this.pos,t=this.buf.subarray(this.pos,e);return this.pos=e,t},readPackedVarint:function(e,t){if(this.type!==Wx.Bytes)return e.push(this.readVarint(t));var i=Yx(this);for(e=e||[];this.pos<i;)e.push(this.readVarint(t));return e},readPackedSVarint:function(e){if(this.type!==Wx.Bytes)return e.push(this.readSVarint());var t=Yx(this);for(e=e||[];this.pos<t;)e.push(this.readSVarint());return e},readPackedBoolean:function(e){if(this.type!==Wx.Bytes)return e.push(this.readBoolean());var t=Yx(this);for(e=e||[];this.pos<t;)e.push(this.readBoolean());return e},readPackedFloat:function(e){if(this.type!==Wx.Bytes)return e.push(this.readFloat());var t=Yx(this);for(e=e||[];this.pos<t;)e.push(this.readFloat());return e},readPackedDouble:function(e){if(this.type!==Wx.Bytes)return e.push(this.readDouble());var t=Yx(this);for(e=e||[];this.pos<t;)e.push(this.readDouble());return e},readPackedFixed32:function(e){if(this.type!==Wx.Bytes)return e.push(this.readFixed32());var t=Yx(this);for(e=e||[];this.pos<t;)e.push(this.readFixed32());return e},readPackedSFixed32:function(e){if(this.type!==Wx.Bytes)return e.push(this.readSFixed32());var t=Yx(this);for(e=e||[];this.pos<t;)e.push(this.readSFixed32());return e},readPackedFixed64:function(e){if(this.type!==Wx.Bytes)return e.push(this.readFixed64());var t=Yx(this);for(e=e||[];this.pos<t;)e.push(this.readFixed64());return e},readPackedSFixed64:function(e){if(this.type!==Wx.Bytes)return e.push(this.readSFixed64());var t=Yx(this);for(e=e||[];this.pos<t;)e.push(this.readSFixed64());return e},skip:function(e){var t=7&e;if(t===Wx.Varint)for(;this.buf[this.pos++]>127;);else if(t===Wx.Bytes)this.pos=this.readVarint()+this.pos;else if(t===Wx.Fixed32)this.pos+=4;else{if(t!==Wx.Fixed64)throw new Error("Unimplemented type: "+t);this.pos+=8}},writeTag:function(e,t){this.writeVarint(e<<3|t)},realloc:function(e){for(var t=this.length||16;t<this.pos+e;)t*=2;if(t!==this.length){var i=new Uint8Array(t);i.set(this.buf),this.buf=i,this.length=t}},finish:function(){return this.length=this.pos,this.pos=0,this.buf.subarray(0,this.length)},writeFixed32:function(e){this.realloc(4),cw(this.buf,e,this.pos),this.pos+=4},writeSFixed32:function(e){this.realloc(4),cw(this.buf,e,this.pos),this.pos+=4},writeFixed64:function(e){this.realloc(8),cw(this.buf,-1&e,this.pos),cw(this.buf,Math.floor(e*Xx),this.pos+4),this.pos+=8},writeSFixed64:function(e){this.realloc(8),cw(this.buf,-1&e,this.pos),cw(this.buf,Math.floor(e*Xx),this.pos+4),this.pos+=8},writeVarint:function(e){(e=+e||0)>268435455||e<0?function(e,t){var i,n;e>=0?(i=e%4294967296|0,n=e/4294967296|0):(n=~(-e/4294967296),4294967295^(i=~(-e%4294967296))?i=i+1|0:(i=0,n=n+1|0));if(e>=0x10000000000000000||e<-0x10000000000000000)throw new Error("Given varint doesn't fit into 10 bytes");t.realloc(10),function(e,t,i){i.buf[i.pos++]=127&e|128,e>>>=7,i.buf[i.pos++]=127&e|128,e>>>=7,i.buf[i.pos++]=127&e|128,e>>>=7,i.buf[i.pos++]=127&e|128,e>>>=7,i.buf[i.pos]=127&e}(i,0,t),function(e,t){var i=(7&e)<<4;if(t.buf[t.pos++]|=i|((e>>>=3)?128:0),!e)return;if(t.buf[t.pos++]=127&e|((e>>>=7)?128:0),!e)return;if(t.buf[t.pos++]=127&e|((e>>>=7)?128:0),!e)return;if(t.buf[t.pos++]=127&e|((e>>>=7)?128:0),!e)return;if(t.buf[t.pos++]=127&e|((e>>>=7)?128:0),!e)return;t.buf[t.pos++]=127&e}(n,t)}(e,this):(this.realloc(4),this.buf[this.pos++]=127&e|(e>127?128:0),e<=127||(this.buf[this.pos++]=127&(e>>>=7)|(e>127?128:0),e<=127||(this.buf[this.pos++]=127&(e>>>=7)|(e>127?128:0),e<=127||(this.buf[this.pos++]=e>>>7&127))))},writeSVarint:function(e){this.writeVarint(e<0?2*-e-1:2*e)},writeBoolean:function(e){this.writeVarint(Boolean(e))},writeString:function(e){e=String(e),this.realloc(4*e.length),this.pos++;var t=this.pos;this.pos=function(e,t,i){for(var n,r,s=0;s<t.length;s++){if((n=t.charCodeAt(s))>55295&&n<57344){if(!r){n>56319||s+1===t.length?(e[i++]=239,e[i++]=191,e[i++]=189):r=n;continue}if(n<56320){e[i++]=239,e[i++]=191,e[i++]=189,r=n;continue}n=r-55296<<10|n-56320|65536,r=null}else r&&(e[i++]=239,e[i++]=191,e[i++]=189,r=null);n<128?e[i++]=n:(n<2048?e[i++]=n>>6|192:(n<65536?e[i++]=n>>12|224:(e[i++]=n>>18|240,e[i++]=n>>12&63|128),e[i++]=n>>6&63|128),e[i++]=63&n|128)}return i}(this.buf,e,this.pos);var i=this.pos-t;i>=128&&Kx(t,i,this),this.pos=t-1,this.writeVarint(i),this.pos+=i},writeFloat:function(e){this.realloc(4),Gx.write(this.buf,e,this.pos,!0,23,4),this.pos+=4},writeDouble:function(e){this.realloc(8),Gx.write(this.buf,e,this.pos,!0,52,8),this.pos+=8},writeBytes:function(e){var t=e.length;this.writeVarint(t),this.realloc(t);for(var i=0;i<t;i++)this.buf[this.pos++]=e[i]},writeRawMessage:function(e,t){this.pos++;var i=this.pos;e(t,this);var n=this.pos-i;n>=128&&Kx(i,n,this),this.pos=i-1,this.writeVarint(n),this.pos+=n},writeMessage:function(e,t,i){this.writeTag(e,Wx.Bytes),this.writeRawMessage(t,i)},writePackedVarint:function(e,t){t.length&&this.writeMessage(e,Qx,t)},writePackedSVarint:function(e,t){t.length&&this.writeMessage(e,ew,t)},writePackedBoolean:function(e,t){t.length&&this.writeMessage(e,nw,t)},writePackedFloat:function(e,t){t.length&&this.writeMessage(e,tw,t)},writePackedDouble:function(e,t){t.length&&this.writeMessage(e,iw,t)},writePackedFixed32:function(e,t){t.length&&this.writeMessage(e,rw,t)},writePackedSFixed32:function(e,t){t.length&&this.writeMessage(e,sw,t)},writePackedFixed64:function(e,t){t.length&&this.writeMessage(e,aw,t)},writePackedSFixed64:function(e,t){t.length&&this.writeMessage(e,ow,t)},writeBytesField:function(e,t){this.writeTag(e,Wx.Bytes),this.writeBytes(t)},writeFixed32Field:function(e,t){this.writeTag(e,Wx.Fixed32),this.writeFixed32(t)},writeSFixed32Field:function(e,t){this.writeTag(e,Wx.Fixed32),this.writeSFixed32(t)},writeFixed64Field:function(e,t){this.writeTag(e,Wx.Fixed64),this.writeFixed64(t)},writeSFixed64Field:function(e,t){this.writeTag(e,Wx.Fixed64),this.writeSFixed64(t)},writeVarintField:function(e,t){this.writeTag(e,Wx.Varint),this.writeVarint(t)},writeSVarintField:function(e,t){this.writeTag(e,Wx.Varint),this.writeSVarint(t)},writeStringField:function(e,t){this.writeTag(e,Wx.Bytes),this.writeString(t)},writeFloatField:function(e,t){this.writeTag(e,Wx.Fixed32),this.writeFloat(t)},writeDoubleField:function(e,t){this.writeTag(e,Wx.Fixed64),this.writeDouble(t)},writeBooleanField:function(e,t){this.writeVarintField(e,Boolean(t))}};class gw extends nf{constructor(e){super(),this._geometry=e}get geometry(){return this._geometry}fire(e,t){super.fire(e,t)}getCoreImages(e){return Promise.reject(new Pu("Not implemented"))}getCluster(e,t){return Promise.reject(new Pu("Not implemented"))}getSpatialImages(e){return Promise.reject(new Pu("Not implemented"))}getImages(e){return Promise.reject(new Pu("Not implemented"))}getImageBuffer(e,t){return Promise.reject(new Pu("Not implemented"))}getImageTiles(e){return Promise.reject(new Pu("Not implemented"))}getMesh(e,t){return Promise.reject(new Pu("Not implemented"))}getSequence(e){return Promise.reject(new Pu("Not implemented"))}off(e,t){super.off(e,t)}on(e,t){super.on(e,t)}setAccessToken(e){throw new Pu("Not implemented")}}class _w{constructor(){}bboxToCellIds(e,t){throw new Pu("Not implemented")}getAdjacent(e){throw new Pu("Not implemented")}getVertices(e){throw new Pu("Not implemented")}lngLatToCellId(e){throw new Pu("Not implemented")}_approxBboxToCellIds(e,t){if(t.lat<=e.lat||t.lng<=e.lng)throw new Pu("North east needs to be top right of south west");const i=(e.lat+t.lat)/2,n=(e.lng+t.lng)/2,r=_u(t.lng,t.lat,0,n,i,0),s=Math.max(r[0],r[1]);return this._lngLatToCellIds({lat:i,lng:n},s)}_enuToGeodetic(e,t){const[i,n]=vu(e[0],e[1],e[2],t.lng,t.lat,0);return{lat:n,lng:i}}_getLngLatBoundingBoxCorners(e,t){return[[-t,t,0],[t,t,0],[t,-t,0],[-t,-t,0]].map((t=>this._enuToGeodetic(t,e)))}_lngLatToCellIds(e,t){const i=this.lngLatToCellId(e),n=this._getLngLatBoundingBoxCorners(e,t);for(const e of n){if(this.lngLatToCellId(e)!==i)return[i,...this.getAdjacent(i)]}return[i]}}var vw={exports:{}},yw={exports:{}};!function(e){
 /**
- * @class Viewer
- *
- * @classdesc The Viewer object represents the navigable photo viewer.
- * Create a Viewer by specifying a container, client ID, photo key and
- * other options. The viewer exposes methods and events for programmatic
- * interaction.
- */
-var Viewer = (function (_super) {
-    __extends(Viewer, _super);
-    /**
-     * Create a new viewer instance.
-     *
-     * @param {string} id - Required `id` of a DOM element which will
-     * be transformed into the viewer.
-     * @param {string} clientId - Required `Mapillary API ClientID`. Can
-     * be obtained from https://www.mapillary.com/app/settings/developers.
-     * @param {string} [key] - Optional `photoId` to start from, can be any
-     * Mapillary photo, if null no image is loaded.
-     * @param {IViewerOptions} [options] - Optional configuration object
-     * specifing Viewer's initial setup.
-     * @param {string} [token] - Optional bearer token for API requests of
-     * protected resources.
-     */
-    function Viewer(id, clientId, key, options, token) {
-        var _this = _super.call(this) || this;
-        options = options != null ? options : {};
-        Utils_1.Settings.setOptions(options);
-        _this._navigator = new Viewer_1.Navigator(clientId, token);
-        _this._container = new Viewer_1.Container(id, _this._navigator.stateService, options);
-        _this._eventLauncher = new Viewer_1.EventLauncher(_this, _this._navigator, _this._container);
-        _this._componentController = new Viewer_1.ComponentController(_this._container, _this._navigator, key, options.component);
-        return _this;
-    }
-    /**
-     * Activate a component.
-     *
-     * @param {string} name - Name of the component which will become active.
-     */
-    Viewer.prototype.activateComponent = function (name) {
-        this._componentController.activate(name);
-    };
-    /**
-     * Activate the cover (deactivates all other components).
-     */
-    Viewer.prototype.activateCover = function () {
-        this._componentController.activateCover();
-    };
-    /**
-     * Deactivate a component.
-     *
-     * @param {string} name - Name of component which become inactive.
-     */
-    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.
-     */
-    Viewer.prototype.getBearing = function () {
-        var _this = this;
-        return when.promise(function (resolve, reject) {
-            _this._container.renderService.bearing$
-                .first()
-                .subscribe(function (bearing) {
-                resolve(bearing);
-            }, function (error) {
-                reject(error);
-            });
-        });
-    };
-    /**
-     * Get the basic coordinates of the current photo 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
-     * photo.
-     *
-     * @returns {Promise<number[]>} Promise to the basic coordinates
-     * of the current photo at the center for the viewport.
-     */
-    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.
-     */
-    Viewer.prototype.getComponent = function (name) {
-        return this._componentController.get(name);
-    };
-    /**
-     * Get the photo's current zoom level.
-     *
-     * @returns {Promise<number>} Promise to the viewers's current
-     * zoom level.
-     */
-    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.
-     *
-     * @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.
+     * @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.moveCloseTo = function (lat, lon) {
-        var _this = this;
-        return when.promise(function (resolve, reject) {
-            _this._navigator.moveCloseTo$(lat, lon).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.
-     *
-     * @example `viewer.moveDir(Mapillary.EdgeDirection.Next);`
-     */
-    Viewer.prototype.moveDir = function (dir) {
-        var _this = this;
-        return when.promise(function (resolve, reject) {
-            _this._navigator.moveDir$(dir).subscribe(function (node) {
-                resolve(node);
-            }, function (error) {
-                reject(error);
-            });
-        });
-    };
-    /**
-     * Navigate to a given photo key.
-     *
-     * @param {string} key - A valid Mapillary photo key.
-     * @returns {Promise<Node>} Promise to the node that was navigated to.
-     * @throws {Error} Propagates any IO errors to the caller.
-     */
-    Viewer.prototype.moveToKey = function (key) {
-        var _this = this;
-        return when.promise(function (resolve, reject) {
-            _this._navigator.moveToKey$(key).subscribe(function (node) {
-                resolve(node);
-            }, 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.
-     */
-    Viewer.prototype.resize = function () {
-        this._container.renderService.resize$.next(null);
-        this._componentController.resize();
-    };
-    /**
-     * 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 and
-     * the rejections need to be caught.
-     *
-     * @param {string} [token] token - Bearer token.
-     * @returns {Promise<void>} Promise that resolves after token
-     * is set.
-     */
-    Viewer.prototype.setAuthToken = function (token) {
-        var _this = this;
-        return when.promise(function (resolve, reject) {
-            _this._navigator.setToken$(token)
-                .subscribe(function () {
-                resolve(undefined);
-            }, function (error) {
-                reject(error);
-            });
-        });
-    };
-    /**
-     * Set the basic coordinates of the current photo 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
-     * photo.
-     *
-     * @param {number[]} The basic coordinates of the current
-     * photo to be at the center for the viewport.
-     */
-    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 node property name. 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.
-     *
-     * @param {FilterExpression} filter - The filter expression.
-     * @returns {Promise<void>} Promise that resolves after filter is applied.
-     *
-     * @example `viewer.setFilter(["==", "sequenceKey", "<my sequence key>"]);`
-     */
-    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 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 photo's current zoom level.
-     *
-     * @description Possible zoom level values are on the [0, 3] interval.
-     * Zero means zooming out to fit the photo to the view whereas three
-     * shows the highest level of detail.
-     *
-     * @param {number} The photo's current zoom level.
-     */
-    Viewer.prototype.setZoom = function (zoom) {
-        this._navigator.stateService.setZoom(zoom);
-    };
-    return Viewer;
-}(Utils_1.EventEmitter));
-/**
- * Fired when the viewing direction of the camera changes.
- * @event
- * @type {boolean} bearing - Value indicating the current bearing
- * measured in degrees clockwise with respect to north.
- */
-Viewer.bearingchanged = "bearingchanged";
-/**
- * Fired when the viewer is loading more data.
- * @event
- * @type {boolean} loading - Value indicating whether the viewer is loading.
- */
-Viewer.loadingchanged = "loadingchanged";
-/**
- * Fired when the viewer finishes transitioning and is in a fixed
- * position with a fixed point of view.
- * @event
- */
-Viewer.moveend = "moveend";
-/**
- * Fired when the viewer starts transitioning from one view to another,
- * either by changing the node or by interaction such as pan and zoom.
- * @event
- */
-Viewer.movestart = "movestart";
-/**
- * Fired every time the viewer navigates to a new node.
- * @event
- * @type {Node} node - Current node.
- */
-Viewer.nodechanged = "nodechanged";
-/**
- * Fired every time the sequence edges of the current node changes.
- * @event
- * @type {IEdgeStatus} status - The edge status object.
- */
-Viewer.sequenceedgeschanged = "sequenceedgeschanged";
-/**
- * Fired every time the spatial edges of the current node changes.
- * @event
- * @type {IEdgeStatus} status - The edge status object.
- */
-Viewer.spatialedgeschanged = "spatialedgeschanged";
-exports.Viewer = Viewer;
-
-},{"../Utils":226,"../Viewer":227,"when":214}]},{},[222])(222)
-});
+!function(t,i){e&&e.exports?e.exports=i():(t.dcodeIO=t.dcodeIO||{}).Long=i()}(hd,(function(){function e(e,t,i){this.low=0|e,this.high=0|t,this.unsigned=!!i}function t(e){return!0===(e&&e.__isLong__)}e.prototype.__isLong__,Object.defineProperty(e.prototype,"__isLong__",{value:!0,enumerable:!1,configurable:!1}),e.isLong=t;var i={},n={};function r(e,t){var r,s,o;return t?(o=0<=(e>>>=0)&&e<256)&&(s=n[e])?s:(r=a(e,(0|e)<0?-1:0,!0),o&&(n[e]=r),r):(o=-128<=(e|=0)&&e<128)&&(s=i[e])?s:(r=a(e,e<0?-1:0,!1),o&&(i[e]=r),r)}function s(e,t){if(isNaN(e)||!isFinite(e))return t?f:m;if(t){if(e<0)return f;if(e>=u)return b}else{if(e<=-d)return x;if(e+1>=d)return y}return e<0?s(-e,t).neg():a(e%l|0,e/l|0,t)}function a(t,i,n){return new e(t,i,n)}e.fromInt=r,e.fromNumber=s,e.fromBits=a;var o=Math.pow;function h(e,t,i){if(0===e.length)throw Error("empty string");if("NaN"===e||"Infinity"===e||"+Infinity"===e||"-Infinity"===e)return m;if("number"==typeof t?(i=t,t=!1):t=!!t,(i=i||10)<2||36<i)throw RangeError("radix");var n;if((n=e.indexOf("-"))>0)throw Error("interior hyphen");if(0===n)return h(e.substring(1),t,i).neg();for(var r=s(o(i,8)),a=m,c=0;c<e.length;c+=8){var l=Math.min(8,e.length-c),u=parseInt(e.substring(c,c+l),i);if(l<8){var d=s(o(i,l));a=a.mul(d).add(s(u))}else a=(a=a.mul(r)).add(s(u))}return a.unsigned=t,a}function c(t){return t instanceof e?t:"number"==typeof t?s(t):"string"==typeof t?h(t):a(t.low,t.high,t.unsigned)}e.fromString=h,e.fromValue=c;var l=4294967296,u=l*l,d=u/2,p=r(1<<24),m=r(0);e.ZERO=m;var f=r(0,!0);e.UZERO=f;var g=r(1);e.ONE=g;var _=r(1,!0);e.UONE=_;var v=r(-1);e.NEG_ONE=v;var y=a(-1,2147483647,!1);e.MAX_VALUE=y;var b=a(-1,-1,!0);e.MAX_UNSIGNED_VALUE=b;var x=a(0,-2147483648,!1);e.MIN_VALUE=x;var w=e.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(e){if((e=e||10)<2||36<e)throw RangeError("radix");if(this.isZero())return"0";if(this.isNegative()){if(this.eq(x)){var t=s(e),i=this.div(t),n=i.mul(t).sub(this);return i.toString(e)+n.toInt().toString(e)}return"-"+this.neg().toString(e)}for(var r=s(o(e,6),this.unsigned),a=this,h="";;){var c=a.div(r),l=(a.sub(c.mul(r)).toInt()>>>0).toString(e);if((a=c).isZero())return l+h;for(;l.length<6;)l="0"+l;h=""+l+h}},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 e=0!=this.high?this.high:this.low,t=31;t>0&&0==(e&1<<t);t--);return 0!=this.high?t+33:t+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(e){return t(e)||(e=c(e)),(this.unsigned===e.unsigned||this.high>>>31!=1||e.high>>>31!=1)&&(this.high===e.high&&this.low===e.low)},w.eq=w.equals,w.notEquals=function(e){return!this.eq(e)},w.neq=w.notEquals,w.lessThan=function(e){return this.comp(e)<0},w.lt=w.lessThan,w.lessThanOrEqual=function(e){return this.comp(e)<=0},w.lte=w.lessThanOrEqual,w.greaterThan=function(e){return this.comp(e)>0},w.gt=w.greaterThan,w.greaterThanOrEqual=function(e){return this.comp(e)>=0},w.gte=w.greaterThanOrEqual,w.compare=function(e){if(t(e)||(e=c(e)),this.eq(e))return 0;var i=this.isNegative(),n=e.isNegative();return i&&!n?-1:!i&&n?1:this.unsigned?e.high>>>0>this.high>>>0||e.high===this.high&&e.low>>>0>this.low>>>0?-1:1:this.sub(e).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(e){t(e)||(e=c(e));var i=this.high>>>16,n=65535&this.high,r=this.low>>>16,s=65535&this.low,o=e.high>>>16,h=65535&e.high,l=e.low>>>16,u=0,d=0,p=0,m=0;return p+=(m+=s+(65535&e.low))>>>16,d+=(p+=r+l)>>>16,u+=(d+=n+h)>>>16,u+=i+o,a((p&=65535)<<16|(m&=65535),(u&=65535)<<16|(d&=65535),this.unsigned)},w.subtract=function(e){return t(e)||(e=c(e)),this.add(e.neg())},w.sub=w.subtract,w.multiply=function(e){if(this.isZero())return m;if(t(e)||(e=c(e)),e.isZero())return m;if(this.eq(x))return e.isOdd()?x:m;if(e.eq(x))return this.isOdd()?x:m;if(this.isNegative())return e.isNegative()?this.neg().mul(e.neg()):this.neg().mul(e).neg();if(e.isNegative())return this.mul(e.neg()).neg();if(this.lt(p)&&e.lt(p))return s(this.toNumber()*e.toNumber(),this.unsigned);var i=this.high>>>16,n=65535&this.high,r=this.low>>>16,o=65535&this.low,h=e.high>>>16,l=65535&e.high,u=e.low>>>16,d=65535&e.low,f=0,g=0,_=0,v=0;return _+=(v+=o*d)>>>16,g+=(_+=r*d)>>>16,_&=65535,g+=(_+=o*u)>>>16,f+=(g+=n*d)>>>16,g&=65535,f+=(g+=r*u)>>>16,g&=65535,f+=(g+=o*l)>>>16,f+=i*d+n*u+r*l+o*h,a((_&=65535)<<16|(v&=65535),(f&=65535)<<16|(g&=65535),this.unsigned)},w.mul=w.multiply,w.divide=function(e){if(t(e)||(e=c(e)),e.isZero())throw Error("division by zero");if(this.isZero())return this.unsigned?f:m;var i,n,r;if(this.unsigned){if(e.unsigned||(e=e.toUnsigned()),e.gt(this))return f;if(e.gt(this.shru(1)))return _;r=f}else{if(this.eq(x))return e.eq(g)||e.eq(v)?x:e.eq(x)?g:(i=this.shr(1).div(e).shl(1)).eq(m)?e.isNegative()?g:v:(n=this.sub(e.mul(i)),r=i.add(n.div(e)));if(e.eq(x))return this.unsigned?f:m;if(this.isNegative())return e.isNegative()?this.neg().div(e.neg()):this.neg().div(e).neg();if(e.isNegative())return this.div(e.neg()).neg();r=m}for(n=this;n.gte(e);){i=Math.max(1,Math.floor(n.toNumber()/e.toNumber()));for(var a=Math.ceil(Math.log(i)/Math.LN2),h=a<=48?1:o(2,a-48),l=s(i),u=l.mul(e);u.isNegative()||u.gt(n);)u=(l=s(i-=h,this.unsigned)).mul(e);l.isZero()&&(l=g),r=r.add(l),n=n.sub(u)}return r},w.div=w.divide,w.modulo=function(e){return t(e)||(e=c(e)),this.sub(this.div(e).mul(e))},w.mod=w.modulo,w.not=function(){return a(~this.low,~this.high,this.unsigned)},w.and=function(e){return t(e)||(e=c(e)),a(this.low&e.low,this.high&e.high,this.unsigned)},w.or=function(e){return t(e)||(e=c(e)),a(this.low|e.low,this.high|e.high,this.unsigned)},w.xor=function(e){return t(e)||(e=c(e)),a(this.low^e.low,this.high^e.high,this.unsigned)},w.shiftLeft=function(e){return t(e)&&(e=e.toInt()),0==(e&=63)?this:e<32?a(this.low<<e,this.high<<e|this.low>>>32-e,this.unsigned):a(0,this.low<<e-32,this.unsigned)},w.shl=w.shiftLeft,w.shiftRight=function(e){return t(e)&&(e=e.toInt()),0==(e&=63)?this:e<32?a(this.low>>>e|this.high<<32-e,this.high>>e,this.unsigned):a(this.high>>e-32,this.high>=0?0:-1,this.unsigned)},w.shr=w.shiftRight,w.shiftRightUnsigned=function(e){if(t(e)&&(e=e.toInt()),0===(e&=63))return this;var i=this.high;return e<32?a(this.low>>>e|i<<32-e,i>>>e,this.unsigned):a(32===e?i:i>>>e-32,0,this.unsigned)},w.shru=w.shiftRightUnsigned,w.toSigned=function(){return this.unsigned?a(this.low,this.high,!1):this},w.toUnsigned=function(){return this.unsigned?this:a(this.low,this.high,!0)},w.toBytes=function(e){return e?this.toBytesLE():this.toBytesBE()},w.toBytesLE=function(){var e=this.high,t=this.low;return[255&t,t>>>8&255,t>>>16&255,t>>>24&255,255&e,e>>>8&255,e>>>16&255,e>>>24&255]},w.toBytesBE=function(){var e=this.high,t=this.low;return[e>>>24&255,e>>>16&255,e>>>8&255,255&e,t>>>24&255,t>>>16&255,t>>>8&255,255&t]},e}))}(yw),function(e){!function(e){var t=e.S2={L:{}};t.L.LatLng=function(e,t,i){var n=parseFloat(e,10),r=parseFloat(t,10);if(isNaN(n)||isNaN(r))throw new Error("Invalid LatLng object: ("+e+", "+t+")");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}},t.L.LatLng.DEG_TO_RAD=Math.PI/180,t.L.LatLng.RAD_TO_DEG=180/Math.PI,t.LatLngToXYZ=function(e){var i=t.L.LatLng.DEG_TO_RAD,n=e.lat*i,r=e.lng*i,s=Math.cos(n);return[Math.cos(r)*s,Math.sin(r)*s,Math.sin(n)]},t.XYZToLatLng=function(e){var i=t.L.LatLng.RAD_TO_DEG,n=Math.atan2(e[2],Math.sqrt(e[0]*e[0]+e[1]*e[1])),r=Math.atan2(e[1],e[0]);return t.L.LatLng(n*i,r*i)};t.XYZToFaceUV=function(e){var t=function(e){var t=[Math.abs(e[0]),Math.abs(e[1]),Math.abs(e[2])];return t[0]>t[1]?t[0]>t[2]?0:2:t[1]>t[2]?1:2}(e);return e[t]<0&&(t+=3),[t,function(e,t){var i,n;switch(e){case 0:i=t[1]/t[0],n=t[2]/t[0];break;case 1:i=-t[0]/t[1],n=t[2]/t[1];break;case 2:i=-t[0]/t[2],n=-t[1]/t[2];break;case 3:i=t[2]/t[0],n=t[1]/t[0];break;case 4:i=t[2]/t[1],n=-t[0]/t[1];break;case 5:i=-t[1]/t[2],n=-t[0]/t[2];break;default:throw{error:"Invalid face"}}return[i,n]}(t,e)]},t.FaceUVToXYZ=function(e,t){var i=t[0],n=t[1];switch(e){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(e){return e>=.5?1/3*(4*e*e-1):1/3*(1-4*(1-e)*(1-e))};t.STToUV=function(e){return[i(e[0]),i(e[1])]};var n=function(e){return e>=0?.5*Math.sqrt(1+3*e):1-.5*Math.sqrt(1-3*e)};t.UVToST=function(e){return[n(e[0]),n(e[1])]},t.STToIJ=function(e,t){var i=1<<t,n=function(e){var t=Math.floor(e*i);return Math.max(0,Math.min(i-1,t))};return[n(e[0]),n(e[1])]},t.IJToST=function(e,t,i){var n=1<<t;return[(e[0]+i[0])/n,(e[1]+i[1])/n]};var r=function(e,t,i,n){if(0==n){1==i&&(t.x=e-1-t.x,t.y=e-1-t.y);var r=t.x;t.x=t.y,t.y=r}},s=function(e,t,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",a=[],o=i-1;o>=0;o--){var h=1<<o,c=r[s][2*(e&h?1:0)+(t&h?1:0)];a.push(c[0]),s=c[1]}return a};t.S2Cell=function(){},t.S2Cell.FromHilbertQuadKey=function(e){var i,n,s,a,o,h,c=e.split("/"),l=parseInt(c[0]),u=c[1],d=u.length,p={x:0,y:0};for(i=d-1;i>=0;i--)n=d-i,a=0,o=0,"1"===(s=u[i])?o=1:"2"===s?(a=1,o=1):"3"===s&&(a=1),h=Math.pow(2,n-1),r(h,p,a,o),p.x+=h*a,p.y+=h*o;if(l%2==1){var m=p.x;p.x=p.y,p.y=m}return t.S2Cell.FromFaceIJ(parseInt(l),[p.x,p.y],n)},t.S2Cell.FromLatLng=function(e,i){if(!e.lat&&0!==e.lat||!e.lng&&0!==e.lng)throw new Error("Pass { lat: lat, lng: lng } to S2.S2Cell.FromLatLng");var n=t.LatLngToXYZ(e),r=t.XYZToFaceUV(n),s=t.UVToST(r[1]),a=t.STToIJ(s,i);return t.S2Cell.FromFaceIJ(r[0],a,i)},t.S2Cell.FromFaceIJ=function(e,i,n){var r=new t.S2Cell;return r.face=e,r.ij=i,r.level=n,r},t.S2Cell.prototype.toString=function(){return"F"+this.face+"ij["+this.ij[0]+","+this.ij[1]+"]@"+this.level},t.S2Cell.prototype.getLatLng=function(){var e=t.IJToST(this.ij,this.level,[.5,.5]),i=t.STToUV(e),n=t.FaceUVToXYZ(this.face,i);return t.XYZToLatLng(n)},t.S2Cell.prototype.getCornerLatLngs=function(){for(var e=[],i=[[0,0],[0,1],[1,1],[1,0]],n=0;n<4;n++){var r=t.IJToST(this.ij,this.level,i[n]),s=t.STToUV(r),a=t.FaceUVToXYZ(this.face,s);e.push(t.XYZToLatLng(a))}return e},t.S2Cell.prototype.getFaceAndQuads=function(){var e=s(this.ij[0],this.ij[1],this.level,this.face);return[this.face,e]},t.S2Cell.prototype.toHilbertQuadkey=function(){var e=s(this.ij[0],this.ij[1],this.level,this.face);return this.face.toString(10)+"/"+e.join("")},t.latLngToNeighborKeys=t.S2Cell.latLngToNeighborKeys=function(e,i,n){return t.S2Cell.FromLatLng({lat:e,lng:i},n).getNeighbors().map((function(e){return e.toHilbertQuadkey()}))},t.S2Cell.prototype.getNeighbors=function(){var e=function(e,i,n){var r=1<<n;if(i[0]>=0&&i[1]>=0&&i[0]<r&&i[1]<r)return t.S2Cell.FromFaceIJ(e,i,n);var s=t.IJToST(i,n,[.5,.5]),a=t.STToUV(s),o=t.FaceUVToXYZ(e,a),h=t.XYZToFaceUV(o);return e=h[0],a=h[1],s=t.UVToST(a),i=t.STToIJ(s,n),t.S2Cell.FromFaceIJ(e,i,n)},i=this.face,n=this.ij[0],r=this.ij[1],s=this.level;return[e(i,[n-1,r],s),e(i,[n,r-1],s),e(i,[n+1,r],s),e(i,[n,r+1],s)]},t.FACE_BITS=3,t.MAX_LEVEL=30,t.POS_BITS=2*t.MAX_LEVEL+1,t.facePosLevelToId=t.S2Cell.facePosLevelToId=t.fromFacePosLevel=function(i,n,r){var s,a,o,h=e.dcodeIO&&e.dcodeIO.Long||yw.exports;for(r||(r=n.length),n.length>r&&(n=n.substr(0,r)),s=h.fromString(i.toString(10),!0,10).toString(2);s.length<t.FACE_BITS;)s="0"+s;for(a=h.fromString(n,!0,4).toString(2);a.length<2*r;)a="0"+a;for(o=s+a,o+="1";o.length<t.FACE_BITS+t.POS_BITS;)o+="0";return h.fromString(o,!0,2).toString(10)},t.keyToId=t.S2Cell.keyToId=t.toId=t.toCellId=t.fromKey=function(e){var i=e.split("/");return t.fromFacePosLevel(i[0],i[1],i[1].length)},t.idToKey=t.S2Cell.idToKey=t.S2Cell.toKey=t.toKey=t.fromId=t.fromCellId=t.S2Cell.toHilbertQuadkey=t.toHilbertQuadkey=function(i){for(var n=e.dcodeIO&&e.dcodeIO.Long||yw.exports,r=n.fromString(i,!0,10).toString(2);r.length<t.FACE_BITS+t.POS_BITS;)r="0"+r;for(var s=r.lastIndexOf("1"),a=r.substring(0,3),o=r.substring(3,s),h=o.length/2,c=n.fromString(a,!0,2).toString(10),l=n.fromString(o,!0,2).toString(4);l.length<h;)l="0"+l;return c+"/"+l},t.keyToLatLng=t.S2Cell.keyToLatLng=function(e){return t.S2Cell.FromHilbertQuadKey(e).getLatLng()},t.idToLatLng=t.S2Cell.idToLatLng=function(e){var i=t.idToKey(e);return t.keyToLatLng(i)},t.S2Cell.latLngToKey=t.latLngToKey=t.latLngToQuadkey=function(e,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 t.S2Cell.FromLatLng({lat:e,lng:i},n).toHilbertQuadkey()},t.stepKey=function(t,i){var n,r=e.dcodeIO&&e.dcodeIO.Long||yw.exports,s=t.split("/"),a=s[0],o=s[1],h=s[1].length,c=r.fromString(o,!0,4);i>0?n=c.add(Math.abs(i)):i<0&&(n=c.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<h;)l="0"+l;return a+"/"+l},t.S2Cell.prevKey=t.prevKey=function(e){return t.stepKey(e,-1)},t.S2Cell.nextKey=t.nextKey=function(e){return t.stepKey(e,1)}}(e.exports)}(vw);class bw extends _w{constructor(e=17){super(),this._level=e}bboxToCellIds(e,t){return this._approxBboxToCellIds(e,t)}getAdjacent(e){const t=vw.exports.S2.idToKey(e),i=t.split("/")[1].length,[n,r,s,a]=this._getNeighbors(t,i),o=[t,n,r,s,a],h=Array.from(new Set([...this._getNeighbors(n,i),...this._getNeighbors(r,i),...this._getNeighbors(s,i),...this._getNeighbors(a,i)].filter((e=>!o.includes(e))))),c=[n,r,s,a];for(const e of h){let t=0;for(const n of this._getNeighbors(e,i))o.includes(n)&&t++;2===t&&c.push(e)}return c.map((e=>vw.exports.S2.keyToId(e)))}getVertices(e){const t=vw.exports.S2.idToKey(e);return vw.exports.S2.S2Cell.FromHilbertQuadKey(t).getCornerLatLngs().map((e=>({lat:e.lat,lng:e.lng})))}lngLatToCellId(e){return this._lngLatToId(e,this._level)}_getNeighbors(e,t){const i=vw.exports.S2.keyToLatLng(e);return vw.exports.S2.latLngToNeighborKeys(i.lat,i.lng,t)}_lngLatToId(e,t){const i=vw.exports.S2.latLngToKey(e.lat,e.lng,t);return vw.exports.S2.keyToId(i)}}class xw{clusterReconstruction(e){const t=e.points,i=1/255;for(const e in t){if(!t.hasOwnProperty(e))continue;const n=t[e].color;n[0]*=i,n[1]*=i,n[2]*=i}const n=e.reference_lla;return{id:null,points:t,reference:{alt:n.altitude,lat:n.latitude,lng:n.longitude}}}coreImage(e){const t=this._geometry(e.geometry),i=this._geometry(e.computed_geometry),n={id:e.sequence};return{computed_geometry:i,geometry:t,id:e.id,sequence:n}}spatialImage(e){var t,i,n,r,s;e.camera_type=function(e){switch(e){case"equirectangular":case"spherical":return"spherical";case"fisheye":return"fisheye";default:return"perspective"}}(e.camera_type),e.merge_id=e.merge_cc?e.merge_cc.toString():null,e.private=null;const a="spherical"===e.camera_type?e.thumb_2048_url:e.thumb_1024_url;return e.thumb=null!==(t=e.thumb)&&void 0!==t?t:{id:null,url:a},e.cluster=null!==(i=e.sfm_cluster)&&void 0!==i?i:{id:null,url:null},e.creator=null!==(n=e.creator)&&void 0!==n?n:{id:null,username:null},e.owner=null!==(r=e.organization)&&void 0!==r?r:{id:null},e.mesh=null!==(s=e.mesh)&&void 0!==s?s:{id:null,url:null},e}_geometry(e){const t=null==e?void 0:e.coordinates;return t?{lat:t[1],lng:t[0]}:null}}class ww{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","creator","exif_orientation","height","merge_cc","mesh","organization","quality_score","sfm_cluster","thumb_1024_url","thumb_2048_url","width"],this.imageTileFields=["url","z","x","y"]}images(e,t){return`image_ids=${e.join(",")}&fields=${t.join(",")}`}imagesS2(e,t){return`s2=${e}&fields=${t.join(",")}`}imageTiles(e,t){return`z=${e}&fields=${t.join(",")}`}imageTilesPath(e){return`${e}/${this._imageTilesPath}`}sequence(e){return`sequence_id=${e}`}}class Mw extends gw{constructor(e,t,i,n){var r;super(null!=t?t:new bw),this._convert=null!=i?i:new xw,this._query=null!=n?n:new ww,this._method="GET";const s=null!=e?e:{};this._endpoint=null!==(r=s.endpoint)&&void 0!==r?r:"https://graph.mapillary.com",this._accessToken=s.accessToken}getCluster(e,t){return dw(e,t).then((e=>{const t=uw(e);if(t.length<1)throw new Error("Cluster reconstruction empty");return this._convert.clusterReconstruction(t[0])}))}getCoreImages(e){const t=[...this._query.idFields,...this._query.coreFields],i=this._query.imagesS2(e,t),n=new URL(this._query.imagesPath,this._endpoint).href;return this._fetchGraphContract(i,n).then((t=>{const i={cell_id:e,images:[]},n=t.data;for(const e of n){const t=this._convert.coreImage(e);i.images.push(t)}return i}))}getImageBuffer(e,t){return dw(e,t)}getImages(e){const t=[...this._query.idFields,...this._query.coreFields,...this._query.spatialFields],i=this._query.images(e,t),n=new URL(this._query.imagesPath,this._endpoint).href;return this._fetchGraphContract(i,n).then((e=>{const t=[],i=e.data;for(const e of i){const i=this._convert.coreImage(e),n=this._convert.spatialImage(e),r={node:Object.assign({},n,i),node_id:e.id};t.push(r)}return t}))}getImageTiles(e){const t=[...this._query.imageTileFields],i=this._query.imageTiles(e.z,t),n=new URL(this._query.imageTilesPath(e.imageId),this._endpoint).href;return this._fetchGraphContract(i,n).then((t=>({node:t.data,node_id:e.imageId})))}getMesh(e,t){return dw(e,t).then((e=>mw(e)))}getSequence(e){const t=this._query.sequence(e),i=new URL(this._query.sequencePath,this._endpoint).href;return this._fetchGraphContract(t,i).then((t=>({id:e,image_ids:t.data.map((e=>e.id))})))}getSpatialImages(e){const t=[...this._query.idFields,...this._query.coreFields,...this._query.spatialFields],i=this._query.images(e,t),n=new URL(this._query.imagesPath,this._endpoint).href;return this._fetchGraphContract(i,n).then((e=>{const t=[],i=e.data;for(const e of i){const i={node:this._convert.spatialImage(e),node_id:e.id};t.push(i)}return t}))}setAccessToken(e){this._accessToken=e}_createHeaders(){const e=[{name:"Accept",value:"application/json"},{name:"Content-Type",value:"application/x-www-form-urlencoded"}];return this._accessToken&&e.push({name:"Authorization",value:`OAuth ${this._accessToken}`}),e}_fetchGraphContract(e,t){return pw(`${t}?${e}`,this._method,"json",this._createHeaders(),null,null).catch((e=>{const t=this._makeErrorMessage(e);throw new Pu(t)}))}_makeErrorMessage(e){const t=e.error;return t?`${t.code} (${t.type}, ${t.fbtrace_id}): ${t.message}`:"Failed to fetch data"}}class Sw{constructor(e,t){this._id=e,this._lngLat=t}get id(){return this._id}get geometry(){return this._geometry}get lngLat(){return this._lngLat}createGeometry(e){this._geometry||(this._createGeometry(e),this._geometry.updateMatrixWorld(!0))}disposeGeometry(){this._geometry&&(this._disposeGeometry(),this._geometry=void 0)}getInteractiveObjects(){return this._geometry?this._getInteractiveObjects():[]}lerpAltitude(e,t){this._geometry&&(this._geometry.position.z=(1-t)*this._geometry.position.z+t*e)}updatePosition(e,t){t&&(this._lngLat.lat=t.lat,this._lngLat.lng=t.lng),this._geometry&&(this._geometry.position.fromArray(e),this._geometry.updateMatrixWorld(!0))}}let Tw;function Cw(){return void 0===Tw&&(Tw=function(){const e={alpha:!1,antialias:!1,depth:!0,failIfMajorPerformanceCaveat:!1,premultipliedAlpha:!0,preserveDrawingBuffer:!1,stencil:!0},t=document.createElement("canvas");if(t.getContext("webgl2",e))return!0;const i=t.getContext("webgl",e)||t.getContext("experimental-webgl",e);if(!i)return!1;const n=["OES_standard_derivatives"],r=i.getSupportedExtensions();for(const e of n)if(-1===r.indexOf(e))return!1;return!0}()),Tw}function Ew(){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 Aw,Iw,Rw;e.CameraControls=void 0,(Aw=e.CameraControls||(e.CameraControls={}))[Aw.Custom=0]="Custom",Aw[Aw.Earth=1]="Earth",Aw[Aw.Street=2]="Street",e.RenderMode=void 0,(Iw=e.RenderMode||(e.RenderMode={}))[Iw.Letterbox=0]="Letterbox",Iw[Iw.Fill=1]="Fill",e.RenderPass=void 0,function(e){e[e.Opaque=0]="Opaque"}(e.RenderPass||(e.RenderPass={})),e.TransitionMode=void 0,(Rw=e.TransitionMode||(e.TransitionMode={}))[Rw.Default=0]="Default",Rw[Rw.Instantaneous=1]="Instantaneous";class Pw{constructor(e,t,i,n,r,s){this._container=e,this._observer=i,this._navigator=t,this._options=null!=r?r:{},this._key=n,this._navigable=null==n,this._componentService=s||new od(this._container,this._navigator),this._coverComponent=this._componentService.getCover(),this._initializeComponents(),n?(this._initilizeCoverComponent(),this._subscribeCoverComponent()):this._navigator.movedToId$.pipe(St((e=>null!=e))).subscribe((e=>{this._key=e,this._componentService.deactivateCover(),this._coverComponent.configure({id:this._key,state:Qm.Hidden}),this._subscribeCoverComponent(),this._navigator.stateService.start(),this._navigator.cacheService.start(),this._navigator.panService.start(),this._observer.startEmit()}))}get navigable(){return this._navigable}get(e){return this._componentService.get(e)}activate(e){this._componentService.activate(e)}activateCover(){this._coverComponent.configure({state:Qm.Visible})}deactivate(e){this._componentService.deactivate(e)}deactivateCover(){this._coverComponent.configure({state:Qm.Loading})}remove(){this._componentService.remove(),null!=this._configurationSubscription&&this._configurationSubscription.unsubscribe()}_initializeComponents(){var e,t;const i=this._options;this._uFalse(null===(e=i.fallback)||void 0===e?void 0:e.image,"imagefallback"),this._uFalse(null===(t=i.fallback)||void 0===t?void 0:t.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 e=this._options;this._coverComponent.configure({id:this._key}),void 0===e.cover||e.cover?this.activateCover():this.deactivateCover()}_setNavigable(e){this._navigable!==e&&(this._navigable=e,this._observer.navigable$.next(e))}_subscribeCoverComponent(){this._configurationSubscription=this._coverComponent.configuration$.pipe(vt(void 0,(e=>e.state))).subscribe((e=>{e.state===Qm.Loading?this._navigator.stateService.currentId$.pipe(St(),zt((t=>{const i=null==t||t!==e.id;return i&&this._setNavigable(!1),i?this._navigator.moveTo$(e.id):this._navigator.stateService.currentImage$.pipe(St())}))).subscribe((()=>{this._navigator.stateService.start(),this._navigator.cacheService.start(),this._navigator.panService.start(),this._observer.startEmit(),this._coverComponent.configure({state:Qm.Hidden}),this._componentService.deactivateCover(),this._setNavigable(!0)}),(e=>{console.error("Failed to deactivate cover.",e),this._coverComponent.configure({state:Qm.Visible})})):e.state===Qm.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==e.id))}))}_uFalse(e,t){void 0!==e?"boolean"!=typeof e?(this._componentService.configure(t,e),this._componentService.activate(t)):e?this._componentService.activate(t):this._componentService.deactivate(t):this._componentService.deactivate(t)}_uTrue(e,t){void 0!==e?"boolean"!=typeof e?(this._componentService.configure(t,e),this._componentService.activate(t)):e?this._componentService.activate(t):this._componentService.deactivate(t):this._componentService.activate(t)}}class Lw{constructor(t,i,n){this._adaptiveOperation$=new j,this._render$=new j,this._renderAdaptive$=new j,this._subscriptions=new rf,this._renderService=i,this._currentFrame$=n;const r=this._subscriptions,s=tf.create(tf.h("div.mapillary-dom-renderer",[]));t.appendChild(s),this._offset$=this._adaptiveOperation$.pipe(Lt(((e,t)=>t(e)),{elementHeight:t.offsetHeight,elementWidth:t.offsetWidth,imageAspect:0,renderMode:e.RenderMode.Fill}),st((e=>e.imageAspect>0&&e.elementWidth>0&&e.elementHeight>0)),De((t=>{const i=t.elementWidth/t.elementHeight,n=t.imageAspect/i;let r=0,s=0;return t.renderMode===e.RenderMode.Letterbox?t.imageAspect>i?r=t.elementHeight*(1-1/n)/2:s=t.elementWidth*(1-n)/2:t.imageAspect>i?s=-t.elementWidth*(n-1)/2:r=-t.elementHeight*(1/n-1)/2,{bottom:r,left:s,right:s,top:r}})));const a=this._currentFrame$.pipe(st((e=>null!=e.state.currentImage)),vt(((e,t)=>e===t),(e=>e.state.currentImage.id)),De((e=>e.state.currentTransform.basicAspect)),De((e=>t=>(t.imageAspect=e,t)))).subscribe(this._adaptiveOperation$),o=Ve(this._renderAdaptive$.pipe(Lt(((e,t)=>(null==t.vNode?delete e[t.name]:e[t.name]=t.vNode,e)),{})),this._offset$).pipe(De((e=>{const t=[],i=e[0];for(const e in i)i.hasOwnProperty(e)&&t.push(i[e]);const n=e[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:tf.h("div.mapillary-dom-adaptive-renderer",r,t)}}))).subscribe(this._render$);this._vNode$=this._render$.pipe(Lt(((e,t)=>(null==t.vNode?delete e[t.name]:e[t.name]=t.vNode,e)),{}),De((e=>{const t=[];for(const i in e)e.hasOwnProperty(i)&&t.push(e[i]);return tf.h("div.mapillary-dom-renderer",t)}))),this._vPatch$=this._vNode$.pipe(Lt(((e,t)=>(e.vpatch=tf.diff(e.vNode,t),e.vNode=t,e)),{vNode:tf.h("div.mapillary-dom-renderer",[]),vpatch:null}),function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var i=e.length;if(0===i)throw new Error("list of properties cannot be empty.");return De((function(t){for(var n=t,r=0;r<i;r++){var s=null==n?void 0:n[e[r]];if(void 0===s)return;n=s}return n}))}("vpatch")),this._element$=this._vPatch$.pipe(Lt(((e,t)=>tf.patch(e,t)),s),Rt(1),U()),r.push(a),r.push(o),r.push(this._element$.subscribe((()=>{}))),r.push(this._renderService.size$.pipe(De((e=>t=>(t.elementWidth=e.width,t.elementHeight=e.height,t)))).subscribe(this._adaptiveOperation$)),r.push(this._renderService.renderMode$.pipe(De((e=>t=>(t.renderMode=e,t)))).subscribe(this._adaptiveOperation$))}get element$(){return this._element$}get render$(){return this._render$}get renderAdaptive$(){return this._renderAdaptive$}clear(e){this._renderAdaptive$.next({name:e,vNode:null}),this._render$.next({name:e,vNode:null})}remove(){this._subscriptions.unsubscribe()}}class Dw{constructor(e,t,i){this._renderFrame$=new j,this._renderCameraOperation$=new j,this._render$=new j,this._clear$=new j,this._renderOperation$=new j,this._rendererOperation$=new j,this._eraserOperation$=new j,this._triggerOperation$=new j,this._subscriptions=new rf,this._opaqueRender$=new j,this._renderService=i;const n=this._subscriptions;this._renderer$=this._rendererOperation$.pipe(Lt(((e,t)=>t(e)),{needsRender:!1,renderer:null}),st((e=>!!e.renderer))),this._renderCollection$=this._renderOperation$.pipe(Lt(((e,t)=>t(e)),{}),Dt()),this._renderCamera$=this._renderCameraOperation$.pipe(Lt(((e,t)=>t(e)),{frameId:-1,needsRender:!1,perspective:null})),this._eraser$=this._eraserOperation$.pipe(Ot((e=>e)),Lt(((e,t)=>t(e)),{needsRender:!1}));const r=this._triggerOperation$.pipe(Ot((e=>e)),Lt(((e,t)=>t(e)),{needsRender:!1})),s=new xr(986895),a=Ve(this._renderer$,this._renderCollection$,this._renderCamera$,this._eraser$,r).pipe(De((([e,t,i,n,r])=>({camera:i,eraser:n,trigger:r,renderer:e,renders:Object.keys(t).map((e=>t[e]))}))),st((e=>{let t=e.renderer.needsRender||e.camera.needsRender||e.eraser.needsRender||e.trigger.needsRender;const i=e.camera.frameId;for(const n of e.renders){if(n.frameId!==i)return!1;t=t||n.needsRender}return t})),vt(((e,t)=>e===t),(e=>e.eraser.needsRender||e.trigger.needsRender?-e.camera.frameId:e.camera.frameId))).subscribe((e=>{e.renderer.needsRender=!1,e.camera.needsRender=!1,e.eraser.needsRender=!1,e.trigger.needsRender=!1;const t=e.camera.perspective,i=[],n=[];for(const t of e.renders)t.pass===yf.Background?i.push(t.render):t.pass===yf.Opaque&&n.push(t.render);const r=e.renderer.renderer;r.resetState(),r.setClearColor(s,1),r.clear();for(const e of i)e(t,r);r.clearDepth();for(const e of n)e(t,r);r.resetState(),this._opaqueRender$.next()}));n.push(a),n.push(this._renderFrame$.pipe(De((e=>t=>(t.frameId=e.frameId,t.perspective=e.perspective,!0===e.changed&&(t.needsRender=!0),t)))).subscribe(this._renderCameraOperation$)),this._renderFrameSubscribe();const o=this._render$.pipe(De((e=>t=>(t[e.name]=e.renderer,t)))),h=this._clear$.pipe(De((e=>t=>(delete t[e],t))));n.push(it(o,h).subscribe(this._renderOperation$)),this._webGLRenderer$=this._render$.pipe(St(),De((()=>{t.appendChild(e);const n=i.element,r=new hh({canvas:e});return r.setPixelRatio(window.devicePixelRatio),r.setSize(n.offsetWidth,n.offsetHeight),r.autoClear=!1,r})),Rt(1),U()),n.push(this._webGLRenderer$.subscribe((()=>{})));const c=this._webGLRenderer$.pipe(St(),De((e=>t=>(t.needsRender=!0,t.renderer=e,t)))),l=this._renderService.size$.pipe(De((e=>t=>(null==t.renderer||(t.renderer.setSize(e.width,e.height),t.needsRender=!0),t)))),u=this._clear$.pipe(De((()=>e=>(null==e.renderer||(e.needsRender=!0),e))));n.push(it(c,l,u).subscribe(this._rendererOperation$));const d=this._renderCollection$.pipe(st((e=>0===Object.keys(e).length)),Dt());n.push(d.subscribe((()=>{null!=this._renderFrameSubscription&&(this._renderFrameSubscription.unsubscribe(),this._renderFrameSubscription=null,this._renderFrameSubscribe())}))),n.push(d.pipe(De((()=>e=>(e.needsRender=!0,e)))).subscribe(this._eraserOperation$))}get render$(){return this._render$}get opaqueRender$(){return this._opaqueRender$}get webGLRenderer$(){return this._webGLRenderer$}clear(e){this._clear$.next(e)}remove(){this._rendererOperation$.next((e=>{if(null!=e.renderer){const t=e.renderer.getContext().getExtension("WEBGL_lose_context");t&&t.loseContext(),e.renderer=null}return e})),null!=this._renderFrameSubscription&&this._renderFrameSubscription.unsubscribe(),this._subscriptions.unsubscribe()}triggerRerender(){this._renderService.renderCameraFrame$.pipe($t(1),St()).subscribe((()=>{this._triggerOperation$.next((e=>(e.needsRender=!0,e)))}))}_renderFrameSubscribe(){this._render$.pipe(St(),De((()=>e=>(e.needsRender=!0,e)))).subscribe((e=>{this._renderCameraOperation$.next(e)})),this._renderFrameSubscription=this._render$.pipe(St(),We((()=>this._renderService.renderCameraFrame$))).subscribe(this._renderFrame$)}}class Nw{constructor(e){null!=e?(this._position=(new Ki).fromArray(e.unprojectSfM([0,0],0)),this._lookat=(new Ki).fromArray(e.unprojectSfM([0,0],10)),this._up=e.upVector(),this._focal=this._getFocal(e)):(this._position=new Ki(0,0,0),this._lookat=new Ki(1,0,0),this._up=new Ki(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(e){this._focal=e}lerpCameras(e,t,i){this._position.subVectors(t.position,e.position).multiplyScalar(i).add(e.position),this._lookat.subVectors(t.lookat,e.lookat).multiplyScalar(i).add(e.lookat),this._up.subVectors(t.up,e.up).multiplyScalar(i).add(e.up),this._focal=(1-i)*e.focal+i*t.focal}copy(e){this._position.copy(e.position),this._lookat.copy(e.lookat),this._up.copy(e.up),this._focal=e.focal}clone(){let e=new Nw;return e.position.copy(this._position),e.lookat.copy(this._lookat),e.up.copy(this._up),e.focal=this._focal,e}diff(e){let t=this._position.distanceToSquared(e.position),i=this._lookat.distanceToSquared(e.lookat),n=this._up.distanceToSquared(e.up),r=100*Math.abs(this._focal-e.focal);return Math.max(t,i,n,r)}_getFocal(e){return $u(e.cameraType)?.5/Math.tan(Math.PI/2):e.focal}}class $w{constructor(e,t,i){this._spatial=new Du,this._viewportCoords=new hf,this._size={width:e,height:t},this._initialFov=60,this._alpha=-1,this._stateTransitionAlpha=-1,this._stateTransitionFov=-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 Nw,this._perspective=new hs(this._initialFov,this._computeAspect(e,t),.1,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(e){e=Math.min(90,Math.max(0,e));const t=this._computeCurrentFov(0),i=1===this._alpha?t:this._interpolateFov(t,this._computePreviousFov(0),this._alpha),n=Math.tan(i/2*Math.PI/180),r=Math.tan(e/2*Math.PI/180);return Math.log(n/r)/Math.log(2)}setFrame(e){const t=e.state;if(t.state!==this._state){if(this._state=t.state,this._state!==Df.Custom&&(this.setRenderMode(this._renderMode),this.setSize(this._size)),this._state===Df.Earth){const e=this._fovToY(this._perspective.fov,this._zoom);this._stateTransitionFov=this._yToFov(e,0)}this._changed=!0}const i=t.currentImage.id,n=t.previousImage?t.previousImage.id:null;i!==this._currentImageId&&(this._currentImageId=i,this._currentSpherical=$u(t.currentTransform.cameraType),this._currentProjectedPoints=this._computeProjectedPoints(t.currentTransform),this._changed=!0),n!==this._previousImageId&&(this._previousImageId=n,this._previousSpherical=$u(t.previousTransform.cameraType),this._previousProjectedPoints=this._computeProjectedPoints(t.previousTransform),this._changed=!0);const r=t.zoom;r!==this._zoom&&(this._changed=!0),this._changed&&(this._currentFov=this._computeCurrentFov(r),this._previousFov=this._computePreviousFov(r));const s=t.alpha,a=t.stateTransitionAlpha;if(this._changed||s!==this._alpha||a!==this._stateTransitionAlpha){switch(this._alpha=s,this._stateTransitionAlpha=a,this._state){case Df.Earth:{const e=this._stateTransitionFov,i=this._focalToFov(t.camera.focal),n=Oi.lerp(e,i,a),s=this._fovToY(n,0);this._perspective.fov=this._yToFov(s,r);break}case Df.Custom:break;default:this._perspective.fov=this._interpolateFov(this._currentFov,this._previousFov,this._alpha),this._changed=!0}this._zoom=r,this._state!==Df.Custom&&this._perspective.updateProjectionMatrix()}const o=t.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(e.id)}setProjectionMatrix(e){this._perspective.fov=this._focalToFov(e[5]/2),this._perspective.projectionMatrix.fromArray(e),this._perspective.projectionMatrixInverse.copy(this._perspective.projectionMatrix).invert(),this._changed=!0}setRenderMode(e){this._renderMode=e,this._state!==Df.Custom&&(this._perspective.fov=this._computeFov(),this._perspective.updateProjectionMatrix(),this._changed=!0)}setSize(e){this._size=e,this._state!==Df.Custom&&(this._perspective.aspect=this._computeAspect(e.width,e.height),this._perspective.fov=this._computeFov(),this._perspective.updateProjectionMatrix(),this._changed=!0)}_computeAspect(e,t){return 0===e?0:e/t}_computeCurrentFov(e){return 0===this._perspective.aspect?0:this._currentImageId?this._currentSpherical?this._yToFov(1,e):this._computeVerticalFov(this._currentProjectedPoints,this._renderMode,e,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(e){return 0===this._perspective.aspect?0:this._currentImageId?this._previousImageId?this._previousSpherical?this._yToFov(1,e):this._computeVerticalFov(this._previousProjectedPoints,this._renderMode,e,this.perspective.aspect):this._currentFov:this._initialFov}_computeProjectedPoints(e){return zu(e,[[.5,0],[1,0]],[[.5,0],[0,.5]],100,this._viewportCoords)}_computeRequiredVerticalFov(e,t,i){const n=Math.max(e[0]/i,e[1]);return this._yToFov(n,t)}_computeRotation(e){let t=e.lookat.clone().sub(e.position),i=e.up.clone();return{phi:this._spatial.azimuthal(t.toArray(),i.toArray()),theta:Math.PI/2-this._spatial.angleToPlane(t.toArray(),[0,0,1])}}_computeVerticalFov(t,i,n,r){const s=t.map((e=>this._computeRequiredVerticalFov(e,n,r)));return i===e.RenderMode.Fill?.995*Math.min(...s):Math.max(...s)}_yToFov(e,t){return 2*Math.atan(e/Math.pow(2,t))*180/Math.PI}_focalToFov(e){return 2*Math.atan2(1,2*e)*180/Math.PI}_fovToY(e,t){return Math.pow(2,t)*Math.tan(Math.PI*e/360)}_interpolateFov(e,t,i){return i*e+(1-i)*t}_setFrameId(e){this._frameId=e,this._changed&&(this._changed=!1,this._changedForFrame=e)}}class kw{constructor(t,i,n,r){this._subscriptions=new rf,this._element=t,this._currentFrame$=i,this._spatial=new Du,n=null!=n?n:e.RenderMode.Fill,this._resize$=new j,this._projectionMatrix$=new j,this._renderCameraOperation$=new j,this._size$=new W({height:this._element.offsetHeight,width:this._element.offsetWidth});const s=this._subscriptions;s.push(this._resize$.pipe(De((()=>({height:this._element.offsetHeight,width:this._element.offsetWidth})))).subscribe(this._size$)),this._renderMode$=new W(n),this._renderCameraHolder$=this._renderCameraOperation$.pipe(Ot((e=>e)),Lt(((e,t)=>t(e)),null!=r?r:new $w(this._element.offsetWidth,this._element.offsetHeight,n)),Rt(1),U()),this._renderCameraFrame$=this._currentFrame$.pipe(Vt(this._renderCameraHolder$),Ut((([e,t])=>{t.setFrame(e)})),De((e=>e[1])),Rt(1),U()),this._renderCamera$=this._renderCameraFrame$.pipe(st((e=>e.changed)),Rt(1),U()),this._bearing$=this._renderCamera$.pipe(De((e=>{let t=this._spatial.radToDeg(this._spatial.azimuthalToBearing(e.rotation.phi));return this._spatial.wrap(t,0,360)})),Rt(1),U()),s.push(this._size$.pipe($t(1),De((e=>t=>(t.setSize(e),t)))).subscribe(this._renderCameraOperation$)),s.push(this._renderMode$.pipe($t(1),De((e=>t=>(t.setRenderMode(e),t)))).subscribe(this._renderCameraOperation$)),s.push(this._projectionMatrix$.pipe(De((e=>t=>(t.setProjectionMatrix(e),t)))).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 Ow{constructor(e){this._keyDown$=Qe(e,"keydown"),this._keyUp$=Qe(e,"keyup")}get keyDown$(){return this._keyDown$}get keyUp$(){return this._keyUp$}}const zw={0:1,2:2};class Fw{constructor(e,t,i,n){this._subscriptions=new rf;const r=this._subscriptions;this._activeSubject$=new W(!1),this._active$=this._activeSubject$.pipe(vt(),Rt(1),U()),this._claimMouse$=new j,this._claimWheel$=new j,this._deferPixelClaims$=new j,this._deferPixels$=this._deferPixelClaims$.pipe(Lt(((e,t)=>(null==t.deferPixels?delete e[t.name]:e[t.name]=t.deferPixels,e)),{}),De((e=>{let t=-1;for(const i in e){if(!e.hasOwnProperty(i))continue;const n=e[i];n>t&&(t=n)}return t})),Ot(-1),Rt(1),U()),r.push(this._deferPixels$.subscribe((()=>{}))),this._documentMouseMove$=Qe(n,"pointermove").pipe(st(this._isMousePen)),this._documentMouseUp$=Qe(n,"pointerup").pipe(st(this._isMousePen)),this._mouseDown$=Qe(t,"pointerdown").pipe(st(this._isMousePen)),this._mouseEnter$=Qe(t,"pointerenter").pipe(st(this._isMousePen)),this._mouseLeave$=Qe(t,"pointerleave").pipe(st(this._isMousePen)),this._mouseMove$=Qe(t,"pointermove").pipe(st(this._isMousePen)),this._mouseUp$=Qe(t,"pointerup").pipe(st(this._isMousePen)),this._mouseOut$=Qe(t,"pointerout").pipe(st(this._isMousePen)),this._mouseOver$=Qe(t,"pointerover").pipe(st(this._isMousePen)),this._domMouseDown$=Qe(i,"pointerdown").pipe(st(this._isMousePen)),this._domMouseMove$=Qe(i,"pointermove").pipe(st(this._isMousePen)),this._click$=Qe(t,"click"),this._contextMenu$=Qe(t,"contextmenu"),this._windowBlur$=Qe(window,"blur"),this._dblClick$=it(Qe(e,"click"),Qe(t,"dblclick")).pipe(ht(3,1),st((e=>{const i=e[0],n=e[1],r=e[2];return"click"===i.type&&"click"===n.type&&"dblclick"===r.type&&i.target.parentNode===t&&n.target.parentNode===t})),De((e=>e[2])),Dt()),r.push(it(this._domMouseDown$,this._domMouseMove$,this._dblClick$,this._contextMenu$).subscribe((e=>{e.preventDefault()}))),this._mouseWheel$=it(Qe(t,"wheel"),Qe(i,"wheel")).pipe(Dt()),this._consistentContextMenu$=it(this._mouseDown$,this._mouseMove$,this._mouseOut$,this._mouseUp$,this._contextMenu$).pipe(ht(3,1),st((e=>"pointerdown"===e[0].type&&"contextmenu"===e[1].type&&"pointerup"===e[2].type)),De((e=>e[1])),Dt());const s=it(this._windowBlur$,this._documentMouseMove$.pipe(st((e=>this._buttonReleased(e,0)))),this._documentMouseUp$.pipe(st((e=>0===this._mouseButton(e))))).pipe(Dt()),a=this._createMouseDragInitiate$(0,this._mouseDown$,s,!0).pipe(Dt());this._mouseDragStart$=this._createMouseDragStart$(a).pipe(Dt()),this._mouseDrag$=this._createMouseDrag$(a,s).pipe(Dt()),this._mouseDragEnd$=this._createMouseDragEnd$(this._mouseDragStart$,s).pipe(Dt());const o=this._createMouseDragInitiate$(0,this._domMouseDown$,s,!1).pipe(Dt());this._domMouseDragStart$=this._createMouseDragStart$(o).pipe(Dt()),this._domMouseDrag$=this._createMouseDrag$(o,s).pipe(Dt()),this._domMouseDragEnd$=this._createMouseDragEnd$(this._domMouseDragStart$,s).pipe(Dt());const h=it(this._windowBlur$,this._documentMouseMove$.pipe(st((e=>this._buttonReleased(e,2)))),this._documentMouseUp$.pipe(st((e=>2===this._mouseButton(e))))).pipe(Dt()),c=this._createMouseDragInitiate$(2,this._mouseDown$,h,!0).pipe(Dt());this._mouseRightDragStart$=this._createMouseDragStart$(c).pipe(Dt()),this._mouseRightDrag$=this._createMouseDrag$(c,h).pipe(Dt()),this._mouseRightDragEnd$=this._createMouseDragEnd$(this._mouseRightDragStart$,h).pipe(Dt()),this._proximateClick$=this._mouseDown$.pipe(zt((e=>this._click$.pipe(Ft(this._createDeferredMouseMove$(e,this._documentMouseMove$)),_t(1)))),Dt()),this._staticClick$=this._mouseDown$.pipe(zt((()=>this._click$.pipe(Ft(this._documentMouseMove$),_t(1)))),Dt()),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(Rt(1),U()),this._wheelOwner$=this._createOwner$(this._claimWheel$).pipe(Rt(1),U()),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(e,t){this._claimMouse$.next({name:e,zindex:t})}unclaimMouse(e){this._claimMouse$.next({name:e,zindex:null})}deferPixels(e,t){this._deferPixelClaims$.next({name:e,deferPixels:t})}undeferPixels(e){this._deferPixelClaims$.next({name:e,deferPixels:null})}claimWheel(e,t){this._claimWheel$.next({name:e,zindex:t})}unclaimWheel(e){this._claimWheel$.next({name:e,zindex:null})}filtered$(e,t){return this._filtered(e,t,this._mouseOwner$)}filteredWheel$(e,t){return this._filtered(e,t,this._wheelOwner$)}_createDeferredMouseMove$(e,t){return t.pipe(De((t=>{const i=t.clientX-e.clientX,n=t.clientY-e.clientY;return[t,Math.sqrt(i*i+n*n)]})),Vt(this._deferPixels$),st((([[,e],t])=>e>t)),De((([[e]])=>e)))}_createMouseDrag$(e,t){return e.pipe(De((([,e])=>e)),zt((e=>Ze(Ce(e),this._documentMouseMove$).pipe(Ft(t)))))}_createMouseDragEnd$(e,t){return e.pipe(zt((()=>t.pipe(St()))))}_createMouseDragStart$(e){return e.pipe(De((([e])=>e)))}_createMouseDragInitiate$(e,t,i,n){return t.pipe(st((t=>this._mouseButton(t)===e)),zt((e=>Ve(Ce(e),n?this._createDeferredMouseMove$(e,this._documentMouseMove$):this._documentMouseMove$).pipe(Ft(i),_t(1)))))}_createOwner$(e){return e.pipe(Lt(((e,t)=>(null==t.zindex?delete e[t.name]:e[t.name]=t.zindex,e)),{}),De((e=>{let t=null,i=-1;for(const n in e)e.hasOwnProperty(n)&&e[n]>i&&(i=e[n],t=n);return t})),Ot(null))}_filtered(e,t,i){return t.pipe(Vt(i),st((([,t])=>t===e)),De((([e])=>e)))}_mouseButton(e){const t="pointerdown"===e.type||"pointerup"===e.type,i=window.InstallTrigger;return t&&void 0!==i&&2===e.button&&e.ctrlKey&&window.navigator.platform.toUpperCase().indexOf("MAC")>=0?0:e.button}_buttonReleased(e,t){const i=zw[t];return void 0===e.buttons||(e.buttons&i)!==i}_isMousePen(e){const t=e.pointerType;return"mouse"===t||"pen"===t}}class Bw{set json(e){this._json=e}set image(e){this._image=e,this._texture=new Wi(this._image),this._texture.minFilter=Jt}get loaded(){return!(!this._image||!this._json)}getGLSprite(e){if(!this.loaded)throw new Error("Sprites cannot be retrieved before the atlas is loaded.");let t=this._json[e];if(!t)return console.warn("Sprite with key"+e+"does not exist in sprite definition."),new tr;let i=this._texture.clone();i.needsUpdate=!0;let n=this._image.width,r=this._image.height;i.offset.x=t.x/n,i.offset.y=(r-t.y-t.height)/r,i.repeat.x=t.width/n,i.repeat.y=t.height/r;let s=new ph({map:i});return new Eh(s)}getDOMSprite(t,i){if(!this.loaded)throw new Error("Sprites cannot be retrieved before the atlas is loaded.");null==i&&(i=e.Alignment.Center);let n=this._json[t];if(!n)return console.warn("Sprite with key"+t+"does not exist in sprite definition."),tf.h("div",{},[]);let r=n.y,s=n.x+n.width,a=n.y+n.height,o=n.x,h=-n.x,c=-n.y,l=this._image.height,u=this._image.width;switch(i){case e.Alignment.Bottom:case e.Alignment.Center:case e.Alignment.Top:h-=n.width/2;break;case e.Alignment.BottomLeft:case e.Alignment.Left:case e.Alignment.TopLeft:h-=n.width;break;case e.Alignment.BottomRight:case e.Alignment.Right:case e.Alignment.TopRight:}switch(i){case e.Alignment.Center:case e.Alignment.Left:case e.Alignment.Right:c-=n.height/2;break;case e.Alignment.Top:case e.Alignment.TopLeft:case e.Alignment.TopRight:c-=n.height;break;case e.Alignment.Bottom:case e.Alignment.BottomLeft:case e.Alignment.BottomRight:}let d=1/n.pixelRatio;r*=d,s*=d,a*=d,o*=d,h*=d,c*=d,l*=d,u*=d;let p={src:this._image.src,style:{clip:`rect(${r}px, ${s}px, ${a}px, ${o}px)`,height:`${l}px`,left:`${h}px`,position:"absolute",top:`${c}px`,width:`${u}px`}};return tf.h("img",p,[])}}class Uw{constructor(e){if(this._retina=window.devicePixelRatio>1,this._spriteAtlasOperation$=new j,this._spriteAtlas$=this._spriteAtlasOperation$.pipe(Ot((e=>e)),Lt(((e,t)=>t(e)),new Bw),Rt(1),U()),this._atlasSubscription=this._spriteAtlas$.subscribe((()=>{})),null==e)return;let t=this._retina?"@2x":"",i=new XMLHttpRequest;i.open("GET",e+t+".png",!0),i.responseType="arraybuffer",i.onload=()=>{let e=new Image;e.onload=()=>{this._spriteAtlasOperation$.next((t=>(t.image=e,t)))};let t=new Blob([i.response]);e.src=window.URL.createObjectURL(t)},i.onerror=i=>{console.error(new Error(`Failed to fetch sprite sheet (${e}${t}.png)`))},i.send();let n=new XMLHttpRequest;n.open("GET",e+t+".json",!0),n.responseType="text",n.onload=()=>{let e=JSON.parse(n.response);this._spriteAtlasOperation$.next((t=>(t.json=e,t)))},n.onerror=i=>{console.error(new Error(`Failed to fetch sheet (${e}${t}.json)`))},n.send()}get spriteAtlas$(){return this._spriteAtlas$}dispose(){this._atlasSubscription.unsubscribe()}}class Vw{constructor(e,t){this._subscriptions=new rf;const i=this._subscriptions;this._activeSubject$=new W(!1),this._active$=this._activeSubject$.pipe(vt(),Rt(1),U()),i.push(Qe(t,"touchmove").subscribe((e=>{e.preventDefault()}))),this._touchStart$=Qe(e,"touchstart"),this._touchMove$=Qe(e,"touchmove"),this._touchEnd$=Qe(e,"touchend"),this._touchCancel$=Qe(e,"touchcancel");const n=this._touchStart$.pipe(st((e=>1===e.touches.length&&1===e.targetTouches.length)),Dt());var r;this._doubleTap$=n.pipe((r=()=>n.pipe(St(),zt((()=>it(tt(300),n).pipe(_t(1))))),F((function(e,t){var i=null,n=null,s=function(){null==n||n.unsubscribe();var e=i;i=[],e&&t.next(e),_e(r()).subscribe(n=new B(t,s,w))};s(),e.subscribe(new B(t,(function(e){return null==i?void 0:i.push(e)}),(function(){i&&t.next(i),t.complete()}),void 0,(function(){return i=n=null})))}))),st((e=>2===e.length)),De((e=>e[e.length-1])),Dt()),i.push(this._doubleTap$.subscribe((e=>{e.preventDefault()}))),this._singleTouchMove$=this._touchMove$.pipe(st((e=>1===e.touches.length&&1===e.targetTouches.length)),Dt());let s=it(this._touchStart$,this._touchEnd$,this._touchCancel$).pipe(st((e=>1===e.touches.length&&1===e.targetTouches.length))),a=it(this._touchStart$,this._touchEnd$,this._touchCancel$).pipe(st((e=>e.touches.length>=1))),o=it(this._touchEnd$,this._touchCancel$).pipe(st((e=>0===e.touches.length)));this._singleTouchDragStart$=s.pipe(We((()=>this._singleTouchMove$.pipe(Ft(it(o,a)),_t(1))))),this._singleTouchDragEnd$=s.pipe(We((()=>it(o,a).pipe(St())))),this._singleTouchDrag$=s.pipe(zt((()=>this._singleTouchMove$.pipe($t(1),Ft(it(a,o))))));let h=it(this._touchStart$,this._touchEnd$,this._touchCancel$);this._pinchStart$=h.pipe(st((e=>2===e.touches.length&&2===e.targetTouches.length))),this._pinchEnd$=h.pipe(st((e=>2!==e.touches.length||2!==e.targetTouches.length))),this._pinchOperation$=new j,this._pinch$=this._pinchOperation$.pipe(Lt(((e,t)=>t(e)),{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 c=this._touchMove$.pipe(st((e=>2===e.touches.length&&2===e.targetTouches.length)),De((e=>t=>{let i=e.touches[0],n=e.touches[1],r=Math.min(i.clientX,n.clientX),s=Math.max(i.clientX,n.clientX),a=Math.min(i.clientY,n.clientY),o=r+(s-r)/2,h=a+(Math.max(i.clientY,n.clientY)-a)/2,c=o+i.pageX-i.clientX,l=h+i.pageY-i.clientY,u=o+i.screenX-i.clientX,d=h+i.screenY-i.clientY,p=Math.abs(i.clientX-n.clientX),m=Math.abs(i.clientY-n.clientY),f=Math.sqrt(p*p+m*m),g=f-t.distance;return{changeX:p-t.distanceX,changeY:m-t.distanceY,clientX:o,clientY:h,distance:f,distanceChange:g,distanceX:p,distanceY:m,originalEvent:e,pageX:c,pageY:l,screenX:u,screenY:d,touch1:i,touch2:n}}))).subscribe(this._pinchOperation$);i.push(c),this._pinchChange$=this._pinchStart$.pipe(zt((()=>this._pinch$.pipe($t(1),Ft(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 Hw{constructor(e){var t,i,n,r;const s=null!==(i=null===(t=null==e?void 0:e.url)||void 0===t?void 0:t.exploreHost)&&void 0!==i?i:"www.mapillary.com",a=`${null!==(r=null===(n=null==e?void 0:e.url)||void 0===n?void 0:n.scheme)&&void 0!==r?r:"https"}://${s}`;this._exploreUrl$=Ce(a);const o=!1!==(null==e?void 0:e.imageTiling);this._imageTiling$=Ce(o)}get exploreUrl$(){return this._exploreUrl$}get imageTiling$(){return this._imageTiling$}}class jw{constructor(e,t,i){var n;if(this._onWindowResize=()=>{this._trackResize&&this.renderService.resize$.next()},this._dom=null!=i?i:new og,"string"==typeof e.container){if(this._container=this._dom.document.getElementById(e.container),!this._container)throw new Error(`Container "${e.container}" not found.`)}else{if(!(e.container instanceof HTMLElement))throw new Error('Invalid type: "container" must be a String or HTMLElement.');this._container=e.container}this._trackResize=!1!==e.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 Hw(e),this.renderService=new kw(this._container,t.currentState$,e.renderMode),this.glRenderer=new Dw(this._canvas,this._canvasContainer,this.renderService),this.domRenderer=new Lw(this._domContainer,this.renderService,t.currentState$),this.keyboardService=new Ow(this._canvasContainer),this.mouseService=new Fw(this._container,this._canvasContainer,this._domContainer,document),this.touchService=new Vw(this._canvasContainer,this._domContainer),this.spriteService=new Uw(e.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(e){e.parentNode&&e.parentNode.removeChild(e)}}class Gw{constructor(e,t,i){this._graphService=e,this._stateService=t,this._api=i,this._subscriptions=new rf,this._started=!1,this._cellDepth=1}get started(){return this._started}configure(e){this._cellDepth=e?Math.max(1,Math.min(3,e.cellDepth)):1}start(){if(this._started)return;const e=this._subscriptions;e.push(this._stateService.currentState$.pipe(vt(void 0,(e=>e.state.currentImage.id)),De((e=>{const t=e.state,i=t.trajectory,n=i.map((e=>e.id)),r=i[i.length-1].sequenceId;return[n,t.currentImage.originalLngLat,r]})),ht(1,5),Vt(this._graphService.graphMode$),zt((([e,t])=>{const i=e[0][0],n=e[0][1],r=this._api.data.geometry,s=kg(r.lngLatToCellId(n),this._cellDepth,r),a=t===Nf.Sequence?e[0][2]:void 0;return this._graphService.uncache$(i,s,a)}))).subscribe((()=>{}))),e.push(this._graphService.graphMode$.pipe($t(1),Vt(this._stateService.currentState$),zt((([e,t])=>e===Nf.Sequence?this._keyToEdges(t.state.currentImage.id,(e=>e.sequenceEdges$)):ge(t.state.trajectory.map((e=>e.id)).slice(t.state.currentIndex)).pipe(We((e=>this._keyToEdges(e,(e=>e.spatialEdges$))),6))))).subscribe((()=>{}))),e.push(this._graphService.dataAdded$.pipe(Vt(this._stateService.currentId$),zt((([e,t])=>this._graphService.cacheImage$(t)))).subscribe((()=>{}))),this._started=!0}stop(){this._started&&(this._subscriptions.unsubscribe(),this._started=!1)}_keyToEdges(e,t){return this._graphService.cacheImage$(e).pipe(zt(t),St((e=>e.cached)),Pe(15e3),ct((t=>(console.error(`Failed to cache edges (${e}).`,t),ie()))))}}class Ww{constructor(){this._loadersSubject$=new j,this._loaders$=this._loadersSubject$.pipe(Lt(((e,t)=>(void 0!==t.task&&(e[t.task]=t.loading),e)),{}),Ot({}),Rt(1),U())}get loading$(){return this._loaders$.pipe(De((e=>{for(const t in e)if(e.hasOwnProperty(t)&&e[t])return!0;return!1})),ft(100),vt())}taskLoading$(e){return this._loaders$.pipe(De((t=>!!t[e])),ft(100),vt())}startLoading(e){this._loadersSubject$.next({loading:!0,task:e})}stopLoading(e){this._loadersSubject$.next({loading:!1,task:e})}}var qw;!function(e){e[e.Disabled=0]="Disabled",e[e.Enabled=1]="Enabled",e[e.Started=2]="Started"}(qw||(qw={}));class Xw{constructor(e,t,i,n,r,s){this._subscriptions=new rf,this._graphService=e,this._stateService=t,this._graphCalculator=null!=n?n:new Mu,this._spatial=null!=r?r:new Du,this._viewportCoords=null!=s?s:new hf,this._mode=!1!==i?qw.Enabled:qw.Disabled,this._panImagesSubject$=new j,this._panImages$=this._panImagesSubject$.pipe(Ot([]),Rt(1),U()),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===qw.Disabled&&(this._mode=qw.Enabled,this.start())}disable(){this._mode!==qw.Disabled&&(this.stop(),this._mode=qw.Disabled)}start(){if(this._mode!==qw.Enabled)return;const e=this._stateService.currentImage$.pipe(zt((e=>{if(!e.merged||$u(e.cameraType))return Ce([]);const t=Ce(e),i=this._graphCalculator.boundingBoxCorners(e.lngLat,20);return Ve(t,this._graphService.cacheBoundingBox$(i[0],i[1]).pipe(ct((t=>(console.error(`Failed to cache periphery bounding box (${e.id})`,t),ie()))),De((t=>{if($u(e.cameraType))return[];const i=[];for(const n of t)n.id!==e.id&&n.mergeId===e.mergeId&&($u(n.cameraType)||this._distance(n,e)>4||i.push(n));return i})))).pipe(Vt(this._stateService.reference$),De((([[e,t],i])=>{const n=this._spatial.viewingDirection(e.rotation),r=Ou({lat:e.lngLat.lat,lng:e.lngLat.lng,alt:e.computedAltitude},e.rotation,i),s=this._createTransform(e,r),a=this._spatial.wrap(this._spatial.azimuthal(n.toArray(),s.upVector().toArray()),0,2*Math.PI),o=this._computeProjectedPoints(s),h=this._computeHorizontalFov(o)/180*Math.PI,c=Math.PI/8;let l,u;for(const r of t){const t=Ou({lat:r.lngLat.lat,lng:r.lngLat.lng,alt:r.computedAltitude},r.rotation,i),s=this._createTransform(r,t),o=this._computeProjectedPoints(s),d=this._computeHorizontalFov(o)/180*Math.PI,p=this._spatial.viewingDirection(r.rotation),m=this._spatial.wrap(this._spatial.azimuthal(p.toArray(),s.upVector().toArray()),0,2*Math.PI),f=this._spatial.angleBetweenVector2(n.x,n.y,p.x,p.y);let g=Number.NEGATIVE_INFINITY;g=f>0?a>m?a-2*Math.PI+h/2-(m-d/2):a+h/2-(m-d/2):a<m?m+d/2-(a+2*Math.PI-h/2):m+d/2-(a-h/2);const _=Math.abs(d-g),v=this._distance(r,e)+Math.min(this._timeDifference(r,e),4)+20*Math.abs(g-c)+Math.min(5,1/Math.min(d/h,1))+(g>0?-2*_:0);g>0&&g<.5*h&&g<.5*d&&_>.5*h&&(f>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})),Ot([]))})));this._panImagesSubscription=this._stateService.currentState$.pipe(De((e=>e.state.imagesAhead>0)),vt(),zt((t=>t?Ce([]):e))).subscribe((e=>{this._panImagesSubject$.next(e)})),this._mode=qw.Started}stop(){this._mode===qw.Started&&(this._panImagesSubscription.unsubscribe(),this._panImagesSubject$.next([]),this._mode=qw.Enabled)}_distance(e,t){const[i,n,r]=_u(e.lngLat.lng,e.lngLat.lat,e.computedAltitude,t.lngLat.lng,t.lngLat.lat,t.computedAltitude);return Math.sqrt(i*i+n*n+r*r)}_timeDifference(e,t){return Math.abs(e.capturedAt-t.capturedAt)/2592e6}_createTransform(e,t){return new ug(e.exifOrientation,e.width,e.height,e.scale,e.rotation,t,e.assetsCached?e.image:void 0,void 0,e.cameraParameters,e.cameraType)}_computeProjectedPoints(e){return zu(e,[[1,0]],[[0,.5]],20,this._viewportCoords)}_computeHorizontalFov(e){const t=e.map((e=>this._coordToFov(e[0])));return Math.min(...t)}_coordToFov(e){return 2*Math.atan(e)*180/Math.PI}}class Zw{constructor(e){this._data=e}get data(){return this._data}getCoreImages$(e){return this._wrap$(this._data.getCoreImages(e))}getImages$(e){return this._wrap$(this._data.getImages(e))}getImageTiles$(e){return this._wrap$(this._data.getImageTiles(e))}getSequence$(e){return this._wrap$(this._data.getSequence(e))}getSpatialImages$(e){return this._wrap$(this._data.getSpatialImages(e))}setAccessToken(e){this._data.setAccessToken(e)}_wrap$(e){return k.create((t=>{e.then((e=>{t.next(e),t.complete()}),(e=>{t.error(e)}))}))}}class Yw{constructor(e){this._dataAdded$=new j,this._subscriptions=new rf,this._onDataAdded=e=>{this._graph$.pipe(St(),We((t=>t.updateCells$(e.cellIds).pipe(Ut((()=>{t.resetSpatialEdges()})))))).subscribe((e=>{this._dataAdded$.next(e)}))};const t=this._subscriptions;this._graph$=Ze(Ce(e),e.changed$).pipe(Rt(1),U()),t.push(this._graph$.subscribe((()=>{}))),this._graphMode=Nf.Spatial,this._graphModeSubject$=new j,this._graphMode$=this._graphModeSubject$.pipe(Ot(this._graphMode),Rt(1),U()),t.push(this._graphMode$.subscribe((()=>{}))),this._firstGraphSubjects$=[],this._initializeCacheSubscriptions=[],this._sequenceSubscriptions=[],this._spatialSubscriptions=[],e.api.data.on("datacreate",this._onDataAdded)}get dataAdded$(){return this._dataAdded$}get filter$(){return this._graph$.pipe(St(),We((e=>e.filter$)))}get graphMode$(){return this._graphMode$}cacheBoundingBox$(e,t){return this._graph$.pipe(St(),We((i=>i.cacheBoundingBox$(e,t))))}cacheCell$(e){return this._graph$.pipe(St(),We((t=>t.cacheCell$(e))))}cacheImage$(e){const t=new j;this._firstGraphSubjects$.push(t);const i=t.pipe(Rt(1),U()),n=i.pipe(De((t=>t.getNode(e))),We((e=>e.assetsCached?Ce(e):e.cacheAssets$())),Rt(1),U());let r;n.subscribe(void 0,(t=>{console.error(`Failed to cache image (${e}).`,t)})),r=this._graph$.pipe(St(),We((t=>t.isCachingFull(e)||!t.hasNode(e)?t.cacheFull$(e):t.isCachingFill(e)||!t.getNode(e).complete?t.cacheFill$(e):Ce(t))),Ut((t=>{if(!t.hasNode(e))throw new Bu(`Failed to cache image (${e})`);t.hasInitializedCache(e)||t.initializeCache(e)})),Mt((()=>{null!=r&&(this._removeFromArray(r,this._initializeCacheSubscriptions),this._removeFromArray(t,this._firstGraphSubjects$))}))).subscribe((e=>{t.next(e),t.complete()}),(e=>{t.error(e)})),r.closed||this._initializeCacheSubscriptions.push(r);const s=i.pipe(ct((()=>ie())),We((t=>t.isCachingNodeSequence(e)||!t.hasNodeSequence(e)?t.cacheNodeSequence$(e):Ce(t))),Rt(1),U());let a;if(a=s.pipe(Ut((t=>{t.getNode(e).sequenceEdges.cached||t.cacheSequenceEdges(e)})),Mt((()=>{null!=a&&this._removeFromArray(a,this._sequenceSubscriptions)}))).subscribe((()=>{}),(t=>{console.error(`Failed to cache sequence edges (${e}).`,t)})),a.closed||this._sequenceSubscriptions.push(a),this._graphMode===Nf.Spatial){let t;t=i.pipe(ct((()=>ie())),wt((t=>t.hasTiles(e)?ie():ge(t.cacheTiles$(e)).pipe(We((t=>t.pipe(We((t=>t.isCachingTiles(e)?ie():Ce(t))),ct((t=>(console.error(`Failed to cache tile data (${e}).`,t),ie()))))))))),Tt(1),We((t=>t.hasSpatialArea(e)?Ce(t):ge(t.cacheSpatialArea$(e)).pipe(We((t=>t.pipe(ct((t=>(console.error(`Failed to cache spatial images (${e}).`,t),ie()))))))))),Tt(1),We((t=>t.hasNodeSequence(e)?Ce(t):t.cacheNodeSequence$(e))),Ut((t=>{t.getNode(e).spatialEdges.cached||t.cacheSpatialEdges(e)})),Mt((()=>{null!=t&&this._removeFromArray(t,this._spatialSubscriptions)}))).subscribe((()=>{}),(t=>{const i=`Failed to cache spatial edges (${e}).`;console.error(i,t)})),t.closed||this._spatialSubscriptions.push(t)}return n.pipe(St((e=>e.assetsCached)))}cacheSequence$(e){return this._graph$.pipe(St(),We((t=>t.isCachingSequence(e)||!t.hasSequence(e)?t.cacheSequence$(e):Ce(t))),De((t=>t.getSequence(e))))}cacheSequenceImages$(e,t){return this._graph$.pipe(St(),We((t=>t.isCachingSequence(e)||!t.hasSequence(e)?t.cacheSequence$(e):Ce(t))),We((i=>i.isCachingSequenceNodes(e)||!i.hasSequenceNodes(e)?i.cacheSequenceNodes$(e,t):Ce(i))),De((t=>t.getSequence(e))))}dispose(){this._graph$.pipe(St()).subscribe((e=>{e.unsubscribe()})),this._subscriptions.unsubscribe()}setFilter$(e){return this._resetSubscriptions(this._spatialSubscriptions),this._graph$.pipe(St(),Ut((t=>{t.resetSpatialEdges(),t.setFilter(e)})),De((()=>{})))}setGraphMode(e){this._graphMode!==e&&(e===Nf.Sequence&&this._resetSubscriptions(this._spatialSubscriptions),this._graphMode=e,this._graphModeSubject$.next(this._graphMode))}reset$(e){return this._abortSubjects(this._firstGraphSubjects$),this._resetSubscriptions(this._initializeCacheSubscriptions),this._resetSubscriptions(this._sequenceSubscriptions),this._resetSubscriptions(this._spatialSubscriptions),this._graph$.pipe(St(),Ut((t=>{t.reset(e)})),De((()=>{})))}uncache$(e,t,i){return this._graph$.pipe(St(),Ut((n=>{n.uncache(e,t,i)})),De((()=>{})))}_abortSubjects(e){for(const t of e.slice())this._removeFromArray(t,e),t.error(new Error("Cache image request was aborted."))}_removeFromArray(e,t){const i=t.indexOf(e);-1!==i&&t.splice(i,1)}_resetSubscriptions(e){for(const t of e.slice())this._removeFromArray(t,e),t.closed||t.unsubscribe()}}class Jw{constructor(e){e.requestAnimationFrame?(this._cancelAnimationFrame=e.cancelAnimationFrame.bind(e),this._requestAnimationFrame=e.requestAnimationFrame.bind(e)):e.mozRequestAnimationFrame?(this._cancelAnimationFrame=e.mozCancelAnimationFrame.bind(e),this._requestAnimationFrame=e.mozRequestAnimationFrame.bind(e)):e.webkitRequestAnimationFrame?(this._cancelAnimationFrame=e.webkitCancelAnimationFrame.bind(e),this._requestAnimationFrame=e.webkitRequestAnimationFrame.bind(e)):e.msRequestAnimationFrame?(this._cancelAnimationFrame=e.msCancelAnimationFrame.bind(e),this._requestAnimationFrame=e.msRequestAnimationFrame.bind(e)):e.oRequestAnimationFrame?(this._cancelAnimationFrame=e.oCancelAnimationFrame.bind(e),this._requestAnimationFrame=e.oRequestAnimationFrame.bind(e)):(this._cancelAnimationFrame=e.clearTimeout.bind(e),this._requestAnimationFrame=t=>e.setTimeout(t,1e3/60))}get cancelAnimationFrame(){return this._cancelAnimationFrame}get requestAnimationFrame(){return this._requestAnimationFrame}}class Kw{constructor(e){this._spatial=new Du,this._referenceThreshold=.01,this._transitionMode=e.transitionMode,this._reference=e.reference,this._alpha=e.alpha,this._stateTransitionAlpha=0,this._camera=e.camera.clone(),this._zoom=e.zoom,this._currentIndex=e.currentIndex,this._trajectory=e.trajectory.slice(),this._trajectoryTransforms=[],this._trajectoryCameras=[];for(let e of this._trajectory){let t=this._imageToTranslation(e,this._reference),i=new ug(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 Nw(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 Nw,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 stateTransitionAlpha(){return this._getStateTransitionAlpha()}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(e){}moveTo(e){}rotate(e){}rotateUnbounded(e){}rotateWithoutInertia(e){}rotateBasic(e){}rotateBasicUnbounded(e){}rotateBasicWithoutInertia(e){}rotateToBasic(e){}setSpeed(e){}zoomIn(e,t){}update(e){}setCenter(e){}setZoom(e){}dolly(e){}orbit(e){}setViewMatrix(e){}truck(e){}append(e){if(e.length<1)throw Error("Trajectory can not be empty");this._currentIndex<0?this.set(e):(this._trajectory=this._trajectory.concat(e),this._appendToTrajectories(e))}prepend(e){if(e.length<1)throw Error("Trajectory can not be empty");this._trajectory=e.slice().concat(this._trajectory),this._currentIndex+=e.length,this._setCurrentImage(),this._setReference(this._currentImage)?this._setTrajectories():this._prependToTrajectories(e),this._setCurrentCamera()}remove(e){if(e<0)throw Error("n must be a positive integer");if(this._currentIndex-1<e)throw Error("Current and previous images can not be removed");for(let t=0;t<e;t++)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(e){this._setTrajectory(e),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(e){this._transitionMode=e}_getAlpha(){return 1}_getStateTransitionAlpha(){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===e.TransitionMode.Instantaneous||!(this._currentImage.merged&&this._previousImage.merged&&this._withinOriginalDistance()&&this._sameConnectedComponent()))}_setReference(e){return!(Math.abs(e.lngLat.lat-this.reference.lat)<this._referenceThreshold&&Math.abs(e.lngLat.lng-this.reference.lng)<this._referenceThreshold)&&(!(null!=this._previousImage&&!this._motionlessTransition())&&(this._reference.lat=e.lngLat.lat,this._reference.lng=e.lngLat.lng,this._reference.alt=e.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(e){if(e.length<1)throw new Lu("Trajectory can not be empty");null!=this._currentImage?(this._trajectory=[this._currentImage].concat(e),this._currentIndex=1):(this._trajectory=e.slice(),this._currentIndex=0)}_setTrajectories(){this._trajectoryTransforms.length=0,this._trajectoryCameras.length=0,this._appendToTrajectories(this._trajectory)}_appendToTrajectories(e){for(let t of e){if(!t.assetsCached)throw new Lu("Assets must be cached when image is added to trajectory");let e=this._imageToTranslation(t,this.reference),i=new ug(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 Nw(i))}}_prependToTrajectories(e){for(let t of e.reverse()){if(!t.assetsCached)throw new Lu("Assets must be cached when added to trajectory");let e=this._imageToTranslation(t,this.reference),i=new ug(t.exifOrientation,t.width,t.height,t.scale,t.rotation,e,t.image,void 0,t.cameraParameters,t.cameraType);this._trajectoryTransforms.unshift(i),this._trajectoryCameras.unshift(new Nw(i))}}_imageToTranslation(e,t){return Ou({alt:e.computedAltitude,lat:e.lngLat.lat,lng:e.lngLat.lng},e.rotation,t)}_sameConnectedComponent(){let e=this._currentImage,t=this._previousImage;return!!e&&!!t&&e.mergeId===t.mergeId}_withinOriginalDistance(){let e=this._currentImage,t=this._previousImage;return!e||!t||this._spatial.distanceFromLngLat(e.originalLngLat.lng,e.originalLngLat.lat,t.originalLngLat.lng,t.originalLngLat.lat)<25}}class Qw extends Kw{constructor(e){super(e)}setViewMatrix(e){const t=(new Rn).fromArray(e).invert().elements,i=new Ki(t[12],t[13],t[14]),n=new Ki(-t[8],-t[9],-t[10]),r=new Ki(t[4],t[5],t[6]),s=this._camera;s.position.copy(i),s.lookat.copy(i.clone().add(n)),s.up.copy(r);const a=.5/Math.tan(Math.PI/3);s.focal=a}}class eM extends Kw{constructor(e){super(e),this._transition=0;const t=this._camera.position.clone(),i=this._camera.lookat.clone().sub(t).normalize(),n=Math.sqrt(i.x*i.x+i.y*i.y),r=Math.atan2(i.z,n),s=new Ki;if(r>-Math.PI/45)s.copy(t),t.add(new Ki(i.x,i.y,0).multiplyScalar(-50)),t.z=30;else{const e=t.clone(),n=new Ki(0,0,1),r=new Ki(0,0,-2),a=(new Ki).subVectors(r,e).dot(n)/i.dot(n),o=1e4,h=e.clone().add(i.clone().multiplyScalar(Math.min(o,a)));s.copy(h);const c=t.clone().sub(h).normalize();t.copy(h.add(c.multiplyScalar(Math.max(50,c.length()))))}const a=this._camera.position.clone(),o=a.clone().add(i.clone().normalize().multiplyScalar(10)),h=this._camera.up.clone(),c=o.clone(),l=c.clone().add(i.clone().normalize().multiplyScalar(10)),u=h.clone(),d=t.clone(),p=s.clone(),m=new Ki(0,0,1),f=t.clone().add(p.clone().sub(d).normalize().multiplyScalar(-10)),g=p.clone(),_=m.clone();this._curveE=new dc([c,a,d,f]),this._curveL=new dc([l,o,p,g]),this._curveU=new dc([u,h,m,_]),this._zoom0=this._zoom,this._zoom1=0,this._camera.focal=.5/Math.tan(Math.PI/4)}get _isTransitioning(){return this._transition<1}dolly(e){if(this._isTransitioning)return;const t=this._camera,i=t.position.clone().sub(t.lookat),n=i.length()*Math.pow(2,-e),r=Math.max(1,Math.min(n,4e3));i.normalize(),i.multiplyScalar(r),t.position.copy(t.lookat).add(i)}orbit(e){if(this._isTransitioning)return;const t=this._camera,i=(new Ji).setFromUnitVectors(t.up,new Ki(0,0,1)),n=i.clone().invert(),r=t.position.clone().sub(t.lookat);r.applyQuaternion(i);const s=r.length();let a=Math.atan2(r.y,r.x);a+=e.phi;let o=Math.atan2(Math.sqrt(r.x*r.x+r.y*r.y),r.z);o+=e.theta;const h=Math.PI/36;o=Math.max(h,Math.min(Math.PI/2-h,o)),r.x=Math.sin(o)*Math.cos(a),r.y=Math.sin(o)*Math.sin(a),r.z=Math.cos(o),r.applyQuaternion(n),t.position.copy(t.lookat).add(r.multiplyScalar(s))}truck(e){if(this._isTransitioning)return;const t=this._camera;t.position.add((new Ki).fromArray(e)),t.lookat.add((new Ki).fromArray(e))}update(e){if(!this._isTransitioning)return;this._transition=Math.min(this._transition+2*e/3,1);const t=Oi.smootherstep(this._transition,0,1),i=(t+1)/3,n=this._curveE.getPoint(i),r=this._curveL.getPoint(i),s=this._curveU.getPoint(i);this._camera.position.copy(n),this._camera.lookat.copy(r),this._camera.up.copy(s),this._zoom=Oi.lerp(this._zoom0,this._zoom1,t),this._stateTransitionAlpha=t}_getStateTransitionAlpha(){return this._stateTransitionAlpha}}class tM{constructor(e,t){this._phi=e,this._theta=t}get phi(){return this._phi}set phi(e){this._phi=e}get theta(){return this._theta}set theta(e){this._theta=e}get isZero(){return 0===this._phi&&0===this._theta}copy(e){this._phi=e.phi,this._theta=e.theta}lerp(e,t){this._phi=(1-t)*this._phi+t*e.phi,this._theta=(1-t)*this._theta+t*e.theta}multiply(e){this._phi*=e,this._theta*=e}threshold(e){this._phi=Math.abs(this._phi)>e?this._phi:0,this._theta=Math.abs(this._theta)>e?this._theta:0}lengthSquared(){return this._phi*this._phi+this._theta*this._theta}reset(){this._phi=0,this._theta=0}}class iM extends Kw{constructor(e){super(e),this._animationSpeed=1/40,this._rotationDelta=new tM(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=e.zoom,this._minZoom=0,this._maxZoom=3,this._lookatDepth=10,this._desiredLookat=null,this._desiredCenter=null}rotate(e){null!=this._currentImage&&(0===e.phi&&0===e.theta||(this._desiredZoom=this._zoom,this._desiredLookat=null,this._requestedBasicRotation=null,null!=this._requestedRotationDelta?(this._requestedRotationDelta.phi=this._requestedRotationDelta.phi+e.phi,this._requestedRotationDelta.theta=this._requestedRotationDelta.theta+e.theta):this._requestedRotationDelta=new tM(e.phi,e.theta)))}rotateUnbounded(e){if(null==this._currentImage)return;if(this._requestedBasicRotation=null,this._requestedRotationDelta=null,this._applyRotation(e,this._currentCamera),this._applyRotation(e,this._previousCamera),!this._desiredLookat)return;const t=(new Ji).setFromUnitVectors(this._currentCamera.up,new Ki(0,0,1)),i=t.clone().invert(),n=(new Ki).copy(this._desiredLookat).sub(this._camera.position).applyQuaternion(t),r=n.length();let s=Math.atan2(n.y,n.x);s+=e.phi;let a=Math.atan2(Math.sqrt(n.x*n.x+n.y*n.y),n.z);a+=e.theta,a=Math.max(.1,Math.min(Math.PI-.1,a)),n.x=Math.sin(a)*Math.cos(s),n.y=Math.sin(a)*Math.sin(s),n.z=Math.cos(a),n.applyQuaternion(i),this._desiredLookat.copy(this._camera.position).add(n.multiplyScalar(r))}rotateWithoutInertia(e){if(null==this._currentImage)return;this._desiredZoom=this._zoom,this._desiredLookat=null,this._requestedBasicRotation=null,this._requestedRotationDelta=null;const t=Math.PI/(10*Math.pow(2,this._zoom)),i={phi:this._spatial.clamp(e.phi,-t,t),theta:this._spatial.clamp(e.theta,-t,t)};this._applyRotation(i,this._currentCamera),this._applyRotation(i,this._previousCamera)}rotateBasic(e){if(null!=this._currentImage)if(this._desiredZoom=this._zoom,this._desiredLookat=null,this._requestedRotationDelta=null,null!=this._requestedBasicRotation){this._requestedBasicRotation[0]+=e[0],this._requestedBasicRotation[1]+=e[1];let t=.05/Math.pow(2,this._zoom);this._requestedBasicRotation[0]=this._spatial.clamp(this._requestedBasicRotation[0],-t,t),this._requestedBasicRotation[1]=this._spatial.clamp(this._requestedBasicRotation[1],-t,t)}else this._requestedBasicRotation=e.slice()}rotateBasicUnbounded(e){null!=this._currentImage&&(null!=this._requestedBasicRotationUnbounded?(this._requestedBasicRotationUnbounded[0]+=e[0],this._requestedBasicRotationUnbounded[1]+=e[1]):this._requestedBasicRotationUnbounded=e.slice())}rotateBasicWithoutInertia(e){if(null==this._currentImage)return;this._desiredZoom=this._zoom,this._desiredLookat=null,this._requestedRotationDelta=null,this._requestedBasicRotation=null;const t=.05/Math.pow(2,this._zoom),i=e.slice();i[0]=this._spatial.clamp(i[0],-t,t),i[1]=this._spatial.clamp(i[1],-t,t),this._applyRotationBasic(i)}rotateToBasic(e){if(null==this._currentImage)return;this._desiredZoom=this._zoom,this._desiredLookat=null,e[0]=this._spatial.clamp(e[0],0,1),e[1]=this._spatial.clamp(e[1],0,1);let t=this.currentTransform.unprojectBasic(e,this._lookatDepth);this._currentCamera.lookat.fromArray(t)}zoomIn(e,t){if(null==this._currentImage)return;this._desiredZoom=Math.max(this._minZoom,Math.min(this._maxZoom,this._desiredZoom+e));let i=this.currentTransform.projectBasic(this._currentCamera.lookat.toArray()),n=i[0],r=i[1],s=Math.pow(2,this._zoom),a=Math.pow(2,this._desiredZoom),o=t[0],h=t[1];$u(this.currentTransform.cameraType)&&(o-n>.5?o-=1:n-o>.5&&(o=1+o));let c=o-s/a*(o-n),l=h-s/a*(h-r);$u(this._currentImage.cameraType)?(c=this._spatial.wrap(c+this._basicRotation[0],0,1),l=this._spatial.clamp(l+this._basicRotation[1],.05,.95)):(c=this._spatial.clamp(c,0,1),l=this._spatial.clamp(l,0,1)),this._desiredLookat=(new Ki).fromArray(this.currentTransform.unprojectBasic([c,l],this._lookatDepth))}setCenter(e){this._desiredLookat=null,this._requestedRotationDelta=null,this._requestedBasicRotation=null,this._desiredZoom=this._zoom;let t=[this._spatial.clamp(e[0],0,1),this._spatial.clamp(e[1],0,1)];if(null==this._currentImage)return void(this._desiredCenter=t);this._desiredCenter=null;let i=(new Ki).fromArray(this.currentTransform.unprojectBasic(t,this._lookatDepth)),n=null!=this.previousTransform?this.previousTransform:this.currentTransform,r=(new Ki).fromArray(n.unprojectBasic(t,this._lookatDepth));this._currentCamera.lookat.copy(i),this._previousCamera.lookat.copy(r)}setZoom(e){this._desiredLookat=null,this._requestedRotationDelta=null,this._requestedBasicRotation=null,this._zoom=this._spatial.clamp(e,this._minZoom,this._maxZoom),this._desiredZoom=this._zoom}_applyRotation(e,t){if(null==t)return;let i=(new Ji).setFromUnitVectors(t.up,new Ki(0,0,1)),n=i.clone().invert(),r=new Ki;r.copy(t.lookat).sub(t.position),r.applyQuaternion(i);let s=r.length(),a=Math.atan2(r.y,r.x);a+=e.phi;let o=Math.atan2(Math.sqrt(r.x*r.x+r.y*r.y),r.z);o+=e.theta,o=Math.max(.1,Math.min(Math.PI-.1,o)),r.x=Math.sin(o)*Math.cos(a),r.y=Math.sin(o)*Math.sin(a),r.z=Math.cos(o),r.applyQuaternion(n),t.lookat.copy(t.position).add(r.multiplyScalar(s))}_applyRotationBasic(e){let t=this._currentImage,i=null!=this._previousImage?this.previousImage:this.currentImage,n=this._currentCamera,r=this._previousCamera,s=this.currentTransform,a=null!=this.previousTransform?this.previousTransform:this.currentTransform,o=s.projectBasic(n.lookat.toArray()),h=a.projectBasic(r.lookat.toArray());$u(t.cameraType)?(o[0]=this._spatial.wrap(o[0]+e[0],0,1),o[1]=this._spatial.clamp(o[1]+e[1],.05,.95)):(o[0]=this._spatial.clamp(o[0]+e[0],0,1),o[1]=this._spatial.clamp(o[1]+e[1],0,1)),$u(i.cameraType)?(h[0]=this._spatial.wrap(h[0]+e[0],0,1),h[1]=this._spatial.clamp(h[1]+e[1],.05,.95)):(h[0]=this._spatial.clamp(h[0]+e[0],0,1),h[1]=this._spatial.clamp(o[1]+e[1],0,1));let c=s.unprojectBasic(o,this._lookatDepth);n.lookat.fromArray(c);let l=a.unprojectBasic(h,this._lookatDepth);r.lookat.fromArray(l)}_updateZoom(e){let t=this._desiredZoom-this._zoom,i=t>0?1:t<0?-1:0;0!==t&&(Math.abs(t)<.002?(this._zoom=this._desiredZoom,null!=this._desiredLookat&&(this._desiredLookat=null)):this._zoom+=i*Math.max(Math.abs(5*e*t),.002))}_updateLookat(e){if(null===this._desiredLookat)return;let t=this._desiredLookat.distanceToSquared(this._currentCamera.lookat);Math.abs(t)<1e-6?(this._currentCamera.lookat.copy(this._desiredLookat),this._desiredLookat=null):this._currentCamera.lookat.lerp(this._desiredLookat,5*e)}_updateRotation(){if(null!=this._requestedRotationDelta){let e=this._rotationDelta.lengthSquared();return this._requestedRotationDelta.lengthSquared()>e?this._rotationDelta.lerp(this._requestedRotationDelta,this._rotationIncreaseAlpha):this._rotationDelta.lerp(this._requestedRotationDelta,this._rotationDecreaseAlpha),void(this._requestedRotationDelta=null)}if(this._rotationDelta.isZero)return;const e=$u(this.currentImage.cameraType)?1:this._alpha;this._rotationDelta.multiply(this._rotationAcceleration*e),this._rotationDelta.threshold(this._rotationThreshold)}_updateRotationBasic(){if(null!=this._requestedBasicRotation){let e=this._basicRotation[0],t=this._basicRotation[1],i=this._requestedBasicRotation[0],n=this._requestedBasicRotation[1];return Math.abs(i)>Math.abs(e)?this._basicRotation[0]=(1-this._rotationIncreaseAlpha)*e+this._rotationIncreaseAlpha*i:this._basicRotation[0]=(1-this._rotationDecreaseAlpha)*e+this._rotationDecreaseAlpha*i,Math.abs(n)>Math.abs(t)?this._basicRotation[1]=(1-this._rotationIncreaseAlpha)*t+this._rotationIncreaseAlpha*n:this._basicRotation[1]=(1-this._rotationDecreaseAlpha)*t+this._rotationDecreaseAlpha*n,void(this._requestedBasicRotation=null)}if(null!=this._requestedBasicRotationUnbounded){let e=this._requestedBasicRotationUnbounded[0],t=this._requestedBasicRotationUnbounded[1];if(Math.abs(e)>0&&(this._basicRotation[0]=(1-this._unboundedRotationAlpha)*this._basicRotation[0]+this._unboundedRotationAlpha*e),Math.abs(t)>0&&(this._basicRotation[1]=(1-this._unboundedRotationAlpha)*this._basicRotation[1]+this._unboundedRotationAlpha*t),null!=this._desiredLookat){let i=this.currentTransform.projectBasic(this._desiredLookat.toArray());i[0]+=e,i[1]+=t,this._desiredLookat=(new Ki).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(){$u(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 e=(new Ki).fromArray(this.currentTransform.unprojectBasic(this._desiredCenter,this._lookatDepth)).sub(this._currentCamera.position);this._currentCamera.lookat.copy(this._currentCamera.position.clone().add(e)),this._previousCamera.lookat.copy(this._previousCamera.position.clone().add(e)),this._desiredCenter=null}_setDesiredZoom(){this._desiredZoom=$u(this._currentImage.cameraType)||null==this._previousImage?this._zoom:0}}class nM extends iM{constructor(e){super(e),this._adjustCameras(),this._motionless=this._motionlessTransition()}prepend(e){super.prepend(e),this._motionless=this._motionlessTransition()}set(e){super.set(e),this._motionless=this._motionlessTransition()}move(e){this._alpha=Math.max(0,Math.min(1,this._alpha+e))}moveTo(e){this._alpha=Math.max(0,Math.min(1,e))}update(e){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 t=this._animationSpeed*e/.1*6;this._updateZoom(t),this._updateLookat(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($u(this._currentImage.cameraType)){let e=this._camera.lookat.clone().sub(this._camera.position);this._currentCamera.lookat.copy(e.clone().add(this._currentCamera.position))}if($u(this._previousImage.cameraType)){let e=this._currentCamera.lookat.clone().sub(this._currentCamera.position);this._previousCamera.lookat.copy(e.clone().add(this._previousCamera.position))}}}}class rM extends iM{constructor(e){super(e),this._adjustCameras(),this._motionless=this._motionlessTransition(),this._baseAlpha=this._alpha,this._speedCoefficient=1,this._smoothing=!1}append(e){let t=0===this._trajectory.length;t&&this._resetTransition(),super.append(e),t&&(this._setDesiredCenter(),this._setDesiredZoom())}prepend(e){let t=0===this._trajectory.length;t&&this._resetTransition(),super.prepend(e),t&&(this._setDesiredCenter(),this._setDesiredZoom())}set(e){super.set(e),this._desiredLookat=null,this._resetTransition(),this._clearRotation(),this._setDesiredCenter(),this._setDesiredZoom(),this._trajectory.length<3&&(this._smoothing=!0)}setSpeed(e){this._speedCoefficient=this._spatial.clamp(e,0,10)}update(e){1===this._alpha&&this._currentIndex+this._alpha<this._trajectory.length&&(this._currentIndex+=1,this._smoothing=this._trajectory.length<3&&this._currentIndex+1===this._trajectory.length,this._setCurrent(),this._resetTransition(),this._clearRotation(),this._desiredZoom=$u(this._currentImage.cameraType)?this._zoom:0,this._desiredLookat=null);let t=this._animationSpeed*e/.1*6;this._baseAlpha=Math.min(1,this._baseAlpha+this._speedCoefficient*t),this._smoothing?this._alpha=Oi.smootherstep(this._baseAlpha,0,1):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(t),this._updateLookat(t),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 e=this._camera.lookat.clone().sub(this._camera.position);this._previousCamera.lookat.copy(e.clone().add(this._previousCamera.position)),$u(this._currentImage.cameraType)&&this._currentCamera.lookat.copy(e.clone().add(this._currentCamera.position))}_resetTransition(){this._alpha=0,this._baseAlpha=0,this._motionless=this._motionlessTransition()}}class sM extends Kw{constructor(e){super(e),this._zoom=0,this._adjustCameras(),this._motionless=this._motionlessTransition()}prepend(e){super.prepend(e),this._motionless=this._motionlessTransition()}set(e){super.set(e),this._motionless=this._motionlessTransition()}move(e){this._alpha=Math.max(0,Math.min(1,this._alpha+e))}moveTo(e){this._alpha=Math.max(0,Math.min(1,e))}update(){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($u(this._currentImage.cameraType)){let e=this._camera.lookat.clone().sub(this._camera.position);this._currentCamera.lookat.copy(e.clone().add(this._currentCamera.position))}if($u(this._previousImage.cameraType)){let e=this._currentCamera.lookat.clone().sub(this._currentCamera.position);this._previousCamera.lookat.copy(e.clone().add(this._previousCamera.position))}}}}class aM{constructor(){const e=Df[Df.Custom],t=Df[Df.Earth],i=Df[Df.Traversing],n=Df[Df.Waiting],r=Df[Df.WaitingInteractively];this._creators=new Map;const s=this._creators;s.set(e,Qw),s.set(t,eM),s.set(i,rM),s.set(n,sM),s.set(r,nM),this._transitions=new Map;const a=this._transitions;a.set(e,[t,i]),a.set(t,[e,i]),a.set(i,[e,t,n,r]),a.set(n,[i,r]),a.set(r,[i,n])}getState(e){if(e instanceof Qw)return Df.Custom;if(e instanceof eM)return Df.Earth;if(e instanceof rM)return Df.Traversing;if(e instanceof sM)return Df.Waiting;if(e instanceof nM)return Df.WaitingInteractively;throw new Error("Invalid state instance")}generate(e,t){return new(this._creators.get(Df[e]))(t)}transition(e,t){if(!this.validate(e,t))throw new Error("Invalid transition");return this.generate(t,e)}validate(e,t){const i=Df[this.getState(e)],n=Df[t],r=this._transitions;return r.has(i)&&r.get(i).includes(n)}}class oM{constructor(t,i){this._transitions=new aM,this._state=this._transitions.generate(t,{alpha:1,camera:new Nw,currentIndex:-1,reference:{alt:0,lat:0,lng:0},trajectory:[],transitionMode:null==i?e.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 stateTransitionAlpha(){return this._state.stateTransitionAlpha}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(Df.Custom)}earth(){this._transition(Df.Earth)}traverse(){this._transition(Df.Traversing)}wait(){this._transition(Df.Waiting)}waitInteractively(){this._transition(Df.WaitingInteractively)}getCenter(){return this._state.getCenter()}setCenter(e){this._state.setCenter(e)}setZoom(e){this._state.setZoom(e)}update(e){this._state.update(e)}append(e){this._state.append(e)}prepend(e){this._state.prepend(e)}remove(e){this._state.remove(e)}clear(){this._state.clear()}clearPrior(){this._state.clearPrior()}cut(){this._state.cut()}set(e){this._state.set(e)}setViewMatrix(e){this._state.setViewMatrix(e)}rotate(e){this._state.rotate(e)}rotateUnbounded(e){this._state.rotateUnbounded(e)}rotateWithoutInertia(e){this._state.rotateWithoutInertia(e)}rotateBasic(e){this._state.rotateBasic(e)}rotateBasicUnbounded(e){this._state.rotateBasicUnbounded(e)}rotateBasicWithoutInertia(e){this._state.rotateBasicWithoutInertia(e)}rotateToBasic(e){this._state.rotateToBasic(e)}move(e){this._state.move(e)}moveTo(e){this._state.moveTo(e)}zoomIn(e,t){this._state.zoomIn(e,t)}setSpeed(e){this._state.setSpeed(e)}setTransitionMode(e){this._state.setTransitionMode(e)}dolly(e){this._state.dolly(e)}orbit(e){this._state.orbit(e)}truck(e){this._state.truck(e)}_transition(e){if(!this._transitions.validate(this._state,e)){const t=this._transitions.getState(this._state);return void console.warn(`Transition not valid (${Df[t]} - ${Df[e]})`)}const t=this._transitions.transition(this._state,e);this._state=t}}class hM{constructor(e,t){this._appendImage$=new j,this._clock=new jl,this._subscriptions=new rf;const i=this._subscriptions;this._start$=new j,this._frame$=new j,this._contextOperation$=new W((e=>e)),this._context$=this._contextOperation$.pipe(Lt(((e,t)=>t(e)),new oM(e,t)),Rt(1),U()),this._state$=this._context$.pipe(De((e=>e.state)),vt(),Rt(1),U()),this._currentState$=this._frame$.pipe(Vt(this._context$,((e,t)=>[e,t])),st((e=>null!=e[1].currentImage)),Ut((e=>{e[1].update(this._clock.getDelta())})),De((e=>({fps:60,id:e[0],state:e[1]}))),Dt()),this._lastState$=this._currentState$.pipe(Rt(1),U());let n=this._currentState$.pipe(vt(void 0,(e=>e.state.currentImage.id)),Rt(1),U()),r=new j;i.push(n.subscribe(r)),this._currentId$=new W(null),i.push(r.pipe(De((e=>e.state.currentImage.id))).subscribe(this._currentId$)),this._currentImage$=r.pipe(De((e=>e.state.currentImage)),Rt(1),U()),this._currentCamera$=r.pipe(De((e=>e.state.currentCamera)),Rt(1),U()),this._currentTransform$=r.pipe(De((e=>e.state.currentTransform)),Rt(1),U()),this._reference$=r.pipe(De((e=>e.state.reference)),vt(((e,t)=>e.lat===t.lat&&e.lng===t.lng),(e=>({lat:e.lat,lng:e.lng}))),Rt(1),U()),this._currentImageExternal$=n.pipe(De((e=>e.state.currentImage)),Rt(1),U()),i.push(this._appendImage$.pipe(De((e=>t=>(t.append([e]),t)))).subscribe(this._contextOperation$)),this._inMotionOperation$=new j,i.push(n.pipe(De((()=>!0))).subscribe(this._inMotionOperation$)),i.push(this._inMotionOperation$.pipe(vt(),st((e=>e)),zt((()=>this._currentState$.pipe(st((e=>0===e.state.imagesAhead)),De((e=>[e.state.camera.clone(),e.state.zoom])),At(),De((e=>{let t=e[0][0],i=e[1][0],n=e[0][1],r=e[1][1];return t.diff(i)>1e-5||Math.abs(n-r)>1e-5})),St((e=>!e)))))).subscribe(this._inMotionOperation$)),this._inMotion$=this._inMotionOperation$.pipe(vt(),Rt(1),U()),this._inTranslationOperation$=new j,i.push(n.pipe(De((()=>!0))).subscribe(this._inTranslationOperation$)),i.push(this._inTranslationOperation$.pipe(vt(),st((e=>e)),zt((()=>this._currentState$.pipe(st((e=>0===e.state.imagesAhead)),De((e=>e.state.camera.position.clone())),At(),De((e=>0!==e[0].distanceToSquared(e[1]))),St((e=>!e)))))).subscribe(this._inTranslationOperation$)),this._inTranslation$=this._inTranslationOperation$.pipe(vt(),Rt(1),U()),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 Jw(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((e=>{e.custom()}))}earth(){this._inMotionOperation$.next(!0),this._invokeContextOperation((e=>{e.earth()}))}traverse(){this._inMotionOperation$.next(!0),this._invokeContextOperation((e=>{e.traverse()}))}wait(){this._invokeContextOperation((e=>{e.wait()}))}waitInteractively(){this._invokeContextOperation((e=>{e.waitInteractively()}))}appendImagess(e){this._invokeContextOperation((t=>{t.append(e)}))}prependImages(e){this._invokeContextOperation((t=>{t.prepend(e)}))}removeImages(e){this._invokeContextOperation((t=>{t.remove(e)}))}clearImages(){this._invokeContextOperation((e=>{e.clear()}))}clearPriorImages(){this._invokeContextOperation((e=>{e.clearPrior()}))}cutImages(){this._invokeContextOperation((e=>{e.cut()}))}setImages(e){this._invokeContextOperation((t=>{t.set(e)}))}setViewMatrix(e){this._inMotionOperation$.next(!0),this._invokeContextOperation((t=>{t.setViewMatrix(e)}))}rotate(e){this._inMotionOperation$.next(!0),this._invokeContextOperation((t=>{t.rotate(e)}))}rotateUnbounded(e){this._inMotionOperation$.next(!0),this._invokeContextOperation((t=>{t.rotateUnbounded(e)}))}rotateWithoutInertia(e){this._inMotionOperation$.next(!0),this._invokeContextOperation((t=>{t.rotateWithoutInertia(e)}))}rotateBasic(e){this._inMotionOperation$.next(!0),this._invokeContextOperation((t=>{t.rotateBasic(e)}))}rotateBasicUnbounded(e){this._inMotionOperation$.next(!0),this._invokeContextOperation((t=>{t.rotateBasicUnbounded(e)}))}rotateBasicWithoutInertia(e){this._inMotionOperation$.next(!0),this._invokeContextOperation((t=>{t.rotateBasicWithoutInertia(e)}))}rotateToBasic(e){this._inMotionOperation$.next(!0),this._invokeContextOperation((t=>{t.rotateToBasic(e)}))}move(e){this._inMotionOperation$.next(!0),this._invokeContextOperation((t=>{t.move(e)}))}moveTo(e){this._inMotionOperation$.next(!0),this._invokeContextOperation((t=>{t.moveTo(e)}))}dolly(e){this._inMotionOperation$.next(!0),this._invokeContextOperation((t=>{t.dolly(e)}))}orbit(e){this._inMotionOperation$.next(!0),this._invokeContextOperation((t=>{t.orbit(e)}))}truck(e){this._inMotionOperation$.next(!0),this._invokeContextOperation((t=>{t.truck(e)}))}zoomIn(e,t){this._inMotionOperation$.next(!0),this._invokeContextOperation((i=>{i.zoomIn(e,t)}))}getCenter(){return this._lastState$.pipe(St(),De((e=>e.state.getCenter())))}getZoom(){return this._lastState$.pipe(St(),De((e=>e.state.zoom)))}setCenter(e){this._inMotionOperation$.next(!0),this._invokeContextOperation((t=>{t.setCenter(e)}))}setSpeed(e){this._invokeContextOperation((t=>{t.setSpeed(e)}))}setTransitionMode(e){this._invokeContextOperation((t=>{t.setTransitionMode(e)}))}setZoom(e){this._inMotionOperation$.next(!0),this._invokeContextOperation((t=>{t.setZoom(e)}))}start(){this._clock.start(),null==this._frameId&&(this._start$.next(null),this._frameId=this._frameGenerator.requestAnimationFrame(this._frame.bind(this)),this._frame$.next(this._frameId))}stop(){this._clock.stop(),null!=this._frameId&&(this._frameGenerator.cancelAnimationFrame(this._frameId),this._frameId=null)}_invokeContextOperation(e){this._contextOperation$.next((t=>(e(t),t)))}_frame(){this._frameId=this._frameGenerator.requestAnimationFrame(this._frame.bind(this)),this._frame$.next(this._frameId)}}function cM(t){switch(t){case e.CameraControls.Custom:return Df.Custom;case e.CameraControls.Earth:return Df.Earth;case e.CameraControls.Street:return Df.Traversing;default:return null}}class lM{constructor(t,i,n,r,s,a,o,h){var c;i?this._api=i:t.dataProvider?this._api=new Zw(t.dataProvider):this._api=new Zw(new Mw({accessToken:t.accessToken})),this._graphService=null!=n?n:new Yw(new Uu(this.api)),this._loadingName="navigator",this._loadingService=null!=r?r:new Ww;const l=null!==(c=t.cameraControls)&&void 0!==c?c:e.CameraControls.Street;this._stateService=null!=s?s:new hM(cM(l),t.transitionMode),this._cacheService=null!=a?a:new Gw(this._graphService,this._stateService,this._api),this._playService=null!=o?o:new fg(this._graphService,this._stateService),this._panService=null!=h?h:new Xw(this._graphService,this._stateService,t.combinedPanning),this._idRequested$=new W(null),this._movedToId$=new W(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$(e){this._abortRequest(`to id ${e}`),this._loadingService.startLoading(this._loadingName);const t=this._moveTo$(e);return this._makeRequest$(t)}moveDir$(t){this._abortRequest(`in dir ${e.NavigationDirection[t]}`),this._loadingService.startLoading(this._loadingName);const i=this.stateService.currentImage$.pipe(St(),We((i=>([e.NavigationDirection.Next,e.NavigationDirection.Prev].indexOf(t)>-1?i.sequenceEdges$:i.spatialEdges$).pipe(St(),De((e=>{for(let i of e.edges)if(i.data.direction===t)return i.target;return null}))))),We((e=>null==e?(this._loadingService.stopLoading(this._loadingName),Ee(new Error(`Direction (${t}) does not exist for current image.`))):this._moveTo$(e))));return this._makeRequest$(i)}setFilter$(e){return this._stateService.clearImages(),this._movedToId$.pipe(St(),We((t=>null!=t?this._trajectoryIds$().pipe(We((t=>this._graphService.setFilter$(e).pipe(We((()=>this._cacheIds$(t)))))),Ct()):this._idRequested$.pipe(St(),We((t=>null!=t?this._graphService.setFilter$(e).pipe(We((()=>this._graphService.cacheImage$(t)))):this._graphService.setFilter$(e).pipe(De((()=>{})))))))),De((()=>{})))}setAccessToken$(e){return this._abortRequest("to set user token"),this._stateService.clearImages(),this._movedToId$.pipe(St(),Ut((()=>{this._api.setAccessToken(e)})),We((e=>null==e?this._graphService.reset$([]):this._trajectoryIds$().pipe(We((e=>this._graphService.reset$(e).pipe(We((()=>this._cacheIds$(e)))))),Ct(),De((()=>{}))))))}_cacheIds$(e){return ge(e.map((e=>this._graphService.cacheImage$(e)))).pipe(qe())}_abortRequest(e){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 uf(`Request aborted by a subsequent request ${e}.`)),this._request$=null)}_makeRequest$(e){const t=new X(1);return this._requestSubscription=t.subscribe(void 0,(()=>{})),this._request$=t,this._imageRequestSubscription=e.subscribe((e=>{this._request$=null,t.next(e),t.complete()}),(e=>{this._request$=null,t.error(e)})),t}_moveTo$(e){return this._idRequested$.next(e),this._graphService.cacheImage$(e).pipe(Ut((e=>{this._stateService.setImages([e]),this._movedToId$.next(e.id)})),Mt((()=>{this._loadingService.stopLoading(this._loadingName)})))}_trajectoryIds$(){return this._stateService.currentState$.pipe(St(),De((e=>e.state.trajectory.map((e=>e.id)))))}}class uM{constructor(e,t){this._spatial=null!=t?t:new Du,this._viewportCoords=null!=e?e:new hf}basicToCanvas(e,t,i,n){return this._viewportCoords.basicToCanvasSafe(e[0],e[1],t,n,i.perspective)}canvasToBasic(e,t,i,n){let r=this._viewportCoords.canvasToBasic(e[0],e[1],t,n,i.perspective);return(r[0]<0||r[0]>1||r[1]<0||r[1]>1)&&(r=null),r}eventToUnprojection(e,t,i,n,r){const s=this._viewportCoords.canvasPosition(e,t);return this.canvasToUnprojection(s,t,i,n,r)}canvasToUnprojection(e,t,i,n,r){const s=e[0],a=e[1],[o,h]=this._viewportCoords.canvasToViewport(s,a,t),c=new Ki(o,h,1).unproject(i.perspective);let l=r.projectBasic(c.toArray());(l[0]<0||l[0]>1||l[1]<0||l[1]>1)&&(l=null);const u=c.clone().sub(i.camera.position).normalize(),d=-2/u.z;let p=null;if(d>0&&d<100&&l){const e=u.clone().multiplyScalar(d).add(i.camera.position),[t,r]=vu(e.x,e.y,e.z,n.lng,n.lat,n.alt);p={lat:r,lng:t}}return{basicPoint:l,lngLat:p,pixelPoint:[s,a]}}cameraToLngLat(e,t){const i=e.camera.position,[n,r]=vu(i.x,i.y,i.z,t.lng,t.lat,t.alt);return{lat:r,lng:n}}lngLatToCanvas(e,t,i,n){const r=_u(e.lng,e.lat,0,n.lng,n.lat,n.alt);return this._viewportCoords.projectToCanvasSafe(r,t,i.perspective)}distanceBetweenLngLats(e,t){return this._spatial.distanceFromLngLat(e.lng,e.lat,t.lng,t.lat)}}class dM{constructor(e,t,i){this._subscriptions=new rf,this._emitSubscriptions=new rf,this._container=i,this._viewer=e,this._navigator=t,this._projection=new uM,this._started=!1,this._navigable$=new j;const n=this._subscriptions;n.push(this._navigable$.subscribe((e=>{const t="navigable",i={navigable:e,target:this._viewer,type:t};this._viewer.fire(t,i)}))),n.push(this._navigator.loadingService.loading$.subscribe((e=>{const t="dataloading",i={loading:e,target:this._viewer,type:t};this._viewer.fire(t,i)}))),n.push(this._container.glRenderer.opaqueRender$.pipe(St()).subscribe((()=>{const e="load",t={target:this._viewer,type:e};this._viewer.fire(e,t)})))}get started(){return this._started}get navigable$(){return this._navigable$}get projection(){return this._projection}dispose(){this.stopEmit(),this._subscriptions.unsubscribe()}project$(e){return Ve(this._container.renderService.renderCamera$,this._navigator.stateService.currentImage$,this._navigator.stateService.reference$).pipe(St(),De((([t,i,n])=>{if(this._projection.distanceBetweenLngLats(e,i.lngLat)>1e3)return null;const r=this._projection.lngLatToCanvas(e,this._container.container,t,n);return r?[Math.round(r[0]),Math.round(r[1])]:null})))}projectBasic$(e){return Ve(this._container.renderService.renderCamera$,this._navigator.stateService.currentTransform$).pipe(St(),De((([t,i])=>{const n=this._projection.basicToCanvas(e,this._container.container,t,i);return n?[Math.round(n[0]),Math.round(n[1])]:null})))}startEmit(){if(this._started)return;this._started=!0;const e=this._emitSubscriptions;e.push(this._navigator.stateService.currentImageExternal$.subscribe((e=>{const t="image",i={image:e,target:this._viewer,type:t};this._viewer.fire(t,i)}))),e.push(this._navigator.stateService.currentImageExternal$.pipe(zt((e=>e.sequenceEdges$))).subscribe((e=>{const t="sequenceedges",i={status:e,target:this._viewer,type:t};this._viewer.fire(t,i)}))),e.push(this._navigator.stateService.currentImageExternal$.pipe(zt((e=>e.spatialEdges$))).subscribe((e=>{const t="spatialedges",i={status:e,target:this._viewer,type:t};this._viewer.fire(t,i)}))),e.push(this._navigator.stateService.reference$.subscribe((e=>{const t="reference",i={reference:e,target:this._viewer,type:t};this._viewer.fire(t,i)}))),e.push(Ve(this._navigator.stateService.inMotion$,this._container.mouseService.active$,this._container.touchService.active$).pipe(De((e=>e[0]||e[1]||e[2])),vt()).subscribe((e=>{const t=e?"movestart":"moveend",i={target:this._viewer,type:t};this._viewer.fire(t,i)}))),e.push(this._container.renderService.bearing$.pipe(ot(100),vt(((e,t)=>Math.abs(t-e)<1))).subscribe((e=>{const t="bearing",i={bearing:e,target:this._viewer,type:t};this._viewer.fire(t,i)})));const t=this._container.mouseService.active$.pipe(zt((e=>e?ie():this._container.mouseService.mouseMove$)));e.push(it(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",t),this._mapMouseEvent$("mouseout",this._container.mouseService.mouseOut$),this._mapMouseEvent$("mouseover",this._container.mouseService.mouseOver$),this._mapMouseEvent$("mouseup",this._container.mouseService.mouseUp$)).pipe(Vt(this._container.renderService.renderCamera$,this._navigator.stateService.reference$,this._navigator.stateService.currentTransform$,this._navigator.stateService.state$),De((([[e,t],i,n,r,s])=>{const a=this._projection.eventToUnprojection(t,this._container.container,i,n,r);return{basicPoint:s===Df.Traversing?a.basicPoint:null,lngLat:a.lngLat,originalEvent:t,pixelPoint:a.pixelPoint,target:this._viewer,type:e}}))).subscribe((e=>{this._viewer.fire(e.type,e)}))),e.push(this._container.renderService.renderCamera$.pipe(vt((([e,t],[i,n])=>this._closeTo(e,i,.01)&&this._closeTo(t,n,.01)),(e=>e.camera.position.toArray()))).subscribe((()=>{const e="position",t={target:this._viewer,type:e};this._viewer.fire(e,t)}))),e.push(this._container.renderService.renderCamera$.pipe(vt((([e,t],[i,n])=>this._closeTo(e,i,.001)&&this._closeTo(t,n,.001)),(e=>[e.rotation.phi,e.rotation.theta]))).subscribe((()=>{const e={target:this._viewer,type:"pov"};this._viewer.fire("pov",e)}))),e.push(this._container.renderService.renderCamera$.pipe(vt(((e,t)=>this._closeTo(e,t,.01)),(e=>e.perspective.fov))).subscribe((()=>{const e={target:this._viewer,type:"fov"};this._viewer.fire("fov",e)})))}stopEmit(){this.started&&(this._emitSubscriptions.unsubscribe(),this._started=!1)}unproject$(e){return Ve(this._container.renderService.renderCamera$,this._navigator.stateService.reference$,this._navigator.stateService.currentTransform$).pipe(St(),De((([t,i,n])=>this._projection.canvasToUnprojection(e,this._container.container,t,i,n).lngLat)))}unprojectBasic$(e){return Ve(this._container.renderService.renderCamera$,this._navigator.stateService.currentTransform$).pipe(St(),De((([t,i])=>this._projection.canvasToBasic(e,this._container.container,t,i))))}_closeTo(e,t,i){return Math.abs(e-t)<=i}_mapMouseEvent$(e,t){return t.pipe(De((t=>[e,t])))}}class pM{constructor(e,t){this._container=e,this._navigator=t,this._renderers={}}add(e,t){const i=new rf;this._renderers[e.id]={subs:i,renderer:e},i.push(Ve([this._container.glRenderer.webGLRenderer$,this._navigator.stateService.reference$]).pipe(_t(1)).subscribe((([i,n])=>{e.onAdd(t,n,i.getContext())}))),i.push(this._container.glRenderer.opaqueRender$.pipe(Vt(this._container.renderService.renderCamera$,this._container.glRenderer.webGLRenderer$)).subscribe((([,t,i])=>{const n=i.getContext(),r=t.perspective.matrixWorldInverse,s=t.perspective.projectionMatrix;e.render(n,r.toArray(),s.toArray())}))),i.push(this._navigator.stateService.reference$.pipe($t(1)).subscribe((i=>{e.onReference(t,i)})))}dispose(e){for(const t of Object.keys(this._renderers))this.remove(t,e)}has(e){return e in this._renderers}remove(e,t){this._renderers[e].subs.unsubscribe();const i=this._renderers[e].renderer;delete this._renderers[e],this._container.glRenderer.webGLRenderer$.subscribe((e=>{i.onRemove(t,e.getContext())}))}}class mM{constructor(e,t){this._container=e,this._navigator=t,this._controls=null,this._subscriptions=new rf}attach(e,t){if(this._controls)throw new Pu("Custom camera controls already attached");this._controls=e;const i=new j,n=i.pipe(zt((()=>this._navigator.stateService.state$)),De((e=>e===Df.Custom)),vt()),r=this._subscriptions;r.push(n.pipe(Ot(!1),At(),Vt(this._navigator.stateService.reference$,this._container.renderService.renderCamera$)).subscribe((([[i,n],r,s])=>{n?e.onActivate(t,s.perspective.matrixWorldInverse.toArray(),s.perspective.projectionMatrix.toArray(),r):i&&e.onDeactivate(t)}))),r.push(n.pipe(zt((e=>e?this._navigator.stateService.currentState$.pipe($t(1)):ie()))).subscribe((i=>{e.onAnimationFrame(t,i.id)}))),r.push(n.pipe(zt((e=>e?this._navigator.stateService.reference$.pipe($t(1)):ie()))).subscribe((i=>e.onReference(t,i)))),r.push(n.pipe(zt((e=>e?this._container.renderService.size$.pipe($t(1)):ie()))).subscribe((()=>e.onResize(t)))),r.push(Ve([this._container.glRenderer.webGLRenderer$,this._container.renderService.renderCamera$,this._navigator.stateService.reference$,this._navigator.stateService.state$]).pipe(St()).subscribe((()=>{e.onAttach(t,(t=>{this._controls&&e===this._controls&&this._updateViewMatrix(t)}),(t=>{this._controls&&e===this._controls&&this._updateProjectionMatrix(t)})),i.next(),i.complete()})))}detach(e){const t=this._controls;return this._controls=null,this._subscriptions.unsubscribe(),new Promise((i=>{this._navigator.stateService.state$.pipe(_t(1)).subscribe((n=>{t?(n===Df.Custom&&t.onDeactivate(e),t.onDetach(e),i(t)):i(null)}))}))}dispose(e){this.detach(e)}has(e){return!!this._controls&&e===this._controls}_updateProjectionMatrix(e){this._navigator.stateService.state$.pipe(St()).subscribe((t=>{if(t===Df.Custom)this._container.renderService.projectionMatrix$.next(e);else{const e="Incorrect camera control mode for projection matrix update";console.warn(e)}}))}_updateViewMatrix(e){this._navigator.stateService.state$.pipe(St()).subscribe((t=>{if(t===Df.Custom)this._navigator.stateService.setViewMatrix(e);else{const e="Incorrect camera control mode for view matrix update";console.warn(e)}}))}}Uu.register(ad),Vu.register(ad),od.registerCover(af),od.register(of),od.register(cf),od.register(lf),od.register(mf),od.register(Of),od.register(Hf),od.register(Gf),od.register(ag),od.register(hg),od.register(lg),od.register(mg),od.register(zg),od.register(Uv),od.register(Vv),od.register(Hv),od.register(jv),e.ArgumentMapillaryError=Lu,e.BearingComponent=cf,e.CacheComponent=lf,e.CancelMapillaryError=uf,e.CircleMarker=class extends Sw{constructor(e,t,i){super(e,t),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(e){const t=new es(new nc(this._radius,16),new wr({color:this._color,opacity:this._opacity,transparent:!0}));t.up.fromArray([0,0,1]),t.renderOrder=-1;const i=new tr;i.add(t),i.position.fromArray(e),this._geometry=i}_disposeGeometry(){for(let e of this._geometry.children)e.geometry.dispose(),e.material.dispose()}_getInteractiveObjects(){return[]}},e.Component=sf,e.DataProviderBase=gw,e.DirectionComponent=mf,e.DragPanHandler=ig,e.EventEmitter=nf,e.ExtremePointTag=Tv,e.Geometry=Fg,e.GeometryProviderBase=_w,e.GeometryTagError=Bg,e.GraphDataProvider=Mw,e.GraphMapillaryError=Bu,e.Image=Su,e.KeyPlayHandler=Vf,e.KeySequenceNavigationHandler=Ff,e.KeySpatialNavigationHandler=Bf,e.KeyZoomHandler=Uf,e.KeyboardComponent=Hf,e.MapillaryError=Pu,e.Marker=Sw,e.MarkerComponent=Gf,e.OutlineTag=Ev,e.PointGeometry=Pv,e.PointerComponent=ag,e.PointsGeometry=Ug,e.PolygonGeometry=dv,e.Popup=class{constructor(e,t,i){this._options={},e=e||{},this._options.capturePointer=!1!==e.capturePointer||e.capturePointer,this._options.clean=e.clean,this._options.float=e.float,this._options.offset=e.offset,this._options.opacity=e.opacity,this._options.position=e.position,this._dom=i||new og,this._viewportCoords=t||new hf,this._notifyChanged$=new j}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(e){this._point=e.slice(),this._rect=null,this._notifyChanged$.next(this)}setBasicRect(e){this._rect=e.slice(),this._point=null,this._notifyChanged$.next(this)}setDOMContent(e){this._content&&this._content.parentNode&&this._content.parentNode.removeChild(this._content);const t="mapillary-popup-content"+(!0===this._options.clean?"-clean":"")+(!0===this._options.capturePointer?" mapillary-popup-capture-pointer":"");this._content=this._dom.createElement("div",t,this._container),this._content.appendChild(e),this._notifyChanged$.next(this)}setHTML(e){const t=this._dom.document.createDocumentFragment(),i=this._dom.createElement("body");let n;for(i.innerHTML=e;n=i.firstChild,n;)t.appendChild(n);this.setDOMContent(t)}setText(e){this.setDOMContent(this._dom.document.createTextNode(e))}setParentContainer(e){this._parentContainer=e}update(t,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!==e.Alignment.Center){const e="mapillary-popup-tip"+(!0===this._options.capturePointer?" mapillary-popup-capture-pointer":"");this._tip=this._dom.createElement("div",e,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),a=this._alignmentToPopupAligment(this._options.float);const o=this._container.classList;if(null!=this._point)r=this._viewportCoords.basicToCanvasSafe(this._point[0],this._point[1],{offsetHeight:i.height,offsetWidth:i.width},n,t.perspective);else{const e=["center","top","bottom","left","right","top-left","top-right","bottom-left","bottom-right"];let h=null;for(const t of e)if(o.contains(`mapillary-popup-float-${t}`)){h=t;break}[r,s]=this._rectToPixel(this._rect,s,h,t,i,n),a||(a=s)}if(null==r)return void(this._container.style.display="none");if(this._container.style.display="",!a){const e=this._container.offsetWidth,t=this._container.offsetHeight,n=this._pixelToFloats(r,i,e,t);a=0===n.length?"top":n.join("-")}const h=this._normalizeOffset(this._options.offset);r=[r[0]+h[a][0],r[1]+h[a][1]],r=[Math.round(r[0]),Math.round(r[1])];const c={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 e in c)c.hasOwnProperty(e)&&o.remove(`mapillary-popup-float-${e}`);o.add(`mapillary-popup-float-${a}`),this._container.style.transform=`${c[a]} translate(${r[0]}px,${r[1]}px)`}_rectToPixel(e,t,i,n,r,s){if(!t){const t=this._container.offsetWidth,a=this._container.offsetHeight,o={bottom:[0,a/2],"bottom-left":[-t/2,a/2],"bottom-right":[t/2,a/2],left:[-t/2,0],right:[t/2,0],top:[0,-a/2],"top-left":[-t/2,-a/2],"top-right":[t/2,-a/2]},h=["top","bottom","left","right"];let c=[0,null,null];for(const l of h){const h=this._pointFromRectPosition(e,l),u=this._viewportCoords.basicToCanvasSafe(h[0],h[1],{offsetHeight:r.height,offsetWidth:r.width},s,n.perspective);if(null==u)continue;const d=o[l],p=[u[0]+d[0],u[1]+d[1]],m=null!=i&&i===l?1:.7;if(0===this._pixelToFloats(p,r,t/m,a/(2*m)).length&&u[0]>0&&u[0]<r.width&&u[1]>0&&u[1]<r.height)return[u,l];const f=Math.max(p[0]-t/2,0),g=Math.min(p[0]+t/2,r.width),_=Math.max(p[1]-a/2,0),v=Math.min(p[1]+a/2,r.height),y=m*Math.max(0,g-f)*Math.max(0,v-_);y>c[0]&&(c[0]=y,c[1]=u,c[2]=l)}if(c[0]>0)return[c[1],c[2]]}const a=this._pointFromRectPosition(e,t);return[this._viewportCoords.basicToCanvasSafe(a[0],a[1],{offsetHeight:r.height,offsetWidth:r.width},s,n.perspective),null!=t?t:"top"]}_alignmentToPopupAligment(t){switch(t){case e.Alignment.Bottom:return"bottom";case e.Alignment.BottomLeft:return"bottom-left";case e.Alignment.BottomRight:return"bottom-right";case e.Alignment.Center:return"center";case e.Alignment.Left:return"left";case e.Alignment.Right:return"right";case e.Alignment.Top:return"top";case e.Alignment.TopLeft:return"top-left";case e.Alignment.TopRight:return"top-right";default:return null}}_normalizeOffset(e){if(null==e)return this._normalizeOffset(0);if("number"==typeof e){const t=e,i=(t>=0?1:-1)*Math.round(Math.sqrt(.5*Math.pow(t,2)));return{bottom:[0,t],"bottom-left":[-i,i],"bottom-right":[i,i],center:[0,0],left:[-t,0],right:[t,0],top:[0,-t],"top-left":[-i,-i],"top-right":[i,-i]}}return{bottom:e.bottom||[0,0],"bottom-left":e.bottomLeft||[0,0],"bottom-right":e.bottomRight||[0,0],center:e.center||[0,0],left:e.left||[0,0],right:e.right||[0,0],top:e.top||[0,0],"top-left":e.topLeft||[0,0],"top-right":e.topRight||[0,0]}}_pixelToFloats(e,t,i,n){const r=[];return e[1]<n?r.push("bottom"):e[1]>t.height-n&&r.push("top"),e[0]<i/2?r.push("right"):e[0]>t.width-i/2&&r.push("left"),r}_pointFromRectPosition(e,t){const i=e[0],n=e[0]<e[2]?e[2]:e[2]+1,r=e[1],s=e[3];switch(t){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]}}},e.PopupComponent=hg,e.RectGeometry=lv,e.S2GeometryProvider=bw,e.ScrollZoomHandler=rg,e.SequenceComponent=lg,e.SimpleMarker=class extends Sw{constructor(e,t,i){super(e,t),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(e){const t=this._radius,i=this._markerHeight(t),n=new wr({color:this._color,opacity:this._opacity,transparent:!0,depthWrite:!1}),r=new es(this._createMarkerGeometry(t,8,8),n),s=new es(new nl(t/2,8,8),new wr({color:this._ballColor,opacity:this._ballOpacity,transparent:!0}));s.position.z=i,s.renderOrder=1;const a=new tr;a.add(s),a.add(r),a.position.fromArray(e),this._geometry=a}_disposeGeometry(){for(const e of this._geometry.children)e.geometry.dispose(),e.material.dispose()}_getInteractiveObjects(){return this._interactive?[this._geometry.children[0]]:[]}_markerHeight(e){const t=Math.tan(Math.PI-this._circleToRayAngle);return e*Math.sqrt(1+t*t)}_createMarkerGeometry(e,t,i){const n=this._markerHeight(e),r=this._circleToRayAngle,s=[],a=new Float32Array(3*(t+1)*(i+1));let o=0;for(let h=0;h<=i;++h){const c=[];for(let s=0;s<=t;++s){const l=s/t*Math.PI*2,u=h/i*Math.PI;let d=e;if(u>r){const t=Math.tan(u-r);d=e*Math.sqrt(1+t*t)}const p=3*o,m=Math.sin(u);a[p+0]=d*Math.cos(l)*m,a[p+1]=d*Math.sin(l)*m,a[p+2]=d*Math.cos(u)+n,c.push(o++)}s.push(c)}const h=new Uint16Array(6*t*i);let c=0;for(let e=0;e<i;++e)for(let i=0;i<t;++i){const t=s[e][i+1],n=s[e][i],r=s[e+1][i],a=s[e+1][i+1];h[c++]=t,h[c++]=n,h[c++]=a,h[c++]=n,h[c++]=r,h[c++]=a}const l=new kr,u=new Tr(a,3);return l.setAttribute("position",u),l.setIndex(new Tr(h,1)),l}},e.SliderComponent=mg,e.SpatialComponent=zg,e.SpotTag=Iv,e.Tag=Sv,e.TagComponent=Uv,e.TouchZoomHandler=sg,e.VertexGeometry=cv,e.Viewer=class extends nf{constructor(e){super(),this._navigator=new lM(e),this._container=new jw(e,this._navigator.stateService),this._observer=new dM(this,this._navigator,this._container),this._componentController=new Pw(this._container,this._navigator,this._observer,e.imageId,e.component),this._customRenderer=new pM(this._container,this._navigator),this._customCameraControls=new mM(this._container,this._navigator)}get dataProvider(){return this._navigator.api.data}get isNavigable(){return this._componentController.navigable}activateCombinedPanning(){this._navigator.panService.enable()}activateComponent(e){this._componentController.activate(e)}activateCover(){this._componentController.activateCover()}addCustomRenderer(e){this._customRenderer.add(e,this)}attachCustomCameraControls(e){this._customCameraControls.attach(e,this)}deactivateCombinedPanning(){this._navigator.panService.disable()}deactivateComponent(e){this._componentController.deactivate(e)}deactivateCover(){this._componentController.deactivateCover()}detachCustomCameraControls(){return this._customCameraControls.detach(this)}fire(e,t){super.fire(e,t)}getBearing(){return new Promise(((e,t)=>{this._container.renderService.bearing$.pipe(St()).subscribe((t=>{e(t)}),(e=>{t(e)}))}))}getCameraControls(){return new Promise(((t,i)=>{this._navigator.stateService.state$.pipe(St()).subscribe((i=>{switch(i){case Df.Custom:t(e.CameraControls.Custom);break;case Df.Earth:t(e.CameraControls.Earth);break;default:t(e.CameraControls.Street)}}),(e=>{i(e)}))}))}getCanvas(){return this._container.canvas}getCanvasContainer(){return this._container.canvasContainer}getCenter(){return new Promise(((e,t)=>{this._navigator.stateService.getCenter().subscribe((t=>{e(t)}),(e=>{t(e)}))}))}getComponent(e){return this._componentController.get(e)}getContainer(){return this._container.container}getFieldOfView(){return new Promise(((e,t)=>{this._container.renderService.renderCamera$.pipe(St()).subscribe((t=>{e(t.perspective.fov)}),(e=>{t(e)}))}))}getImage(){return new Promise(((e,t)=>{this._navigator.stateService.currentImage$.pipe(St()).subscribe((t=>{e(t)}),(e=>{t(e)}))}))}getPointOfView(){return new Promise(((e,t)=>{Ve(this._container.renderService.renderCamera$,this._container.renderService.bearing$).pipe(St()).subscribe((([t,i])=>{e({bearing:i,tilt:t.getTilt()})}),(e=>{t(e)}))}))}getPosition(){return new Promise(((e,t)=>{Ve(this._container.renderService.renderCamera$,this._navigator.stateService.reference$).pipe(St()).subscribe((([t,i])=>{e(this._observer.projection.cameraToLngLat(t,i))}),(e=>{t(e)}))}))}getReference(){return new Promise(((e,t)=>{this._navigator.stateService.reference$.pipe(St()).subscribe((t=>{e(t)}),(e=>{t(e)}))}))}getZoom(){return new Promise(((e,t)=>{this._navigator.stateService.getZoom().subscribe((t=>{e(t)}),(e=>{t(e)}))}))}hasCustomCameraControls(e){return this._customCameraControls.has(e)}hasCustomRenderer(e){return this._customRenderer.has(e)}moveDir(e){const t=this.isNavigable?this._navigator.moveDir$(e):Ee(new Error("Calling moveDir is not supported when viewer is not navigable."));return new Promise(((e,i)=>{t.subscribe((t=>{e(t)}),(e=>{i(e)}))}))}moveTo(e){const t=this.isNavigable?this._navigator.moveTo$(e):Ee(new Error("Calling moveTo is not supported when viewer is not navigable."));return new Promise(((e,i)=>{t.subscribe((t=>{e(t)}),(e=>{i(e)}))}))}off(e,t){super.off(e,t)}on(e,t){super.on(e,t)}project(e){return new Promise(((t,i)=>{this._observer.project$(e).subscribe((e=>{t(e)}),(e=>{i(e)}))}))}projectFromBasic(e){return new Promise(((t,i)=>{this._observer.projectBasic$(e).subscribe((e=>{t(e)}),(e=>{i(e)}))}))}remove(){this._customRenderer.dispose(this),this._customCameraControls.dispose(this),this._observer.dispose(),this._componentController.remove(),this._navigator.dispose(),this._container.remove();const e="remove",t={target:this,type:e};this.fire(e,t)}removeCustomRenderer(e){this._customRenderer.remove(e,this)}resize(){this._container.renderService.resize$.next()}setCameraControls(e){const t=cM(e);t===Df.Traversing?this._navigator.stateService.traverse():t===Df.Earth?this._navigator.stateService.earth():t===Df.Custom?this._navigator.stateService.custom():console.warn(`Unsupported camera control transition (${e})`)}setCenter(e){this._navigator.stateService.setCenter(e)}setFieldOfView(e){this._container.renderService.renderCamera$.pipe(St()).subscribe((t=>{const i=t.fovToZoom(e);this._navigator.stateService.setZoom(i)}))}setFilter(e){return new Promise(((t,i)=>{this._navigator.setFilter$(e).subscribe((()=>{t(void 0)}),(e=>{i(e)}))}))}setRenderMode(e){this._container.renderService.renderMode$.next(e)}setTransitionMode(e){this._navigator.stateService.setTransitionMode(e)}setAccessToken(e){const t=this.isNavigable?this._navigator.setAccessToken$(e):Ee(new Error("Calling setAccessToken is not supported when viewer is not navigable."));return new Promise(((e,i)=>{t.subscribe((()=>{e(void 0)}),(e=>{i(e)}))}))}setZoom(e){this._navigator.stateService.setZoom(e)}triggerRerender(){this._container.glRenderer.triggerRerender()}unproject(e){return new Promise(((t,i)=>{this._observer.unproject$(e).subscribe((e=>{t(e)}),(e=>{i(e)}))}))}unprojectToBasic(e){return new Promise(((t,i)=>{this._observer.unprojectBasic$(e).subscribe((e=>{t(e)}),(e=>{i(e)}))}))}},e.ZoomComponent=Vv,e.decompress=uw,e.ecefToEnu=yu,e.ecefToGeodetic=wu,e.enuToEcef=bu,e.enuToGeodetic=vu,e.fetchArrayBuffer=dw,e.geodeticToEcef=xu,e.geodeticToEnu=_u,e.isFallbackSupported=Ew,e.isSupported=function(){return Ew()&&Cw()},e.readMeshPbf=mw,Object.defineProperty(e,"__esModule",{value:!0})}));
 //# sourceMappingURL=mapillary.js.map