define(["@jupyter-widgets/base"], function(__WEBPACK_EXTERNAL_MODULE_2__) { return /******/ (function(modules) { // webpackBootstrap
/******/ 	// The module cache
/******/ 	var installedModules = {};
/******/
/******/ 	// The require function
/******/ 	function __webpack_require__(moduleId) {
/******/
/******/ 		// Check if module is in cache
/******/ 		if(installedModules[moduleId])
/******/ 			return installedModules[moduleId].exports;
/******/
/******/ 		// Create a new module (and put it into the cache)
/******/ 		var module = installedModules[moduleId] = {
/******/ 			exports: {},
/******/ 			id: moduleId,
/******/ 			loaded: false
/******/ 		};
/******/
/******/ 		// Execute the module function
/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ 		// Flag the module as loaded
/******/ 		module.loaded = true;
/******/
/******/ 		// Return the exports of the module
/******/ 		return module.exports;
/******/ 	}
/******/
/******/
/******/ 	// expose the modules object (__webpack_modules__)
/******/ 	__webpack_require__.m = modules;
/******/
/******/ 	// expose the module cache
/******/ 	__webpack_require__.c = installedModules;
/******/
/******/ 	// __webpack_public_path__
/******/ 	__webpack_require__.p = "";
/******/
/******/ 	// Load entry module and return exports
/******/ 	return __webpack_require__(0);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ (function(module, exports, __webpack_require__) {

	module.exports = {};
	
	var loadedModules = [
	    __webpack_require__(1),
	]
	
	for (var i in loadedModules) {
	    if (loadedModules.hasOwnProperty(i)) {
	        var loadedModule = loadedModules[i];
	        for (var target_name in loadedModule) {
	            if (loadedModule.hasOwnProperty(target_name)) {
	                module.exports[target_name] = loadedModule[target_name];
	            }
	        }
	    }
	}
	
	module.exports['version'] = __webpack_require__(11).version;


/***/ }),
/* 1 */
/***/ (function(module, exports, __webpack_require__) {

	var Jupyter
	var widgets = __webpack_require__(2)
	var NGL = __webpack_require__(3)
	var ColormakerRegistryModel = __webpack_require__(7).ColormakerRegistryModel
	var ColormakerRegistryView = __webpack_require__(7).ColormakerRegistryView
	var BaseView = __webpack_require__(10).BaseView
	var $ = __webpack_require__(12)
	var _ = __webpack_require__(8)
	__webpack_require__(13)
	__webpack_require__(14)
	__webpack_require__(15)
	__webpack_require__(16)
	__webpack_require__(17)
	__webpack_require__(18)
	var StageWidget = __webpack_require__(19).StageWidget
	__webpack_require__(20)
	__webpack_require__(45)
	// require('./css/dark.css');  // How to switch theme?
	__webpack_require__(76);
	__webpack_require__(78)
	
	
	// From NGL
	// http://www.broofa.com/Tools/Math.uuid.htm
	const chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('')
	const uuid = new Array(36)
	
	function generateUUID () {
	  let rnd = 0
	  let r
	
	  for (let i = 0; i < 36; i++) {
	    if (i === 8 || i === 13 || i === 18 || i === 23) {
	      uuid[ i ] = '-'
	    } else if (i === 14) {
	      uuid[ i ] = '4'
	    } else {
	      if (rnd <= 0x02) rnd = 0x2000000 + (Math.random() * 0x1000000) | 0
	      r = rnd & 0xf
	      rnd = rnd >> 4
	      uuid[ i ] = chars[ (i === 19) ? (r & 0x3) | 0x8 : r ]
	    }
	  }
	
	  return uuid.join('')
	}
	
	
	function createView(that, trait_name){
	    // Create a view for the model with given `trait_name`
	    // e.g: in backend, 'view.<trait_name>`
	    console.log("Creating view for model " + trait_name);
	    var manager = that.model.widget_manager
	    var model_id = that.model.get(trait_name).replace("IPY_MODEL_", "");
	    return manager.get_model(model_id).then(function(model){
	        return manager.create_view(model)
	    })
	}
	
	
	var NGLModel = widgets.DOMWidgetModel.extend({
	    defaults: function(){
	        return _.extend(widgets.DOMWidgetModel.prototype.defaults(), {
	            _model_name: 'NGLModel',
	            _model_module: 'nglview-js-widgets',
	            _model_module_version: __webpack_require__(11).version,
	            _view_name: "NGLView",
	            _view_module: "nglview-js-widgets",
	            _view_module_version: __webpack_require__(11).version,
	        });
	    }
	})
	
	var NGLView = widgets.DOMWidgetView.extend({
	    render: function() {
	        this.beforeDisplay()
	        this.displayed.then(function() {
	            // move all below code inside 'displayed'
	            // to make sure the NGLView and NGLModel are created
	            this.createStage()
	            this.handlePicking()
	            this.handleSignals()
	            this.handleMessage()
	            this.finalizeDisplay()
	        }.bind(this));
	
	    },
	
	    beforeDisplay: function(){
	        this.model.on("change:_parameters", this.parametersChanged, this);
	        this.model.on("change:gui_style", this.GUIStyleChanged, this);
	        this.model.set('_ngl_version', NGL.Version);
	        this._ngl_focused = 0
	        this.uuid = generateUUID()
	        this.stage_widget = undefined
	        this._synced_model_ids = this.model.get("_synced_model_ids");
	        this._synced_repr_model_ids = this.model.get("_synced_repr_model_ids")
	    },
	
	    createStage: function(){
	        // init NGL stage
	        var stage_params = this.model.get("_ngl_full_stage_parameters");
	        if (!("backgroundColor" in stage_params)){
	            stage_params["backgroundColor"] = "white"
	        }
	        NGL.useWorker = false;
	        var view_parent = this.options.parent
	        this.stage = new NGL.Stage(undefined)
	        this.$container = $(this.stage.viewer.container);
	        this.$el.append(this.$container)
	        this.stage.setParameters(stage_params);
	        this.$container = $(this.stage.viewer.container);
	        this.handleResizable()
	        this.ngl_view_id = this.get_last_child_id(); // will be wrong if displaying
	        // more than two views at the same time (e.g: in a Box)
	        this.model.set("_ngl_view_id", Object.keys(this.model.views).sort());
	        this.touch();
	        var that = this;
	        var width = this.model.get("_view_width") || this.$el.parent().width() + "px";
	        var height = this.model.get("_view_height") || "300px";
	        this.setSize(width, height);
	        this.createFullscreenBtn(); // FIXME: move up?
	        this.createIPlayer(); // FIXME: move up?
	        this.GUIStyleChanged(); // must be called after displaying to get correct width and height
	
	        this.$container.resizable(
	            "option", "maxWidth", this.$el.parent().width()
	        );
	        var is_embeded = this.model.get("_ngl_serialize") || (this.model.comm == undefined)
		    if (is_embeded){
	            console.log("In embeding mode")
		        that.handle_embed();
	        }else{
	            this.requestUpdateStageParameters();
	            if (this.model.views.length == 1){
	                this.serialize_camera_orientation();
	            }else{
	                this.set_camera_orientation(that.model.get("_camera_orientation"));
	            }
	        }
	    },
	
	    handleMessage(){
	        this.model.on("msg:custom", function(msg){
	            if ('ngl_view_id' in msg){
	                var key = msg.ngl_view_id;
	                console.log(key);
	                this.model.views[key].then(function(v){
	                    v.on_msg(msg);
	                })
	            }
	            else{this.on_msg(msg);}
	        }, this);
	
	        if (this.model.comm) {
	            // for embeding in website
	            this.model.comm.on_msg(function(msg) {
	                var buffers = msg.buffers;
	                var content = msg.content.data.content;
	                if (buffers.length && content) {
	                    content.buffers = buffers;
	                }
	                this.model._handle_comm_msg.call(this.model, msg);
	            }.bind(this));
	        }
	    },
	
	
	    finalizeDisplay: function(){
	      // for callbacks from Python
	      // must be after initializing NGL.Stage
	      this.send({
	          'type': 'request_loaded',
	          'data': true
	      })
	      var state_params = this.stage.getParameters();
	      this.model.set('_ngl_original_stage_parameters', state_params);
	      this.touch();
	      if (this.stage.compList.length < this.model.get("n_components")){
	          this.handle_embed()
	      }
	    },
	
	    handleSignals: function(){
	      var container = this.stage.viewer.container;
	      var that = this;
	      container.addEventListener('mouseover', function(e) {
	          that._ngl_focused = 1;
	          e; // linter
	          that.mouseover_display('block')
	      }, false);
	
	      container.addEventListener('mouseout', function(e) {
	          that._ngl_focused = 0;
	          e; // linter
	          that.mouseover_display('none')
	      }, false);
	
	      this.stage.signals.componentAdded.add(function() {
	          var len = this.stage.compList.length;
	          this.model.set("n_components", len);
	          this.touch();
	          var comp = this.stage.compList[len - 1];
	          comp.signals.representationRemoved.add(function() {
	              that.request_repr_dict();
	          });
	          comp.signals.representationAdded.add(function() {
	              that.request_repr_dict();
	          });
	      }, this);
	
	      this.stage.signals.componentRemoved.add(function() {
	          this.model.set("n_components", this.stage.compList.length);
	          this.touch();
	      }, this);
	
	      this.stage.signals.parametersChanged.add(function(){
	          this.requestUpdateStageParameters();
	      }, this);
	
	      this.stage.viewerControls.signals.changed.add(function() {
	          this.serialize_camera_orientation();
	          var m = this.stage.viewerControls.getOrientation();
	          if (that._synced_model_ids.length > 0 && that._ngl_focused == 1){
	              that._synced_model_ids.forEach(function(mid){
	                  that.model.widget_manager.get_model(mid).then(function(model){
	                      for (var k in model.views){
	                          var pview = model.views[k];
	                          pview.then(function(view){
	                              // not sync with itself
	                              if (view.uuid != that.uuid){
	                                  view.stage.viewerControls.orient(m);
	                              }
	                          })
	                      }
	                  })
	              })
	          }
	      }.bind(this));
	
	    },
	
	    handlePicking: function(){
	      this.$pickingInfo = $("<div></div>")
	          .css("position", "absolute")
	          .css("top", "5%")
	          .css("left", "3%")
	          .css("background-color", "white")
	          .css("padding", "2px 5px 2px 5px")
	          .css("opacity", "0.7")
	          .appendTo(this.$container);
	
	      var that = this;
	      this.stage.signals.clicked.add(function (pd) {
	          if (pd) {
	              this.model.set('picked', {}); //refresh signal
	              this.touch();
	
	              var pd2 = {};
	              var pickingText = "";
	              if (pd.atom) {
	                  pd2.atom1 = pd.atom.toObject();
	                  pd2.atom1.name = pd.atom.qualifiedName();
	                  pickingText = "Atom: " + pd2.atom1.name;
	              } else if (pd.bond) {
	                  pd2.bond = pd.bond.toObject();
	                  pd2.atom1 = pd.bond.atom1.toObject();
	                  pd2.atom1.name = pd.bond.atom1.qualifiedName();
	                  pd2.atom2 = pd.bond.atom2.toObject();
	                  pd2.atom2.name = pd.bond.atom2.qualifiedName();
	                  pickingText = "Bond: " + pd2.atom1.name + " - " + pd2.atom2.name;
	              }
	              if (pd.instance) pd2.instance = pd.instance;
	
	              var n_components = this.stage.compList.length;
	              for (var i = 0; i < n_components; i++) {
	                  var comp = this.stage.compList[i];
	                  if (comp.uuid == pd.component.uuid) {
	                      pd2.component = i;
	                  }
	              }
	
	              this.model.set('picked', pd2);
	              this.touch();
	
	              this.$pickingInfo.text(pickingText);
	          }
	      }, this);
	    },
	
	    mouseover_display: function(type){
	        var that = this;
	        if (this.btn_pview_fullscreen){
	            this.btn_pview_fullscreen.then(function(v){
	                v.el.style.display = type
	                if (that.stage_widget){
	                    // If NGL's GUI exists, use its fullscreen button.
	                    v.el.style.display = 'none'
	                }
	            })
	        }
	
	        var that = this;
	        if (this.player_pview){
	            this.player_pview.then(function(v){
	                v.el.style.display = type
	                // Need to check if max_frame is available (otherwise NaN)
	                // https://github.com/jupyter-widgets/ipywidgets/issues/2485
	                if (!that.model.get("max_frame") || (that.model.get("max_frame") <= 1)){
	                    // always hide if there's no trajectory.
	                    v.el.style.display = 'none'
	                }
	            })
	        }
	    },
	
	    updateNGLTheme: function(css_content){
	        var ele = document.getElementById("nglview_style")
	        if (ele != undefined){
	            document.head.removeChild(ele)
	        }
	        var style = document.createElement("style")
	        style.id = 'nglview_style'
	        style.type = 'text/css'
	        style.appendChild(document.createTextNode(css_content))
	        document.head.appendChild(style)
	    },
	
	    serialize_camera_orientation: function(){
	         var m = this.stage.viewerControls.getOrientation();
	         this.model.set('_camera_orientation', m.elements);
	         this.touch();
	    },
	
	    set_camera_orientation: function(orientation){
	        if (orientation.length > 0){
	            this.stage.viewerControls.orient(orientation);
	            this.serialize_camera_orientation();
	        }
	    },
	
	    executeCode: function(code){
	        eval(code);
	    },
	
	    handleCustomColor: function(){
	    },
	
	    handle_embed: function(){
	        var that = this;
	        var ngl_coordinate_resource = that.model.get("_ngl_coordinate_resource");
	        var ngl_msg_archive = that.model.get("_ngl_msg_archive");
	        var ngl_stage_params = that.model.get('_ngl_full_stage_parameters');
	        var ngl_color_dict = that.model.get("_ngl_color_dict");
	        var loadfile_list = [];
	        var label
	
	        // reconstruct colors
	        if (this.model.comm === undefined){
	            var model_dict = this.model.widget_manager._models
	            var models = []
	            for (let k in model_dict){
	                models.push(model_dict[k])
	            }
	            Promise.all(models).then(models => {
	                for (var i in models){
	                    var model = models[i]
	                    if (model instanceof ColormakerRegistryModel){
	                        var k = Object.keys(model.views)[0] // singleton
	                        model.views[k].then(view =>{
	                            view.model.get("_msg_ar").forEach(msg =>{
	                                view.on_msg(msg)
	                            })
	                        })
	                    }
	                }
	            })
	
	            // Outside the notebook
	            // Old API (_ColorScheme)
	            for (label in ngl_color_dict){
	                if (!NGL.ColormakerRegistry.hasScheme(label)){
	                    that.addColorScheme(ngl_color_dict[label], label);
	                }
	            }
	        }
	
	        _.each(ngl_msg_archive, function(msg){
	            if (msg.methodName == 'loadFile'){
	                if (msg.kwargs && msg.kwargs.defaultRepresentation) {
	                    // no need to add default representation as all representations
	                    // are serialized separately, also it unwantedly sets the orientation
	                    msg.kwargs.defaultRepresentation = false
	                 }
	                loadfile_list.push(that._get_loadFile_promise(msg));
	            }
	        });
	
	
	        Promise.all(loadfile_list).then(function(compList){
	            n_frames = ngl_coordinate_resource['n_frames'] || 1;
	            that._set_representation_from_repr_dict(that.model.get("_ngl_repr_dict"))
	            that.stage.setParameters(ngl_stage_params);
	            that.set_camera_orientation(that.model.get("_camera_orientation"));
	            that.model.set("max_frame", n_frames-1);  // trigger updating slider and player's max
	            that.touch();
	            delete ngl_coordinate_resource['n_frames'];
	
	            // sync frame again since we don't do that in notebook (to avoid lagging);
	            that.getPlayerModel().then(function(model){
	                var pmodel = model.get("children")[0];
	                that.listenTo(pmodel,
	                    "change:value", function(){that.updateCoordinatesFromDict(ngl_coordinate_resource,
	                        pmodel.get("value"))})
	            })
	
	
	            var pd = that.model.get("_player_dict");
	            var manager = that.model.widget_manager;
	            if (pd){
	                var rd = pd['widget_quick_repr'];
	                for (let model_id in rd){
	                    manager.get_model(model_id).then(function(model){
	                        that.listenTo(model, "change:value", function(){
	                            var msg = rd[model_id][model.get("value")];
	                            that.on_msg(msg);
	                        })
	                    })
	                }
	            }
	
	            // fire any msg with "fire_embed"
	            that.model.get("_ngl_msg_archive").forEach(function(msg){
	                if (msg.fire_embed){
	                    that.on_msg(msg);
	                }
	            })
	        }); // Promise.all
	    },
	
	    updateCoordinatesFromDict: function(cdict, frame_index){
	        // update coordinates for given "index"
	        // cdict = Dict[int, List[base64]]
	        var keys = Object.keys(cdict);
	
	        for (var i = 0; i < keys.length; i++) {
	            var traj_index = keys[i];
	            var coordinates = this.decode_base64(cdict[traj_index][frame_index]);
	            if (coordinates && coordinates.byteLength > 0) {
	                this.updateCoordinates(coordinates, traj_index);
	            }
	        }
	    },
	
	    requestFrame: function() {
	        this.send({
	            'type': 'request_frame',
	            'data': 'frame'
	        });
	    },
	
	    requestUpdateStageParameters: function() {
	        var updated_params = this.stage.getParameters();
	        this.model.set('_ngl_full_stage_parameters', updated_params);
	        this.touch();
	    },
	
	    requestReprParameters: function(component_index, repr_index) {
	        var comp = this.stage.compList[component_index];
	        var repr = comp.reprList[repr_index];
	        var msg = repr.repr.getParameters();
	
	        if (msg) {
	            msg['name'] = repr.name;
	            this.send({
	                'type': 'repr_parameters',
	                'data': msg
	            });
	        }
	    },
	
	    request_repr_dict: function() {
	        var n_components = this.stage.compList.length;
	        var repr_dict = {};
	
	        for (var i = 0; i < n_components; i++) {
	            var comp = this.stage.compList[i];
	            repr_dict[i] = {};
	            var msgi = repr_dict[i];
	            for (var j = 0; j < comp.reprList.length; j++) {
	                var repr = comp.reprList[j];
	                msgi[j] = {};
	                msgi[j]['type'] = repr.name;
	                msgi[j]['params'] = repr.repr.getParameters();
	            }
	        }
	        this.send({
	            // make sure we are using "request_repr_dict" name
	            // in backend too.
	            'type': 'request_repr_dict',
	            'data': repr_dict,
	        });
	        var that = this
	        if (that._synced_repr_model_ids.length > 0){
	            that._synced_repr_model_ids.forEach(function(mid){
	                that.model.widget_manager.get_model(mid).then(function(model){
	                    for (var k in model.views){
	                        var pview = model.views[k];
	                        pview.then(function(view){
	                            // not sync with itself
	                            if (view.uuid != that.uuid){
	                                view._set_representation_from_repr_dict(repr_dict)
	                            }
	                        })
	                    }
	                })
	            })
	        }
	    },
	
	    setSyncRepr: function(model_ids){
	        this._synced_repr_model_ids = model_ids
	    },
	
	    setSyncCamera: function(model_ids){
	        this._synced_model_ids = model_ids
	    },
	
	    viewXZPlane: function() {
	        var m = new NGL.Matrix4().makeRotationX( Math.PI / 2 );
	        var q = new NGL.Quaternion().setFromRotationMatrix( m );
	        this.stage.viewerControls.rotate( q );
	    },
	
	    set_representation_from_backend: function(){
	        var repr_dict = this.model.get('_ngl_repr_dict')
	        this._set_representation_from_repr_dict(repr_dict)
	    },
	
	    _set_representation_from_repr_dict: function(repr_dict){
	        var compList = this.stage.compList
	        if (compList.length > 0){
	            for (var index in repr_dict){
	                var comp = compList[index];
	                comp.removeAllRepresentations();
	                var reprlist = repr_dict[index];
	                for (var j in reprlist){
	                    var repr = reprlist[j];
	                    if (repr){
	                        comp.addRepresentation(repr.type, repr.params);
	                    }
	                }
	            }
	        }
	    },
	
	    createView: function(trait_name){
	        // Create a view for the model with given `trait_name`
	        // e.g: in backend, 'view.<trait_name>`
	        console.log("Creating view for model " + trait_name);
	        var manager = this.model.widget_manager;
	        var model_id = this.model.get(trait_name).replace("IPY_MODEL_", "");
	        return this.model.widget_manager.get_model(model_id).then(function(model){
	            return manager.create_view(model)
	        })
	    },
	
	    getPlayerModel: function(){
	        // return a Promise
	        var model_id = this.model.get("_iplayer").replace("IPY_MODEL_", "");
	        return this.model.widget_manager.get_model(model_id)
	    },
	
	    createIPlayer: function(){
	        this.player_pview = this.createView("_iplayer");
	        var that = this;
	        this.player_pview.then(function(view){
	                var pe = view.el
	                pe.style.position = 'absolute'
	                pe.style.zIndex = 100
	                pe.style.bottom = '5%'
	                pe.style.left = '10%'
	                pe.style.opacity = '0.7'
	                that.stage.viewer.container.append(view.el);
	                pe.style.display = 'none'
	            })
	    },
	
	    createImageBtn: function(){
	        this.image_btn_pview = this.createView("_ibtn_image");
	        var that = this;
	        this.image_btn_pview.then(function(view){
	           var pe = view.el
	           pe.style.position = 'absolute'
	           pe.style.zIndex = 100
	           pe.style.top = '5%'
	           pe.style.right = '10%'
	           pe.style.opacity = '0.7'
	           pe.style.width = '35px'
	           that.stage.viewer.container.append(view.el);
	        })
	    },
	
	    createFullscreenBtn: function(){
	        this.btn_pview_fullscreen = this.createView("_ibtn_fullscreen");
	        var that = this;
	        var stage = that.stage;
	        this.btn_pview_fullscreen.then(function(view){
	           var pe = view.el
	           pe.style.position = 'absolute'
	           pe.style.zIndex = 100
	           pe.style.top = '5%'
	           pe.style.right = '5%'
	           pe.style.opacity = '0.7'
	           pe.style.width = '35px'
	           pe.style.background = 'white'
	           pe.style.opacity = '0.3'
	           pe.style.display = 'none'
	           pe.onclick = function(){
	               that.stage.toggleFullscreen();
	           }
	           stage.viewer.container.append(view.el);
	           stage.signals.fullscreenChanged.add(function (isFullscreen) {
	             if (isFullscreen) {
	               view.model.set("icon", "compress")
	             } else {
	               view.model.set("icon", "expand")
	             }
	           })
	        })
	    },
	
	
	    createGUI: function(){
	        this.pgui_view = this.createView("_igui");
	        var that = this;
	        this.pgui_view.then(function(view){
	                var pe = view.el
	                pe.style.position = 'absolute'
	                pe.style.zIndex = 100
	                pe.style.top = '5%'
	                pe.style.right = '10%'
	                pe.style.width = '300px'
	                that.stage.viewer.container.append(view.el);
	            })
	    },
	
	
	    createNglGUI: function(){
	      this.stage_widget = new StageWidget(this)
	    },
	
	
	    setVisibilityForRepr: function(component_index, repr_index, value) {
	        // value = True/False
	        var component = this.stage.compList[component_index];
	        var repr = component.reprList[repr_index];
	
	        if (repr) {
	            repr.setVisibility(value);
	        }
	    },
	
	    removeRepresentation: function(component_index, repr_index) {
	        var component = this.stage.compList[component_index];
	        var repr = component.reprList[repr_index]
	
	        if (repr) {
	            component.removeRepresentation(repr);
	        }
	    },
	
	    removeRepresentationsByName: function(repr_name, component_index) {
	        var component = this.stage.compList[component_index];
	
	        if (component) {
	            component.reprList.forEach(function(repr) {
	                if (repr.name == repr_name) {
	                    component.removeRepresentation(repr);
	                }
	            })
	        }
	    },
	
	    updateRepresentationForComponent: function(repr_index, component_index, params) {
	        var component = this.stage.compList[component_index];
	        var that = this;
	        var repr = component.reprList[repr_index];
	        if (repr) {
	            repr.setParameters(params);
	            that.request_repr_dict();
	        }
	    },
	
	    updateRepresentationsByName: function(repr_name, component_index, params) {
	        var component = this.stage.compList[component_index];
	        var that = this;
	
	        if (component) {
	            component.reprList.forEach(function(repr) {
	                if (repr.name == repr_name) {
	                    repr.setParameters(params);
	                    that.request_repr_dict();
	                }
	            })
	        }
	    },
	
	    setRepresentation: function(name, params, component_index, repr_index) {
	        var component = this.stage.compList[component_index];
	        var repr = component.reprList[repr_index];
	        var that = this;
	
	        if (repr) {
	            params['useWorker'] = false;
	            var new_repr = NGL.makeRepresentation(name, component.structure,
	                this.stage.viewer, params);
	            if (new_repr) {
	                repr.setRepresentation(new_repr);
	                repr.name = name;
	                component.reprList[repr_index] = repr;
	                that.request_repr_dict();
	            }
	        }
	    },
	
	    setColorByResidue: function(colors, component_index, repr_index){
	        var repr = this.stage.compList[component_index].reprList[repr_index];
	        var schemeId = NGL.ColormakerRegistry.addScheme(function(params){
	            this.atomColor = function(atom){
	                 var color = colors[atom.residueIndex];
	                 return color
	            };
	            params; // to pass eslint; ack;
	        });
	        repr.setColor(schemeId);
	    },
	
	    addShape: function(name, shapes) {
	        // shapes: List[Tuple[str, ...]]
	        // e.g: [('sphere', ...), ('cone', ...)]
	        var shape = new NGL.Shape(name);
	        var shape_dict = {
	            'sphere': shape.addSphere,
	            'ellipsoid': shape.addEllipsoid,
	            'cylinder': shape.addCylinder,
	            'cone': shape.addCone,
	            'mesh': shape.addMesh,
	            'arrow': shape.addArrow,
	            'text': shape.addText,
	            'label': shape.addText,
	            'tetrahedron': shape.addTetrahedron,
	            'octahedron': shape.addOctahedron,
	            'torus': shape.addTorus
	        };
	        for (var i = 0; i < shapes.length; i++) {
	            var shapes_i = shapes[i]
	            var shape_type = shapes_i[0];
	            var params = shapes_i.slice(1, shapes_i.length);
	            // e.g params = ('sphere', [ 0, 0, 9 ], [ 1, 0, 0 ], 1.5)
	
	            var func = shape_dict[shape_type];
	            func.apply(shape, params);
	            // shape.func(params);
	        }
	        var shapeComp = this.stage.addComponentFromObject(shape);
	        shapeComp.addRepresentation("buffer");
	    },
	
	    addBuffer: function(name, kwargs){
	        var class_dict = {
	            "arrow": NGL.ArrowBuffer,
	            "box": NGL.BoXbuffer,
	            "cone": NGL.ConeBuffer,
	            "cylinder": NGL.CylinderBuffer,
	            "ellipsoid": NGL.EllipsoidBuffer,
	            "octahedron": NGL.OctahedronBuffer,
	            "sphere": NGL.SphereBuffer,
	            "text": NGL.TextBuffer,
	            "tetrahedron": NGL.TetrahedronBuffer,
	            "torus": NGL.TorusBuffer
	        };
	
	        var params = {};
	        for (var key in kwargs){
	            params[key] = new Float32Array(kwargs[key]);
	        }
	        var shape = new NGL.Shape("shape");
	        var buffer_class = class_dict[name];
	        var buffer = new buffer_class(params);
	        shape.addBuffer(buffer);
	        var shapeComp = this.stage.addComponentFromObject(shape);
	        shapeComp.addRepresentation("buffer");
	    },
	
	    replaceStructure: function(structure){
	         var blob = new Blob([structure.data], {type: "text/plain"});
	         var params = structure.params || {};
	         params.ext = structure.ext;
	         params.defaultRepresentation = false;
	         var comp = this.stage.compList[0];
	         var representations = comp.reprList.slice();
	         var old_orientation = this.stage.viewerControls.getOrientation();
	         var that = this;
	         this.stage.loadFile(blob, params).then(function(component) {
	             that.stage.viewerControls.orient(old_orientation);
	             representations.forEach(function(repr) {
	                 var repr_name = repr.name;
	                 var repr_params = repr.repr.getParameters();
	                 // Note: not using repr.repr.type, repr.repr.params
	                 // since seems to me that repr.repr.params won't return correct "sele"
	                 component.addRepresentation(repr_name, repr_params);
	             });
	             that.stage.removeComponent(comp);
	             that._handle_loading_file_finished();
	         });
	    },
	
	    superpose: function(cindex0, cindex1, align, sele0, sele1) {
	        // superpose two components with given params
	        var component0 = this.stage.compList[cindex0];
	        var component1 = this.stage.compList[cindex1];
	        component1.superpose(component0, align, sele0, sele1);
	    },
	
	    decode_base64: function(base64) {
	        // lightly adapted from Niklas
	
	        /*
	         * base64-arraybuffer
	         * https://github.com/niklasvh/base64-arraybuffer
	         *
	         * Copyright (c) 2012 Niklas von Hertzen
	         * Licensed under the MIT license.
	         */
	        var chars =
	            "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
	        var bufferLength = base64.length * 0.75,
	            len = base64.length,
	            i, p = 0,
	            encoded1, encoded2, encoded3, encoded4;
	
	        if (base64[base64.length - 1] === "=") {
	            bufferLength--;
	            if (base64[base64.length - 2] === "=") {
	                bufferLength--;
	            }
	        }
	
	        var arraybuffer = new ArrayBuffer(bufferLength),
	            bytes = new Uint8Array(arraybuffer);
	
	        for (i = 0; i < len; i += 4) {
	            encoded1 = chars.indexOf(base64[i]);
	            encoded2 = chars.indexOf(base64[i + 1]);
	            encoded3 = chars.indexOf(base64[i + 2]);
	            encoded4 = chars.indexOf(base64[i + 3]);
	
	            bytes[p++] = (encoded1 << 2) | (encoded2 >> 4);
	            bytes[p++] = ((encoded2 & 15) << 4) | (encoded3 >> 2);
	            bytes[p++] = ((encoded3 & 3) << 6) | (encoded4 & 63);
	        }
	
	        return arraybuffer;
	    },
	
	    updateCoordinates: function(coordinates, model) {
	        // coordinates must be ArrayBuffer (use this.decode_base64)
	        var component = this.stage.compList[model];
	        if (coordinates && component) {
	            var coords = new Float32Array(coordinates);
	            component.structure.updatePosition(coords);
	            component.updateRepresentations({
	                "position": true
	            });
	        }
	    },
	
	    handleResizable: function() {
	        this.$container.resizable({
	            resize: function(event, ui) {
	                this.setSize(ui.size.width + "px", ui.size.height + "px");
	            }.bind(this)
	        })
	    },
	
	    handleResize: function(){
	        var width = this.$el.width()
	        console.log('el width ' + width)
	        var height = this.$el.height() + "px"
	        if (this.stage_widget){
	            width = width - $(this.stage_widget.sidebar.dom).width()
	        }
	        width = width + "px"
	        console.log('new width (px)' + width)
	        this.setSize(width, height)
	    },
	
	    setSize: function(width, height) {
	        this.stage.viewer.container.style.width = width;
	        this.stage.viewer.container.style.height = height;
	        this.stage.handleResize();
	    },
	
	    GUIStyleChanged: function(){
	        var style = this.model.get("gui_style");
	        if (style === 'ngl'){
	            this.createNglGUI();
	        }else{
	            if (this.stage_widget){
	                this.stage_widget.dispose()
	                this.stage_widget = undefined
	                this.$container.resizable("enable")
	                var width = this.$el.parent().width() + "px";
	                var height = this.$el.parent().height() + "px";
	                this.setSize(width, height);
	            }
	        }
	    },
	
	    parametersChanged: function() {
	        var _parameters = this.model.get("_parameters");
	        this.setParameters(_parameters);
	    },
	
	    setParameters: function(parameters) {
	        this.stage.setParameters(parameters);
	
	        // do not set _ngl_full_stage_parameters here
	        // or parameters will be never updated (not sure why)
	        // use observe in python side
	        var updated_params = this.stage.getParameters();
	        this.send({
	            'type': 'stage_parameters',
	            'data': updated_params
	        })
	    },
	
	    _downloadImage: function(filename, params) {
	        if (this.ngl_view_id == this.get_last_child_id()){
	            this.stage.makeImage(params).then(function(blob) {
	                NGL.download(blob, filename);
	            })
	        }
	    },
	
	    _exportImage: function(wid, params) {
	        if (this.ngl_view_id == this.get_last_child_id()){
	            this.stage.makeImage(params).then(function(blob) {
	                var reader = new FileReader();
	                var arr_str;
	                reader.onload = function() {
	                    arr_str = reader.result.replace("data:image/png;base64,", "");
	                    // this.model.set("_image_data", arr_str);
	                    // this.touch();
	                    this.send({
	                        "data": arr_str,
	                        "type": "image_data",
	                        "ID": wid,
	                    });
	                    this.send({'type': 'async_message', 'data': 'ok'});
	                }.bind(this);
	                reader.readAsDataURL(blob);
	            }.bind(this));
	        }
	    },
	
	
	    _handle_loading_file_finished: function() {
	        this.send({'type': 'async_message', 'data': 'ok'});
	    },
	
	    _get_loadFile_promise: function(msg){
	         // args = [{'type': ..., 'data': ...}]
	         var args0 = msg.args[0];
	         if (args0.type == 'blob') {
	             var blob;
	             if (args0.binary) {
	                 var decoded_data = this.decode_base64(args0.data);
	                 blob = new Blob([decoded_data], {
	                     type: "application/octet-binary"
	                 });
	             } else {
	                 blob = new Blob([args0.data], {
	                     type: "text/plain"
	                 });
	             }
	             return this.stage.loadFile(blob, msg.kwargs)
	         } else {
	             var file = new File([""], args0.data);
	             var path = "";
	             if (args0.type == 'path' && ! file.exists){
	                 // hacky fix for jupyterlab
	                 // https://github.com/arose/nglview/issues/783
	                 // https://github.com/jupyterlab/jupyterlab/issues/6218
	                 // e.g: http://localhost:8888/files/ala3.pdb
	                 path = 'files/' + args0.data;
	             } else {
	                 path = args0.data;
	             }
	             return this.stage.loadFile(path, msg.kwargs)
	         }
	    },
	
	    get_last_child_id: function(){
	        var keys = Object.keys(this.model.views);
	        return keys[keys.length-1]
	    },
	
	    _handle_stage_loadFile: function(msg){
	        // args = [{'type': ..., 'data': ...}]
	        if (this.ngl_view_id != this.get_last_child_id() && msg.last_child){
	            return
	        }
	        var that = this;
	        this._get_loadFile_promise(msg).then(function(o){
	            that._handle_loading_file_finished();
	            o;
	        });
	    },
	
		addColorScheme: function(args, label){
	        var id = NGL.ColormakerRegistry.addSelectionScheme(args, label);
	        var scheme = NGL.ColormakerRegistry.userSchemes[id];
	        NGL.ColormakerRegistry.removeScheme(id);
	        // hard code the scheme ID
	        NGL.ColormakerRegistry.add(label, scheme);
	        return label
		},
	
	    on_msg: function(msg) {
	        // TODO: re-organize
	        if (msg.type == 'call_method') {
	            var index, component, func, stage;
	            var new_args = msg.args.slice();
	            new_args.push(msg.kwargs);
	
	            // handle color
	            if (msg.methodName == 'addRepresentation' &&
	                msg.reconstruc_color_scheme){
	                msg.kwargs.color = this.addColorScheme(msg.kwargs.color, msg.kwargs.color_label);
	            }
	            if ("colorVolume" in msg.kwargs){
	                // backend only send component index
	                // so we need to convert to 'volume' data
	                index = msg.kwargs["colorVolume"];
	                msg.kwargs["colorVolume"] = this.stage.compList[index].volume;
	            }
	
	            switch (msg.target) {
	                case 'Stage':
	                    var stage_func = this.stage[msg.methodName];
	                    stage = this.stage;
	                    if (msg.methodName == 'screenshot') {
	                        NGL.screenshot(this.stage.viewer, msg.kwargs);
	                    } else if (msg.methodName == 'removeComponent') {
	                        index = msg.args[0];
	                        component = this.stage.compList[index];
	                        this.stage.removeComponent(component);
	                    } else if (msg.methodName == 'loadFile') {
	                        if (this.model.views.length > 1 && msg.kwargs &&
	                            msg.kwargs.defaultRepresentation) {
	                            // no need to add default representation as all representations
	                            // are serialized separately, also it unwantedly sets the orientation
	                            msg.kwargs.defaultRepresentation = false
	                        }
	                        this._handle_stage_loadFile(msg);
	                    } else {
	                            stage_func.apply(stage, new_args);
	                    }
	                    break;
	                case 'Viewer':
	                    var viewer = this.stage.viewer;
	                    func = this.stage.viewer[msg.methodName];
	                    func.apply(viewer, new_args);
	                    break;
	                case 'viewerControls':
	                    var controls = this.stage.viewerControls;
	                    func = controls[msg.methodName];
	                    func.apply(controls, new_args);
	                    break;
	                case 'compList':
	                    index = msg['component_index'];
	                    component = this.stage.compList[index];
	                    func = component[msg.methodName];
	                    func.apply(component, new_args);
	                    break;
	                case 'Widget':
	                    func = this[msg.methodName];
	                    if (func) {
	                        func.apply(this, new_args);
	                    } else {
	                        // send error message to Python?
	                        console.log('can not create func for ' + msg.methodName);
	                    }
	                    break;
	                case 'Representation':
	                    var component_index = msg['component_index'];
	                    var repr_index = msg['repr_index'];
	                    component = this.stage.compList[component_index];
	                    var repr = component.reprList[repr_index];
	                    func = repr[msg.methodName];
	                    if (repr && func) {
	                        func.apply(repr, new_args);
	                    }
	                    break;
	                default:
	                    console.log('there is no method for ' + msg.target);
	                    break;
	            }
	        } else if (msg.type == 'base64_single') {
	            var coordinatesDict = msg.data;
	            var keys = Object.keys(coordinatesDict);
	
	            for (var i = 0; i < keys.length; i++) {
	                var traj_index = keys[i];
	                var coordinates = this.decode_base64(coordinatesDict[traj_index]);
	                if (coordinates && coordinates.byteLength > 0) {
	                    this.updateCoordinates(coordinates, traj_index);
	                }
	            }
	        } else if (msg.type == 'binary_single') {
	            var coordinateMeta = msg.data;
	            keys = Object.keys(coordinateMeta);
	
	            for (i = 0; i < keys.length; i++) {
	                traj_index = keys[i];
	                coordinates = new Float32Array(msg.buffers[i].buffer);
	                if (coordinates.byteLength > 0) {
	                    this.updateCoordinates(coordinates, traj_index);
	                }
	            }
	        } else if (msg.type == 'get') {
	            if (msg.data == 'camera') {
	                this.send(JSON.stringify(this.stage.viewer.camera));
	            } else if (msg.data == 'parameters') {
	                this.send(JSON.stringify(this.stage.parameters));
	            } else {
	                console.log("Number of components", this.stage.compList.length);
	                console.log("ngl_view_id", this.ngl_view_id);
	            }
	        }
	    },
	});
	
	var FullscreenModel = widgets.DOMWidgetModel.extend({
	    defaults: function(){
	        return _.extend(widgets.DOMWidgetModel.prototype.defaults(), {
	            _model_name: 'FullscreenModel',
	            _model_module: 'nglview-js-widgets',
	            _model_module_version: __webpack_require__(11).version,
	            _view_name: "FullscreenView",
	            _view_module: "nglview-js-widgets",
	            _view_module_version: __webpack_require__(11).version,
	        });
	    }
	})
	
	var FullscreenView = BaseView.extend({
	    render: function() {
	        this.stage = new NGL.Stage()
	        var that = this
	        this.model.on("msg:custom", function(msg){
	            that.on_msg(msg)
	        })
	        this.handleSignals()
	    },
	
	    fullscreen: function(model_id){
	        var that = this
	        this.model.widget_manager.get_model(model_id).then((model) =>{
	            var key = Object.keys(model.views)[0]
	            model.views[key].then((view) => {
	                that.stage.toggleFullscreen(view.el)
	            })
	        })
	    },
	
	    handleSignals: function(){
	        var that = this
	        this.stage.signals.fullscreenChanged.add(function (isFullscreen) {
	            that.model.set("_is_fullscreen", isFullscreen)
	            that.touch()
	        })
	    },
	
	    executeCode: function(code){
	        eval(code);
	    },
	
	    on_msg: function(msg){
	        if ('executeCode' in msg){
	            this.executeCode(msg.executeCode)
	        }
	    }
	
	});
	
	// export all models and views here to make embeding a bit easier
	module.exports = {
	    'NGLView': NGLView,
	    'NGLModel': NGLModel,
	    'NGL': NGL,
	    'FullscreenModel': FullscreenModel,
	    'FullscreenView': FullscreenView,
	    'ColormakerRegistryModel': ColormakerRegistryModel,
	    'ColormakerRegistryView': ColormakerRegistryView
	};


/***/ }),
/* 2 */
/***/ (function(module, exports) {

	module.exports = __WEBPACK_EXTERNAL_MODULE_2__;

/***/ }),
/* 3 */
/***/ (function(module, exports, __webpack_require__) {

	/* WEBPACK VAR INJECTION */(function(setImmediate, global) {!function(t,e){ true?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e(t.NGL={})}(this,function(de){"use strict";var t,u,e,i,c,r,h,n;"undefined"!=typeof window&&function(){window.console=window.console||{};for(var t,e,i=window.console,r={},n=function(){},o="memory".split(","),a="assert,clear,count,debug,dir,dirxml,error,exception,group,groupCollapsed,groupEnd,info,log,markTimeline,profile,profiles,profileEnd,show,table,time,timeEnd,timeline,timelineEnd,timeStamp,trace,warn".split(",");t=o.pop();)i[t]||(i[t]=r);for(;e=a.pop();)i[e]||(i[e]=n)}(),void 0===window.HTMLCanvasElement||window.HTMLCanvasElement.prototype.toBlob||Object.defineProperty(window.HTMLCanvasElement.prototype,"toBlob",{value:function(t,e,i){for(var r=window.atob(this.toDataURL(e,i).split(",")[1]),n=r.length,o=n>>2,a=new Uint8Array(n),s=new Uint32Array(a.buffer,0,o),c=0,u=0;c<o;c++)s[c]=r.charCodeAt(u++)|r.charCodeAt(u++)<<8|r.charCodeAt(u++)<<16|r.charCodeAt(u++)<<24;for(var h=3&n;h--;)a[u]=r.charCodeAt(u++);t(new window.Blob([a],{type:e||"image/png"}))}}),Math.cbrt=Math.cbrt||function(t){var e=Math.pow(Math.abs(t),1/3);return t<0?-e:e},Math.sign||(Math.sign=function(t){return 0===(t=+t)||isNaN(t)?Number(t):0<t?1:-1}),Number.isInteger||(Number.isInteger=function(t){return"number"==typeof t&&isFinite(t)&&-9007199254740992<t&&t<9007199254740992&&Math.floor(t)===t}),Number.isNaN||(Number.isNaN=function(t){return t!=t}),Object.assign||Object.defineProperty(Object,"assign",{enumerable:!1,configurable:!0,writable:!0,value:function(t){var e=arguments;if(null==t)throw new TypeError("Cannot convert first argument to object");for(var i,r=Object(t),n=!1,o=1;o<arguments.length;o++){var a=e[o];if(null!=a){for(var s=Object.keys(Object(a)),c=0,u=s.length;c<u;c++){var h=s[c];try{var l=Object.getOwnPropertyDescriptor(a,h);void 0!==l&&l.enumerable&&(r[h]=a[h])}catch(t){n||(n=!0,i=t)}}if(n)throw i}}return r}}),String.prototype.startsWith||(t=function(){var t;try{var e={},i=Object.defineProperty;t=i(e,e,e)&&i}catch(t){}return t}(),u={}.toString,e=function(t){if(null===this)throw TypeError();var e=String(this);if(t&&"[object RegExp]"===u.call(t))throw TypeError();var i=e.length,r=String(t),n=r.length,o=1<arguments.length?arguments[1]:void 0,a=o?Number(o):0;Number.isNaN(a)&&(a=0);var s=Math.min(Math.max(a,0),i);if(i<n+s)return!1;for(var c=-1;++c<n;)if(e.charCodeAt(s+c)!==r.charCodeAt(c))return!1;return!0},t?t(String.prototype,"startsWith",{value:e,configurable:!0,writable:!0}):String.prototype.startsWith=e),String.prototype.endsWith||(String.prototype.endsWith=function(t,e){var i=this.toString();("number"!=typeof e||!isFinite(e)||Math.floor(e)!==e||e>i.length)&&(e=i.length),e-=t.length;var r=i.indexOf(t,e);return-1!==r&&r===e}),String.prototype.repeat||(String.prototype.repeat=function(t){if(null===this)throw new TypeError("can't convert "+this+" to object");var e=""+this;if(t=+t,Number.isNaN(t)&&(t=0),t<0)throw new RangeError("repeat count must be non-negative");if(t===1/0)throw new RangeError("repeat count must be less than infinity");if(t=Math.floor(t),0===e.length||0===t)return"";if(e.length*t>=1<<28)throw new RangeError("repeat count must not overflow maximum string size");for(var i="";1==(1&t)&&(i+=e),0!==(t>>>=1);)e+=e;return i}),String.prototype.includes||(String.prototype.includes=function(t,e){return"number"!=typeof e&&(e=0),!(e+t.length>this.length)&&-1!==this.indexOf(t,e)}),Array.prototype.includes||(Array.prototype.includes=function(t){if(null==this)throw new TypeError("Array.prototype.includes called on null or undefined");var e=Object(this),i=parseInt(e.length,10)||0;if(0===i)return!1;var r,n,o=parseInt(arguments[1],10)||0;for(0<=o?r=o:(r=i+o)<0&&(r=0);r<i;){if(t===(n=e[r])||Number.isNaN(t)&&Number.isNaN(n))return!0;r++}return!1}),Array.from||(Array.from=(i=Object.prototype.toString,c=function(t){return"function"==typeof t||"[object Function]"===i.call(t)},r=Math.pow(2,53)-1,h=function(t){var e,i=(e=Number(t),isNaN(e)?0:0!==e&&isFinite(e)?(0<e?1:-1)*Math.floor(Math.abs(e)):e);return Math.min(Math.max(i,0),r)},function(t){var e=Object(t);if(null==t)throw new TypeError("Array.from requires an array-like object - not null or undefined");var i,r=1<arguments.length?arguments[1]:void 0;if(void 0!==r){if(!c(r))throw new TypeError("Array.from: when provided, the second argument must be a function");2<arguments.length&&(i=arguments[2])}for(var n,o=h(e.length),a=c(this)?Object(new this(o)):new Array(o),s=0;s<o;)n=e[s],a[s]=r?void 0===i?r(n,s):r.call(i,n,s):n,s+=1;return a.length=o,a})),"undefined"!=typeof window&&function(){for(var n=0,t=["ms","moz","webkit","o"],e=0;e<t.length&&!window.requestAnimationFrame;++e)window.requestAnimationFrame=window[t[e]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[t[e]+"CancelAnimationFrame"]||window[t[e]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),i=Math.max(0,16-(e-n)),r=window.setTimeout(function(){t(e+i)},i);return n=e+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)})}(),void 0===Function.prototype.name&&void 0!==Object.defineProperty&&Object.defineProperty(Function.prototype,"name",{get:function(){return this.toString().match(/^\s*function\s*(\S*)\s*\(/)[1]}}),"undefined"!=typeof window&&(void 0===window.performance&&(self.performance={}),void 0===window.performance.now&&(n=Date.now(),window.performance.now=function(){return Date.now()-n})),void 0!==Object.defineProperty&&(void 0===Number.MAX_SAFE_INTEGER&&Object.defineProperty(Number,"MAX_SAFE_INTEGER",{enumerable:!1,configurable:!1,writable:!1,value:Math.pow(2,53)-1}),void 0===Number.MIN_SAFE_INTEGER&&Object.defineProperty(Number,"MIN_SAFE_INTEGER",{enumerable:!1,configurable:!1,writable:!1,value:-(Math.pow(2,53)-1)}));var o=setTimeout;function a(){}function s(t){if(!(this instanceof s))throw new TypeError("Promises must be constructed via new");if("function"!=typeof t)throw new TypeError("not a function");this._state=0,this._handled=!1,this._value=void 0,this._deferreds=[],g(t,this)}function l(i,r){for(;3===i._state;)i=i._value;0!==i._state?(i._handled=!0,s._immediateFn(function(){var t=1===i._state?r.onFulfilled:r.onRejected;if(null!==t){var e;try{e=t(i._value)}catch(t){return void d(r.promise,t)}p(r.promise,e)}else(1===i._state?p:d)(r.promise,i._value)})):i._deferreds.push(r)}function p(e,t){try{if(t===e)throw new TypeError("A promise cannot be resolved with itself.");if(t&&("object"==typeof t||"function"==typeof t)){var i=t.then;if(t instanceof s)return e._state=3,e._value=t,void f(e);if("function"==typeof i)return void g((r=i,n=t,function(){r.apply(n,arguments)}),e)}e._state=1,e._value=t,f(e)}catch(t){d(e,t)}var r,n}function d(t,e){t._state=2,t._value=e,f(t)}function f(t){2===t._state&&0===t._deferreds.length&&s._immediateFn(function(){t._handled||s._unhandledRejectionFn(t._value)});for(var e=0,i=t._deferreds.length;e<i;e++)l(t,t._deferreds[e]);t._deferreds=null}function m(t,e,i){this.onFulfilled="function"==typeof t?t:null,this.onRejected="function"==typeof e?e:null,this.promise=i}function g(t,e){var i=!1;try{t(function(t){i||(i=!0,p(e,t))},function(t){i||(i=!0,d(e,t))})}catch(t){if(i)return;i=!0,d(e,t)}}function v(){}s.prototype.catch=function(t){return this.then(null,t)},s.prototype.then=function(t,e){var i=new this.constructor(a);return l(this,new m(t,e,i)),i},s.prototype.finally=function(e){var i=this.constructor;return this.then(function(t){return i.resolve(e()).then(function(){return t})},function(t){return i.resolve(e()).then(function(){return i.reject(t)})})},s.all=function(e){return new s(function(r,n){if(!e||void 0===e.length)throw new TypeError("Promise.all accepts an array");var o=Array.prototype.slice.call(e);if(0===o.length)return r([]);var a=o.length;function s(e,t){try{if(t&&("object"==typeof t||"function"==typeof t)){var i=t.then;if("function"==typeof i)return void i.call(t,function(t){s(e,t)},n)}o[e]=t,0==--a&&r(o)}catch(t){n(t)}}for(var t=0;t<o.length;t++)s(t,o[t])})},s.resolve=function(e){return e&&"object"==typeof e&&e.constructor===s?e:new s(function(t){t(e)})},s.reject=function(i){return new s(function(t,e){e(i)})},s.race=function(n){return new s(function(t,e){for(var i=0,r=n.length;i<r;i++)n[i].then(t,e)})},s._immediateFn="function"==typeof setImmediate&&function(t){setImmediate(t)}||function(t){o(t,0)},s._unhandledRejectionFn=function(t){"undefined"!=typeof console&&console&&console.warn("Possible Unhandled Promise Rejection:",t)},void 0===Number.EPSILON&&(Number.EPSILON=Math.pow(2,-52)),void 0===Number.isInteger&&(Number.isInteger=function(t){return"number"==typeof t&&isFinite(t)&&Math.floor(t)===t}),void 0===Math.sign&&(Math.sign=function(t){return t<0?-1:0<t?1:+t}),"name"in Function.prototype==!1&&Object.defineProperty(Function.prototype,"name",{get:function(){return this.toString().match(/^\s*function\s*([^\(\s]*)/)[1]}}),void 0===Object.assign&&(Object.assign=function(t){var e=arguments;if(null==t)throw new TypeError("Cannot convert undefined or null to object");for(var i=Object(t),r=1;r<arguments.length;r++){var n=e[r];if(null!=n)for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&(i[o]=n[o])}return i}),Object.assign(v.prototype,{addEventListener:function(t,e){void 0===this._listeners&&(this._listeners={});var i=this._listeners;void 0===i[t]&&(i[t]=[]),-1===i[t].indexOf(e)&&i[t].push(e)},hasEventListener:function(t,e){if(void 0===this._listeners)return!1;var i=this._listeners;return void 0!==i[t]&&-1!==i[t].indexOf(e)},removeEventListener:function(t,e){if(void 0!==this._listeners){var i=this._listeners[t];if(void 0!==i){var r=i.indexOf(e);-1!==r&&i.splice(r,1)}}},dispatchEvent:function(t){if(void 0!==this._listeners){var e=this._listeners[t.type];if(void 0!==e){t.target=this;for(var i=e.slice(0),r=0,n=i.length;r<n;r++)i[r].call(this,t)}}}});var y,b,x,_,w,S,A,M,E,P,T,C,I,O,L,R,D,k,B,N,F,z,$=0,W=1,X=2,U=1,j=2,G=0,wt=1,et=2,V=0,q=0,Y=1,Z=2,K=3,J=4,Q=5,H=100,tt=101,it=102,rt=103,nt=104,ot=200,at=201,st=202,ct=203,ut=204,ht=205,lt=206,pt=207,dt=208,ft=209,mt=210,gt=0,vt=1,yt=2,bt=3,xt=4,_t=5,St=6,At=7,Mt=0,Et=1,Pt=2,Tt=0,Ct=1,It=2,Ot=3,Lt=4,Rt=301,Dt=302,kt=303,Bt=304,Nt=305,Ft=306,zt=307,Ut=1e3,jt=1001,Gt=1002,Vt=1003,Ht=1004,$t=1005,Wt=1006,Xt=1007,qt=1008,Yt=1009,Zt=1010,Kt=1011,Jt=1012,Qt=1013,te=1014,ee=1015,ie=1016,re=1017,ne=1018,oe=1019,ae=1020,se=1021,ce=1022,ue=1023,he=1024,le=1025,pe=1026,fe=1027,ge=33776,ve=33777,ye=33778,be=33779,xe=35840,_e=35841,we=35842,Se=35843,Ae=36196,Me=37808,Ee=37809,Pe=37810,Te=37811,Ce=37812,Ie=37813,Oe=37814,Le=37815,Re=37816,De=37817,ke=37818,Be=37819,Ne=37820,Fe=37821,ze=2400,Ue=2401,je=0,Ge=3e3,Ve=3001,He=3007,$e=3002,We=3004,Xe=3005,qe=3006,Ye=3200,Ze=3201,Ke=0,Je=1,Qe={DEG2RAD:Math.PI/180,RAD2DEG:180/Math.PI,generateUUID:function(){for(var n=[],t=0;t<256;t++)n[t]=(t<16?"0":"")+t.toString(16);return function(){var t=4294967295*Math.random()|0,e=4294967295*Math.random()|0,i=4294967295*Math.random()|0,r=4294967295*Math.random()|0;return(n[255&t]+n[t>>8&255]+n[t>>16&255]+n[t>>24&255]+"-"+n[255&e]+n[e>>8&255]+"-"+n[e>>16&15|64]+n[e>>24&255]+"-"+n[63&i|128]+n[i>>8&255]+"-"+n[i>>16&255]+n[i>>24&255]+n[255&r]+n[r>>8&255]+n[r>>16&255]+n[r>>24&255]).toUpperCase()}}(),clamp:function(t,e,i){return Math.max(e,Math.min(i,t))},euclideanModulo:function(t,e){return(t%e+e)%e},mapLinear:function(t,e,i,r,n){return r+(t-e)*(n-r)/(i-e)},lerp:function(t,e,i){return(1-i)*t+i*e},smoothstep:function(t,e,i){return t<=e?0:i<=t?1:(t=(t-e)/(i-e))*t*(3-2*t)},smootherstep:function(t,e,i){return t<=e?0:i<=t?1:(t=(t-e)/(i-e))*t*t*(t*(6*t-15)+10)},randInt:function(t,e){return t+Math.floor(Math.random()*(e-t+1))},randFloat:function(t,e){return t+Math.random()*(e-t)},randFloatSpread:function(t){return t*(.5-Math.random())},degToRad:function(t){return t*Qe.DEG2RAD},radToDeg:function(t){return t*Qe.RAD2DEG},isPowerOfTwo:function(t){return 0==(t&t-1)&&0!==t},ceilPowerOfTwo:function(t){return Math.pow(2,Math.ceil(Math.log(t)/Math.LN2))},floorPowerOfTwo:function(t){return Math.pow(2,Math.floor(Math.log(t)/Math.LN2))}};function ti(t,e){this.x=t||0,this.y=e||0}function ei(){this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],0<arguments.length&&console.error("THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.")}function ii(t,e,i,r){this._x=t||0,this._y=e||0,this._z=i||0,this._w=void 0!==r?r:1}function ri(t,e,i){this.x=t||0,this.y=e||0,this.z=i||0}function ni(){this.elements=[1,0,0,0,1,0,0,0,1],0<arguments.length&&console.error("THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.")}Object.defineProperties(ti.prototype,{width:{get:function(){return this.x},set:function(t){this.x=t}},height:{get:function(){return this.y},set:function(t){this.y=t}}}),Object.assign(ti.prototype,{isVector2:!0,set:function(t,e){return this.x=t,this.y=e,this},setScalar:function(t){return this.x=t,this.y=t,this},setX:function(t){return this.x=t,this},setY:function(t){return this.y=t,this},setComponent:function(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;default:throw new Error("index is out of range: "+t)}return this},getComponent:function(t){switch(t){case 0:return this.x;case 1:return this.y;default:throw new Error("index is out of range: "+t)}},clone:function(){return new this.constructor(this.x,this.y)},copy:function(t){return this.x=t.x,this.y=t.y,this},add:function(t,e){return void 0!==e?(console.warn("THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(t,e)):(this.x+=t.x,this.y+=t.y,this)},addScalar:function(t){return this.x+=t,this.y+=t,this},addVectors:function(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this},addScaledVector:function(t,e){return this.x+=t.x*e,this.y+=t.y*e,this},sub:function(t,e){return void 0!==e?(console.warn("THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(t,e)):(this.x-=t.x,this.y-=t.y,this)},subScalar:function(t){return this.x-=t,this.y-=t,this},subVectors:function(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this},multiply:function(t){return this.x*=t.x,this.y*=t.y,this},multiplyScalar:function(t){return this.x*=t,this.y*=t,this},divide:function(t){return this.x/=t.x,this.y/=t.y,this},divideScalar:function(t){return this.multiplyScalar(1/t)},applyMatrix3:function(t){var e=this.x,i=this.y,r=t.elements;return this.x=r[0]*e+r[3]*i+r[6],this.y=r[1]*e+r[4]*i+r[7],this},min:function(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this},max:function(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this},clamp:function(t,e){return this.x=Math.max(t.x,Math.min(e.x,this.x)),this.y=Math.max(t.y,Math.min(e.y,this.y)),this},clampScalar:(y=new ti,b=new ti,function(t,e){return y.set(t,t),b.set(e,e),this.clamp(y,b)}),clampLength:function(t,e){var i=this.length();return this.divideScalar(i||1).multiplyScalar(Math.max(t,Math.min(e,i)))},floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this},ceil:function(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this},round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this},roundToZero:function(){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:function(){return this.x=-this.x,this.y=-this.y,this},dot:function(t){return this.x*t.x+this.y*t.y},cross:function(t){return this.x*t.y-this.y*t.x},lengthSq:function(){return this.x*this.x+this.y*this.y},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},manhattanLength:function(){return Math.abs(this.x)+Math.abs(this.y)},normalize:function(){return this.divideScalar(this.length()||1)},angle:function(){var t=Math.atan2(this.y,this.x);return t<0&&(t+=2*Math.PI),t},distanceTo:function(t){return Math.sqrt(this.distanceToSquared(t))},distanceToSquared:function(t){var e=this.x-t.x,i=this.y-t.y;return e*e+i*i},manhattanDistanceTo:function(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)},setLength:function(t){return this.normalize().multiplyScalar(t)},lerp:function(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this},lerpVectors:function(t,e,i){return this.subVectors(e,t).multiplyScalar(i).add(t)},equals:function(t){return t.x===this.x&&t.y===this.y},fromArray:function(t,e){return void 0===e&&(e=0),this.x=t[e],this.y=t[e+1],this},toArray:function(t,e){return void 0===t&&(t=[]),void 0===e&&(e=0),t[e]=this.x,t[e+1]=this.y,t},fromBufferAttribute:function(t,e,i){return void 0!==i&&console.warn("THREE.Vector2: offset has been removed from .fromBufferAttribute()."),this.x=t.getX(e),this.y=t.getY(e),this},rotateAround:function(t,e){var i=Math.cos(e),r=Math.sin(e),n=this.x-t.x,o=this.y-t.y;return this.x=n*i-o*r+t.x,this.y=n*r+o*i+t.y,this}}),Object.assign(ei.prototype,{isMatrix4:!0,set:function(t,e,i,r,n,o,a,s,c,u,h,l,p,d,f,m){var g=this.elements;return g[0]=t,g[4]=e,g[8]=i,g[12]=r,g[1]=n,g[5]=o,g[9]=a,g[13]=s,g[2]=c,g[6]=u,g[10]=h,g[14]=l,g[3]=p,g[7]=d,g[11]=f,g[15]=m,this},identity:function(){return this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),this},clone:function(){return(new ei).fromArray(this.elements)},copy:function(t){var e=this.elements,i=t.elements;return e[0]=i[0],e[1]=i[1],e[2]=i[2],e[3]=i[3],e[4]=i[4],e[5]=i[5],e[6]=i[6],e[7]=i[7],e[8]=i[8],e[9]=i[9],e[10]=i[10],e[11]=i[11],e[12]=i[12],e[13]=i[13],e[14]=i[14],e[15]=i[15],this},copyPosition:function(t){var e=this.elements,i=t.elements;return e[12]=i[12],e[13]=i[13],e[14]=i[14],this},extractBasis:function(t,e,i){return t.setFromMatrixColumn(this,0),e.setFromMatrixColumn(this,1),i.setFromMatrixColumn(this,2),this},makeBasis:function(t,e,i){return this.set(t.x,e.x,i.x,0,t.y,e.y,i.y,0,t.z,e.z,i.z,0,0,0,0,1),this},extractRotation:(T=new ri,function(t){var e=this.elements,i=t.elements,r=1/T.setFromMatrixColumn(t,0).length(),n=1/T.setFromMatrixColumn(t,1).length(),o=1/T.setFromMatrixColumn(t,2).length();return e[0]=i[0]*r,e[1]=i[1]*r,e[2]=i[2]*r,e[3]=0,e[4]=i[4]*n,e[5]=i[5]*n,e[6]=i[6]*n,e[7]=0,e[8]=i[8]*o,e[9]=i[9]*o,e[10]=i[10]*o,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}),makeRotationFromEuler:function(t){t&&t.isEuler||console.error("THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.");var e=this.elements,i=t.x,r=t.y,n=t.z,o=Math.cos(i),a=Math.sin(i),s=Math.cos(r),c=Math.sin(r),u=Math.cos(n),h=Math.sin(n);if("XYZ"===t.order){var l=o*u,p=o*h,d=a*u,f=a*h;e[0]=s*u,e[4]=-s*h,e[8]=c,e[1]=p+d*c,e[5]=l-f*c,e[9]=-a*s,e[2]=f-l*c,e[6]=d+p*c,e[10]=o*s}else if("YXZ"===t.order){var m=s*u,g=s*h,v=c*u,y=c*h;e[0]=m+y*a,e[4]=v*a-g,e[8]=o*c,e[1]=o*h,e[5]=o*u,e[9]=-a,e[2]=g*a-v,e[6]=y+m*a,e[10]=o*s}else if("ZXY"===t.order){m=s*u,g=s*h,v=c*u,y=c*h;e[0]=m-y*a,e[4]=-o*h,e[8]=v+g*a,e[1]=g+v*a,e[5]=o*u,e[9]=y-m*a,e[2]=-o*c,e[6]=a,e[10]=o*s}else if("ZYX"===t.order){l=o*u,p=o*h,d=a*u,f=a*h;e[0]=s*u,e[4]=d*c-p,e[8]=l*c+f,e[1]=s*h,e[5]=f*c+l,e[9]=p*c-d,e[2]=-c,e[6]=a*s,e[10]=o*s}else if("YZX"===t.order){var b=o*s,x=o*c,_=a*s,w=a*c;e[0]=s*u,e[4]=w-b*h,e[8]=_*h+x,e[1]=h,e[5]=o*u,e[9]=-a*u,e[2]=-c*u,e[6]=x*h+_,e[10]=b-w*h}else if("XZY"===t.order){b=o*s,x=o*c,_=a*s,w=a*c;e[0]=s*u,e[4]=-h,e[8]=c*u,e[1]=b*h+w,e[5]=o*u,e[9]=x*h-_,e[2]=_*h-x,e[6]=a*u,e[10]=w*h+b}return e[3]=0,e[7]=0,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this},makeRotationFromQuaternion:(E=new ri(0,0,0),P=new ri(1,1,1),function(t){return this.compose(E,t,P)}),lookAt:(S=new ri,A=new ri,M=new ri,function(t,e,i){var r=this.elements;return M.subVectors(t,e),0===M.lengthSq()&&(M.z=1),M.normalize(),S.crossVectors(i,M),0===S.lengthSq()&&(1===Math.abs(i.z)?M.x+=1e-4:M.z+=1e-4,M.normalize(),S.crossVectors(i,M)),S.normalize(),A.crossVectors(M,S),r[0]=S.x,r[4]=A.x,r[8]=M.x,r[1]=S.y,r[5]=A.y,r[9]=M.y,r[2]=S.z,r[6]=A.z,r[10]=M.z,this}),multiply:function(t,e){return void 0!==e?(console.warn("THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead."),this.multiplyMatrices(t,e)):this.multiplyMatrices(this,t)},premultiply:function(t){return this.multiplyMatrices(t,this)},multiplyMatrices:function(t,e){var i=t.elements,r=e.elements,n=this.elements,o=i[0],a=i[4],s=i[8],c=i[12],u=i[1],h=i[5],l=i[9],p=i[13],d=i[2],f=i[6],m=i[10],g=i[14],v=i[3],y=i[7],b=i[11],x=i[15],_=r[0],w=r[4],S=r[8],A=r[12],M=r[1],E=r[5],P=r[9],T=r[13],C=r[2],I=r[6],O=r[10],L=r[14],R=r[3],D=r[7],k=r[11],B=r[15];return n[0]=o*_+a*M+s*C+c*R,n[4]=o*w+a*E+s*I+c*D,n[8]=o*S+a*P+s*O+c*k,n[12]=o*A+a*T+s*L+c*B,n[1]=u*_+h*M+l*C+p*R,n[5]=u*w+h*E+l*I+p*D,n[9]=u*S+h*P+l*O+p*k,n[13]=u*A+h*T+l*L+p*B,n[2]=d*_+f*M+m*C+g*R,n[6]=d*w+f*E+m*I+g*D,n[10]=d*S+f*P+m*O+g*k,n[14]=d*A+f*T+m*L+g*B,n[3]=v*_+y*M+b*C+x*R,n[7]=v*w+y*E+b*I+x*D,n[11]=v*S+y*P+b*O+x*k,n[15]=v*A+y*T+b*L+x*B,this},multiplyScalar:function(t){var e=this.elements;return e[0]*=t,e[4]*=t,e[8]*=t,e[12]*=t,e[1]*=t,e[5]*=t,e[9]*=t,e[13]*=t,e[2]*=t,e[6]*=t,e[10]*=t,e[14]*=t,e[3]*=t,e[7]*=t,e[11]*=t,e[15]*=t,this},applyToBufferAttribute:(w=new ri,function(t){for(var e=0,i=t.count;e<i;e++)w.x=t.getX(e),w.y=t.getY(e),w.z=t.getZ(e),w.applyMatrix4(this),t.setXYZ(e,w.x,w.y,w.z);return t}),determinant:function(){var t=this.elements,e=t[0],i=t[4],r=t[8],n=t[12],o=t[1],a=t[5],s=t[9],c=t[13],u=t[2],h=t[6],l=t[10],p=t[14];return t[3]*(+n*s*h-r*c*h-n*a*l+i*c*l+r*a*p-i*s*p)+t[7]*(+e*s*p-e*c*l+n*o*l-r*o*p+r*c*u-n*s*u)+t[11]*(+e*c*h-e*a*p-n*o*h+i*o*p+n*a*u-i*c*u)+t[15]*(-r*a*u-e*s*h+e*a*l+r*o*h-i*o*l+i*s*u)},transpose:function(){var t,e=this.elements;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:function(t){var e=this.elements;return e[12]=t.x,e[13]=t.y,e[14]=t.z,this},getInverse:function(t,e){var i=this.elements,r=t.elements,n=r[0],o=r[1],a=r[2],s=r[3],c=r[4],u=r[5],h=r[6],l=r[7],p=r[8],d=r[9],f=r[10],m=r[11],g=r[12],v=r[13],y=r[14],b=r[15],x=d*y*l-v*f*l+v*h*m-u*y*m-d*h*b+u*f*b,_=g*f*l-p*y*l-g*h*m+c*y*m+p*h*b-c*f*b,w=p*v*l-g*d*l+g*u*m-c*v*m-p*u*b+c*d*b,S=g*d*h-p*v*h-g*u*f+c*v*f+p*u*y-c*d*y,A=n*x+o*_+a*w+s*S;if(0===A){var M="THREE.Matrix4: .getInverse() can't invert matrix, determinant is 0";if(!0===e)throw new Error(M);return console.warn(M),this.identity()}var E=1/A;return i[0]=x*E,i[1]=(v*f*s-d*y*s-v*a*m+o*y*m+d*a*b-o*f*b)*E,i[2]=(u*y*s-v*h*s+v*a*l-o*y*l-u*a*b+o*h*b)*E,i[3]=(d*h*s-u*f*s-d*a*l+o*f*l+u*a*m-o*h*m)*E,i[4]=_*E,i[5]=(p*y*s-g*f*s+g*a*m-n*y*m-p*a*b+n*f*b)*E,i[6]=(g*h*s-c*y*s-g*a*l+n*y*l+c*a*b-n*h*b)*E,i[7]=(c*f*s-p*h*s+p*a*l-n*f*l-c*a*m+n*h*m)*E,i[8]=w*E,i[9]=(g*d*s-p*v*s-g*o*m+n*v*m+p*o*b-n*d*b)*E,i[10]=(c*v*s-g*u*s+g*o*l-n*v*l-c*o*b+n*u*b)*E,i[11]=(p*u*s-c*d*s-p*o*l+n*d*l+c*o*m-n*u*m)*E,i[12]=S*E,i[13]=(p*v*a-g*d*a+g*o*f-n*v*f-p*o*y+n*d*y)*E,i[14]=(g*u*a-c*v*a-g*o*h+n*v*h+c*o*y-n*u*y)*E,i[15]=(c*d*a-p*u*a+p*o*h-n*d*h-c*o*f+n*u*f)*E,this},scale:function(t){var e=this.elements,i=t.x,r=t.y,n=t.z;return e[0]*=i,e[4]*=r,e[8]*=n,e[1]*=i,e[5]*=r,e[9]*=n,e[2]*=i,e[6]*=r,e[10]*=n,e[3]*=i,e[7]*=r,e[11]*=n,this},getMaxScaleOnAxis:function(){var t=this.elements,e=t[0]*t[0]+t[1]*t[1]+t[2]*t[2],i=t[4]*t[4]+t[5]*t[5]+t[6]*t[6],r=t[8]*t[8]+t[9]*t[9]+t[10]*t[10];return Math.sqrt(Math.max(e,i,r))},makeTranslation:function(t,e,i){return this.set(1,0,0,t,0,1,0,e,0,0,1,i,0,0,0,1),this},makeRotationX:function(t){var e=Math.cos(t),i=Math.sin(t);return this.set(1,0,0,0,0,e,-i,0,0,i,e,0,0,0,0,1),this},makeRotationY:function(t){var e=Math.cos(t),i=Math.sin(t);return this.set(e,0,i,0,0,1,0,0,-i,0,e,0,0,0,0,1),this},makeRotationZ:function(t){var e=Math.cos(t),i=Math.sin(t);return this.set(e,-i,0,0,i,e,0,0,0,0,1,0,0,0,0,1),this},makeRotationAxis:function(t,e){var i=Math.cos(e),r=Math.sin(e),n=1-i,o=t.x,a=t.y,s=t.z,c=n*o,u=n*a;return this.set(c*o+i,c*a-r*s,c*s+r*a,0,c*a+r*s,u*a+i,u*s-r*o,0,c*s-r*a,u*s+r*o,n*s*s+i,0,0,0,0,1),this},makeScale:function(t,e,i){return this.set(t,0,0,0,0,e,0,0,0,0,i,0,0,0,0,1),this},makeShear:function(t,e,i){return this.set(1,e,i,0,t,1,i,0,t,e,1,0,0,0,0,1),this},compose:function(t,e,i){var r=this.elements,n=e._x,o=e._y,a=e._z,s=e._w,c=n+n,u=o+o,h=a+a,l=n*c,p=n*u,d=n*h,f=o*u,m=o*h,g=a*h,v=s*c,y=s*u,b=s*h,x=i.x,_=i.y,w=i.z;return r[0]=(1-(f+g))*x,r[1]=(p+b)*x,r[2]=(d-y)*x,r[3]=0,r[4]=(p-b)*_,r[5]=(1-(l+g))*_,r[6]=(m+v)*_,r[7]=0,r[8]=(d+y)*w,r[9]=(m-v)*w,r[10]=(1-(l+f))*w,r[11]=0,r[12]=t.x,r[13]=t.y,r[14]=t.z,r[15]=1,this},decompose:(x=new ri,_=new ei,function(t,e,i){var r=this.elements,n=x.set(r[0],r[1],r[2]).length(),o=x.set(r[4],r[5],r[6]).length(),a=x.set(r[8],r[9],r[10]).length();this.determinant()<0&&(n=-n),t.x=r[12],t.y=r[13],t.z=r[14],_.copy(this);var s=1/n,c=1/o,u=1/a;return _.elements[0]*=s,_.elements[1]*=s,_.elements[2]*=s,_.elements[4]*=c,_.elements[5]*=c,_.elements[6]*=c,_.elements[8]*=u,_.elements[9]*=u,_.elements[10]*=u,e.setFromRotationMatrix(_),i.x=n,i.y=o,i.z=a,this}),makePerspective:function(t,e,i,r,n,o){void 0===o&&console.warn("THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.");var a=this.elements,s=2*n/(e-t),c=2*n/(i-r),u=(e+t)/(e-t),h=(i+r)/(i-r),l=-(o+n)/(o-n),p=-2*o*n/(o-n);return a[0]=s,a[4]=0,a[8]=u,a[12]=0,a[1]=0,a[5]=c,a[9]=h,a[13]=0,a[2]=0,a[6]=0,a[10]=l,a[14]=p,a[3]=0,a[7]=0,a[11]=-1,a[15]=0,this},makeOrthographic:function(t,e,i,r,n,o){var a=this.elements,s=1/(e-t),c=1/(i-r),u=1/(o-n),h=(e+t)*s,l=(i+r)*c,p=(o+n)*u;return a[0]=2*s,a[4]=0,a[8]=0,a[12]=-h,a[1]=0,a[5]=2*c,a[9]=0,a[13]=-l,a[2]=0,a[6]=0,a[10]=-2*u,a[14]=-p,a[3]=0,a[7]=0,a[11]=0,a[15]=1,this},equals:function(t){for(var e=this.elements,i=t.elements,r=0;r<16;r++)if(e[r]!==i[r])return!1;return!0},fromArray:function(t,e){void 0===e&&(e=0);for(var i=0;i<16;i++)this.elements[i]=t[i+e];return this},toArray:function(t,e){void 0===t&&(t=[]),void 0===e&&(e=0);var i=this.elements;return t[e]=i[0],t[e+1]=i[1],t[e+2]=i[2],t[e+3]=i[3],t[e+4]=i[4],t[e+5]=i[5],t[e+6]=i[6],t[e+7]=i[7],t[e+8]=i[8],t[e+9]=i[9],t[e+10]=i[10],t[e+11]=i[11],t[e+12]=i[12],t[e+13]=i[13],t[e+14]=i[14],t[e+15]=i[15],t}}),Object.assign(ii,{slerp:function(t,e,i,r){return i.copy(t).slerp(e,r)},slerpFlat:function(t,e,i,r,n,o,a){var s=i[r+0],c=i[r+1],u=i[r+2],h=i[r+3],l=n[o+0],p=n[o+1],d=n[o+2],f=n[o+3];if(h!==f||s!==l||c!==p||u!==d){var m=1-a,g=s*l+c*p+u*d+h*f,v=0<=g?1:-1,y=1-g*g;if(y>Number.EPSILON){var b=Math.sqrt(y),x=Math.atan2(b,g*v);m=Math.sin(m*x)/b,a=Math.sin(a*x)/b}var _=a*v;if(s=s*m+l*_,c=c*m+p*_,u=u*m+d*_,h=h*m+f*_,m===1-a){var w=1/Math.sqrt(s*s+c*c+u*u+h*h);s*=w,c*=w,u*=w,h*=w}}t[e]=s,t[e+1]=c,t[e+2]=u,t[e+3]=h}}),Object.defineProperties(ii.prototype,{x:{get:function(){return this._x},set:function(t){this._x=t,this.onChangeCallback()}},y:{get:function(){return this._y},set:function(t){this._y=t,this.onChangeCallback()}},z:{get:function(){return this._z},set:function(t){this._z=t,this.onChangeCallback()}},w:{get:function(){return this._w},set:function(t){this._w=t,this.onChangeCallback()}}}),Object.assign(ii.prototype,{set:function(t,e,i,r){return this._x=t,this._y=e,this._z=i,this._w=r,this.onChangeCallback(),this},clone:function(){return new this.constructor(this._x,this._y,this._z,this._w)},copy:function(t){return this._x=t.x,this._y=t.y,this._z=t.z,this._w=t.w,this.onChangeCallback(),this},setFromEuler:function(t,e){if(!t||!t.isEuler)throw new Error("THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.");var i=t._x,r=t._y,n=t._z,o=t.order,a=Math.cos,s=Math.sin,c=a(i/2),u=a(r/2),h=a(n/2),l=s(i/2),p=s(r/2),d=s(n/2);return"XYZ"===o?(this._x=l*u*h+c*p*d,this._y=c*p*h-l*u*d,this._z=c*u*d+l*p*h,this._w=c*u*h-l*p*d):"YXZ"===o?(this._x=l*u*h+c*p*d,this._y=c*p*h-l*u*d,this._z=c*u*d-l*p*h,this._w=c*u*h+l*p*d):"ZXY"===o?(this._x=l*u*h-c*p*d,this._y=c*p*h+l*u*d,this._z=c*u*d+l*p*h,this._w=c*u*h-l*p*d):"ZYX"===o?(this._x=l*u*h-c*p*d,this._y=c*p*h+l*u*d,this._z=c*u*d-l*p*h,this._w=c*u*h+l*p*d):"YZX"===o?(this._x=l*u*h+c*p*d,this._y=c*p*h+l*u*d,this._z=c*u*d-l*p*h,this._w=c*u*h-l*p*d):"XZY"===o&&(this._x=l*u*h-c*p*d,this._y=c*p*h-l*u*d,this._z=c*u*d+l*p*h,this._w=c*u*h+l*p*d),!1!==e&&this.onChangeCallback(),this},setFromAxisAngle:function(t,e){var i=e/2,r=Math.sin(i);return this._x=t.x*r,this._y=t.y*r,this._z=t.z*r,this._w=Math.cos(i),this.onChangeCallback(),this},setFromRotationMatrix:function(t){var e,i=t.elements,r=i[0],n=i[4],o=i[8],a=i[1],s=i[5],c=i[9],u=i[2],h=i[6],l=i[10],p=r+s+l;return 0<p?(e=.5/Math.sqrt(p+1),this._w=.25/e,this._x=(h-c)*e,this._y=(o-u)*e,this._z=(a-n)*e):s<r&&l<r?(e=2*Math.sqrt(1+r-s-l),this._w=(h-c)/e,this._x=.25*e,this._y=(n+a)/e,this._z=(o+u)/e):l<s?(e=2*Math.sqrt(1+s-r-l),this._w=(o-u)/e,this._x=(n+a)/e,this._y=.25*e,this._z=(c+h)/e):(e=2*Math.sqrt(1+l-r-s),this._w=(a-n)/e,this._x=(o+u)/e,this._y=(c+h)/e,this._z=.25*e),this.onChangeCallback(),this},setFromUnitVectors:(I=new ri,function(t,e){return void 0===I&&(I=new ri),(C=t.dot(e)+1)<1e-6?(C=0,Math.abs(t.x)>Math.abs(t.z)?I.set(-t.y,t.x,0):I.set(0,-t.z,t.y)):I.crossVectors(t,e),this._x=I.x,this._y=I.y,this._z=I.z,this._w=C,this.normalize()}),angleTo:function(t){return 2*Math.acos(Math.abs(Qe.clamp(this.dot(t),-1,1)))},rotateTowards:function(t,e){var i=this.angleTo(t);if(0===i)return this;var r=Math.min(1,e/i);return this.slerp(t,r),this},inverse:function(){return this.conjugate()},conjugate:function(){return this._x*=-1,this._y*=-1,this._z*=-1,this.onChangeCallback(),this},dot:function(t){return this._x*t._x+this._y*t._y+this._z*t._z+this._w*t._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 t=this.length();return 0===t?(this._x=0,this._y=0,this._z=0,this._w=1):(t=1/t,this._x=this._x*t,this._y=this._y*t,this._z=this._z*t,this._w=this._w*t),this.onChangeCallback(),this},multiply:function(t,e){return void 0!==e?(console.warn("THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead."),this.multiplyQuaternions(t,e)):this.multiplyQuaternions(this,t)},premultiply:function(t){return this.multiplyQuaternions(t,this)},multiplyQuaternions:function(t,e){var i=t._x,r=t._y,n=t._z,o=t._w,a=e._x,s=e._y,c=e._z,u=e._w;return this._x=i*u+o*a+r*c-n*s,this._y=r*u+o*s+n*a-i*c,this._z=n*u+o*c+i*s-r*a,this._w=o*u-i*a-r*s-n*c,this.onChangeCallback(),this},slerp:function(t,e){if(0===e)return this;if(1===e)return this.copy(t);var i=this._x,r=this._y,n=this._z,o=this._w,a=o*t._w+i*t._x+r*t._y+n*t._z;if(a<0?(this._w=-t._w,this._x=-t._x,this._y=-t._y,this._z=-t._z,a=-a):this.copy(t),1<=a)return this._w=o,this._x=i,this._y=r,this._z=n,this;var s=1-a*a;if(s<=Number.EPSILON){var c=1-e;return this._w=c*o+e*this._w,this._x=c*i+e*this._x,this._y=c*r+e*this._y,this._z=c*n+e*this._z,this.normalize()}var u=Math.sqrt(s),h=Math.atan2(u,a),l=Math.sin((1-e)*h)/u,p=Math.sin(e*h)/u;return this._w=o*l+this._w*p,this._x=i*l+this._x*p,this._y=r*l+this._y*p,this._z=n*l+this._z*p,this.onChangeCallback(),this},equals:function(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._w===this._w},fromArray:function(t,e){return void 0===e&&(e=0),this._x=t[e],this._y=t[e+1],this._z=t[e+2],this._w=t[e+3],this.onChangeCallback(),this},toArray:function(t,e){return void 0===t&&(t=[]),void 0===e&&(e=0),t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._w,t},onChange:function(t){return this.onChangeCallback=t,this},onChangeCallback:function(){}}),Object.assign(ri.prototype,{isVector3:!0,set:function(t,e,i){return this.x=t,this.y=e,this.z=i,this},setScalar:function(t){return this.x=t,this.y=t,this.z=t,this},setX:function(t){return this.x=t,this},setY:function(t){return this.y=t,this},setZ:function(t){return this.z=t,this},setComponent:function(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;default:throw new Error("index is out of range: "+t)}return this},getComponent:function(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+t)}},clone:function(){return new this.constructor(this.x,this.y,this.z)},copy:function(t){return this.x=t.x,this.y=t.y,this.z=t.z,this},add:function(t,e){return void 0!==e?(console.warn("THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(t,e)):(this.x+=t.x,this.y+=t.y,this.z+=t.z,this)},addScalar:function(t){return this.x+=t,this.y+=t,this.z+=t,this},addVectors:function(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this},addScaledVector:function(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this},sub:function(t,e){return void 0!==e?(console.warn("THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(t,e)):(this.x-=t.x,this.y-=t.y,this.z-=t.z,this)},subScalar:function(t){return this.x-=t,this.y-=t,this.z-=t,this},subVectors:function(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this},multiply:function(t,e){return void 0!==e?(console.warn("THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead."),this.multiplyVectors(t,e)):(this.x*=t.x,this.y*=t.y,this.z*=t.z,this)},multiplyScalar:function(t){return this.x*=t,this.y*=t,this.z*=t,this},multiplyVectors:function(t,e){return this.x=t.x*e.x,this.y=t.y*e.y,this.z=t.z*e.z,this},applyEuler:(F=new ii,function(t){return t&&t.isEuler||console.error("THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order."),this.applyQuaternion(F.setFromEuler(t))}),applyAxisAngle:(N=new ii,function(t,e){return this.applyQuaternion(N.setFromAxisAngle(t,e))}),applyMatrix3:function(t){var e=this.x,i=this.y,r=this.z,n=t.elements;return this.x=n[0]*e+n[3]*i+n[6]*r,this.y=n[1]*e+n[4]*i+n[7]*r,this.z=n[2]*e+n[5]*i+n[8]*r,this},applyMatrix4:function(t){var e=this.x,i=this.y,r=this.z,n=t.elements,o=1/(n[3]*e+n[7]*i+n[11]*r+n[15]);return this.x=(n[0]*e+n[4]*i+n[8]*r+n[12])*o,this.y=(n[1]*e+n[5]*i+n[9]*r+n[13])*o,this.z=(n[2]*e+n[6]*i+n[10]*r+n[14])*o,this},applyQuaternion:function(t){var e=this.x,i=this.y,r=this.z,n=t.x,o=t.y,a=t.z,s=t.w,c=s*e+o*r-a*i,u=s*i+a*e-n*r,h=s*r+n*i-o*e,l=-n*e-o*i-a*r;return this.x=c*s+l*-n+u*-a-h*-o,this.y=u*s+l*-o+h*-n-c*-a,this.z=h*s+l*-a+c*-o-u*-n,this},project:(B=new ei,function(t){return B.multiplyMatrices(t.projectionMatrix,B.getInverse(t.matrixWorld)),this.applyMatrix4(B)}),unproject:(k=new ei,function(t){return k.multiplyMatrices(t.matrixWorld,k.getInverse(t.projectionMatrix)),this.applyMatrix4(k)}),transformDirection:function(t){var e=this.x,i=this.y,r=this.z,n=t.elements;return this.x=n[0]*e+n[4]*i+n[8]*r,this.y=n[1]*e+n[5]*i+n[9]*r,this.z=n[2]*e+n[6]*i+n[10]*r,this.normalize()},divide:function(t){return this.x/=t.x,this.y/=t.y,this.z/=t.z,this},divideScalar:function(t){return this.multiplyScalar(1/t)},min:function(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this.z=Math.min(this.z,t.z),this},max:function(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this.z=Math.max(this.z,t.z),this},clamp:function(t,e){return this.x=Math.max(t.x,Math.min(e.x,this.x)),this.y=Math.max(t.y,Math.min(e.y,this.y)),this.z=Math.max(t.z,Math.min(e.z,this.z)),this},clampScalar:(R=new ri,D=new ri,function(t,e){return R.set(t,t,t),D.set(e,e,e),this.clamp(R,D)}),clampLength:function(t,e){var i=this.length();return this.divideScalar(i||1).multiplyScalar(Math.max(t,Math.min(e,i)))},floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this},ceil:function(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this},round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this},roundToZero:function(){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:function(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this},dot:function(t){return this.x*t.x+this.y*t.y+this.z*t.z},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)},manhattanLength:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)},normalize:function(){return this.divideScalar(this.length()||1)},setLength:function(t){return this.normalize().multiplyScalar(t)},lerp:function(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this.z+=(t.z-this.z)*e,this},lerpVectors:function(t,e,i){return this.subVectors(e,t).multiplyScalar(i).add(t)},cross:function(t,e){return void 0!==e?(console.warn("THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead."),this.crossVectors(t,e)):this.crossVectors(this,t)},crossVectors:function(t,e){var i=t.x,r=t.y,n=t.z,o=e.x,a=e.y,s=e.z;return this.x=r*s-n*a,this.y=n*o-i*s,this.z=i*a-r*o,this},projectOnVector:function(t){var e=t.dot(this)/t.lengthSq();return this.copy(t).multiplyScalar(e)},projectOnPlane:(L=new ri,function(t){return L.copy(this).projectOnVector(t),this.sub(L)}),reflect:(O=new ri,function(t){return this.sub(O.copy(t).multiplyScalar(2*this.dot(t)))}),angleTo:function(t){var e=this.dot(t)/Math.sqrt(this.lengthSq()*t.lengthSq());return Math.acos(Qe.clamp(e,-1,1))},distanceTo:function(t){return Math.sqrt(this.distanceToSquared(t))},distanceToSquared:function(t){var e=this.x-t.x,i=this.y-t.y,r=this.z-t.z;return e*e+i*i+r*r},manhattanDistanceTo:function(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)+Math.abs(this.z-t.z)},setFromSpherical:function(t){var e=Math.sin(t.phi)*t.radius;return this.x=e*Math.sin(t.theta),this.y=Math.cos(t.phi)*t.radius,this.z=e*Math.cos(t.theta),this},setFromCylindrical:function(t){return this.x=t.radius*Math.sin(t.theta),this.y=t.y,this.z=t.radius*Math.cos(t.theta),this},setFromMatrixPosition:function(t){var e=t.elements;return this.x=e[12],this.y=e[13],this.z=e[14],this},setFromMatrixScale:function(t){var e=this.setFromMatrixColumn(t,0).length(),i=this.setFromMatrixColumn(t,1).length(),r=this.setFromMatrixColumn(t,2).length();return this.x=e,this.y=i,this.z=r,this},setFromMatrixColumn:function(t,e){return this.fromArray(t.elements,4*e)},equals:function(t){return t.x===this.x&&t.y===this.y&&t.z===this.z},fromArray:function(t,e){return void 0===e&&(e=0),this.x=t[e],this.y=t[e+1],this.z=t[e+2],this},toArray:function(t,e){return void 0===t&&(t=[]),void 0===e&&(e=0),t[e]=this.x,t[e+1]=this.y,t[e+2]=this.z,t},fromBufferAttribute:function(t,e,i){return void 0!==i&&console.warn("THREE.Vector3: offset has been removed from .fromBufferAttribute()."),this.x=t.getX(e),this.y=t.getY(e),this.z=t.getZ(e),this}}),Object.assign(ni.prototype,{isMatrix3:!0,set:function(t,e,i,r,n,o,a,s,c){var u=this.elements;return u[0]=t,u[1]=r,u[2]=a,u[3]=e,u[4]=n,u[5]=s,u[6]=i,u[7]=o,u[8]=c,this},identity:function(){return this.set(1,0,0,0,1,0,0,0,1),this},clone:function(){return(new this.constructor).fromArray(this.elements)},copy:function(t){var e=this.elements,i=t.elements;return e[0]=i[0],e[1]=i[1],e[2]=i[2],e[3]=i[3],e[4]=i[4],e[5]=i[5],e[6]=i[6],e[7]=i[7],e[8]=i[8],this},setFromMatrix4:function(t){var e=t.elements;return this.set(e[0],e[4],e[8],e[1],e[5],e[9],e[2],e[6],e[10]),this},applyToBufferAttribute:(z=new ri,function(t){for(var e=0,i=t.count;e<i;e++)z.x=t.getX(e),z.y=t.getY(e),z.z=t.getZ(e),z.applyMatrix3(this),t.setXYZ(e,z.x,z.y,z.z);return t}),multiply:function(t){return this.multiplyMatrices(this,t)},premultiply:function(t){return this.multiplyMatrices(t,this)},multiplyMatrices:function(t,e){var i=t.elements,r=e.elements,n=this.elements,o=i[0],a=i[3],s=i[6],c=i[1],u=i[4],h=i[7],l=i[2],p=i[5],d=i[8],f=r[0],m=r[3],g=r[6],v=r[1],y=r[4],b=r[7],x=r[2],_=r[5],w=r[8];return n[0]=o*f+a*v+s*x,n[3]=o*m+a*y+s*_,n[6]=o*g+a*b+s*w,n[1]=c*f+u*v+h*x,n[4]=c*m+u*y+h*_,n[7]=c*g+u*b+h*w,n[2]=l*f+p*v+d*x,n[5]=l*m+p*y+d*_,n[8]=l*g+p*b+d*w,this},multiplyScalar:function(t){var e=this.elements;return e[0]*=t,e[3]*=t,e[6]*=t,e[1]*=t,e[4]*=t,e[7]*=t,e[2]*=t,e[5]*=t,e[8]*=t,this},determinant:function(){var t=this.elements,e=t[0],i=t[1],r=t[2],n=t[3],o=t[4],a=t[5],s=t[6],c=t[7],u=t[8];return e*o*u-e*a*c-i*n*u+i*a*s+r*n*c-r*o*s},getInverse:function(t,e){t&&t.isMatrix4&&console.error("THREE.Matrix3: .getInverse() no longer takes a Matrix4 argument.");var i=t.elements,r=this.elements,n=i[0],o=i[1],a=i[2],s=i[3],c=i[4],u=i[5],h=i[6],l=i[7],p=i[8],d=p*c-u*l,f=u*h-p*s,m=l*s-c*h,g=n*d+o*f+a*m;if(0===g){var v="THREE.Matrix3: .getInverse() can't invert matrix, determinant is 0";if(!0===e)throw new Error(v);return console.warn(v),this.identity()}var y=1/g;return r[0]=d*y,r[1]=(a*l-p*o)*y,r[2]=(u*o-a*c)*y,r[3]=f*y,r[4]=(p*n-a*h)*y,r[5]=(a*s-u*n)*y,r[6]=m*y,r[7]=(o*h-l*n)*y,r[8]=(c*n-o*s)*y,this},transpose:function(){var t,e=this.elements;return t=e[1],e[1]=e[3],e[3]=t,t=e[2],e[2]=e[6],e[6]=t,t=e[5],e[5]=e[7],e[7]=t,this},getNormalMatrix:function(t){return this.setFromMatrix4(t).getInverse(this).transpose()},transposeIntoArray:function(t){var e=this.elements;return t[0]=e[0],t[1]=e[3],t[2]=e[6],t[3]=e[1],t[4]=e[4],t[5]=e[7],t[6]=e[2],t[7]=e[5],t[8]=e[8],this},setUvTransform:function(t,e,i,r,n,o,a){var s=Math.cos(n),c=Math.sin(n);this.set(i*s,i*c,-i*(s*o+c*a)+o+t,-r*c,r*s,-r*(-c*o+s*a)+a+e,0,0,1)},scale:function(t,e){var i=this.elements;return i[0]*=t,i[3]*=t,i[6]*=t,i[1]*=e,i[4]*=e,i[7]*=e,this},rotate:function(t){var e=Math.cos(t),i=Math.sin(t),r=this.elements,n=r[0],o=r[3],a=r[6],s=r[1],c=r[4],u=r[7];return r[0]=e*n+i*s,r[3]=e*o+i*c,r[6]=e*a+i*u,r[1]=-i*n+e*s,r[4]=-i*o+e*c,r[7]=-i*a+e*u,this},translate:function(t,e){var i=this.elements;return i[0]+=t*i[2],i[3]+=t*i[5],i[6]+=t*i[8],i[1]+=e*i[2],i[4]+=e*i[5],i[7]+=e*i[8],this},equals:function(t){for(var e=this.elements,i=t.elements,r=0;r<9;r++)if(e[r]!==i[r])return!1;return!0},fromArray:function(t,e){void 0===e&&(e=0);for(var i=0;i<9;i++)this.elements[i]=t[i+e];return this},toArray:function(t,e){void 0===t&&(t=[]),void 0===e&&(e=0);var i=this.elements;return t[e]=i[0],t[e+1]=i[1],t[e+2]=i[2],t[e+3]=i[3],t[e+4]=i[4],t[e+5]=i[5],t[e+6]=i[6],t[e+7]=i[7],t[e+8]=i[8],t}});var oi,ai,si,ci,ui,hi,li,pi,di,fi,mi,gi,vi,yi,bi,xi={getDataURL:function(t){var e;if(t instanceof HTMLCanvasElement)e=t;else{"undefined"!=typeof OffscreenCanvas?e=new OffscreenCanvas(t.width,t.height):((e=document.createElementNS("http://www.w3.org/1999/xhtml","canvas")).width=t.width,e.height=t.height);var i=e.getContext("2d");t instanceof ImageData?i.putImageData(t,0,0):i.drawImage(t,0,0,t.width,t.height)}return 2048<e.width||2048<e.height?e.toDataURL("image/jpeg",.6):e.toDataURL("image/png")}},_i=0;function wi(t,e,i,r,n,o,a,s,c,u){Object.defineProperty(this,"id",{value:_i++}),this.uuid=Qe.generateUUID(),this.name="",this.image=void 0!==t?t:wi.DEFAULT_IMAGE,this.mipmaps=[],this.mapping=void 0!==e?e:wi.DEFAULT_MAPPING,this.wrapS=void 0!==i?i:jt,this.wrapT=void 0!==r?r:jt,this.magFilter=void 0!==n?n:Wt,this.minFilter=void 0!==o?o:qt,this.anisotropy=void 0!==c?c:1,this.format=void 0!==a?a:ue,this.type=void 0!==s?s:Yt,this.offset=new ti(0,0),this.repeat=new ti(1,1),this.center=new ti(0,0),this.rotation=0,this.matrixAutoUpdate=!0,this.matrix=new ni,this.generateMipmaps=!0,this.premultiplyAlpha=!1,this.flipY=!0,this.unpackAlignment=4,this.encoding=void 0!==u?u:Ge,this.version=0,this.onUpdate=null}function Si(t,e,i,r){this.x=t||0,this.y=e||0,this.z=i||0,this.w=void 0!==r?r:1}function Ai(t,e,i){this.width=t,this.height=e,this.scissor=new Si(0,0,t,e),this.scissorTest=!1,this.viewport=new Si(0,0,t,e),void 0===(i=i||{}).minFilter&&(i.minFilter=Wt),this.texture=new wi(void 0,void 0,i.wrapS,i.wrapT,i.magFilter,i.minFilter,i.format,i.type,i.anisotropy,i.encoding),this.texture.generateMipmaps=void 0===i.generateMipmaps||i.generateMipmaps,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}function Mi(t,e,i){Ai.call(this,t,e,i),this.activeCubeFace=0,this.activeMipMapLevel=0}function Ei(t,e,i,r,n,o,a,s,c,u,h,l){wi.call(this,null,o,a,s,c,u,r,n,h,l),this.image={data:t,width:e,height:i},this.magFilter=void 0!==c?c:Vt,this.minFilter=void 0!==u?u:Vt,this.generateMipmaps=!1,this.flipY=!1,this.unpackAlignment=1}function Pi(t,e){this.min=void 0!==t?t:new ri(1/0,1/0,1/0),this.max=void 0!==e?e:new ri(-1/0,-1/0,-1/0)}function Ti(t,e){this.center=void 0!==t?t:new ri,this.radius=void 0!==e?e:0}function Ci(t,e){this.normal=void 0!==t?t:new ri(1,0,0),this.constant=void 0!==e?e:0}function Ii(t,e,i,r,n,o){this.planes=[void 0!==t?t:new Ci,void 0!==e?e:new Ci,void 0!==i?i:new Ci,void 0!==r?r:new Ci,void 0!==n?n:new Ci,void 0!==o?o:new Ci]}wi.DEFAULT_IMAGE=void 0,wi.DEFAULT_MAPPING=300,wi.prototype=Object.assign(Object.create(v.prototype),{constructor:wi,isTexture:!0,updateMatrix:function(){this.matrix.setUvTransform(this.offset.x,this.offset.y,this.repeat.x,this.repeat.y,this.rotation,this.center.x,this.center.y)},clone:function(){return(new this.constructor).copy(this)},copy:function(t){return this.name=t.name,this.image=t.image,this.mipmaps=t.mipmaps.slice(0),this.mapping=t.mapping,this.wrapS=t.wrapS,this.wrapT=t.wrapT,this.magFilter=t.magFilter,this.minFilter=t.minFilter,this.anisotropy=t.anisotropy,this.format=t.format,this.type=t.type,this.offset.copy(t.offset),this.repeat.copy(t.repeat),this.center.copy(t.center),this.rotation=t.rotation,this.matrixAutoUpdate=t.matrixAutoUpdate,this.matrix.copy(t.matrix),this.generateMipmaps=t.generateMipmaps,this.premultiplyAlpha=t.premultiplyAlpha,this.flipY=t.flipY,this.unpackAlignment=t.unpackAlignment,this.encoding=t.encoding,this},toJSON:function(t){var e=void 0===t||"string"==typeof t;if(!e&&void 0!==t.textures[this.uuid])return t.textures[this.uuid];var 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,minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY};if(void 0!==this.image){var r=this.image;if(void 0===r.uuid&&(r.uuid=Qe.generateUUID()),!e&&void 0===t.images[r.uuid]){var n;if(Array.isArray(r)){n=[];for(var o=0,a=r.length;o<a;o++)n.push(xi.getDataURL(r[o]))}else n=xi.getDataURL(r);t.images[r.uuid]={uuid:r.uuid,url:n}}i.image=r.uuid}return e||(t.textures[this.uuid]=i),i},dispose:function(){this.dispatchEvent({type:"dispose"})},transformUv:function(t){if(300===this.mapping){if(t.applyMatrix3(this.matrix),t.x<0||1<t.x)switch(this.wrapS){case Ut:t.x=t.x-Math.floor(t.x);break;case jt:t.x=t.x<0?0:1;break;case Gt:1===Math.abs(Math.floor(t.x)%2)?t.x=Math.ceil(t.x)-t.x:t.x=t.x-Math.floor(t.x)}if(t.y<0||1<t.y)switch(this.wrapT){case Ut:t.y=t.y-Math.floor(t.y);break;case jt:t.y=t.y<0?0:1;break;case Gt:1===Math.abs(Math.floor(t.y)%2)?t.y=Math.ceil(t.y)-t.y:t.y=t.y-Math.floor(t.y)}this.flipY&&(t.y=1-t.y)}}}),Object.defineProperty(wi.prototype,"needsUpdate",{set:function(t){!0===t&&this.version++}}),Object.assign(Si.prototype,{isVector4:!0,set:function(t,e,i,r){return this.x=t,this.y=e,this.z=i,this.w=r,this},setScalar:function(t){return this.x=t,this.y=t,this.z=t,this.w=t,this},setX:function(t){return this.x=t,this},setY:function(t){return this.y=t,this},setZ:function(t){return this.z=t,this},setW:function(t){return this.w=t,this},setComponent:function(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;case 3:this.w=e;break;default:throw new Error("index is out of range: "+t)}return this},getComponent:function(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error("index is out of range: "+t)}},clone:function(){return new this.constructor(this.x,this.y,this.z,this.w)},copy:function(t){return this.x=t.x,this.y=t.y,this.z=t.z,this.w=void 0!==t.w?t.w:1,this},add:function(t,e){return void 0!==e?(console.warn("THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(t,e)):(this.x+=t.x,this.y+=t.y,this.z+=t.z,this.w+=t.w,this)},addScalar:function(t){return this.x+=t,this.y+=t,this.z+=t,this.w+=t,this},addVectors:function(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this.w=t.w+e.w,this},addScaledVector:function(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this.w+=t.w*e,this},sub:function(t,e){return void 0!==e?(console.warn("THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(t,e)):(this.x-=t.x,this.y-=t.y,this.z-=t.z,this.w-=t.w,this)},subScalar:function(t){return this.x-=t,this.y-=t,this.z-=t,this.w-=t,this},subVectors:function(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this.w=t.w-e.w,this},multiplyScalar:function(t){return this.x*=t,this.y*=t,this.z*=t,this.w*=t,this},applyMatrix4:function(t){var e=this.x,i=this.y,r=this.z,n=this.w,o=t.elements;return this.x=o[0]*e+o[4]*i+o[8]*r+o[12]*n,this.y=o[1]*e+o[5]*i+o[9]*r+o[13]*n,this.z=o[2]*e+o[6]*i+o[10]*r+o[14]*n,this.w=o[3]*e+o[7]*i+o[11]*r+o[15]*n,this},divideScalar:function(t){return this.multiplyScalar(1/t)},setAxisAngleFromQuaternion:function(t){this.w=2*Math.acos(t.w);var e=Math.sqrt(1-t.w*t.w);return e<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=t.x/e,this.y=t.y/e,this.z=t.z/e),this},setAxisAngleFromRotationMatrix:function(t){var e,i,r,n,o=t.elements,a=o[0],s=o[4],c=o[8],u=o[1],h=o[5],l=o[9],p=o[2],d=o[6],f=o[10];if(Math.abs(s-u)<.01&&Math.abs(c-p)<.01&&Math.abs(l-d)<.01){if(Math.abs(s+u)<.1&&Math.abs(c+p)<.1&&Math.abs(l+d)<.1&&Math.abs(a+h+f-3)<.1)return this.set(1,0,0,0),this;e=Math.PI;var m=(a+1)/2,g=(h+1)/2,v=(f+1)/2,y=(s+u)/4,b=(c+p)/4,x=(l+d)/4;return g<m&&v<m?m<.01?(i=0,n=r=.707106781):(r=y/(i=Math.sqrt(m)),n=b/i):v<g?g<.01?(r=0,n=i=.707106781):(i=y/(r=Math.sqrt(g)),n=x/r):v<.01?(r=i=.707106781,n=0):(i=b/(n=Math.sqrt(v)),r=x/n),this.set(i,r,n,e),this}var _=Math.sqrt((d-l)*(d-l)+(c-p)*(c-p)+(u-s)*(u-s));return Math.abs(_)<.001&&(_=1),this.x=(d-l)/_,this.y=(c-p)/_,this.z=(u-s)/_,this.w=Math.acos((a+h+f-1)/2),this},min:function(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this.z=Math.min(this.z,t.z),this.w=Math.min(this.w,t.w),this},max:function(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this.z=Math.max(this.z,t.z),this.w=Math.max(this.w,t.w),this},clamp:function(t,e){return this.x=Math.max(t.x,Math.min(e.x,this.x)),this.y=Math.max(t.y,Math.min(e.y,this.y)),this.z=Math.max(t.z,Math.min(e.z,this.z)),this.w=Math.max(t.w,Math.min(e.w,this.w)),this},clampScalar:function(t,e){return void 0===oi&&(oi=new Si,ai=new Si),oi.set(t,t,t,t),ai.set(e,e,e,e),this.clamp(oi,ai)},clampLength:function(t,e){var i=this.length();return this.divideScalar(i||1).multiplyScalar(Math.max(t,Math.min(e,i)))},floor:function(){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:function(){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:function(){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:function(){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:function(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this.w=-this.w,this},dot:function(t){return this.x*t.x+this.y*t.y+this.z*t.z+this.w*t.w},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)},manhattanLength:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)},normalize:function(){return this.divideScalar(this.length()||1)},setLength:function(t){return this.normalize().multiplyScalar(t)},lerp:function(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this.z+=(t.z-this.z)*e,this.w+=(t.w-this.w)*e,this},lerpVectors:function(t,e,i){return this.subVectors(e,t).multiplyScalar(i).add(t)},equals:function(t){return t.x===this.x&&t.y===this.y&&t.z===this.z&&t.w===this.w},fromArray:function(t,e){return void 0===e&&(e=0),this.x=t[e],this.y=t[e+1],this.z=t[e+2],this.w=t[e+3],this},toArray:function(t,e){return void 0===t&&(t=[]),void 0===e&&(e=0),t[e]=this.x,t[e+1]=this.y,t[e+2]=this.z,t[e+3]=this.w,t},fromBufferAttribute:function(t,e,i){return void 0!==i&&console.warn("THREE.Vector4: offset has been removed from .fromBufferAttribute()."),this.x=t.getX(e),this.y=t.getY(e),this.z=t.getZ(e),this.w=t.getW(e),this}}),Ai.prototype=Object.assign(Object.create(v.prototype),{constructor:Ai,isWebGLRenderTarget:!0,setSize:function(t,e){this.width===t&&this.height===e||(this.width=t,this.height=e,this.dispose()),this.viewport.set(0,0,t,e),this.scissor.set(0,0,t,e)},clone:function(){return(new this.constructor).copy(this)},copy:function(t){return this.width=t.width,this.height=t.height,this.viewport.copy(t.viewport),this.texture=t.texture.clone(),this.depthBuffer=t.depthBuffer,this.stencilBuffer=t.stencilBuffer,this.depthTexture=t.depthTexture,this},dispose:function(){this.dispatchEvent({type:"dispose"})}}),((Mi.prototype=Object.create(Ai.prototype)).constructor=Mi).prototype.isWebGLRenderTargetCube=!0,((Ei.prototype=Object.create(wi.prototype)).constructor=Ei).prototype.isDataTexture=!0,Object.assign(Pi.prototype,{isBox3:!0,set:function(t,e){return this.min.copy(t),this.max.copy(e),this},setFromArray:function(t){for(var e=1/0,i=1/0,r=1/0,n=-1/0,o=-1/0,a=-1/0,s=0,c=t.length;s<c;s+=3){var u=t[s],h=t[s+1],l=t[s+2];u<e&&(e=u),h<i&&(i=h),l<r&&(r=l),n<u&&(n=u),o<h&&(o=h),a<l&&(a=l)}return this.min.set(e,i,r),this.max.set(n,o,a),this},setFromBufferAttribute:function(t){for(var e=1/0,i=1/0,r=1/0,n=-1/0,o=-1/0,a=-1/0,s=0,c=t.count;s<c;s++){var u=t.getX(s),h=t.getY(s),l=t.getZ(s);u<e&&(e=u),h<i&&(i=h),l<r&&(r=l),n<u&&(n=u),o<h&&(o=h),a<l&&(a=l)}return this.min.set(e,i,r),this.max.set(n,o,a),this},setFromPoints:function(t){this.makeEmpty();for(var e=0,i=t.length;e<i;e++)this.expandByPoint(t[e]);return this},setFromCenterAndSize:(hi=new ri,function(t,e){var i=hi.copy(e).multiplyScalar(.5);return this.min.copy(t).sub(i),this.max.copy(t).add(i),this}),setFromObject:function(t){return this.makeEmpty(),this.expandByObject(t)},clone:function(){return(new this.constructor).copy(this)},copy:function(t){return this.min.copy(t.min),this.max.copy(t.max),this},makeEmpty:function(){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:function(){return this.max.x<this.min.x||this.max.y<this.min.y||this.max.z<this.min.z},getCenter:function(t){return void 0===t&&(console.warn("THREE.Box3: .getCenter() target is now required"),t=new ri),this.isEmpty()?t.set(0,0,0):t.addVectors(this.min,this.max).multiplyScalar(.5)},getSize:function(t){return void 0===t&&(console.warn("THREE.Box3: .getSize() target is now required"),t=new ri),this.isEmpty()?t.set(0,0,0):t.subVectors(this.max,this.min)},expandByPoint:function(t){return this.min.min(t),this.max.max(t),this},expandByVector:function(t){return this.min.sub(t),this.max.add(t),this},expandByScalar:function(t){return this.min.addScalar(-t),this.max.addScalar(t),this},expandByObject:function(){var n,o,a,s=new ri;function e(t){var e=t.geometry;if(void 0!==e)if(e.isGeometry){var i=e.vertices;for(o=0,a=i.length;o<a;o++)s.copy(i[o]),s.applyMatrix4(t.matrixWorld),n.expandByPoint(s)}else if(e.isBufferGeometry){var r=e.attributes.position;if(void 0!==r)for(o=0,a=r.count;o<a;o++)s.fromBufferAttribute(r,o).applyMatrix4(t.matrixWorld),n.expandByPoint(s)}}return function(t){return n=this,t.updateMatrixWorld(!0),t.traverse(e),this}}(),containsPoint:function(t){return!(t.x<this.min.x||t.x>this.max.x||t.y<this.min.y||t.y>this.max.y||t.z<this.min.z||t.z>this.max.z)},containsBox:function(t){return this.min.x<=t.min.x&&t.max.x<=this.max.x&&this.min.y<=t.min.y&&t.max.y<=this.max.y&&this.min.z<=t.min.z&&t.max.z<=this.max.z},getParameter:function(t,e){return void 0===e&&(console.warn("THREE.Box3: .getParameter() target is now required"),e=new ri),e.set((t.x-this.min.x)/(this.max.x-this.min.x),(t.y-this.min.y)/(this.max.y-this.min.y),(t.z-this.min.z)/(this.max.z-this.min.z))},intersectsBox:function(t){return!(t.max.x<this.min.x||t.min.x>this.max.x||t.max.y<this.min.y||t.min.y>this.max.y||t.max.z<this.min.z||t.min.z>this.max.z)},intersectsSphere:(ui=new ri,function(t){return this.clampPoint(t.center,ui),ui.distanceToSquared(t.center)<=t.radius*t.radius}),intersectsPlane:function(t){var e,i;return 0<t.normal.x?(e=t.normal.x*this.min.x,i=t.normal.x*this.max.x):(e=t.normal.x*this.max.x,i=t.normal.x*this.min.x),0<t.normal.y?(e+=t.normal.y*this.min.y,i+=t.normal.y*this.max.y):(e+=t.normal.y*this.max.y,i+=t.normal.y*this.min.y),0<t.normal.z?(e+=t.normal.z*this.min.z,i+=t.normal.z*this.max.z):(e+=t.normal.z*this.max.z,i+=t.normal.z*this.min.z),e<=t.constant&&i>=t.constant},intersectsTriangle:function(){var s=new ri,c=new ri,u=new ri,i=new ri,r=new ri,n=new ri,h=new ri,o=new ri,l=new ri,a=new ri;function p(t){var e,i;for(e=0,i=t.length-3;e<=i;e+=3){h.fromArray(t,e);var r=l.x*Math.abs(h.x)+l.y*Math.abs(h.y)+l.z*Math.abs(h.z),n=s.dot(h),o=c.dot(h),a=u.dot(h);if(Math.max(-Math.max(n,o,a),Math.min(n,o,a))>r)return!1}return!0}return function(t){if(this.isEmpty())return!1;this.getCenter(o),l.subVectors(this.max,o),s.subVectors(t.a,o),c.subVectors(t.b,o),u.subVectors(t.c,o),i.subVectors(c,s),r.subVectors(u,c),n.subVectors(s,u);var e=[0,-i.z,i.y,0,-r.z,r.y,0,-n.z,n.y,i.z,0,-i.x,r.z,0,-r.x,n.z,0,-n.x,-i.y,i.x,0,-r.y,r.x,0,-n.y,n.x,0];return!!p(e)&&(!!p(e=[1,0,0,0,1,0,0,0,1])&&(a.crossVectors(i,r),p(e=[a.x,a.y,a.z])))}}(),clampPoint:function(t,e){return void 0===e&&(console.warn("THREE.Box3: .clampPoint() target is now required"),e=new ri),e.copy(t).clamp(this.min,this.max)},distanceToPoint:(ci=new ri,function(t){return ci.copy(t).clamp(this.min,this.max).sub(t).length()}),getBoundingSphere:(si=new ri,function(t){return void 0===t&&(console.warn("THREE.Box3: .getBoundingSphere() target is now required"),t=new Ti),this.getCenter(t.center),t.radius=.5*this.getSize(si).length(),t}),intersect:function(t){return this.min.max(t.min),this.max.min(t.max),this.isEmpty()&&this.makeEmpty(),this},union:function(t){return this.min.min(t.min),this.max.max(t.max),this},applyMatrix4:function(t){if(this.isEmpty())return this;var e=t.elements,i=e[0]*this.min.x,r=e[1]*this.min.x,n=e[2]*this.min.x,o=e[0]*this.max.x,a=e[1]*this.max.x,s=e[2]*this.max.x,c=e[4]*this.min.y,u=e[5]*this.min.y,h=e[6]*this.min.y,l=e[4]*this.max.y,p=e[5]*this.max.y,d=e[6]*this.max.y,f=e[8]*this.min.z,m=e[9]*this.min.z,g=e[10]*this.min.z,v=e[8]*this.max.z,y=e[9]*this.max.z,b=e[10]*this.max.z;return this.min.x=Math.min(i,o)+Math.min(c,l)+Math.min(f,v)+e[12],this.min.y=Math.min(r,a)+Math.min(u,p)+Math.min(m,y)+e[13],this.min.z=Math.min(n,s)+Math.min(h,d)+Math.min(g,b)+e[14],this.max.x=Math.max(i,o)+Math.max(c,l)+Math.max(f,v)+e[12],this.max.y=Math.max(r,a)+Math.max(u,p)+Math.max(m,y)+e[13],this.max.z=Math.max(n,s)+Math.max(h,d)+Math.max(g,b)+e[14],this},translate:function(t){return this.min.add(t),this.max.add(t),this},equals:function(t){return t.min.equals(this.min)&&t.max.equals(this.max)}}),Object.assign(Ti.prototype,{set:function(t,e){return this.center.copy(t),this.radius=e,this},setFromPoints:(li=new Pi,function(t,e){var i=this.center;void 0!==e?i.copy(e):li.setFromPoints(t).getCenter(i);for(var r=0,n=0,o=t.length;n<o;n++)r=Math.max(r,i.distanceToSquared(t[n]));return this.radius=Math.sqrt(r),this}),clone:function(){return(new this.constructor).copy(this)},copy:function(t){return this.center.copy(t.center),this.radius=t.radius,this},empty:function(){return this.radius<=0},containsPoint:function(t){return t.distanceToSquared(this.center)<=this.radius*this.radius},distanceToPoint:function(t){return t.distanceTo(this.center)-this.radius},intersectsSphere:function(t){var e=this.radius+t.radius;return t.center.distanceToSquared(this.center)<=e*e},intersectsBox:function(t){return t.intersectsSphere(this)},intersectsPlane:function(t){return Math.abs(t.distanceToPoint(this.center))<=this.radius},clampPoint:function(t,e){var i=this.center.distanceToSquared(t);return void 0===e&&(console.warn("THREE.Sphere: .clampPoint() target is now required"),e=new ri),e.copy(t),i>this.radius*this.radius&&(e.sub(this.center).normalize(),e.multiplyScalar(this.radius).add(this.center)),e},getBoundingBox:function(t){return void 0===t&&(console.warn("THREE.Sphere: .getBoundingBox() target is now required"),t=new Pi),t.set(this.center,this.center),t.expandByScalar(this.radius),t},applyMatrix4:function(t){return this.center.applyMatrix4(t),this.radius=this.radius*t.getMaxScaleOnAxis(),this},translate:function(t){return this.center.add(t),this},equals:function(t){return t.center.equals(this.center)&&t.radius===this.radius}}),Object.assign(Ci.prototype,{set:function(t,e){return this.normal.copy(t),this.constant=e,this},setComponents:function(t,e,i,r){return this.normal.set(t,e,i),this.constant=r,this},setFromNormalAndCoplanarPoint:function(t,e){return this.normal.copy(t),this.constant=-e.dot(this.normal),this},setFromCoplanarPoints:(mi=new ri,gi=new ri,function(t,e,i){var r=mi.subVectors(i,e).cross(gi.subVectors(t,e)).normalize();return this.setFromNormalAndCoplanarPoint(r,t),this}),clone:function(){return(new this.constructor).copy(this)},copy:function(t){return this.normal.copy(t.normal),this.constant=t.constant,this},normalize:function(){var t=1/this.normal.length();return this.normal.multiplyScalar(t),this.constant*=t,this},negate:function(){return this.constant*=-1,this.normal.negate(),this},distanceToPoint:function(t){return this.normal.dot(t)+this.constant},distanceToSphere:function(t){return this.distanceToPoint(t.center)-t.radius},projectPoint:function(t,e){return void 0===e&&(console.warn("THREE.Plane: .projectPoint() target is now required"),e=new ri),e.copy(this.normal).multiplyScalar(-this.distanceToPoint(t)).add(t)},intersectLine:(fi=new ri,function(t,e){void 0===e&&(console.warn("THREE.Plane: .intersectLine() target is now required"),e=new ri);var i=t.delta(fi),r=this.normal.dot(i);if(0===r)return 0===this.distanceToPoint(t.start)?e.copy(t.start):void 0;var n=-(t.start.dot(this.normal)+this.constant)/r;return n<0||1<n?void 0:e.copy(i).multiplyScalar(n).add(t.start)}),intersectsLine:function(t){var e=this.distanceToPoint(t.start),i=this.distanceToPoint(t.end);return e<0&&0<i||i<0&&0<e},intersectsBox:function(t){return t.intersectsPlane(this)},intersectsSphere:function(t){return t.intersectsPlane(this)},coplanarPoint:function(t){return void 0===t&&(console.warn("THREE.Plane: .coplanarPoint() target is now required"),t=new ri),t.copy(this.normal).multiplyScalar(-this.constant)},applyMatrix4:(pi=new ri,di=new ni,function(t,e){var i=e||di.getNormalMatrix(t),r=this.coplanarPoint(pi).applyMatrix4(t),n=this.normal.applyMatrix3(i).normalize();return this.constant=-r.dot(n),this}),translate:function(t){return this.constant-=t.dot(this.normal),this},equals:function(t){return t.normal.equals(this.normal)&&t.constant===this.constant}}),Object.assign(Ii.prototype,{set:function(t,e,i,r,n,o){var a=this.planes;return a[0].copy(t),a[1].copy(e),a[2].copy(i),a[3].copy(r),a[4].copy(n),a[5].copy(o),this},clone:function(){return(new this.constructor).copy(this)},copy:function(t){for(var e=this.planes,i=0;i<6;i++)e[i].copy(t.planes[i]);return this},setFromMatrix:function(t){var e=this.planes,i=t.elements,r=i[0],n=i[1],o=i[2],a=i[3],s=i[4],c=i[5],u=i[6],h=i[7],l=i[8],p=i[9],d=i[10],f=i[11],m=i[12],g=i[13],v=i[14],y=i[15];return e[0].setComponents(a-r,h-s,f-l,y-m).normalize(),e[1].setComponents(a+r,h+s,f+l,y+m).normalize(),e[2].setComponents(a+n,h+c,f+p,y+g).normalize(),e[3].setComponents(a-n,h-c,f-p,y-g).normalize(),e[4].setComponents(a-o,h-u,f-d,y-v).normalize(),e[5].setComponents(a+o,h+u,f+d,y+v).normalize(),this},intersectsObject:(bi=new Ti,function(t){var e=t.geometry;return null===e.boundingSphere&&e.computeBoundingSphere(),bi.copy(e.boundingSphere).applyMatrix4(t.matrixWorld),this.intersectsSphere(bi)}),intersectsSprite:(yi=new Ti,function(t){return yi.center.set(0,0,0),yi.radius=.7071067811865476,yi.applyMatrix4(t.matrixWorld),this.intersectsSphere(yi)}),intersectsSphere:function(t){for(var e=this.planes,i=t.center,r=-t.radius,n=0;n<6;n++){if(e[n].distanceToPoint(i)<r)return!1}return!0},intersectsBox:(vi=new ri,function(t){for(var e=this.planes,i=0;i<6;i++){var r=e[i];if(vi.x=0<r.normal.x?t.max.x:t.min.x,vi.y=0<r.normal.y?t.max.y:t.min.y,vi.z=0<r.normal.z?t.max.z:t.min.z,r.distanceToPoint(vi)<0)return!1}return!0}),containsPoint:function(t){for(var e=this.planes,i=0;i<6;i++)if(e[i].distanceToPoint(t)<0)return!1;return!0}});var Oi,Li={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\tif( decayExponent > 0.0 ) {\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\t\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\t\tfloat maxDistanceCutoffFactor = pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t\treturn distanceFalloff * maxDistanceCutoffFactor;\n#else\n\t\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\n#endif\n\t}\n\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 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE  = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS  = 0.5 / LUT_SIZE;\n\tfloat dotNV = saturate( dot( N, V ) );\n\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\n\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\treturn vec3( result );\n}\nvec3 BRDF_Specular_GGX_Environment( const in 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 = vec3( dFdx( surf_pos.x ), dFdx( surf_pos.y ), dFdx( surf_pos.z ) );\n\t\tvec3 vSigmaY = vec3( dFdy( surf_pos.x ), dFdy( surf_pos.y ), dFdy( surf_pos.z ) );\n\t\tvec3 vN = surf_norm;\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\t\tfloat fDet = dot( vSigmaX, R1 );\n\t\tfDet *= ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\t}\n#endif\n",clipping_planes_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tvec4 plane;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\tplane = clippingPlanes[ i ];\n\t\tif ( dot( vViewPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\t#pragma unroll_loop\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vViewPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\tif ( clipped ) discard;\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 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}\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( sampler2D envMap, 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:"vec3 transformedNormal = normalMatrix * objectNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\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 += normalize( objectNormal ) * ( 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\treturn value;\n}\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.xyz, vec3( gammaFactor ) ), value.w );\n}\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.xyz, vec3( 1.0 / gammaFactor ) ), value.w );\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.w );\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.w );\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.xyz * value.w * maxRange, 1.0 );\n}\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.x, 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.x, max( value.g, value.b ) );\n\tfloat D      = max( maxRange / maxRGB, 1.0 );\n\tD            = min( floor( D ) / 255.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 = value.rgb * cLogLuvM;\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 = Xp_Y_XYZp.rgb * cLogLuvInverseM;\n\treturn 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, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\tvec2 sampleUV;\n\t\treflectVec = normalize( reflectVec );\n\t\tsampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\t\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\tvec4 envColor = texture2D( envMap, sampleUV );\n\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\treflectVec = normalize( reflectVec );\n\t\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0, 0.0, 1.0 ) );\n\t\tvec4 envColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5 );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\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\tuniform int maxMipLevel;\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_physical_pars_fragment:"#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( envMap, 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( envMap, queryReflectVec, BlinnExponentToGGXRoughness(blinnShininessExponent ));\n\t\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\t\tvec2 sampleUV;\n\t\t\tsampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 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",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_vertex:"\n#ifdef USE_FOG\nfogDepth = -mvPosition.z;\n#endif",fog_pars_vertex:"#ifdef USE_FOG\n  varying float fogDepth;\n#endif\n",fog_fragment:"#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 ) );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, fogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif\n",fog_pars_fragment:"#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float fogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif\n",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\t#pragma unroll_loop\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\t#pragma unroll_loop\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_DIR_LIGHTS > 0\n\t#pragma unroll_loop\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\t#pragma unroll_loop\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_begin:"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\tfloat shadowCameraNear;\n\t\tfloat shadowCameraFar;\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 ltc_1;\tuniform sampler2D ltc_2;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\n\t\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tirradiance *= PI;\n\t\t#endif\n\t\treturn irradiance;\n\t}\n#endif\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};\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_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\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometry.normal;\n\t\tvec3 viewDir = geometry.viewDir;\n\t\tvec3 position = geometry.position;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.specularRoughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos - halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos + halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos + halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos - halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( t1.x, 0, t1.y ),\n\t\t\tvec3(    0, 1,    0 ),\n\t\t\tvec3( t1.z, 0, t1.w )\n\t\t);\n\t\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\t#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_fragment_begin:"\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\t#pragma unroll_loop\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 ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 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\t#pragma unroll_loop\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\t#pragma unroll_loop\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\t#pragma unroll_loop\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#if ( NUM_HEMI_LIGHTS > 0 )\n\t\t#pragma unroll_loop\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#endif\n#if defined( RE_IndirectSpecular )\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearCoatRadiance = vec3( 0.0 );\n#endif\n",lights_fragment_maps:"#if defined( RE_IndirectDiffuse )\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 defined( USE_ENVMAP ) && defined( PHYSICAL ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tirradiance += getLightProbeIndirectIrradiance( geometry, maxMipLevel );\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tradiance += getLightProbeIndirectRadiance( geometry, Material_BlinnShininessExponent( material ), maxMipLevel );\n\t#ifndef STANDARD\n\t\tclearCoatRadiance += getLightProbeIndirectRadiance( geometry, Material_ClearCoat_BlinnShininessExponent( material ), maxMipLevel );\n\t#endif\n#endif\n",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, 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\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t#else\n\t\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\n\t\tgl_Position.z *= 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\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n\tvec4 mapTexel = texture2D( map, uv );\n\tdiffuseColor *= mapTexelToLinear( mapTexel );\n#endif\n",map_particle_pars_fragment:"#ifdef USE_MAP\n\tuniform mat3 uvTransform;\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.b;\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_fragment_begin:"#ifdef FLAT_SHADED\n\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\n\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal );\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t#endif\n#endif\n",normal_fragment_maps:"#ifdef USE_NORMALMAP\n\t#ifdef OBJECTSPACE_NORMALMAP\n\t\tnormal = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t\t#ifdef FLIP_SIDED\n\t\t\tnormal = - normal;\n\t\t#endif\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tnormal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\t#endif\n\t\tnormal = normalize( normalMatrix * normal );\n\t#else\n\t\tnormal = perturbNormal2Arb( -vViewPosition, normal );\n\t#endif\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\t#ifdef OBJECTSPACE_NORMALMAP\n\t\tuniform mat3 normalMatrix;\n\t#else\n\t\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {\n\t\t\tvec3 q0 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) );\n\t\t\tvec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) );\n\t\t\tvec2 st0 = dFdx( vUv.st );\n\t\t\tvec2 st1 = dFdy( vUv.st );\n\t\t\tfloat scale = sign( st1.t * st0.s - st0.t * st1.s );\n\t\t\tvec3 S = normalize( ( q0 * st1.t - q1 * st0.t ) * scale );\n\t\t\tvec3 T = normalize( ( - q0 * st1.s + q1 * st0.s ) * scale );\n\t\t\tvec3 N = normalize( surf_norm );\n\t\t\tmat3 tsn = mat3( S, T, N );\n\t\t\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t\t\tmapN.xy *= normalScale;\n\t\t\tmapN.xy *= ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\t\treturn normalize( tsn * mapN );\n\t\t}\n\t#endif\n#endif\n",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}\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}\n",premultiplied_alpha_fragment:"#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif\n",project_vertex:"vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\ngl_Position = projectionMatrix * mvPosition;\n",dithering_fragment:"#if defined( DITHERING )\n  gl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif\n",dithering_pars_fragment:"#if defined( 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\n",roughnessmap_fragment:"float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.g;\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\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\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\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( 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\tshadow = (\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\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 )\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#endif\n",shadowmap_vertex:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t#pragma unroll_loop\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\t#pragma unroll_loop\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\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * worldPosition;\n\t}\n\t#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\t#pragma unroll_loop\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\t#pragma unroll_loop\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\t#pragma unroll_loop\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 ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t}\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 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\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\ttransformed = ( bindMatrixInverse * skinned ).xyz;\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:"#ifndef saturate\n\t#define saturate(a) clamp( a, 0.0, 1.0 )\n#endif\nuniform float toneMappingExposure;\nuniform float toneMappingWhitePoint;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn toneMappingExposure * color;\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\n#define Uncharted2Helper( x ) max( ( ( x * ( 0.15 * x + 0.10 * 0.50 ) + 0.20 * 0.02 ) / ( x * ( 0.15 * x + 0.50 ) + 0.20 * 0.30 ) ) - 0.02 / 0.30, vec3( 0.0 ) )\nvec3 Uncharted2ToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\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 mat3 uvTransform;\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 = ( 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#endif",uv2_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = uv2;\n#endif",worldpos_vertex:"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP )\n\tvec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\n#endif\n",cube_frag:"uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldPosition;\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\tgl_Position.z = gl_Position.w;\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( 1.0 - 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#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}\n",distanceRGBA_frag:"#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main () {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = packDepthToRGBA( dist );\n}\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}\n",equirect_frag:"uniform sampler2D tEquirect;\nvarying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvec3 direction = normalize( vWorldPosition );\n\tvec2 sampleUV;\n\tsampleUV.y = asin( clamp( direction.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 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 <fog_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\t#include <fog_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 <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 <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_ENVMAP\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <envmap_vertex>\n\t#include <fog_vertex>\n}\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 <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_pars_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\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 <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}\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_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}\n",meshphong_frag:"#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <gradientmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <lights_phong_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\t#include <lights_phong_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}\n",meshphong_vert:"#define PHONG\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\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 <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <bsdfs>\n#include <cube_uv_reflection_fragment>\n#include <envmap_pars_fragment>\n#include <envmap_physical_pars_fragment>\n#include <fog_pars_fragment>\n#include <lights_pars_begin>\n#include <lights_physical_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <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 <emissivemap_fragment>\n\t#include <lights_physical_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}\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 <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n",normal_frag:"#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || ( defined( USE_NORMALMAP ) && ! defined( OBJECTSPACE_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_fragment_begin>\n\t#include <normal_fragment_maps>\n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n}\n",normal_vert:"#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || ( defined( USE_NORMALMAP ) && ! defined( OBJECTSPACE_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 <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || ( defined( USE_NORMALMAP ) && ! defined( OBJECTSPACE_NORMALMAP ) )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}\n",points_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include <common>\n#include <color_pars_fragment>\n#include <map_particle_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_particle_fragment>\n\t#include <color_fragment>\n\t#include <alphatest_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <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 <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\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 <fog_vertex>\n}\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 <fog_fragment>\n}\n",shadow_vert:"#include <fog_pars_vertex>\n#include <shadowmap_pars_vertex>\nvoid main() {\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n",sprite_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include <common>\n#include <uv_pars_fragment>\n#include <map_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 <alphatest_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\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\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\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\tvec4 mvPosition;\n\tmvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\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}\n"},Ri={merge:function(t){for(var e={},i=0;i<t.length;i++){var r=this.clone(t[i]);for(var n in r)e[n]=r[n]}return e},clone:function(t){var e={};for(var i in t)for(var r in e[i]={},t[i]){var n=t[i][r];n&&(n.isColor||n.isMatrix3||n.isMatrix4||n.isVector2||n.isVector3||n.isVector4||n.isTexture)?e[i][r]=n.clone():Array.isArray(n)?e[i][r]=n.slice():e[i][r]=n}return e}},Di={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};function ki(t,e,i){return void 0===e&&void 0===i?this.set(t):this.setRGB(t,e,i)}Object.assign(ki.prototype,{isColor:!0,r:1,g:1,b:1,set:function(t){return t&&t.isColor?this.copy(t):"number"==typeof t?this.setHex(t):"string"==typeof t&&this.setStyle(t),this},setScalar:function(t){return this.r=t,this.g=t,this.b=t,this},setHex:function(t){return t=Math.floor(t),this.r=(t>>16&255)/255,this.g=(t>>8&255)/255,this.b=(255&t)/255,this},setRGB:function(t,e,i){return this.r=t,this.g=e,this.b=i,this},setHSL:function(){function o(t,e,i){return i<0&&(i+=1),1<i&&(i-=1),i<1/6?t+6*(e-t)*i:i<.5?e:i<2/3?t+6*(e-t)*(2/3-i):t}return function(t,e,i){if(t=Qe.euclideanModulo(t,1),e=Qe.clamp(e,0,1),i=Qe.clamp(i,0,1),0===e)this.r=this.g=this.b=i;else{var r=i<=.5?i*(1+e):i+e-i*e,n=2*i-r;this.r=o(n,r,t+1/3),this.g=o(n,r,t),this.b=o(n,r,t-1/3)}return this}}(),setStyle:function(e){function t(t){void 0!==t&&parseFloat(t)<1&&console.warn("THREE.Color: Alpha component of "+e+" will be ignored.")}var i;if(i=/^((?:rgb|hsl)a?)\(\s*([^\)]*)\)/.exec(e)){var r,n=i[1],o=i[2];switch(n){case"rgb":case"rgba":if(r=/^(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(o))return this.r=Math.min(255,parseInt(r[1],10))/255,this.g=Math.min(255,parseInt(r[2],10))/255,this.b=Math.min(255,parseInt(r[3],10))/255,t(r[5]),this;if(r=/^(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(o))return this.r=Math.min(100,parseInt(r[1],10))/100,this.g=Math.min(100,parseInt(r[2],10))/100,this.b=Math.min(100,parseInt(r[3],10))/100,t(r[5]),this;break;case"hsl":case"hsla":if(r=/^([0-9]*\.?[0-9]+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(o)){var a=parseFloat(r[1])/360,s=parseInt(r[2],10)/100,c=parseInt(r[3],10)/100;return t(r[5]),this.setHSL(a,s,c)}}}else if(i=/^\#([A-Fa-f0-9]+)$/.exec(e)){var u,h=(u=i[1]).length;if(3===h)return this.r=parseInt(u.charAt(0)+u.charAt(0),16)/255,this.g=parseInt(u.charAt(1)+u.charAt(1),16)/255,this.b=parseInt(u.charAt(2)+u.charAt(2),16)/255,this;if(6===h)return this.r=parseInt(u.charAt(0)+u.charAt(1),16)/255,this.g=parseInt(u.charAt(2)+u.charAt(3),16)/255,this.b=parseInt(u.charAt(4)+u.charAt(5),16)/255,this}e&&0<e.length&&(void 0!==(u=Di[e])?this.setHex(u):console.warn("THREE.Color: Unknown color "+e));return this},clone:function(){return new this.constructor(this.r,this.g,this.b)},copy:function(t){return this.r=t.r,this.g=t.g,this.b=t.b,this},copyGammaToLinear:function(t,e){return void 0===e&&(e=2),this.r=Math.pow(t.r,e),this.g=Math.pow(t.g,e),this.b=Math.pow(t.b,e),this},copyLinearToGamma:function(t,e){void 0===e&&(e=2);var i=0<e?1/e:1;return this.r=Math.pow(t.r,i),this.g=Math.pow(t.g,i),this.b=Math.pow(t.b,i),this},convertGammaToLinear:function(t){return this.copyGammaToLinear(this,t),this},convertLinearToGamma:function(t){return this.copyLinearToGamma(this,t),this},copySRGBToLinear:function(){function e(t){return t<.04045?.0773993808*t:Math.pow(.9478672986*t+.0521327014,2.4)}return function(t){return this.r=e(t.r),this.g=e(t.g),this.b=e(t.b),this}}(),copyLinearToSRGB:function(){function e(t){return t<.0031308?12.92*t:1.055*Math.pow(t,.41666)-.055}return function(t){return this.r=e(t.r),this.g=e(t.g),this.b=e(t.b),this}}(),convertSRGBToLinear:function(){return this.copySRGBToLinear(this),this},convertLinearToSRGB:function(){return this.copyLinearToSRGB(this),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(t){void 0===t&&(console.warn("THREE.Color: .getHSL() target is now required"),t={h:0,s:0,l:0});var e,i,r=this.r,n=this.g,o=this.b,a=Math.max(r,n,o),s=Math.min(r,n,o),c=(s+a)/2;if(s===a)i=e=0;else{var u=a-s;switch(i=c<=.5?u/(a+s):u/(2-a-s),a){case r:e=(n-o)/u+(n<o?6:0);break;case n:e=(o-r)/u+2;break;case o:e=(r-n)/u+4}e/=6}return t.h=e,t.s=i,t.l=c,t},getStyle:function(){return"rgb("+(255*this.r|0)+","+(255*this.g|0)+","+(255*this.b|0)+")"},offsetHSL:(Oi={},function(t,e,i){return this.getHSL(Oi),Oi.h+=t,Oi.s+=e,Oi.l+=i,this.setHSL(Oi.h,Oi.s,Oi.l),this}),add:function(t){return this.r+=t.r,this.g+=t.g,this.b+=t.b,this},addColors:function(t,e){return this.r=t.r+e.r,this.g=t.g+e.g,this.b=t.b+e.b,this},addScalar:function(t){return this.r+=t,this.g+=t,this.b+=t,this},sub:function(t){return this.r=Math.max(0,this.r-t.r),this.g=Math.max(0,this.g-t.g),this.b=Math.max(0,this.b-t.b),this},multiply:function(t){return this.r*=t.r,this.g*=t.g,this.b*=t.b,this},multiplyScalar:function(t){return this.r*=t,this.g*=t,this.b*=t,this},lerp:function(t,e){return this.r+=(t.r-this.r)*e,this.g+=(t.g-this.g)*e,this.b+=(t.b-this.b)*e,this},equals:function(t){return t.r===this.r&&t.g===this.g&&t.b===this.b},fromArray:function(t,e){return void 0===e&&(e=0),this.r=t[e],this.g=t[e+1],this.b=t[e+2],this},toArray:function(t,e){return void 0===t&&(t=[]),void 0===e&&(e=0),t[e]=this.r,t[e+1]=this.g,t[e+2]=this.b,t},toJSON:function(){return this.getHex()}});var Bi,Ni,Fi={common:{diffuse:{value:new ki(15658734)},opacity:{value:1},map:{value:null},uvTransform:{value:new ni},alphaMap:{value:null}},specularmap:{specularMap:{value:null}},envmap:{envMap:{value:null},flipEnvMap:{value:-1},reflectivity:{value:1},refractionRatio:{value:.98},maxMipLevel:{value:0}},aomap:{aoMap:{value:null},aoMapIntensity:{value:1}},lightmap:{lightMap:{value:null},lightMapIntensity:{value:1}},emissivemap:{emissiveMap:{value:null}},bumpmap:{bumpMap:{value:null},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalScale:{value:new ti(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 ki(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:{},shadowCameraNear:{},shadowCameraFar:{}}},pointShadowMap:{value:[]},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}},rectAreaLights:{value:[],properties:{color:{},position:{},width:{},height:{}}}},points:{diffuse:{value:new ki(15658734)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},uvTransform:{value:new ni}},sprite:{diffuse:{value:new ki(15658734)},opacity:{value:1},center:{value:new ti(.5,.5)},rotation:{value:0},map:{value:null},uvTransform:{value:new ni}}},zi={basic:{uniforms:Ri.merge([Fi.common,Fi.specularmap,Fi.envmap,Fi.aomap,Fi.lightmap,Fi.fog]),vertexShader:Li.meshbasic_vert,fragmentShader:Li.meshbasic_frag},lambert:{uniforms:Ri.merge([Fi.common,Fi.specularmap,Fi.envmap,Fi.aomap,Fi.lightmap,Fi.emissivemap,Fi.fog,Fi.lights,{emissive:{value:new ki(0)}}]),vertexShader:Li.meshlambert_vert,fragmentShader:Li.meshlambert_frag},phong:{uniforms:Ri.merge([Fi.common,Fi.specularmap,Fi.envmap,Fi.aomap,Fi.lightmap,Fi.emissivemap,Fi.bumpmap,Fi.normalmap,Fi.displacementmap,Fi.gradientmap,Fi.fog,Fi.lights,{emissive:{value:new ki(0)},specular:{value:new ki(1118481)},shininess:{value:30}}]),vertexShader:Li.meshphong_vert,fragmentShader:Li.meshphong_frag},standard:{uniforms:Ri.merge([Fi.common,Fi.envmap,Fi.aomap,Fi.lightmap,Fi.emissivemap,Fi.bumpmap,Fi.normalmap,Fi.displacementmap,Fi.roughnessmap,Fi.metalnessmap,Fi.fog,Fi.lights,{emissive:{value:new ki(0)},roughness:{value:.5},metalness:{value:.5},envMapIntensity:{value:1}}]),vertexShader:Li.meshphysical_vert,fragmentShader:Li.meshphysical_frag},points:{uniforms:Ri.merge([Fi.points,Fi.fog]),vertexShader:Li.points_vert,fragmentShader:Li.points_frag},dashed:{uniforms:Ri.merge([Fi.common,Fi.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:Li.linedashed_vert,fragmentShader:Li.linedashed_frag},depth:{uniforms:Ri.merge([Fi.common,Fi.displacementmap]),vertexShader:Li.depth_vert,fragmentShader:Li.depth_frag},normal:{uniforms:Ri.merge([Fi.common,Fi.bumpmap,Fi.normalmap,Fi.displacementmap,{opacity:{value:1}}]),vertexShader:Li.normal_vert,fragmentShader:Li.normal_frag},sprite:{uniforms:Ri.merge([Fi.sprite,Fi.fog]),vertexShader:Li.sprite_vert,fragmentShader:Li.sprite_frag},cube:{uniforms:{tCube:{value:null},tFlip:{value:-1},opacity:{value:1}},vertexShader:Li.cube_vert,fragmentShader:Li.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:Li.equirect_vert,fragmentShader:Li.equirect_frag},distanceRGBA:{uniforms:Ri.merge([Fi.common,Fi.displacementmap,{referencePosition:{value:new ri},nearDistance:{value:1},farDistance:{value:1e3}}]),vertexShader:Li.distanceRGBA_vert,fragmentShader:Li.distanceRGBA_frag},shadow:{uniforms:Ri.merge([Fi.lights,Fi.fog,{color:{value:new ki(0)},opacity:{value:1}}]),vertexShader:Li.shadow_vert,fragmentShader:Li.shadow_frag}};function Ui(){var i=null,r=!1,n=null;function o(t,e){!1!==r&&(n(t,e),i.requestAnimationFrame(o))}return{start:function(){!0!==r&&null!==n&&(i.requestAnimationFrame(o),r=!0)},stop:function(){r=!1},setAnimationLoop:function(t){n=t},setContext:function(t){i=t}}}function ji(c){var u=new WeakMap;return{get:function(t){return t.isInterleavedBufferAttribute&&(t=t.data),u.get(t)},remove:function(t){t.isInterleavedBufferAttribute&&(t=t.data);var e=u.get(t);e&&(c.deleteBuffer(e.buffer),u.delete(t))},update:function(t,e){t.isInterleavedBufferAttribute&&(t=t.data);var i,r,n,o,a,s=u.get(t);void 0===s?u.set(t,function(t,e){var i=t.array,r=t.dynamic?c.DYNAMIC_DRAW:c.STATIC_DRAW,n=c.createBuffer();c.bindBuffer(e,n),c.bufferData(e,i,r),t.onUploadCallback();var o=c.FLOAT;return i instanceof Float32Array?o=c.FLOAT:i instanceof Float64Array?console.warn("THREE.WebGLAttributes: Unsupported data buffer format: Float64Array."):i instanceof Uint16Array?o=c.UNSIGNED_SHORT:i instanceof Int16Array?o=c.SHORT:i instanceof Uint32Array?o=c.UNSIGNED_INT:i instanceof Int32Array?o=c.INT:i instanceof Int8Array?o=c.BYTE:i instanceof Uint8Array&&(o=c.UNSIGNED_BYTE),{buffer:n,type:o,bytesPerElement:i.BYTES_PER_ELEMENT,version:t.version}}(t,e)):s.version<t.version&&(i=s.buffer,n=e,o=(r=t).array,a=r.updateRange,c.bindBuffer(n,i),!1===r.dynamic?c.bufferData(n,o,c.STATIC_DRAW):-1===a.count?c.bufferSubData(n,0,o):0===a.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."):(c.bufferSubData(n,a.offset*o.BYTES_PER_ELEMENT,o.subarray(a.offset,a.offset+a.count)),a.count=-1),s.version=t.version)}}}function Gi(t,e,i,r){this._x=t||0,this._y=e||0,this._z=i||0,this._order=r||Gi.DefaultOrder}function Vi(){this.mask=1}zi.physical={uniforms:Ri.merge([zi.standard.uniforms,{clearCoat:{value:0},clearCoatRoughness:{value:0}}]),vertexShader:Li.meshphysical_vert,fragmentShader:Li.meshphysical_frag},Gi.RotationOrders=["XYZ","YZX","ZXY","XZY","YXZ","ZYX"],Gi.DefaultOrder="XYZ",Object.defineProperties(Gi.prototype,{x:{get:function(){return this._x},set:function(t){this._x=t,this.onChangeCallback()}},y:{get:function(){return this._y},set:function(t){this._y=t,this.onChangeCallback()}},z:{get:function(){return this._z},set:function(t){this._z=t,this.onChangeCallback()}},order:{get:function(){return this._order},set:function(t){this._order=t,this.onChangeCallback()}}}),Object.assign(Gi.prototype,{isEuler:!0,set:function(t,e,i,r){return this._x=t,this._y=e,this._z=i,this._order=r||this._order,this.onChangeCallback(),this},clone:function(){return new this.constructor(this._x,this._y,this._z,this._order)},copy:function(t){return this._x=t._x,this._y=t._y,this._z=t._z,this._order=t._order,this.onChangeCallback(),this},setFromRotationMatrix:function(t,e,i){var r=Qe.clamp,n=t.elements,o=n[0],a=n[4],s=n[8],c=n[1],u=n[5],h=n[9],l=n[2],p=n[6],d=n[10];return"XYZ"===(e=e||this._order)?(this._y=Math.asin(r(s,-1,1)),Math.abs(s)<.99999?(this._x=Math.atan2(-h,d),this._z=Math.atan2(-a,o)):(this._x=Math.atan2(p,u),this._z=0)):"YXZ"===e?(this._x=Math.asin(-r(h,-1,1)),Math.abs(h)<.99999?(this._y=Math.atan2(s,d),this._z=Math.atan2(c,u)):(this._y=Math.atan2(-l,o),this._z=0)):"ZXY"===e?(this._x=Math.asin(r(p,-1,1)),Math.abs(p)<.99999?(this._y=Math.atan2(-l,d),this._z=Math.atan2(-a,u)):(this._y=0,this._z=Math.atan2(c,o))):"ZYX"===e?(this._y=Math.asin(-r(l,-1,1)),Math.abs(l)<.99999?(this._x=Math.atan2(p,d),this._z=Math.atan2(c,o)):(this._x=0,this._z=Math.atan2(-a,u))):"YZX"===e?(this._z=Math.asin(r(c,-1,1)),Math.abs(c)<.99999?(this._x=Math.atan2(-h,u),this._y=Math.atan2(-l,o)):(this._x=0,this._y=Math.atan2(s,d))):"XZY"===e?(this._z=Math.asin(-r(a,-1,1)),Math.abs(a)<.99999?(this._x=Math.atan2(p,u),this._y=Math.atan2(s,o)):(this._x=Math.atan2(-h,d),this._y=0)):console.warn("THREE.Euler: .setFromRotationMatrix() given unsupported order: "+e),this._order=e,!1!==i&&this.onChangeCallback(),this},setFromQuaternion:(Ni=new ei,function(t,e,i){return Ni.makeRotationFromQuaternion(t),this.setFromRotationMatrix(Ni,e,i)}),setFromVector3:function(t,e){return this.set(t.x,t.y,t.z,e||this._order)},reorder:(Bi=new ii,function(t){return Bi.setFromEuler(this),this.setFromQuaternion(Bi,t)}),equals:function(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._order===this._order},fromArray:function(t){return this._x=t[0],this._y=t[1],this._z=t[2],void 0!==t[3]&&(this._order=t[3]),this.onChangeCallback(),this},toArray:function(t,e){return void 0===t&&(t=[]),void 0===e&&(e=0),t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._order,t},toVector3:function(t){return t?t.set(this._x,this._y,this._z):new ri(this._x,this._y,this._z)},onChange:function(t){return this.onChangeCallback=t,this},onChangeCallback:function(){}}),Object.assign(Vi.prototype,{set:function(t){this.mask=1<<t|0},enable:function(t){this.mask|=1<<t|0},toggle:function(t){this.mask^=1<<t|0},disable:function(t){this.mask&=~(1<<t|0)},test:function(t){return 0!=(this.mask&t.mask)}});var Hi,$i,Wi,Xi,qi,Yi,Zi,Ki,Ji,Qi,tr,er,ir,rr,nr,or,ar,sr,cr=0;function ur(){Object.defineProperty(this,"id",{value:cr++}),this.uuid=Qe.generateUUID(),this.name="",this.type="Object3D",this.parent=null,this.children=[],this.up=ur.DefaultUp.clone();var t=new ri,e=new Gi,i=new ii,r=new ri(1,1,1);e.onChange(function(){i.setFromEuler(e,!1)}),i.onChange(function(){e.setFromQuaternion(i,void 0,!1)}),Object.defineProperties(this,{position:{enumerable:!0,value:t},rotation:{enumerable:!0,value:e},quaternion:{enumerable:!0,value:i},scale:{enumerable:!0,value:r},modelViewMatrix:{value:new ei},normalMatrix:{value:new ni}}),this.matrix=new ei,this.matrixWorld=new ei,this.matrixAutoUpdate=ur.DefaultMatrixAutoUpdate,this.matrixWorldNeedsUpdate=!1,this.layers=new Vi,this.visible=!0,this.castShadow=!1,this.receiveShadow=!1,this.frustumCulled=!0,this.renderOrder=0,this.userData={}}function hr(){ur.call(this),this.type="Camera",this.matrixWorldInverse=new ei,this.projectionMatrix=new ei}function lr(t,e,i,r,n,o){hr.call(this),this.type="OrthographicCamera",this.zoom=1,this.view=null,this.left=t,this.right=e,this.top=i,this.bottom=r,this.near=void 0!==n?n:.1,this.far=void 0!==o?o:2e3,this.updateProjectionMatrix()}function pr(t,e,i,r,n,o){this.a=t,this.b=e,this.c=i,this.normal=r&&r.isVector3?r:new ri,this.vertexNormals=Array.isArray(r)?r:[],this.color=n&&n.isColor?n:new ki,this.vertexColors=Array.isArray(n)?n:[],this.materialIndex=void 0!==o?o:0}ur.DefaultUp=new ri(0,1,0),ur.DefaultMatrixAutoUpdate=!0,ur.prototype=Object.assign(Object.create(v.prototype),{constructor:ur,isObject3D:!0,onBeforeRender:function(){},onAfterRender:function(){},applyMatrix:function(t){this.matrix.multiplyMatrices(t,this.matrix),this.matrix.decompose(this.position,this.quaternion,this.scale)},applyQuaternion:function(t){return this.quaternion.premultiply(t),this},setRotationFromAxisAngle:function(t,e){this.quaternion.setFromAxisAngle(t,e)},setRotationFromEuler:function(t){this.quaternion.setFromEuler(t,!0)},setRotationFromMatrix:function(t){this.quaternion.setFromRotationMatrix(t)},setRotationFromQuaternion:function(t){this.quaternion.copy(t)},rotateOnAxis:(ar=new ii,function(t,e){return ar.setFromAxisAngle(t,e),this.quaternion.multiply(ar),this}),rotateOnWorldAxis:(or=new ii,function(t,e){return or.setFromAxisAngle(t,e),this.quaternion.premultiply(or),this}),rotateX:(nr=new ri(1,0,0),function(t){return this.rotateOnAxis(nr,t)}),rotateY:(rr=new ri(0,1,0),function(t){return this.rotateOnAxis(rr,t)}),rotateZ:(ir=new ri(0,0,1),function(t){return this.rotateOnAxis(ir,t)}),translateOnAxis:(er=new ri,function(t,e){return er.copy(t).applyQuaternion(this.quaternion),this.position.add(er.multiplyScalar(e)),this}),translateX:(tr=new ri(1,0,0),function(t){return this.translateOnAxis(tr,t)}),translateY:(Qi=new ri(0,1,0),function(t){return this.translateOnAxis(Qi,t)}),translateZ:(Ji=new ri(0,0,1),function(t){return this.translateOnAxis(Ji,t)}),localToWorld:function(t){return t.applyMatrix4(this.matrixWorld)},worldToLocal:(Ki=new ei,function(t){return t.applyMatrix4(Ki.getInverse(this.matrixWorld))}),lookAt:(Yi=new ei,Zi=new ri,function(t,e,i){t.isVector3?Zi.copy(t):Zi.set(t,e,i),this.isCamera?Yi.lookAt(this.position,Zi,this.up):Yi.lookAt(Zi,this.position,this.up),this.quaternion.setFromRotationMatrix(Yi)}),add:function(t){var e=arguments;if(1<arguments.length){for(var i=0;i<arguments.length;i++)this.add(e[i]);return this}return t===this?console.error("THREE.Object3D.add: object can't be added as a child of itself.",t):t&&t.isObject3D?(null!==t.parent&&t.parent.remove(t),t.parent=this,t.dispatchEvent({type:"added"}),this.children.push(t)):console.error("THREE.Object3D.add: object not an instance of THREE.Object3D.",t),this},remove:function(t){var e=arguments;if(1<arguments.length){for(var i=0;i<arguments.length;i++)this.remove(e[i]);return this}var r=this.children.indexOf(t);return-1!==r&&(t.parent=null,t.dispatchEvent({type:"removed"}),this.children.splice(r,1)),this},getObjectById:function(t){return this.getObjectByProperty("id",t)},getObjectByName:function(t){return this.getObjectByProperty("name",t)},getObjectByProperty:function(t,e){if(this[t]===e)return this;for(var i=0,r=this.children.length;i<r;i++){var n=this.children[i].getObjectByProperty(t,e);if(void 0!==n)return n}},getWorldPosition:function(t){return void 0===t&&(console.warn("THREE.Object3D: .getWorldPosition() target is now required"),t=new ri),this.updateMatrixWorld(!0),t.setFromMatrixPosition(this.matrixWorld)},getWorldQuaternion:(Xi=new ri,qi=new ri,function(t){return void 0===t&&(console.warn("THREE.Object3D: .getWorldQuaternion() target is now required"),t=new ii),this.updateMatrixWorld(!0),this.matrixWorld.decompose(Xi,t,qi),t}),getWorldScale:($i=new ri,Wi=new ii,function(t){return void 0===t&&(console.warn("THREE.Object3D: .getWorldScale() target is now required"),t=new ri),this.updateMatrixWorld(!0),this.matrixWorld.decompose($i,Wi,t),t}),getWorldDirection:(Hi=new ii,function(t){return void 0===t&&(console.warn("THREE.Object3D: .getWorldDirection() target is now required"),t=new ri),this.getWorldQuaternion(Hi),t.set(0,0,1).applyQuaternion(Hi)}),raycast:function(){},traverse:function(t){t(this);for(var e=this.children,i=0,r=e.length;i<r;i++)e[i].traverse(t)},traverseVisible:function(t){if(!1!==this.visible){t(this);for(var e=this.children,i=0,r=e.length;i<r;i++)e[i].traverseVisible(t)}},traverseAncestors:function(t){var e=this.parent;null!==e&&(t(e),e.traverseAncestors(t))},updateMatrix:function(){this.matrix.compose(this.position,this.quaternion,this.scale),this.matrixWorldNeedsUpdate=!0},updateMatrixWorld:function(t){this.matrixAutoUpdate&&this.updateMatrix(),(this.matrixWorldNeedsUpdate||t)&&(null===this.parent?this.matrixWorld.copy(this.matrix):this.matrixWorld.multiplyMatrices(this.parent.matrixWorld,this.matrix),t=!(this.matrixWorldNeedsUpdate=!1));for(var e=this.children,i=0,r=e.length;i<r;i++)e[i].updateMatrixWorld(t)},toJSON:function(i){var t=void 0===i||"string"==typeof i,e={};t&&(i={geometries:{},materials:{},textures:{},images:{},shapes:{}},e.metadata={version:4.5,type:"Object",generator:"Object3D.toJSON"});var r={};function n(t,e){return void 0===t[e.uuid]&&(t[e.uuid]=e.toJSON(i)),e.uuid}if(r.uuid=this.uuid,r.type=this.type,""!==this.name&&(r.name=this.name),!0===this.castShadow&&(r.castShadow=!0),!0===this.receiveShadow&&(r.receiveShadow=!0),!1===this.visible&&(r.visible=!1),!1===this.frustumCulled&&(r.frustumCulled=!1),0!==this.renderOrder&&(r.renderOrder=this.renderOrder),"{}"!==JSON.stringify(this.userData)&&(r.userData=this.userData),r.layers=this.layers.mask,r.matrix=this.matrix.toArray(),!1===this.matrixAutoUpdate&&(r.matrixAutoUpdate=!1),this.isMesh||this.isLine||this.isPoints){r.geometry=n(i.geometries,this.geometry);var o=this.geometry.parameters;if(void 0!==o&&void 0!==o.shapes){var a=o.shapes;if(Array.isArray(a))for(var s=0,c=a.length;s<c;s++){var u=a[s];n(i.shapes,u)}else n(i.shapes,a)}}if(void 0!==this.material)if(Array.isArray(this.material)){var h=[];for(s=0,c=this.material.length;s<c;s++)h.push(n(i.materials,this.material[s]));r.material=h}else r.material=n(i.materials,this.material);if(0<this.children.length){r.children=[];for(s=0;s<this.children.length;s++)r.children.push(this.children[s].toJSON(i).object)}if(t){var l=m(i.geometries),p=m(i.materials),d=m(i.textures),f=m(i.images);a=m(i.shapes);0<l.length&&(e.geometries=l),0<p.length&&(e.materials=p),0<d.length&&(e.textures=d),0<f.length&&(e.images=f),0<a.length&&(e.shapes=a)}return e.object=r,e;function m(t){var e=[];for(var i in t){var r=t[i];delete r.metadata,e.push(r)}return e}},clone:function(t){return(new this.constructor).copy(this,t)},copy:function(t,e){if(void 0===e&&(e=!0),this.name=t.name,this.up.copy(t.up),this.position.copy(t.position),this.quaternion.copy(t.quaternion),this.scale.copy(t.scale),this.matrix.copy(t.matrix),this.matrixWorld.copy(t.matrixWorld),this.matrixAutoUpdate=t.matrixAutoUpdate,this.matrixWorldNeedsUpdate=t.matrixWorldNeedsUpdate,this.layers.mask=t.layers.mask,this.visible=t.visible,this.castShadow=t.castShadow,this.receiveShadow=t.receiveShadow,this.frustumCulled=t.frustumCulled,this.renderOrder=t.renderOrder,this.userData=JSON.parse(JSON.stringify(t.userData)),!0===e)for(var i=0;i<t.children.length;i++){var r=t.children[i];this.add(r.clone())}return this}}),hr.prototype=Object.assign(Object.create(ur.prototype),{constructor:hr,isCamera:!0,copy:function(t,e){return ur.prototype.copy.call(this,t,e),this.matrixWorldInverse.copy(t.matrixWorldInverse),this.projectionMatrix.copy(t.projectionMatrix),this},getWorldDirection:(sr=new ii,function(t){return void 0===t&&(console.warn("THREE.Camera: .getWorldDirection() target is now required"),t=new ri),this.getWorldQuaternion(sr),t.set(0,0,-1).applyQuaternion(sr)}),updateMatrixWorld:function(t){ur.prototype.updateMatrixWorld.call(this,t),this.matrixWorldInverse.getInverse(this.matrixWorld)},clone:function(){return(new this.constructor).copy(this)}}),lr.prototype=Object.assign(Object.create(hr.prototype),{constructor:lr,isOrthographicCamera:!0,copy:function(t,e){return hr.prototype.copy.call(this,t,e),this.left=t.left,this.right=t.right,this.top=t.top,this.bottom=t.bottom,this.near=t.near,this.far=t.far,this.zoom=t.zoom,this.view=null===t.view?null:Object.assign({},t.view),this},setViewOffset:function(t,e,i,r,n,o){null===this.view&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=t,this.view.fullHeight=e,this.view.offsetX=i,this.view.offsetY=r,this.view.width=n,this.view.height=o,this.updateProjectionMatrix()},clearViewOffset:function(){null!==this.view&&(this.view.enabled=!1),this.updateProjectionMatrix()},updateProjectionMatrix:function(){var t=(this.right-this.left)/(2*this.zoom),e=(this.top-this.bottom)/(2*this.zoom),i=(this.right+this.left)/2,r=(this.top+this.bottom)/2,n=i-t,o=i+t,a=r+e,s=r-e;if(null!==this.view&&this.view.enabled){var c=this.zoom/(this.view.width/this.view.fullWidth),u=this.zoom/(this.view.height/this.view.fullHeight),h=(this.right-this.left)/this.view.width,l=(this.top-this.bottom)/this.view.height;o=(n+=h*(this.view.offsetX/c))+h*(this.view.width/c),s=(a-=l*(this.view.offsetY/u))-l*(this.view.height/u)}this.projectionMatrix.makeOrthographic(n,o,a,s,this.near,this.far)},toJSON:function(t){var e=ur.prototype.toJSON.call(this,t);return e.object.zoom=this.zoom,e.object.left=this.left,e.object.right=this.right,e.object.top=this.top,e.object.bottom=this.bottom,e.object.near=this.near,e.object.far=this.far,null!==this.view&&(e.object.view=Object.assign({},this.view)),e}}),Object.assign(pr.prototype,{clone:function(){return(new this.constructor).copy(this)},copy:function(t){this.a=t.a,this.b=t.b,this.c=t.c,this.normal.copy(t.normal),this.color.copy(t.color),this.materialIndex=t.materialIndex;for(var e=0,i=t.vertexNormals.length;e<i;e++)this.vertexNormals[e]=t.vertexNormals[e].clone();for(e=0,i=t.vertexColors.length;e<i;e++)this.vertexColors[e]=t.vertexColors[e].clone();return this}});var dr,fr,mr,gr,vr,yr,br,xr=0;function _r(){Object.defineProperty(this,"id",{value:xr+=2}),this.uuid=Qe.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.boundingBox=null,this.boundingSphere=null,this.elementsNeedUpdate=!1,this.verticesNeedUpdate=!1,this.uvsNeedUpdate=!1,this.normalsNeedUpdate=!1,this.colorsNeedUpdate=!1,this.lineDistancesNeedUpdate=!1,this.groupsNeedUpdate=!1}function wr(t,e,i){if(Array.isArray(t))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.name="",this.array=t,this.itemSize=e,this.count=void 0!==t?t.length/e:0,this.normalized=!0===i,this.dynamic=!1,this.updateRange={offset:0,count:-1},this.version=0}function Sr(t,e,i){wr.call(this,new Int8Array(t),e,i)}function Ar(t,e,i){wr.call(this,new Uint8Array(t),e,i)}function Mr(t,e,i){wr.call(this,new Uint8ClampedArray(t),e,i)}function Er(t,e,i){wr.call(this,new Int16Array(t),e,i)}function Pr(t,e,i){wr.call(this,new Uint16Array(t),e,i)}function Tr(t,e,i){wr.call(this,new Int32Array(t),e,i)}function Cr(t,e,i){wr.call(this,new Uint32Array(t),e,i)}function Ir(t,e,i){wr.call(this,new Float32Array(t),e,i)}function Or(t,e,i){wr.call(this,new Float64Array(t),e,i)}function Lr(){this.vertices=[],this.normals=[],this.colors=[],this.uvs=[],this.uvs2=[],this.groups=[],this.morphTargets={},this.skinWeights=[],this.skinIndices=[],this.boundingBox=null,this.boundingSphere=null,this.verticesNeedUpdate=!1,this.normalsNeedUpdate=!1,this.colorsNeedUpdate=!1,this.uvsNeedUpdate=!1,this.groupsNeedUpdate=!1}function Rr(t){if(0===t.length)return-1/0;for(var e=t[0],i=1,r=t.length;i<r;++i)t[i]>e&&(e=t[i]);return e}_r.prototype=Object.assign(Object.create(v.prototype),{constructor:_r,isGeometry:!0,applyMatrix:function(t){for(var e=(new ni).getNormalMatrix(t),i=0,r=this.vertices.length;i<r;i++){this.vertices[i].applyMatrix4(t)}for(i=0,r=this.faces.length;i<r;i++){var n=this.faces[i];n.normal.applyMatrix3(e).normalize();for(var o=0,a=n.vertexNormals.length;o<a;o++)n.vertexNormals[o].applyMatrix3(e).normalize()}return null!==this.boundingBox&&this.computeBoundingBox(),null!==this.boundingSphere&&this.computeBoundingSphere(),this.verticesNeedUpdate=!0,this.normalsNeedUpdate=!0,this},rotateX:(br=new ei,function(t){return br.makeRotationX(t),this.applyMatrix(br),this}),rotateY:(yr=new ei,function(t){return yr.makeRotationY(t),this.applyMatrix(yr),this}),rotateZ:(vr=new ei,function(t){return vr.makeRotationZ(t),this.applyMatrix(vr),this}),translate:(gr=new ei,function(t,e,i){return gr.makeTranslation(t,e,i),this.applyMatrix(gr),this}),scale:(mr=new ei,function(t,e,i){return mr.makeScale(t,e,i),this.applyMatrix(mr),this}),lookAt:(fr=new ur,function(t){fr.lookAt(t),fr.updateMatrix(),this.applyMatrix(fr.matrix)}),fromBufferGeometry:function(t){var o=this,e=null!==t.index?t.index.array:void 0,i=t.attributes,r=i.position.array,a=void 0!==i.normal?i.normal.array:void 0,s=void 0!==i.color?i.color.array:void 0,c=void 0!==i.uv?i.uv.array:void 0,u=void 0!==i.uv2?i.uv2.array:void 0;void 0!==u&&(this.faceVertexUvs[1]=[]);for(var h=[],l=[],p=[],n=0,d=0;n<r.length;n+=3,d+=2)o.vertices.push(new ri(r[n],r[n+1],r[n+2])),void 0!==a&&h.push(new ri(a[n],a[n+1],a[n+2])),void 0!==s&&o.colors.push(new ki(s[n],s[n+1],s[n+2])),void 0!==c&&l.push(new ti(c[d],c[d+1])),void 0!==u&&p.push(new ti(u[d],u[d+1]));function f(t,e,i,r){var n=new pr(t,e,i,void 0!==a?[h[t].clone(),h[e].clone(),h[i].clone()]:[],void 0!==s?[o.colors[t].clone(),o.colors[e].clone(),o.colors[i].clone()]:[],r);o.faces.push(n),void 0!==c&&o.faceVertexUvs[0].push([l[t].clone(),l[e].clone(),l[i].clone()]),void 0!==u&&o.faceVertexUvs[1].push([p[t].clone(),p[e].clone(),p[i].clone()])}var m=t.groups;if(0<m.length)for(n=0;n<m.length;n++)for(var g=m[n],v=g.start,y=(d=v,v+g.count);d<y;d+=3)void 0!==e?f(e[d],e[d+1],e[d+2],g.materialIndex):f(d,d+1,d+2,g.materialIndex);else if(void 0!==e)for(n=0;n<e.length;n+=3)f(e[n],e[n+1],e[n+2]);else for(n=0;n<r.length/3;n+=3)f(n,n+1,n+2);return this.computeFaceNormals(),null!==t.boundingBox&&(this.boundingBox=t.boundingBox.clone()),null!==t.boundingSphere&&(this.boundingSphere=t.boundingSphere.clone()),this},center:(dr=new ri,function(){return this.computeBoundingBox(),this.boundingBox.getCenter(dr).negate(),this.translate(dr.x,dr.y,dr.z),this}),normalize:function(){this.computeBoundingSphere();var t=this.boundingSphere.center,e=this.boundingSphere.radius,i=0===e?1:1/e,r=new ei;return r.set(i,0,0,-i*t.x,0,i,0,-i*t.y,0,0,i,-i*t.z,0,0,0,1),this.applyMatrix(r),this},computeFaceNormals:function(){for(var t=new ri,e=new ri,i=0,r=this.faces.length;i<r;i++){var n=this.faces[i],o=this.vertices[n.a],a=this.vertices[n.b],s=this.vertices[n.c];t.subVectors(s,a),e.subVectors(o,a),t.cross(e),t.normalize(),n.normal.copy(t)}},computeVertexNormals:function(t){var e,i,r,n,o,a;for(void 0===t&&(t=!0),a=new Array(this.vertices.length),e=0,i=this.vertices.length;e<i;e++)a[e]=new ri;if(t){var s,c,u,h=new ri,l=new ri;for(r=0,n=this.faces.length;r<n;r++)o=this.faces[r],s=this.vertices[o.a],c=this.vertices[o.b],u=this.vertices[o.c],h.subVectors(u,c),l.subVectors(s,c),h.cross(l),a[o.a].add(h),a[o.b].add(h),a[o.c].add(h)}else for(this.computeFaceNormals(),r=0,n=this.faces.length;r<n;r++)a[(o=this.faces[r]).a].add(o.normal),a[o.b].add(o.normal),a[o.c].add(o.normal);for(e=0,i=this.vertices.length;e<i;e++)a[e].normalize();for(r=0,n=this.faces.length;r<n;r++){var p=(o=this.faces[r]).vertexNormals;3===p.length?(p[0].copy(a[o.a]),p[1].copy(a[o.b]),p[2].copy(a[o.c])):(p[0]=a[o.a].clone(),p[1]=a[o.b].clone(),p[2]=a[o.c].clone())}0<this.faces.length&&(this.normalsNeedUpdate=!0)},computeFlatVertexNormals:function(){var t,e,i;for(this.computeFaceNormals(),t=0,e=this.faces.length;t<e;t++){var r=(i=this.faces[t]).vertexNormals;3===r.length?(r[0].copy(i.normal),r[1].copy(i.normal),r[2].copy(i.normal)):(r[0]=i.normal.clone(),r[1]=i.normal.clone(),r[2]=i.normal.clone())}0<this.faces.length&&(this.normalsNeedUpdate=!0)},computeMorphNormals:function(){var t,e,i,r,n,o=this;for(i=0,r=this.faces.length;i<r;i++)for((n=o.faces[i]).__originalFaceNormal?n.__originalFaceNormal.copy(n.normal):n.__originalFaceNormal=n.normal.clone(),n.__originalVertexNormals||(n.__originalVertexNormals=[]),t=0,e=n.vertexNormals.length;t<e;t++)n.__originalVertexNormals[t]?n.__originalVertexNormals[t].copy(n.vertexNormals[t]):n.__originalVertexNormals[t]=n.vertexNormals[t].clone();var a=new _r;for(a.faces=this.faces,t=0,e=this.morphTargets.length;t<e;t++){if(!o.morphNormals[t]){o.morphNormals[t]={},o.morphNormals[t].faceNormals=[],o.morphNormals[t].vertexNormals=[];var s=o.morphNormals[t].faceNormals,c=o.morphNormals[t].vertexNormals;for(i=0,r=this.faces.length;i<r;i++)u=new ri,h={a:new ri,b:new ri,c:new ri},s.push(u),c.push(h)}var u,h,l=o.morphNormals[t];for(a.vertices=o.morphTargets[t].vertices,a.computeFaceNormals(),a.computeVertexNormals(),i=0,r=this.faces.length;i<r;i++)n=o.faces[i],u=l.faceNormals[i],h=l.vertexNormals[i],u.copy(n.normal),h.a.copy(n.vertexNormals[0]),h.b.copy(n.vertexNormals[1]),h.c.copy(n.vertexNormals[2])}for(i=0,r=this.faces.length;i<r;i++)(n=o.faces[i]).normal=n.__originalFaceNormal,n.vertexNormals=n.__originalVertexNormals},computeBoundingBox:function(){null===this.boundingBox&&(this.boundingBox=new Pi),this.boundingBox.setFromPoints(this.vertices)},computeBoundingSphere:function(){null===this.boundingSphere&&(this.boundingSphere=new Ti),this.boundingSphere.setFromPoints(this.vertices)},merge:function(t,e,i){if(t&&t.isGeometry){var r,n=this.vertices.length,o=this.vertices,a=t.vertices,s=this.faces,c=t.faces,u=this.faceVertexUvs[0],h=t.faceVertexUvs[0],l=this.colors,p=t.colors;void 0===i&&(i=0),void 0!==e&&(r=(new ni).getNormalMatrix(e));for(var d=0,f=a.length;d<f;d++){var m=a[d].clone();void 0!==e&&m.applyMatrix4(e),o.push(m)}for(d=0,f=p.length;d<f;d++)l.push(p[d].clone());for(d=0,f=c.length;d<f;d++){var g,v,y,b=c[d],x=b.vertexNormals,_=b.vertexColors;(g=new pr(b.a+n,b.b+n,b.c+n)).normal.copy(b.normal),void 0!==r&&g.normal.applyMatrix3(r).normalize();for(var w=0,S=x.length;w<S;w++)v=x[w].clone(),void 0!==r&&v.applyMatrix3(r).normalize(),g.vertexNormals.push(v);g.color.copy(b.color);for(w=0,S=_.length;w<S;w++)y=_[w],g.vertexColors.push(y.clone());g.materialIndex=b.materialIndex+i,s.push(g)}for(d=0,f=h.length;d<f;d++){var A=h[d],M=[];if(void 0!==A){for(w=0,S=A.length;w<S;w++)M.push(A[w].clone());u.push(M)}}}else console.error("THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.",t)},mergeMesh:function(t){t&&t.isMesh?(t.matrixAutoUpdate&&t.updateMatrix(),this.merge(t.geometry,t.matrix)):console.error("THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.",t)},mergeVertices:function(){var t,e,i,r,n,o,a,s,c={},u=[],h=[],l=Math.pow(10,4);for(i=0,r=this.vertices.length;i<r;i++)t=this.vertices[i],void 0===c[e=Math.round(t.x*l)+"_"+Math.round(t.y*l)+"_"+Math.round(t.z*l)]?(c[e]=i,u.push(this.vertices[i]),h[i]=u.length-1):h[i]=h[c[e]];var p=[];for(i=0,r=this.faces.length;i<r;i++){(n=this.faces[i]).a=h[n.a],n.b=h[n.b],n.c=h[n.c],o=[n.a,n.b,n.c];for(var d=0;d<3;d++)if(o[d]===o[(d+1)%3]){p.push(i);break}}for(i=p.length-1;0<=i;i--){var f=p[i];for(this.faces.splice(f,1),a=0,s=this.faceVertexUvs.length;a<s;a++)this.faceVertexUvs[a].splice(f,1)}var m=this.vertices.length-u.length;return this.vertices=u,m},setFromPoints:function(t){this.vertices=[];for(var e=0,i=t.length;e<i;e++){var r=t[e];this.vertices.push(new ri(r.x,r.y,r.z||0))}return this},sortFacesByMaterialIndex:function(){for(var t=this.faces,e=t.length,i=0;i<e;i++)t[i]._id=i;t.sort(function(t,e){return t.materialIndex-e.materialIndex});var r,n,o=this.faceVertexUvs[0],a=this.faceVertexUvs[1];o&&o.length===e&&(r=[]),a&&a.length===e&&(n=[]);for(i=0;i<e;i++){var s=t[i]._id;r&&r.push(o[s]),n&&n.push(a[s])}r&&(this.faceVertexUvs[0]=r),n&&(this.faceVertexUvs[1]=n)},toJSON:function(){var t={metadata:{version:4.5,type:"Geometry",generator:"Geometry.toJSON"}};if(t.uuid=this.uuid,t.type=this.type,""!==this.name&&(t.name=this.name),void 0!==this.parameters){var e=this.parameters;for(var i in e)void 0!==e[i]&&(t[i]=e[i]);return t}for(var r=[],n=0;n<this.vertices.length;n++){var o=this.vertices[n];r.push(o.x,o.y,o.z)}var a=[],s=[],c={},u=[],h={},l=[],p={};for(n=0;n<this.faces.length;n++){var d=this.faces[n],f=void 0!==this.faceVertexUvs[0][n],m=0<d.normal.length(),g=0<d.vertexNormals.length,v=1!==d.color.r||1!==d.color.g||1!==d.color.b,y=0<d.vertexColors.length,b=0;if(b=S(b=S(b=S(b=S(b=S(b=S(b=S(b=S(b,0,0),1,!0),2,!1),3,f),4,m),5,g),6,v),7,y),a.push(b),a.push(d.a,d.b,d.c),a.push(d.materialIndex),f){var x=this.faceVertexUvs[0][n];a.push(E(x[0]),E(x[1]),E(x[2]))}if(m&&a.push(A(d.normal)),g){var _=d.vertexNormals;a.push(A(_[0]),A(_[1]),A(_[2]))}if(v&&a.push(M(d.color)),y){var w=d.vertexColors;a.push(M(w[0]),M(w[1]),M(w[2]))}}function S(t,e,i){return i?t|1<<e:t&~(1<<e)}function A(t){var e=t.x.toString()+t.y.toString()+t.z.toString();return void 0!==c[e]||(c[e]=s.length/3,s.push(t.x,t.y,t.z)),c[e]}function M(t){var e=t.r.toString()+t.g.toString()+t.b.toString();return void 0!==h[e]||(h[e]=u.length,u.push(t.getHex())),h[e]}function E(t){var e=t.x.toString()+t.y.toString();return void 0!==p[e]||(p[e]=l.length/2,l.push(t.x,t.y)),p[e]}return t.data={},t.data.vertices=r,t.data.normals=s,0<u.length&&(t.data.colors=u),0<l.length&&(t.data.uvs=[l]),t.data.faces=a,t},clone:function(){return(new _r).copy(this)},copy:function(t){var e,i,r,n,o,a,s=this;this.vertices=[],this.colors=[],this.faces=[],this.faceVertexUvs=[[]],this.morphTargets=[],this.morphNormals=[],this.skinWeights=[],this.skinIndices=[],this.lineDistances=[],this.boundingBox=null,this.boundingSphere=null,this.name=t.name;var c=t.vertices;for(e=0,i=c.length;e<i;e++)s.vertices.push(c[e].clone());var u=t.colors;for(e=0,i=u.length;e<i;e++)s.colors.push(u[e].clone());var h=t.faces;for(e=0,i=h.length;e<i;e++)s.faces.push(h[e].clone());for(e=0,i=t.faceVertexUvs.length;e<i;e++){var l=t.faceVertexUvs[e];for(void 0===s.faceVertexUvs[e]&&(s.faceVertexUvs[e]=[]),r=0,n=l.length;r<n;r++){var p=l[r],d=[];for(o=0,a=p.length;o<a;o++){var f=p[o];d.push(f.clone())}s.faceVertexUvs[e].push(d)}}var m=t.morphTargets;for(e=0,i=m.length;e<i;e++){var g={};if(g.name=m[e].name,void 0!==m[e].vertices)for(g.vertices=[],r=0,n=m[e].vertices.length;r<n;r++)g.vertices.push(m[e].vertices[r].clone());if(void 0!==m[e].normals)for(g.normals=[],r=0,n=m[e].normals.length;r<n;r++)g.normals.push(m[e].normals[r].clone());s.morphTargets.push(g)}var v=t.morphNormals;for(e=0,i=v.length;e<i;e++){var y={};if(void 0!==v[e].vertexNormals)for(y.vertexNormals=[],r=0,n=v[e].vertexNormals.length;r<n;r++){var b=v[e].vertexNormals[r],x={};x.a=b.a.clone(),x.b=b.b.clone(),x.c=b.c.clone(),y.vertexNormals.push(x)}if(void 0!==v[e].faceNormals)for(y.faceNormals=[],r=0,n=v[e].faceNormals.length;r<n;r++)y.faceNormals.push(v[e].faceNormals[r].clone());s.morphNormals.push(y)}var _=t.skinWeights;for(e=0,i=_.length;e<i;e++)s.skinWeights.push(_[e].clone());var w=t.skinIndices;for(e=0,i=w.length;e<i;e++)s.skinIndices.push(w[e].clone());var S=t.lineDistances;for(e=0,i=S.length;e<i;e++)s.lineDistances.push(S[e]);var A=t.boundingBox;null!==A&&(this.boundingBox=A.clone());var M=t.boundingSphere;return null!==M&&(this.boundingSphere=M.clone()),this.elementsNeedUpdate=t.elementsNeedUpdate,this.verticesNeedUpdate=t.verticesNeedUpdate,this.uvsNeedUpdate=t.uvsNeedUpdate,this.normalsNeedUpdate=t.normalsNeedUpdate,this.colorsNeedUpdate=t.colorsNeedUpdate,this.lineDistancesNeedUpdate=t.lineDistancesNeedUpdate,this.groupsNeedUpdate=t.groupsNeedUpdate,this},dispose:function(){this.dispatchEvent({type:"dispose"})}}),Object.defineProperty(wr.prototype,"needsUpdate",{set:function(t){!0===t&&this.version++}}),Object.assign(wr.prototype,{isBufferAttribute:!0,onUploadCallback:function(){},setArray:function(t){if(Array.isArray(t))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");return this.count=void 0!==t?t.length/this.itemSize:0,this.array=t,this},setDynamic:function(t){return this.dynamic=t,this},copy:function(t){return this.name=t.name,this.array=new t.array.constructor(t.array),this.itemSize=t.itemSize,this.count=t.count,this.normalized=t.normalized,this.dynamic=t.dynamic,this},copyAt:function(t,e,i){t*=this.itemSize,i*=e.itemSize;for(var r=0,n=this.itemSize;r<n;r++)this.array[t+r]=e.array[i+r];return this},copyArray:function(t){return this.array.set(t),this},copyColorsArray:function(t){for(var e=this.array,i=0,r=0,n=t.length;r<n;r++){var o=t[r];void 0===o&&(console.warn("THREE.BufferAttribute.copyColorsArray(): color is undefined",r),o=new ki),e[i++]=o.r,e[i++]=o.g,e[i++]=o.b}return this},copyVector2sArray:function(t){for(var e=this.array,i=0,r=0,n=t.length;r<n;r++){var o=t[r];void 0===o&&(console.warn("THREE.BufferAttribute.copyVector2sArray(): vector is undefined",r),o=new ti),e[i++]=o.x,e[i++]=o.y}return this},copyVector3sArray:function(t){for(var e=this.array,i=0,r=0,n=t.length;r<n;r++){var o=t[r];void 0===o&&(console.warn("THREE.BufferAttribute.copyVector3sArray(): vector is undefined",r),o=new ri),e[i++]=o.x,e[i++]=o.y,e[i++]=o.z}return this},copyVector4sArray:function(t){for(var e=this.array,i=0,r=0,n=t.length;r<n;r++){var o=t[r];void 0===o&&(console.warn("THREE.BufferAttribute.copyVector4sArray(): vector is undefined",r),o=new Si),e[i++]=o.x,e[i++]=o.y,e[i++]=o.z,e[i++]=o.w}return this},set:function(t,e){return void 0===e&&(e=0),this.array.set(t,e),this},getX:function(t){return this.array[t*this.itemSize]},setX:function(t,e){return this.array[t*this.itemSize]=e,this},getY:function(t){return this.array[t*this.itemSize+1]},setY:function(t,e){return this.array[t*this.itemSize+1]=e,this},getZ:function(t){return this.array[t*this.itemSize+2]},setZ:function(t,e){return this.array[t*this.itemSize+2]=e,this},getW:function(t){return this.array[t*this.itemSize+3]},setW:function(t,e){return this.array[t*this.itemSize+3]=e,this},setXY:function(t,e,i){return t*=this.itemSize,this.array[t+0]=e,this.array[t+1]=i,this},setXYZ:function(t,e,i,r){return t*=this.itemSize,this.array[t+0]=e,this.array[t+1]=i,this.array[t+2]=r,this},setXYZW:function(t,e,i,r,n){return t*=this.itemSize,this.array[t+0]=e,this.array[t+1]=i,this.array[t+2]=r,this.array[t+3]=n,this},onUpload:function(t){return this.onUploadCallback=t,this},clone:function(){return new this.constructor(this.array,this.itemSize).copy(this)}}),(Sr.prototype=Object.create(wr.prototype)).constructor=Sr,(Ar.prototype=Object.create(wr.prototype)).constructor=Ar,(Mr.prototype=Object.create(wr.prototype)).constructor=Mr,(Er.prototype=Object.create(wr.prototype)).constructor=Er,(Pr.prototype=Object.create(wr.prototype)).constructor=Pr,(Tr.prototype=Object.create(wr.prototype)).constructor=Tr,(Cr.prototype=Object.create(wr.prototype)).constructor=Cr,(Ir.prototype=Object.create(wr.prototype)).constructor=Ir,(Or.prototype=Object.create(wr.prototype)).constructor=Or,Object.assign(Lr.prototype,{computeGroups:function(t){for(var e,i=[],r=void 0,n=t.faces,o=0;o<n.length;o++){var a=n[o];a.materialIndex!==r&&(r=a.materialIndex,void 0!==e&&(e.count=3*o-e.start,i.push(e)),e={start:3*o,materialIndex:r})}void 0!==e&&(e.count=3*o-e.start,i.push(e)),this.groups=i},fromGeometry:function(t){var e,i=this,r=t.faces,n=t.vertices,o=t.faceVertexUvs,a=o[0]&&0<o[0].length,s=o[1]&&0<o[1].length,c=t.morphTargets,u=c.length;if(0<u){e=[];for(var h=0;h<u;h++)e[h]=[];this.morphTargets.position=e}var l,p=t.morphNormals,d=p.length;if(0<d){l=[];for(h=0;h<d;h++)l[h]=[];this.morphTargets.normal=l}var f=t.skinIndices,m=t.skinWeights,g=f.length===n.length,v=m.length===n.length;0<n.length&&0===r.length&&console.error("THREE.DirectGeometry: Faceless geometries are not supported.");for(h=0;h<r.length;h++){var y=r[h];i.vertices.push(n[y.a],n[y.b],n[y.c]);var b=y.vertexNormals;if(3===b.length)i.normals.push(b[0],b[1],b[2]);else{var x=y.normal;i.normals.push(x,x,x)}var _,w=y.vertexColors;if(3===w.length)i.colors.push(w[0],w[1],w[2]);else{var S=y.color;i.colors.push(S,S,S)}if(!0===a)void 0!==(_=o[0][h])?i.uvs.push(_[0],_[1],_[2]):(console.warn("THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ",h),i.uvs.push(new ti,new ti,new ti));if(!0===s)void 0!==(_=o[1][h])?i.uvs2.push(_[0],_[1],_[2]):(console.warn("THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ",h),i.uvs2.push(new ti,new ti,new ti));for(var A=0;A<u;A++){var M=c[A].vertices;e[A].push(M[y.a],M[y.b],M[y.c])}for(A=0;A<d;A++){var E=p[A].vertexNormals[h];l[A].push(E.a,E.b,E.c)}g&&i.skinIndices.push(f[y.a],f[y.b],f[y.c]),v&&i.skinWeights.push(m[y.a],m[y.b],m[y.c])}return this.computeGroups(t),this.verticesNeedUpdate=t.verticesNeedUpdate,this.normalsNeedUpdate=t.normalsNeedUpdate,this.colorsNeedUpdate=t.colorsNeedUpdate,this.uvsNeedUpdate=t.uvsNeedUpdate,this.groupsNeedUpdate=t.groupsNeedUpdate,this}});var Dr,kr,Br,Nr,Fr,zr,Ur,jr,Gr,Vr,Hr=1;function $r(){Object.defineProperty(this,"id",{value:Hr+=2}),this.uuid=Qe.generateUUID(),this.name="",this.type="BufferGeometry",this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingBox=null,this.boundingSphere=null,this.drawRange={start:0,count:1/0},this.userData={}}function Wr(t,e,i,r,n,o){_r.call(this),this.type="BoxGeometry",this.parameters={width:t,height:e,depth:i,widthSegments:r,heightSegments:n,depthSegments:o},this.fromBufferGeometry(new Xr(t,e,i,r,n,o)),this.mergeVertices()}function Xr(t,e,i,r,n,o){$r.call(this),this.type="BoxBufferGeometry",this.parameters={width:t,height:e,depth:i,widthSegments:r,heightSegments:n,depthSegments:o};var C=this;t=t||1,e=e||1,i=i||1,r=Math.floor(r)||1,n=Math.floor(n)||1,o=Math.floor(o)||1;var I=[],O=[],L=[],R=[],D=0,k=0;function a(t,e,i,r,n,o,a,s,c,u,h){var l,p,d=o/c,f=a/u,m=o/2,g=a/2,v=s/2,y=c+1,b=u+1,x=0,_=0,w=new ri;for(p=0;p<b;p++){var S=p*f-g;for(l=0;l<y;l++){var A=l*d-m;w[t]=A*r,w[e]=S*n,w[i]=v,O.push(w.x,w.y,w.z),w[t]=0,w[e]=0,w[i]=0<s?1:-1,L.push(w.x,w.y,w.z),R.push(l/c),R.push(1-p/u),x+=1}}for(p=0;p<u;p++)for(l=0;l<c;l++){var M=D+l+y*p,E=D+l+y*(p+1),P=D+(l+1)+y*(p+1),T=D+(l+1)+y*p;I.push(M,E,T),I.push(E,P,T),_+=6}C.addGroup(k,_,h),k+=_,D+=x}a("z","y","x",-1,-1,i,e,t,o,n,0),a("z","y","x",1,-1,i,e,-t,o,n,1),a("x","z","y",1,1,t,i,e,r,o,2),a("x","z","y",1,-1,t,i,-e,r,o,3),a("x","y","z",1,-1,t,e,i,r,n,4),a("x","y","z",-1,-1,t,e,-i,r,n,5),this.setIndex(I),this.addAttribute("position",new Ir(O,3)),this.addAttribute("normal",new Ir(L,3)),this.addAttribute("uv",new Ir(R,2))}function qr(t,e,i,r){_r.call(this),this.type="PlaneGeometry",this.parameters={width:t,height:e,widthSegments:i,heightSegments:r},this.fromBufferGeometry(new Yr(t,e,i,r)),this.mergeVertices()}function Yr(t,e,i,r){$r.call(this),this.type="PlaneBufferGeometry",this.parameters={width:t,height:e,widthSegments:i,heightSegments:r};var n,o,a=(t=t||1)/2,s=(e=e||1)/2,c=Math.floor(i)||1,u=Math.floor(r)||1,h=c+1,l=u+1,p=t/c,d=e/u,f=[],m=[],g=[],v=[];for(o=0;o<l;o++){var y=o*d-s;for(n=0;n<h;n++){var b=n*p-a;m.push(b,-y,0),g.push(0,0,1),v.push(n/c),v.push(1-o/u)}}for(o=0;o<u;o++)for(n=0;n<c;n++){var x=n+h*o,_=n+h*(o+1),w=n+1+h*(o+1),S=n+1+h*o;f.push(x,_,S),f.push(_,w,S)}this.setIndex(f),this.addAttribute("position",new Ir(m,3)),this.addAttribute("normal",new Ir(g,3)),this.addAttribute("uv",new Ir(v,2))}$r.prototype=Object.assign(Object.create(v.prototype),{constructor:$r,isBufferGeometry:!0,getIndex:function(){return this.index},setIndex:function(t){Array.isArray(t)?this.index=new(65535<Rr(t)?Cr:Pr)(t,1):this.index=t},addAttribute:function(t,e){return e&&e.isBufferAttribute||e&&e.isInterleavedBufferAttribute?("index"===t?(console.warn("THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute."),this.setIndex(e)):this.attributes[t]=e,this):(console.warn("THREE.BufferGeometry: .addAttribute() now expects ( name, attribute )."),this.addAttribute(t,new wr(e,arguments[2])))},getAttribute:function(t){return this.attributes[t]},removeAttribute:function(t){return delete this.attributes[t],this},addGroup:function(t,e,i){this.groups.push({start:t,count:e,materialIndex:void 0!==i?i:0})},clearGroups:function(){this.groups=[]},setDrawRange:function(t,e){this.drawRange.start=t,this.drawRange.count=e},applyMatrix:function(t){var e=this.attributes.position;void 0!==e&&(t.applyToBufferAttribute(e),e.needsUpdate=!0);var i=this.attributes.normal;void 0!==i&&((new ni).getNormalMatrix(t).applyToBufferAttribute(i),i.needsUpdate=!0);return null!==this.boundingBox&&this.computeBoundingBox(),null!==this.boundingSphere&&this.computeBoundingSphere(),this},rotateX:(Vr=new ei,function(t){return Vr.makeRotationX(t),this.applyMatrix(Vr),this}),rotateY:(Gr=new ei,function(t){return Gr.makeRotationY(t),this.applyMatrix(Gr),this}),rotateZ:(jr=new ei,function(t){return jr.makeRotationZ(t),this.applyMatrix(jr),this}),translate:(Ur=new ei,function(t,e,i){return Ur.makeTranslation(t,e,i),this.applyMatrix(Ur),this}),scale:(zr=new ei,function(t,e,i){return zr.makeScale(t,e,i),this.applyMatrix(zr),this}),lookAt:(Fr=new ur,function(t){Fr.lookAt(t),Fr.updateMatrix(),this.applyMatrix(Fr.matrix)}),center:(Nr=new ri,function(){return this.computeBoundingBox(),this.boundingBox.getCenter(Nr).negate(),this.translate(Nr.x,Nr.y,Nr.z),this}),setFromObject:function(t){var e=t.geometry;if(t.isPoints||t.isLine){var i=new Ir(3*e.vertices.length,3),r=new Ir(3*e.colors.length,3);if(this.addAttribute("position",i.copyVector3sArray(e.vertices)),this.addAttribute("color",r.copyColorsArray(e.colors)),e.lineDistances&&e.lineDistances.length===e.vertices.length){var n=new Ir(e.lineDistances.length,1);this.addAttribute("lineDistance",n.copyArray(e.lineDistances))}null!==e.boundingSphere&&(this.boundingSphere=e.boundingSphere.clone()),null!==e.boundingBox&&(this.boundingBox=e.boundingBox.clone())}else t.isMesh&&e&&e.isGeometry&&this.fromGeometry(e);return this},setFromPoints:function(t){for(var e=[],i=0,r=t.length;i<r;i++){var n=t[i];e.push(n.x,n.y,n.z||0)}return this.addAttribute("position",new Ir(e,3)),this},updateFromObject:function(t){var e,i=t.geometry;if(t.isMesh){var r=i.__directGeometry;if(!0===i.elementsNeedUpdate&&(r=void 0,i.elementsNeedUpdate=!1),void 0===r)return this.fromGeometry(i);r.verticesNeedUpdate=i.verticesNeedUpdate,r.normalsNeedUpdate=i.normalsNeedUpdate,r.colorsNeedUpdate=i.colorsNeedUpdate,r.uvsNeedUpdate=i.uvsNeedUpdate,r.groupsNeedUpdate=i.groupsNeedUpdate,i.verticesNeedUpdate=!1,i.normalsNeedUpdate=!1,i.colorsNeedUpdate=!1,i.uvsNeedUpdate=!1,i.groupsNeedUpdate=!1,i=r}return!0===i.verticesNeedUpdate&&(void 0!==(e=this.attributes.position)&&(e.copyVector3sArray(i.vertices),e.needsUpdate=!0),i.verticesNeedUpdate=!1),!0===i.normalsNeedUpdate&&(void 0!==(e=this.attributes.normal)&&(e.copyVector3sArray(i.normals),e.needsUpdate=!0),i.normalsNeedUpdate=!1),!0===i.colorsNeedUpdate&&(void 0!==(e=this.attributes.color)&&(e.copyColorsArray(i.colors),e.needsUpdate=!0),i.colorsNeedUpdate=!1),i.uvsNeedUpdate&&(void 0!==(e=this.attributes.uv)&&(e.copyVector2sArray(i.uvs),e.needsUpdate=!0),i.uvsNeedUpdate=!1),i.lineDistancesNeedUpdate&&(void 0!==(e=this.attributes.lineDistance)&&(e.copyArray(i.lineDistances),e.needsUpdate=!0),i.lineDistancesNeedUpdate=!1),i.groupsNeedUpdate&&(i.computeGroups(t.geometry),this.groups=i.groups,i.groupsNeedUpdate=!1),this},fromGeometry:function(t){return t.__directGeometry=(new Lr).fromGeometry(t),this.fromDirectGeometry(t.__directGeometry)},fromDirectGeometry:function(t){var e=new Float32Array(3*t.vertices.length);if(this.addAttribute("position",new wr(e,3).copyVector3sArray(t.vertices)),0<t.normals.length){var i=new Float32Array(3*t.normals.length);this.addAttribute("normal",new wr(i,3).copyVector3sArray(t.normals))}if(0<t.colors.length){var r=new Float32Array(3*t.colors.length);this.addAttribute("color",new wr(r,3).copyColorsArray(t.colors))}if(0<t.uvs.length){var n=new Float32Array(2*t.uvs.length);this.addAttribute("uv",new wr(n,2).copyVector2sArray(t.uvs))}if(0<t.uvs2.length){var o=new Float32Array(2*t.uvs2.length);this.addAttribute("uv2",new wr(o,2).copyVector2sArray(t.uvs2))}for(var a in this.groups=t.groups,t.morphTargets){for(var s=[],c=t.morphTargets[a],u=0,h=c.length;u<h;u++){var l=c[u],p=new Ir(3*l.length,3);s.push(p.copyVector3sArray(l))}this.morphAttributes[a]=s}if(0<t.skinIndices.length){var d=new Ir(4*t.skinIndices.length,4);this.addAttribute("skinIndex",d.copyVector4sArray(t.skinIndices))}if(0<t.skinWeights.length){var f=new Ir(4*t.skinWeights.length,4);this.addAttribute("skinWeight",f.copyVector4sArray(t.skinWeights))}return null!==t.boundingSphere&&(this.boundingSphere=t.boundingSphere.clone()),null!==t.boundingBox&&(this.boundingBox=t.boundingBox.clone()),this},computeBoundingBox:function(){null===this.boundingBox&&(this.boundingBox=new Pi);var t=this.attributes.position;void 0!==t?this.boundingBox.setFromBufferAttribute(t):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:(kr=new Pi,Br=new ri,function(){null===this.boundingSphere&&(this.boundingSphere=new Ti);var t=this.attributes.position;if(t){var e=this.boundingSphere.center;kr.setFromBufferAttribute(t),kr.getCenter(e);for(var i=0,r=0,n=t.count;r<n;r++)Br.x=t.getX(r),Br.y=t.getY(r),Br.z=t.getZ(r),i=Math.max(i,e.distanceToSquared(Br));this.boundingSphere.radius=Math.sqrt(i),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 t=this.index,e=this.attributes,i=this.groups;if(e.position){var r=e.position.array;if(void 0===e.normal)this.addAttribute("normal",new wr(new Float32Array(r.length),3));else for(var n=e.normal.array,o=0,a=n.length;o<a;o++)n[o]=0;var s,c,u,h=e.normal.array,l=new ri,p=new ri,d=new ri,f=new ri,m=new ri;if(t){var g=t.array;0===i.length&&this.addGroup(0,g.length);for(var v=0,y=i.length;v<y;++v){var b=i[v],x=b.start;for(o=x,a=x+b.count;o<a;o+=3)s=3*g[o+0],c=3*g[o+1],u=3*g[o+2],l.fromArray(r,s),p.fromArray(r,c),d.fromArray(r,u),f.subVectors(d,p),m.subVectors(l,p),f.cross(m),h[s]+=f.x,h[s+1]+=f.y,h[s+2]+=f.z,h[c]+=f.x,h[c+1]+=f.y,h[c+2]+=f.z,h[u]+=f.x,h[u+1]+=f.y,h[u+2]+=f.z}}else for(o=0,a=r.length;o<a;o+=9)l.fromArray(r,o),p.fromArray(r,o+3),d.fromArray(r,o+6),f.subVectors(d,p),m.subVectors(l,p),f.cross(m),h[o]=f.x,h[o+1]=f.y,h[o+2]=f.z,h[o+3]=f.x,h[o+4]=f.y,h[o+5]=f.z,h[o+6]=f.x,h[o+7]=f.y,h[o+8]=f.z;this.normalizeNormals(),e.normal.needsUpdate=!0}},merge:function(t,e){if(t&&t.isBufferGeometry){void 0===e&&(e=0,console.warn("THREE.BufferGeometry.merge(): Overwriting original geometry, starting at offset=0. Use BufferGeometryUtils.mergeBufferGeometries() for lossless merge."));var i=this.attributes;for(var r in i)if(void 0!==t.attributes[r])for(var n=i[r].array,o=t.attributes[r],a=o.array,s=0,c=o.itemSize*e;s<a.length;s++,c++)n[c]=a[s];return this}console.error("THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.",t)},normalizeNormals:(Dr=new ri,function(){for(var t=this.attributes.normal,e=0,i=t.count;e<i;e++)Dr.x=t.getX(e),Dr.y=t.getY(e),Dr.z=t.getZ(e),Dr.normalize(),t.setXYZ(e,Dr.x,Dr.y,Dr.z)}),toNonIndexed:function(){if(null===this.index)return console.warn("THREE.BufferGeometry.toNonIndexed(): Geometry is already non-indexed."),this;var t=new $r,e=this.index.array,i=this.attributes;for(var r in i){for(var n=i[r],o=n.array,a=n.itemSize,s=new o.constructor(e.length*a),c=0,u=0,h=0,l=e.length;h<l;h++){c=e[h]*a;for(var p=0;p<a;p++)s[u++]=o[c++]}t.addAttribute(r,new wr(s,a))}var d=this.groups;for(h=0,l=d.length;h<l;h++){var f=d[h];t.addGroup(f.start,f.count,f.materialIndex)}return t},toJSON:function(){var t={metadata:{version:4.5,type:"BufferGeometry",generator:"BufferGeometry.toJSON"}};if(t.uuid=this.uuid,t.type=this.type,""!==this.name&&(t.name=this.name),0<Object.keys(this.userData).length&&(t.userData=this.userData),void 0!==this.parameters){var e=this.parameters;for(var i in e)void 0!==e[i]&&(t[i]=e[i]);return t}t.data={attributes:{}};var r=this.index;if(null!==r){var n=Array.prototype.slice.call(r.array);t.data.index={type:r.array.constructor.name,array:n}}var o=this.attributes;for(var i in o){var a=o[i];n=Array.prototype.slice.call(a.array);t.data.attributes[i]={itemSize:a.itemSize,type:a.array.constructor.name,array:n,normalized:a.normalized}}var s=this.groups;0<s.length&&(t.data.groups=JSON.parse(JSON.stringify(s)));var c=this.boundingSphere;return null!==c&&(t.data.boundingSphere={center:c.center.toArray(),radius:c.radius}),t},clone:function(){return(new $r).copy(this)},copy:function(t){var e,i,r;this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingBox=null,this.boundingSphere=null,this.name=t.name;var n=t.index;null!==n&&this.setIndex(n.clone());var o=t.attributes;for(e in o){var a=o[e];this.addAttribute(e,a.clone())}var s=t.morphAttributes;for(e in s){var c=[],u=s[e];for(i=0,r=u.length;i<r;i++)c.push(u[i].clone());this.morphAttributes[e]=c}var h=t.groups;for(i=0,r=h.length;i<r;i++){var l=h[i];this.addGroup(l.start,l.count,l.materialIndex)}var p=t.boundingBox;null!==p&&(this.boundingBox=p.clone());var d=t.boundingSphere;return null!==d&&(this.boundingSphere=d.clone()),this.drawRange.start=t.drawRange.start,this.drawRange.count=t.drawRange.count,this.userData=t.userData,this},dispose:function(){this.dispatchEvent({type:"dispose"})}}),(Wr.prototype=Object.create(_r.prototype)).constructor=Wr,(Xr.prototype=Object.create($r.prototype)).constructor=Xr,(qr.prototype=Object.create(_r.prototype)).constructor=qr,(Yr.prototype=Object.create($r.prototype)).constructor=Yr;var Zr,Kr,Jr,Qr,tn,en,rn,nn,on,an,sn,cn,un,hn,ln,pn,dn,fn,mn,gn,vn,yn,bn,xn,_n=0;function wn(){Object.defineProperty(this,"id",{value:_n++}),this.uuid=Qe.generateUUID(),this.name="",this.type="Material",this.fog=!0,this.lights=!0,this.blending=Y,this.side=G,this.flatShading=!1,this.vertexColors=V,this.opacity=1,this.transparent=!1,this.blendSrc=ut,this.blendDst=ht,this.blendEquation=H,this.blendSrcAlpha=null,this.blendDstAlpha=null,this.blendEquationAlpha=null,this.depthFunc=bt,this.depthTest=!0,this.depthWrite=!0,this.clippingPlanes=null,this.clipIntersection=!1,this.clipShadows=!1,this.shadowSide=null,this.colorWrite=!0,this.precision=null,this.polygonOffset=!1,this.polygonOffsetFactor=0,this.polygonOffsetUnits=0,this.dithering=!1,this.alphaTest=0,this.premultipliedAlpha=!1,this.overdraw=0,this.visible=!0,this.userData={},this.needsUpdate=!0}function Sn(t){wn.call(this),this.type="MeshBasicMaterial",this.color=new ki(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=Mt,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.skinning=!1,this.morphTargets=!1,this.lights=!1,this.setValues(t)}function An(t){wn.call(this),this.type="ShaderMaterial",this.defines={},this.uniforms={},this.vertexShader="void main() {\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}",this.fragmentShader="void main() {\n\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n}",this.linewidth=1,this.wireframe=!1,this.wireframeLinewidth=1,this.fog=!1,this.lights=!1,this.clipping=!1,this.skinning=!1,this.morphTargets=!1,this.morphNormals=!1,this.extensions={derivatives:!1,fragDepth:!1,drawBuffers:!1,shaderTextureLOD:!1},this.defaultAttributeValues={color:[1,1,1],uv:[0,0],uv2:[0,0]},this.index0AttributeName=void 0,this.uniformsNeedUpdate=!1,void 0!==t&&(void 0!==t.attributes&&console.error("THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead."),this.setValues(t))}function Mn(t,e){this.origin=void 0!==t?t:new ri,this.direction=void 0!==e?e:new ri}function En(t,e,i){this.a=void 0!==t?t:new ri,this.b=void 0!==e?e:new ri,this.c=void 0!==i?i:new ri}function Pn(t,e){ur.call(this),this.type="Mesh",this.geometry=void 0!==t?t:new $r,this.material=void 0!==e?e:new Sn({color:16777215*Math.random()}),this.drawMode=je,this.updateMorphTargets()}function Tn(o,i,a,r){var s,c,u,h=new ki(0),l=0;function p(t,e){i.buffers.color.setClear(t.r,t.g,t.b,e,r)}return{getClearColor:function(){return h},setClearColor:function(t,e){h.set(t),p(h,l=void 0!==e?e:1)},getClearAlpha:function(){return l},setClearAlpha:function(t){p(h,l=t)},render:function(t,e,i,r){var n=e.background;null===n?p(h,l):n&&n.isColor&&(p(n,1),r=!0),(o.autoClear||r)&&o.clear(o.autoClearColor,o.autoClearDepth,o.autoClearStencil),n&&n.isCubeTexture?(void 0===u&&((u=new Pn(new Xr(1,1,1),new An({uniforms:zi.cube.uniforms,vertexShader:zi.cube.vertexShader,fragmentShader:zi.cube.fragmentShader,side:wt,depthTest:!0,depthWrite:!1,fog:!1}))).geometry.removeAttribute("normal"),u.geometry.removeAttribute("uv"),u.onBeforeRender=function(t,e,i){this.matrixWorld.copyPosition(i.matrixWorld)},a.update(u)),u.material.uniforms.tCube.value=n,t.push(u,u.geometry,u.material,0,null)):n&&n.isTexture&&(void 0===s&&(s=new lr(-1,1,1,-1,0,1),c=new Pn(new Yr(2,2),new Sn({depthTest:!1,depthWrite:!1,fog:!1})),a.update(c)),c.material.map=n,o.renderBufferDirect(s,null,c.geometry,c.material,c,null))}}}function Cn(n,o,a,s){var c;this.setMode=function(t){c=t},this.render=function(t,e){n.drawArrays(c,t,e),a.update(e,c)},this.renderInstances=function(t,e,i){var r;if(s.isWebGL2)r=n;else if(null===(r=o.get("ANGLE_instanced_arrays")))return void console.error("THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");r[s.isWebGL2?"drawArraysInstanced":"drawArraysInstancedANGLE"](c,e,i,t.maxInstancedCount),a.update(i,c,t.maxInstancedCount)}}function In(e,i,t){var r;function n(t){if("highp"===t){if(0<e.getShaderPrecisionFormat(e.VERTEX_SHADER,e.HIGH_FLOAT).precision&&0<e.getShaderPrecisionFormat(e.FRAGMENT_SHADER,e.HIGH_FLOAT).precision)return"highp";t="mediump"}return"mediump"===t&&0<e.getShaderPrecisionFormat(e.VERTEX_SHADER,e.MEDIUM_FLOAT).precision&&0<e.getShaderPrecisionFormat(e.FRAGMENT_SHADER,e.MEDIUM_FLOAT).precision?"mediump":"lowp"}var o="undefined"!=typeof WebGL2RenderingContext&&e instanceof WebGL2RenderingContext,a=void 0!==t.precision?t.precision:"highp",s=n(a);s!==a&&(console.warn("THREE.WebGLRenderer:",a,"not supported, using",s,"instead."),a=s);var c=!0===t.logarithmicDepthBuffer,u=e.getParameter(e.MAX_TEXTURE_IMAGE_UNITS),h=e.getParameter(e.MAX_VERTEX_TEXTURE_IMAGE_UNITS),l=e.getParameter(e.MAX_TEXTURE_SIZE),p=e.getParameter(e.MAX_CUBE_MAP_TEXTURE_SIZE),d=e.getParameter(e.MAX_VERTEX_ATTRIBS),f=e.getParameter(e.MAX_VERTEX_UNIFORM_VECTORS),m=e.getParameter(e.MAX_VARYING_VECTORS),g=e.getParameter(e.MAX_FRAGMENT_UNIFORM_VECTORS),v=0<h,y=o||!!i.get("OES_texture_float");return{isWebGL2:o,getMaxAnisotropy:function(){if(void 0!==r)return r;var t=i.get("EXT_texture_filter_anisotropic");return r=null!==t?e.getParameter(t.MAX_TEXTURE_MAX_ANISOTROPY_EXT):0},getMaxPrecision:n,precision:a,logarithmicDepthBuffer:c,maxTextures:u,maxVertexTextures:h,maxTextureSize:l,maxCubemapSize:p,maxAttributes:d,maxVertexUniforms:f,maxVaryings:m,maxFragmentUniforms:g,vertexTextures:v,floatFragmentTextures:y,floatVertexTextures:v&&y}}function On(){var h=this,l=null,p=0,d=!1,f=!1,m=new Ci,g=new ni,v={value:null,needsUpdate:!1};function y(){v.value!==l&&(v.value=l,v.needsUpdate=0<p),h.numPlanes=p,h.numIntersection=0}function b(t,e,i,r){var n=null!==t?t.length:0,o=null;if(0!==n){if(o=v.value,!0!==r||null===o){var a=i+4*n,s=e.matrixWorldInverse;g.getNormalMatrix(s),(null===o||o.length<a)&&(o=new Float32Array(a));for(var c=0,u=i;c!==n;++c,u+=4)m.copy(t[c]).applyMatrix4(s,g),m.normal.toArray(o,u),o[u+3]=m.constant}v.value=o,v.needsUpdate=!0}return h.numPlanes=n,o}this.uniform=v,this.numPlanes=0,this.numIntersection=0,this.init=function(t,e,i){var r=0!==t.length||e||0!==p||d;return d=e,l=b(t,i,0),p=t.length,r},this.beginShadows=function(){f=!0,b(null)},this.endShadows=function(){f=!1,y()},this.setState=function(t,e,i,r,n,o){if(!d||null===t||0===t.length||f&&!i)f?b(null):y();else{var a=f?0:p,s=4*a,c=n.clippingState||null;v.value=c,c=b(t,r,s,o);for(var u=0;u!==s;++u)c[u]=l[u];n.clippingState=c,this.numIntersection=e?this.numPlanes:0,this.numPlanes+=a}}}function Ln(i){var r={};return{get:function(t){if(void 0!==r[t])return r[t];var e;switch(t){case"WEBGL_depth_texture":e=i.getExtension("WEBGL_depth_texture")||i.getExtension("MOZ_WEBGL_depth_texture")||i.getExtension("WEBKIT_WEBGL_depth_texture");break;case"EXT_texture_filter_anisotropic":e=i.getExtension("EXT_texture_filter_anisotropic")||i.getExtension("MOZ_EXT_texture_filter_anisotropic")||i.getExtension("WEBKIT_EXT_texture_filter_anisotropic");break;case"WEBGL_compressed_texture_s3tc":e=i.getExtension("WEBGL_compressed_texture_s3tc")||i.getExtension("MOZ_WEBGL_compressed_texture_s3tc")||i.getExtension("WEBKIT_WEBGL_compressed_texture_s3tc");break;case"WEBGL_compressed_texture_pvrtc":e=i.getExtension("WEBGL_compressed_texture_pvrtc")||i.getExtension("WEBKIT_WEBGL_compressed_texture_pvrtc");break;default:e=i.getExtension(t)}return null===e&&console.warn("THREE.WebGLRenderer: "+t+" extension not supported."),r[t]=e}}}function Rn(l,p,o){var a={},d={};function s(t){var e=t.target,i=a[e.id];for(var r in null!==i.index&&p.remove(i.index),i.attributes)p.remove(i.attributes[r]);e.removeEventListener("dispose",s),delete a[e.id];var n=d[i.id];n&&(p.remove(n),delete d[i.id]),o.memory.geometries--}return{get:function(t,e){var i=a[e.id];return i||(e.addEventListener("dispose",s),e.isBufferGeometry?i=e:e.isGeometry&&(void 0===e._bufferGeometry&&(e._bufferGeometry=(new $r).setFromObject(t)),i=e._bufferGeometry),a[e.id]=i,o.memory.geometries++,i)},update:function(t){var e=t.index,i=t.attributes;for(var r in null!==e&&p.update(e,l.ELEMENT_ARRAY_BUFFER),i)p.update(i[r],l.ARRAY_BUFFER);var n=t.morphAttributes;for(var r in n)for(var o=n[r],a=0,s=o.length;a<s;a++)p.update(o[a],l.ARRAY_BUFFER)},getWireframeAttribute:function(t){var e=d[t.id];if(e)return e;var i,r=[],n=t.index,o=t.attributes;if(null!==n)for(var a=0,s=(i=n.array).length;a<s;a+=3){var c=i[a+0],u=i[a+1],h=i[a+2];r.push(c,u,u,h,h,c)}else for(a=0,s=(i=o.position.array).length/3-1;a<s;a+=3)c=a+0,u=a+1,h=a+2,r.push(c,u,u,h,h,c);return e=new(65535<Rr(r)?Cr:Pr)(r,1),p.update(e,l.ELEMENT_ARRAY_BUFFER),d[t.id]=e}}}function Dn(n,o,a,s){var c,u,h;this.setMode=function(t){c=t},this.setIndex=function(t){u=t.type,h=t.bytesPerElement},this.render=function(t,e){n.drawElements(c,e,u,t*h),a.update(e,c)},this.renderInstances=function(t,e,i){var r;if(s.isWebGL2)r=n;else if(null===(r=o.get("ANGLE_instanced_arrays")))return void console.error("THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");r[s.isWebGL2?"drawElementsInstanced":"drawElementsInstancedANGLE"](c,i,u,e*h,t.maxInstancedCount),a.update(i,c,t.maxInstancedCount)}}function kn(r){var n={frame:0,calls:0,triangles:0,points:0,lines:0};return{memory:{geometries:0,textures:0},render:n,programs:null,autoReset:!0,reset:function(){n.frame++,n.calls=0,n.triangles=0,n.points=0,n.lines=0},update:function(t,e,i){switch(i=i||1,n.calls++,e){case r.TRIANGLES:n.triangles+=i*(t/3);break;case r.TRIANGLE_STRIP:case r.TRIANGLE_FAN:n.triangles+=i*(t-2);break;case r.LINES:n.lines+=i*(t/2);break;case r.LINE_STRIP:n.lines+=i*(t-1);break;case r.LINE_LOOP:n.lines+=i*t;break;case r.POINTS:n.points+=i*t;break;default:console.error("THREE.WebGLInfo: Unknown draw mode:",e)}}}}function Bn(t,e){return Math.abs(e[1])-Math.abs(t[1])}function Nn(d){var f={},m=new Float32Array(8);return{update:function(t,e,i,r){var n=t.morphTargetInfluences,o=n.length,a=f[e.id];if(void 0===a){a=[];for(var s=0;s<o;s++)a[s]=[s,0];f[e.id]=a}var c=i.morphTargets&&e.morphAttributes.position,u=i.morphNormals&&e.morphAttributes.normal;for(s=0;s<o;s++)0!==(h=a[s])[1]&&(c&&e.removeAttribute("morphTarget"+s),u&&e.removeAttribute("morphNormal"+s));for(s=0;s<o;s++)(h=a[s])[0]=s,h[1]=n[s];for(a.sort(Bn),s=0;s<8;s++){var h;if(h=a[s]){var l=h[0],p=h[1];if(p){c&&e.addAttribute("morphTarget"+s,c[l]),u&&e.addAttribute("morphNormal"+s,u[l]),m[s]=p;continue}}m[s]=0}r.getUniforms().setValue(d,"morphTargetInfluences",m)}}}function Fn(n,o){var a={};return{update:function(t){var e=o.render.frame,i=t.geometry,r=n.get(t,i);return a[r.id]!==e&&(i.isGeometry&&r.updateFromObject(t),n.update(r),a[r.id]=e),r},dispose:function(){a={}}}}function zn(t,e,i,r,n,o,a,s,c,u){wi.call(this,t=void 0!==t?t:[],e=void 0!==e?e:Rt,i,r,n,o,a,s,c,u),this.flipY=!1}wn.prototype=Object.assign(Object.create(v.prototype),{constructor:wn,isMaterial:!0,onBeforeCompile:function(){},setValues:function(t){if(void 0!==t)for(var e in t){var i=t[e];if(void 0!==i)if("shading"!==e){var r=this[e];void 0!==r?r&&r.isColor?r.set(i):r&&r.isVector3&&i&&i.isVector3?r.copy(i):this[e]="overdraw"===e?Number(i):i:console.warn("THREE."+this.type+": '"+e+"' is not a property of this material.")}else console.warn("THREE."+this.type+": .shading has been removed. Use the boolean .flatShading instead."),this.flatShading=1===i;else console.warn("THREE.Material: '"+e+"' parameter is undefined.")}},toJSON:function(t){var e=void 0===t||"string"==typeof t;e&&(t={textures:{},images:{}});var i={metadata:{version:4.5,type:"Material",generator:"Material.toJSON"}};function r(t){var e=[];for(var i in t){var r=t[i];delete r.metadata,e.push(r)}return e}if(i.uuid=this.uuid,i.type=this.type,""!==this.name&&(i.name=this.name),this.color&&this.color.isColor&&(i.color=this.color.getHex()),void 0!==this.roughness&&(i.roughness=this.roughness),void 0!==this.metalness&&(i.metalness=this.metalness),this.emissive&&this.emissive.isColor&&(i.emissive=this.emissive.getHex()),1!==this.emissiveIntensity&&(i.emissiveIntensity=this.emissiveIntensity),this.specular&&this.specular.isColor&&(i.specular=this.specular.getHex()),void 0!==this.shininess&&(i.shininess=this.shininess),void 0!==this.clearCoat&&(i.clearCoat=this.clearCoat),void 0!==this.clearCoatRoughness&&(i.clearCoatRoughness=this.clearCoatRoughness),this.map&&this.map.isTexture&&(i.map=this.map.toJSON(t).uuid),this.alphaMap&&this.alphaMap.isTexture&&(i.alphaMap=this.alphaMap.toJSON(t).uuid),this.lightMap&&this.lightMap.isTexture&&(i.lightMap=this.lightMap.toJSON(t).uuid),this.aoMap&&this.aoMap.isTexture&&(i.aoMap=this.aoMap.toJSON(t).uuid,i.aoMapIntensity=this.aoMapIntensity),this.bumpMap&&this.bumpMap.isTexture&&(i.bumpMap=this.bumpMap.toJSON(t).uuid,i.bumpScale=this.bumpScale),this.normalMap&&this.normalMap.isTexture&&(i.normalMap=this.normalMap.toJSON(t).uuid,i.normalMapType=this.normalMapType,i.normalScale=this.normalScale.toArray()),this.displacementMap&&this.displacementMap.isTexture&&(i.displacementMap=this.displacementMap.toJSON(t).uuid,i.displacementScale=this.displacementScale,i.displacementBias=this.displacementBias),this.roughnessMap&&this.roughnessMap.isTexture&&(i.roughnessMap=this.roughnessMap.toJSON(t).uuid),this.metalnessMap&&this.metalnessMap.isTexture&&(i.metalnessMap=this.metalnessMap.toJSON(t).uuid),this.emissiveMap&&this.emissiveMap.isTexture&&(i.emissiveMap=this.emissiveMap.toJSON(t).uuid),this.specularMap&&this.specularMap.isTexture&&(i.specularMap=this.specularMap.toJSON(t).uuid),this.envMap&&this.envMap.isTexture&&(i.envMap=this.envMap.toJSON(t).uuid,i.reflectivity=this.reflectivity),this.gradientMap&&this.gradientMap.isTexture&&(i.gradientMap=this.gradientMap.toJSON(t).uuid),void 0!==this.size&&(i.size=this.size),void 0!==this.sizeAttenuation&&(i.sizeAttenuation=this.sizeAttenuation),this.blending!==Y&&(i.blending=this.blending),!0===this.flatShading&&(i.flatShading=this.flatShading),this.side!==G&&(i.side=this.side),this.vertexColors!==V&&(i.vertexColors=this.vertexColors),this.opacity<1&&(i.opacity=this.opacity),!0===this.transparent&&(i.transparent=this.transparent),i.depthFunc=this.depthFunc,i.depthTest=this.depthTest,i.depthWrite=this.depthWrite,0!==this.rotation&&(i.rotation=this.rotation),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),0<this.alphaTest&&(i.alphaTest=this.alphaTest),!0===this.premultipliedAlpha&&(i.premultipliedAlpha=this.premultipliedAlpha),!0===this.wireframe&&(i.wireframe=this.wireframe),1<this.wireframeLinewidth&&(i.wireframeLinewidth=this.wireframeLinewidth),"round"!==this.wireframeLinecap&&(i.wireframeLinecap=this.wireframeLinecap),"round"!==this.wireframeLinejoin&&(i.wireframeLinejoin=this.wireframeLinejoin),!0===this.morphTargets&&(i.morphTargets=!0),!0===this.skinning&&(i.skinning=!0),!1===this.visible&&(i.visible=!1),"{}"!==JSON.stringify(this.userData)&&(i.userData=this.userData),e){var n=r(t.textures),o=r(t.images);0<n.length&&(i.textures=n),0<o.length&&(i.images=o)}return i},clone:function(){return(new this.constructor).copy(this)},copy:function(t){this.name=t.name,this.fog=t.fog,this.lights=t.lights,this.blending=t.blending,this.side=t.side,this.flatShading=t.flatShading,this.vertexColors=t.vertexColors,this.opacity=t.opacity,this.transparent=t.transparent,this.blendSrc=t.blendSrc,this.blendDst=t.blendDst,this.blendEquation=t.blendEquation,this.blendSrcAlpha=t.blendSrcAlpha,this.blendDstAlpha=t.blendDstAlpha,this.blendEquationAlpha=t.blendEquationAlpha,this.depthFunc=t.depthFunc,this.depthTest=t.depthTest,this.depthWrite=t.depthWrite,this.colorWrite=t.colorWrite,this.precision=t.precision,this.polygonOffset=t.polygonOffset,this.polygonOffsetFactor=t.polygonOffsetFactor,this.polygonOffsetUnits=t.polygonOffsetUnits,this.dithering=t.dithering,this.alphaTest=t.alphaTest,this.premultipliedAlpha=t.premultipliedAlpha,this.overdraw=t.overdraw,this.visible=t.visible,this.userData=JSON.parse(JSON.stringify(t.userData)),this.clipShadows=t.clipShadows,this.clipIntersection=t.clipIntersection;var e=t.clippingPlanes,i=null;if(null!==e){var r=e.length;i=new Array(r);for(var n=0;n!==r;++n)i[n]=e[n].clone()}return this.clippingPlanes=i,this.shadowSide=t.shadowSide,this},dispose:function(){this.dispatchEvent({type:"dispose"})}}),((Sn.prototype=Object.create(wn.prototype)).constructor=Sn).prototype.isMeshBasicMaterial=!0,Sn.prototype.copy=function(t){return wn.prototype.copy.call(this,t),this.color.copy(t.color),this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.skinning=t.skinning,this.morphTargets=t.morphTargets,this},((An.prototype=Object.create(wn.prototype)).constructor=An).prototype.isShaderMaterial=!0,An.prototype.copy=function(t){return wn.prototype.copy.call(this,t),this.fragmentShader=t.fragmentShader,this.vertexShader=t.vertexShader,this.uniforms=Ri.clone(t.uniforms),this.defines=Object.assign({},t.defines),this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.lights=t.lights,this.clipping=t.clipping,this.skinning=t.skinning,this.morphTargets=t.morphTargets,this.morphNormals=t.morphNormals,this.extensions=t.extensions,this},An.prototype.toJSON=function(t){var e=wn.prototype.toJSON.call(this,t);return e.uniforms=this.uniforms,e.vertexShader=this.vertexShader,e.fragmentShader=this.fragmentShader,e},Object.assign(Mn.prototype,{set:function(t,e){return this.origin.copy(t),this.direction.copy(e),this},clone:function(){return(new this.constructor).copy(this)},copy:function(t){return this.origin.copy(t.origin),this.direction.copy(t.direction),this},at:function(t,e){return void 0===e&&(console.warn("THREE.Ray: .at() target is now required"),e=new ri),e.copy(this.direction).multiplyScalar(t).add(this.origin)},lookAt:function(t){return this.direction.copy(t).sub(this.origin).normalize(),this},recast:(sn=new ri,function(t){return this.origin.copy(this.at(t,sn)),this}),closestPointToPoint:function(t,e){void 0===e&&(console.warn("THREE.Ray: .closestPointToPoint() target is now required"),e=new ri),e.subVectors(t,this.origin);var i=e.dot(this.direction);return i<0?e.copy(this.origin):e.copy(this.direction).multiplyScalar(i).add(this.origin)},distanceToPoint:function(t){return Math.sqrt(this.distanceSqToPoint(t))},distanceSqToPoint:(an=new ri,function(t){var e=an.subVectors(t,this.origin).dot(this.direction);return e<0?this.origin.distanceToSquared(t):(an.copy(this.direction).multiplyScalar(e).add(this.origin),an.distanceToSquared(t))}),distanceSqToSegment:(rn=new ri,nn=new ri,on=new ri,function(t,e,i,r){rn.copy(t).add(e).multiplyScalar(.5),nn.copy(e).sub(t).normalize(),on.copy(this.origin).sub(rn);var n,o,a,s,c=.5*t.distanceTo(e),u=-this.direction.dot(nn),h=on.dot(this.direction),l=-on.dot(nn),p=on.lengthSq(),d=Math.abs(1-u*u);if(0<d)if(o=u*h-l,s=c*d,0<=(n=u*l-h))if(-s<=o)if(o<=s){var f=1/d;a=(n*=f)*(n+u*(o*=f)+2*h)+o*(u*n+o+2*l)+p}else o=c,a=-(n=Math.max(0,-(u*o+h)))*n+o*(o+2*l)+p;else o=-c,a=-(n=Math.max(0,-(u*o+h)))*n+o*(o+2*l)+p;else o<=-s?a=-(n=Math.max(0,-(-u*c+h)))*n+(o=0<n?-c:Math.min(Math.max(-c,-l),c))*(o+2*l)+p:o<=s?(n=0,a=(o=Math.min(Math.max(-c,-l),c))*(o+2*l)+p):a=-(n=Math.max(0,-(u*c+h)))*n+(o=0<n?c:Math.min(Math.max(-c,-l),c))*(o+2*l)+p;else o=0<u?-c:c,a=-(n=Math.max(0,-(u*o+h)))*n+o*(o+2*l)+p;return i&&i.copy(this.direction).multiplyScalar(n).add(this.origin),r&&r.copy(nn).multiplyScalar(o).add(rn),a}),intersectSphere:(en=new ri,function(t,e){en.subVectors(t.center,this.origin);var i=en.dot(this.direction),r=en.dot(en)-i*i,n=t.radius*t.radius;if(n<r)return null;var o=Math.sqrt(n-r),a=i-o,s=i+o;return a<0&&s<0?null:a<0?this.at(s,e):this.at(a,e)}),intersectsSphere:function(t){return this.distanceToPoint(t.center)<=t.radius},distanceToPlane:function(t){var e=t.normal.dot(this.direction);if(0===e)return 0===t.distanceToPoint(this.origin)?0:null;var i=-(this.origin.dot(t.normal)+t.constant)/e;return 0<=i?i:null},intersectPlane:function(t,e){var i=this.distanceToPlane(t);return null===i?null:this.at(i,e)},intersectsPlane:function(t){var e=t.distanceToPoint(this.origin);return 0===e||t.normal.dot(this.direction)*e<0},intersectBox:function(t,e){var i,r,n,o,a,s,c=1/this.direction.x,u=1/this.direction.y,h=1/this.direction.z,l=this.origin;return 0<=c?(i=(t.min.x-l.x)*c,r=(t.max.x-l.x)*c):(i=(t.max.x-l.x)*c,r=(t.min.x-l.x)*c),0<=u?(n=(t.min.y-l.y)*u,o=(t.max.y-l.y)*u):(n=(t.max.y-l.y)*u,o=(t.min.y-l.y)*u),o<i||r<n?null:((i<n||i!=i)&&(i=n),(o<r||r!=r)&&(r=o),0<=h?(a=(t.min.z-l.z)*h,s=(t.max.z-l.z)*h):(a=(t.max.z-l.z)*h,s=(t.min.z-l.z)*h),s<i||r<a?null:((i<a||i!=i)&&(i=a),(s<r||r!=r)&&(r=s),r<0?null:this.at(0<=i?i:r,e)))},intersectsBox:(tn=new ri,function(t){return null!==this.intersectBox(t,tn)}),intersectTriangle:(Zr=new ri,Kr=new ri,Jr=new ri,Qr=new ri,function(t,e,i,r,n){Kr.subVectors(e,t),Jr.subVectors(i,t),Qr.crossVectors(Kr,Jr);var o,a=this.direction.dot(Qr);if(0<a){if(r)return null;o=1}else{if(!(a<0))return null;o=-1,a=-a}Zr.subVectors(this.origin,t);var s=o*this.direction.dot(Jr.crossVectors(Zr,Jr));if(s<0)return null;var c=o*this.direction.dot(Kr.cross(Zr));if(c<0)return null;if(a<s+c)return null;var u=-o*Zr.dot(Qr);return u<0?null:this.at(u/a,n)}),applyMatrix4:function(t){return this.origin.applyMatrix4(t),this.direction.transformDirection(t),this},equals:function(t){return t.origin.equals(this.origin)&&t.direction.equals(this.direction)}}),Object.assign(En,{getNormal:(pn=new ri,function(t,e,i,r){void 0===r&&(console.warn("THREE.Triangle: .getNormal() target is now required"),r=new ri),r.subVectors(i,e),pn.subVectors(t,e),r.cross(pn);var n=r.lengthSq();return 0<n?r.multiplyScalar(1/Math.sqrt(n)):r.set(0,0,0)}),getBarycoord:(un=new ri,hn=new ri,ln=new ri,function(t,e,i,r,n){un.subVectors(r,e),hn.subVectors(i,e),ln.subVectors(t,e);var o=un.dot(un),a=un.dot(hn),s=un.dot(ln),c=hn.dot(hn),u=hn.dot(ln),h=o*c-a*a;if(void 0===n&&(console.warn("THREE.Triangle: .getBarycoord() target is now required"),n=new ri),0===h)return n.set(-2,-1,-1);var l=1/h,p=(c*s-a*u)*l,d=(o*u-a*s)*l;return n.set(1-p-d,d,p)}),containsPoint:(cn=new ri,function(t,e,i,r){return En.getBarycoord(t,e,i,r,cn),0<=cn.x&&0<=cn.y&&cn.x+cn.y<=1})}),Object.assign(En.prototype,{set:function(t,e,i){return this.a.copy(t),this.b.copy(e),this.c.copy(i),this},setFromPointsAndIndices:function(t,e,i,r){return this.a.copy(t[e]),this.b.copy(t[i]),this.c.copy(t[r]),this},clone:function(){return(new this.constructor).copy(this)},copy:function(t){return this.a.copy(t.a),this.b.copy(t.b),this.c.copy(t.c),this},getArea:(bn=new ri,xn=new ri,function(){return bn.subVectors(this.c,this.b),xn.subVectors(this.a,this.b),.5*bn.cross(xn).length()}),getMidpoint:function(t){return void 0===t&&(console.warn("THREE.Triangle: .getMidpoint() target is now required"),t=new ri),t.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)},getNormal:function(t){return En.getNormal(this.a,this.b,this.c,t)},getPlane:function(t){return void 0===t&&(console.warn("THREE.Triangle: .getPlane() target is now required"),t=new ri),t.setFromCoplanarPoints(this.a,this.b,this.c)},getBarycoord:function(t,e){return En.getBarycoord(t,this.a,this.b,this.c,e)},containsPoint:function(t){return En.containsPoint(t,this.a,this.b,this.c)},intersectsBox:function(t){return t.intersectsTriangle(this)},closestPointToPoint:(dn=new ri,fn=new ri,mn=new ri,gn=new ri,vn=new ri,yn=new ri,function(t,e){void 0===e&&(console.warn("THREE.Triangle: .closestPointToPoint() target is now required"),e=new ri);var i,r,n=this.a,o=this.b,a=this.c;dn.subVectors(o,n),fn.subVectors(a,n),gn.subVectors(t,n);var s=dn.dot(gn),c=fn.dot(gn);if(s<=0&&c<=0)return e.copy(n);vn.subVectors(t,o);var u=dn.dot(vn),h=fn.dot(vn);if(0<=u&&h<=u)return e.copy(o);var l=s*h-u*c;if(l<=0&&0<=s&&u<=0)return i=s/(s-u),e.copy(n).addScaledVector(dn,i);yn.subVectors(t,a);var p=dn.dot(yn),d=fn.dot(yn);if(0<=d&&p<=d)return e.copy(a);var f=p*c-s*d;if(f<=0&&0<=c&&d<=0)return r=c/(c-d),e.copy(n).addScaledVector(fn,r);var m=u*d-p*h;if(m<=0&&0<=h-u&&0<=p-d)return mn.subVectors(a,o),r=(h-u)/(h-u+(p-d)),e.copy(o).addScaledVector(mn,r);var g=1/(m+f+l);return i=f*g,r=l*g,e.copy(n).addScaledVector(dn,i).addScaledVector(fn,r)}),equals:function(t){return t.a.equals(this.a)&&t.b.equals(this.b)&&t.c.equals(this.c)}}),Pn.prototype=Object.assign(Object.create(ur.prototype),{constructor:Pn,isMesh:!0,setDrawMode:function(t){this.drawMode=t},copy:function(t){return ur.prototype.copy.call(this,t),this.drawMode=t.drawMode,void 0!==t.morphTargetInfluences&&(this.morphTargetInfluences=t.morphTargetInfluences.slice()),void 0!==t.morphTargetDictionary&&(this.morphTargetDictionary=Object.assign({},t.morphTargetDictionary)),this},updateMorphTargets:function(){var t,e,i,r=this.geometry;if(r.isBufferGeometry){var n=r.morphAttributes,o=Object.keys(n);if(0<o.length){var a=n[o[0]];if(void 0!==a)for(this.morphTargetInfluences=[],this.morphTargetDictionary={},t=0,e=a.length;t<e;t++)i=a[t].name||String(t),this.morphTargetInfluences.push(0),this.morphTargetDictionary[i]=t}}else{var s=r.morphTargets;if(void 0!==s&&0<s.length)for(this.morphTargetInfluences=[],this.morphTargetDictionary={},t=0,e=s.length;t<e;t++)i=s[t].name||String(t),this.morphTargetInfluences.push(0),this.morphTargetDictionary[i]=t}},raycast:function(){var z=new ei,U=new Mn,j=new Ti,G=new ri,V=new ri,H=new ri,$=new ri,W=new ri,X=new ri,q=new ti,Y=new ti,Z=new ti,s=new ri,K=new ri,u=new ri;function J(t,e,i,r,n,o,a){return En.getBarycoord(t,e,i,r,s),n.multiplyScalar(s.x),o.multiplyScalar(s.y),a.multiplyScalar(s.z),n.add(o).add(a),n.clone()}function Q(t,e,i,r,n,o,a,s){if(null===(e.side===wt?r.intersectTriangle(a,o,n,!0,s):r.intersectTriangle(n,o,a,e.side!==et,s)))return null;u.copy(s),u.applyMatrix4(t.matrixWorld);var c=i.ray.origin.distanceTo(u);return c<i.near||c>i.far?null:{distance:c,point:u.clone(),object:t}}function tt(t,e,i,r,n,o,a,s,c){G.fromBufferAttribute(n,a),V.fromBufferAttribute(n,s),H.fromBufferAttribute(n,c);var u=Q(t,e,i,r,G,V,H,K);if(u){o&&(q.fromBufferAttribute(o,a),Y.fromBufferAttribute(o,s),Z.fromBufferAttribute(o,c),u.uv=J(K,G,V,H,q,Y,Z));var h=new pr(a,s,c);En.getNormal(G,V,H,h.normal),u.face=h}return u}return function(t,e){var i,r=this.geometry,n=this.material,o=this.matrixWorld;if(void 0!==n&&(null===r.boundingSphere&&r.computeBoundingSphere(),j.copy(r.boundingSphere),j.applyMatrix4(o),!1!==t.ray.intersectsSphere(j)&&(z.getInverse(o),U.copy(t.ray).applyMatrix4(z),null===r.boundingBox||!1!==U.intersectsBox(r.boundingBox))))if(r.isBufferGeometry){var a,s,c,u,h,l,p,d,f,m=r.index,g=r.attributes.position,v=r.attributes.uv,y=r.groups,b=r.drawRange;if(null!==m)if(Array.isArray(n))for(u=0,l=y.length;u<l;u++)for(f=n[(d=y[u]).materialIndex],h=Math.max(d.start,b.start),p=Math.min(d.start+d.count,b.start+b.count);h<p;h+=3)a=m.getX(h),s=m.getX(h+1),c=m.getX(h+2),(i=tt(this,f,t,U,g,v,a,s,c))&&(i.faceIndex=Math.floor(h/3),e.push(i));else for(u=Math.max(0,b.start),l=Math.min(m.count,b.start+b.count);u<l;u+=3)a=m.getX(u),s=m.getX(u+1),c=m.getX(u+2),(i=tt(this,n,t,U,g,v,a,s,c))&&(i.faceIndex=Math.floor(u/3),e.push(i));else if(void 0!==g)if(Array.isArray(n))for(u=0,l=y.length;u<l;u++)for(f=n[(d=y[u]).materialIndex],h=Math.max(d.start,b.start),p=Math.min(d.start+d.count,b.start+b.count);h<p;h+=3)(i=tt(this,f,t,U,g,v,a=h,s=h+1,c=h+2))&&(i.faceIndex=Math.floor(h/3),e.push(i));else for(u=Math.max(0,b.start),l=Math.min(g.count,b.start+b.count);u<l;u+=3)(i=tt(this,n,t,U,g,v,a=u,s=u+1,c=u+2))&&(i.faceIndex=Math.floor(u/3),e.push(i))}else if(r.isGeometry){var x,_,w,S,A=Array.isArray(n),M=r.vertices,E=r.faces,P=r.faceVertexUvs[0];0<P.length&&(S=P);for(var T=0,C=E.length;T<C;T++){var I=E[T],O=A?n[I.materialIndex]:n;if(void 0!==O){if(x=M[I.a],_=M[I.b],w=M[I.c],!0===O.morphTargets){var L=r.morphTargets,R=this.morphTargetInfluences;G.set(0,0,0),V.set(0,0,0),H.set(0,0,0);for(var D=0,k=L.length;D<k;D++){var B=R[D];if(0!==B){var N=L[D].vertices;G.addScaledVector($.subVectors(N[I.a],x),B),V.addScaledVector(W.subVectors(N[I.b],_),B),H.addScaledVector(X.subVectors(N[I.c],w),B)}}G.add(x),V.add(_),H.add(w),x=G,_=V,w=H}if(i=Q(this,O,t,U,x,_,w,K)){if(S&&S[T]){var F=S[T];q.copy(F[0]),Y.copy(F[1]),Z.copy(F[2]),i.uv=J(K,x,_,w,q,Y,Z)}i.face=I,i.faceIndex=T,e.push(i)}}}}}}(),clone:function(){return new this.constructor(this.geometry,this.material).copy(this)}}),((zn.prototype=Object.create(wi.prototype)).constructor=zn).prototype.isCubeTexture=!0,Object.defineProperty(zn.prototype,"images",{get:function(){return this.image},set:function(t){this.image=t}});var Un=new wi,jn=new zn;function Gn(){this.seq=[],this.map={}}var Vn=[],Hn=[],$n=new Float32Array(16),Wn=new Float32Array(9),Xn=new Float32Array(4);function qn(t,e,i){var r=t[0];if(r<=0||0<r)return t;var n=e*i,o=Vn[n];if(void 0===o&&(o=new Float32Array(n),Vn[n]=o),0!==e){r.toArray(o,0);for(var a=1,s=0;a!==e;++a)s+=i,t[a].toArray(o,s)}return o}function Yn(t,e){if(t.length!==e.length)return!1;for(var i=0,r=t.length;i<r;i++)if(t[i]!==e[i])return!1;return!0}function Zn(t,e){for(var i=0,r=e.length;i<r;i++)t[i]=e[i]}function Kn(t,e){var i=Hn[e];void 0===i&&(i=new Int32Array(e),Hn[e]=i);for(var r=0;r!==e;++r)i[r]=t.allocTextureUnit();return i}function Jn(t,e){var i=this.cache;i[0]!==e&&(t.uniform1f(this.addr,e),i[0]=e)}function Qn(t,e){var i=this.cache;i[0]!==e&&(t.uniform1i(this.addr,e),i[0]=e)}function to(t,e){var i=this.cache;if(void 0!==e.x)i[0]===e.x&&i[1]===e.y||(t.uniform2f(this.addr,e.x,e.y),i[0]=e.x,i[1]=e.y);else{if(Yn(i,e))return;t.uniform2fv(this.addr,e),Zn(i,e)}}function eo(t,e){var i=this.cache;if(void 0!==e.x)i[0]===e.x&&i[1]===e.y&&i[2]===e.z||(t.uniform3f(this.addr,e.x,e.y,e.z),i[0]=e.x,i[1]=e.y,i[2]=e.z);else if(void 0!==e.r)i[0]===e.r&&i[1]===e.g&&i[2]===e.b||(t.uniform3f(this.addr,e.r,e.g,e.b),i[0]=e.r,i[1]=e.g,i[2]=e.b);else{if(Yn(i,e))return;t.uniform3fv(this.addr,e),Zn(i,e)}}function io(t,e){var i=this.cache;if(void 0!==e.x)i[0]===e.x&&i[1]===e.y&&i[2]===e.z&&i[3]===e.w||(t.uniform4f(this.addr,e.x,e.y,e.z,e.w),i[0]=e.x,i[1]=e.y,i[2]=e.z,i[3]=e.w);else{if(Yn(i,e))return;t.uniform4fv(this.addr,e),Zn(i,e)}}function ro(t,e){var i=this.cache,r=e.elements;if(void 0===r){if(Yn(i,e))return;t.uniformMatrix2fv(this.addr,!1,e),Zn(i,e)}else{if(Yn(i,r))return;Xn.set(r),t.uniformMatrix2fv(this.addr,!1,Xn),Zn(i,r)}}function no(t,e){var i=this.cache,r=e.elements;if(void 0===r){if(Yn(i,e))return;t.uniformMatrix3fv(this.addr,!1,e),Zn(i,e)}else{if(Yn(i,r))return;Wn.set(r),t.uniformMatrix3fv(this.addr,!1,Wn),Zn(i,r)}}function oo(t,e){var i=this.cache,r=e.elements;if(void 0===r){if(Yn(i,e))return;t.uniformMatrix4fv(this.addr,!1,e),Zn(i,e)}else{if(Yn(i,r))return;$n.set(r),t.uniformMatrix4fv(this.addr,!1,$n),Zn(i,r)}}function ao(t,e,i){var r=this.cache,n=i.allocTextureUnit();r[0]!==n&&(t.uniform1i(this.addr,n),r[0]=n),i.setTexture2D(e||Un,n)}function so(t,e,i){var r=this.cache,n=i.allocTextureUnit();r[0]!==n&&(t.uniform1i(this.addr,n),r[0]=n),i.setTextureCube(e||jn,n)}function co(t,e){var i=this.cache;Yn(i,e)||(t.uniform2iv(this.addr,e),Zn(i,e))}function uo(t,e){var i=this.cache;Yn(i,e)||(t.uniform3iv(this.addr,e),Zn(i,e))}function ho(t,e){var i=this.cache;Yn(i,e)||(t.uniform4iv(this.addr,e),Zn(i,e))}function lo(t,e){var i=this.cache;Yn(i,e)||(t.uniform1fv(this.addr,e),Zn(i,e))}function po(t,e){var i=this.cache;Yn(i,e)||(t.uniform1iv(this.addr,e),Zn(i,e))}function fo(t,e){var i=this.cache,r=qn(e,this.size,2);Yn(i,r)||(t.uniform2fv(this.addr,r),this.updateCache(r))}function mo(t,e){var i=this.cache,r=qn(e,this.size,3);Yn(i,r)||(t.uniform3fv(this.addr,r),this.updateCache(r))}function go(t,e){var i=this.cache,r=qn(e,this.size,4);Yn(i,r)||(t.uniform4fv(this.addr,r),this.updateCache(r))}function vo(t,e){var i=this.cache,r=qn(e,this.size,4);Yn(i,r)||(t.uniformMatrix2fv(this.addr,!1,r),this.updateCache(r))}function yo(t,e){var i=this.cache,r=qn(e,this.size,9);Yn(i,r)||(t.uniformMatrix3fv(this.addr,!1,r),this.updateCache(r))}function bo(t,e){var i=this.cache,r=qn(e,this.size,16);Yn(i,r)||(t.uniformMatrix4fv(this.addr,!1,r),this.updateCache(r))}function xo(t,e,i){var r=this.cache,n=e.length,o=Kn(i,n);!1===Yn(r,o)&&(t.uniform1iv(this.addr,o),Zn(r,o));for(var a=0;a!==n;++a)i.setTexture2D(e[a]||Un,o[a])}function _o(t,e,i){var r=this.cache,n=e.length,o=Kn(i,n);!1===Yn(r,o)&&(t.uniform1iv(this.addr,o),Zn(r,o));for(var a=0;a!==n;++a)i.setTextureCube(e[a]||jn,o[a])}function wo(t,e,i){this.id=t,this.addr=i,this.cache=[],this.setValue=function(t){switch(t){case 5126:return Jn;case 35664:return to;case 35665:return eo;case 35666:return io;case 35674:return ro;case 35675:return no;case 35676:return oo;case 35678:case 36198:return ao;case 35680:return so;case 5124:case 35670:return Qn;case 35667:case 35671:return co;case 35668:case 35672:return uo;case 35669:case 35673:return ho}}(e.type)}function So(t,e,i){this.id=t,this.addr=i,this.cache=[],this.size=e.size,this.setValue=function(t){switch(t){case 5126:return lo;case 35664:return fo;case 35665:return mo;case 35666:return go;case 35674:return vo;case 35675:return yo;case 35676:return bo;case 35678:return xo;case 35680:return _o;case 5124:case 35670:return po;case 35667:case 35671:return co;case 35668:case 35672:return uo;case 35669:case 35673:return ho}}(e.type)}function Ao(t){this.id=t,Gn.call(this)}So.prototype.updateCache=function(t){var e=this.cache;t instanceof Float32Array&&e.length!==t.length&&(this.cache=new Float32Array(t.length)),Zn(e,t)},Ao.prototype.setValue=function(t,e,i){for(var r=this.seq,n=0,o=r.length;n!==o;++n){var a=r[n];a.setValue(t,e[a.id],i)}};var Mo=/([\w\d_]+)(\])?(\[|\.)?/g;function Eo(t,e){t.seq.push(e),t.map[e.id]=e}function Po(t,e,i){var r=t.name,n=r.length;for(Mo.lastIndex=0;;){var o=Mo.exec(r),a=Mo.lastIndex,s=o[1],c="]"===o[2],u=o[3];if(c&&(s|=0),void 0===u||"["===u&&a+2===n){Eo(i,void 0===u?new wo(s,t,e):new So(s,t,e));break}var h=i.map[s];void 0===h&&Eo(i,h=new Ao(s)),i=h}}function To(t,e,i){Gn.call(this),this.renderer=i;for(var r=t.getProgramParameter(e,t.ACTIVE_UNIFORMS),n=0;n<r;++n){var o=t.getActiveUniform(e,n);Po(o,t.getUniformLocation(e,o.name),this)}}function Co(t,e,i){var r=t.createShader(e);return t.shaderSource(r,i),t.compileShader(r),!1===t.getShaderParameter(r,t.COMPILE_STATUS)&&console.error("THREE.WebGLShader: Shader couldn't compile."),""!==t.getShaderInfoLog(r)&&console.warn("THREE.WebGLShader: gl.getShaderInfoLog()",e===t.VERTEX_SHADER?"vertex":"fragment",t.getShaderInfoLog(r),function(t){for(var e=t.split("\n"),i=0;i<e.length;i++)e[i]=i+1+": "+e[i];return e.join("\n")}(i)),r}To.prototype.setValue=function(t,e,i){var r=this.map[e];void 0!==r&&r.setValue(t,i,this.renderer)},To.prototype.setOptional=function(t,e,i){var r=e[i];void 0!==r&&this.setValue(t,i,r)},To.upload=function(t,e,i,r){for(var n=0,o=e.length;n!==o;++n){var a=e[n],s=i[a.id];!1!==s.needsUpdate&&a.setValue(t,s.value,r)}},To.seqWithValue=function(t,e){for(var i=[],r=0,n=t.length;r!==n;++r){var o=t[r];o.id in e&&i.push(o)}return i};var Io=0;function Oo(t){switch(t){case Ge:return["Linear","( value )"];case Ve:return["sRGB","( value )"];case $e:return["RGBE","( value )"];case We:return["RGBM","( value, 7.0 )"];case Xe:return["RGBM","( value, 16.0 )"];case qe:return["RGBD","( value, 256.0 )"];case He:return["Gamma","( value, float( GAMMA_FACTOR ) )"];default:throw new Error("unsupported encoding: "+t)}}function Lo(t,e){var i=Oo(e);return"vec4 "+t+"( vec4 value ) { return "+i[0]+"ToLinear"+i[1]+"; }"}function Ro(t){return""!==t}function Do(t,e){return t.replace(/NUM_DIR_LIGHTS/g,e.numDirLights).replace(/NUM_SPOT_LIGHTS/g,e.numSpotLights).replace(/NUM_RECT_AREA_LIGHTS/g,e.numRectAreaLights).replace(/NUM_POINT_LIGHTS/g,e.numPointLights).replace(/NUM_HEMI_LIGHTS/g,e.numHemiLights)}function ko(t,e){return t.replace(/NUM_CLIPPING_PLANES/g,e.numClippingPlanes).replace(/UNION_CLIPPING_PLANES/g,e.numClippingPlanes-e.numClipIntersection)}function Bo(t){return t.replace(/^[ \t]*#include +<([\w\d./]+)>/gm,function(t,e){var i=Li[e];if(void 0===i)throw new Error("Can not resolve #include <"+e+">");return Bo(i)})}function No(t){return t.replace(/#pragma unroll_loop[\s]+?for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g,function(t,e,i,r){for(var n="",o=parseInt(e);o<parseInt(i);o++)n+=r.replace(/\[ i \]/g,"[ "+o+" ]");return n})}function Fo(t,e,i,r,n,o,a){var s=t.context,c=r.defines,u=n.vertexShader,h=n.fragmentShader,l="SHADOWMAP_TYPE_BASIC";o.shadowMapType===U?l="SHADOWMAP_TYPE_PCF":o.shadowMapType===j&&(l="SHADOWMAP_TYPE_PCF_SOFT");var p="ENVMAP_TYPE_CUBE",d="ENVMAP_MODE_REFLECTION",f="ENVMAP_BLENDING_MULTIPLY";if(o.envMap){switch(r.envMap.mapping){case Rt:case Dt:p="ENVMAP_TYPE_CUBE";break;case Ft:case zt:p="ENVMAP_TYPE_CUBE_UV";break;case kt:case Bt:p="ENVMAP_TYPE_EQUIREC";break;case Nt:p="ENVMAP_TYPE_SPHERE"}switch(r.envMap.mapping){case Dt:case Bt:d="ENVMAP_MODE_REFRACTION"}switch(r.combine){case Mt:f="ENVMAP_BLENDING_MULTIPLY";break;case Et:f="ENVMAP_BLENDING_MIX";break;case Pt:f="ENVMAP_BLENDING_ADD"}}var m,g,v,y,b,x,_,w,S=0<t.gammaFactor?t.gammaFactor:1,A=a.isWebGL2?"":(m=r.extensions,g=o,v=e,[(m=m||{}).derivatives||g.envMapCubeUV||g.bumpMap||g.normalMap&&!g.objectSpaceNormalMap||g.flatShading?"#extension GL_OES_standard_derivatives : enable":"",(m.fragDepth||g.logarithmicDepthBuffer)&&v.get("EXT_frag_depth")?"#extension GL_EXT_frag_depth : enable":"",m.drawBuffers&&v.get("WEBGL_draw_buffers")?"#extension GL_EXT_draw_buffers : require":"",(m.shaderTextureLOD||g.envMap)&&v.get("EXT_shader_texture_lod")?"#extension GL_EXT_shader_texture_lod : enable":""].filter(Ro).join("\n")),M=function(t){var e=[];for(var i in t){var r=t[i];!1!==r&&e.push("#define "+i+" "+r)}return e.join("\n")}(c),E=s.createProgram();if(r.isRawShaderMaterial?(0<(y=[M].filter(Ro).join("\n")).length&&(y+="\n"),0<(b=[A,M].filter(Ro).join("\n")).length&&(b+="\n")):(y=["precision "+o.precision+" float;","precision "+o.precision+" int;","#define SHADER_NAME "+n.name,M,o.supportsVertexTextures?"#define VERTEX_TEXTURES":"","#define GAMMA_FACTOR "+S,"#define MAX_BONES "+o.maxBones,o.useFog&&o.fog?"#define USE_FOG":"",o.useFog&&o.fogExp?"#define FOG_EXP2":"",o.map?"#define USE_MAP":"",o.envMap?"#define USE_ENVMAP":"",o.envMap?"#define "+d:"",o.lightMap?"#define USE_LIGHTMAP":"",o.aoMap?"#define USE_AOMAP":"",o.emissiveMap?"#define USE_EMISSIVEMAP":"",o.bumpMap?"#define USE_BUMPMAP":"",o.normalMap?"#define USE_NORMALMAP":"",o.normalMap&&o.objectSpaceNormalMap?"#define OBJECTSPACE_NORMALMAP":"",o.displacementMap&&o.supportsVertexTextures?"#define USE_DISPLACEMENTMAP":"",o.specularMap?"#define USE_SPECULARMAP":"",o.roughnessMap?"#define USE_ROUGHNESSMAP":"",o.metalnessMap?"#define USE_METALNESSMAP":"",o.alphaMap?"#define USE_ALPHAMAP":"",o.vertexColors?"#define USE_COLOR":"",o.flatShading?"#define FLAT_SHADED":"",o.skinning?"#define USE_SKINNING":"",o.useVertexTexture?"#define BONE_TEXTURE":"",o.morphTargets?"#define USE_MORPHTARGETS":"",o.morphNormals&&!1===o.flatShading?"#define USE_MORPHNORMALS":"",o.doubleSided?"#define DOUBLE_SIDED":"",o.flipSided?"#define FLIP_SIDED":"",o.shadowMapEnabled?"#define USE_SHADOWMAP":"",o.shadowMapEnabled?"#define "+l:"",o.sizeAttenuation?"#define USE_SIZEATTENUATION":"",o.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",o.logarithmicDepthBuffer&&(a.isWebGL2||e.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(Ro).join("\n"),b=[A,"precision "+o.precision+" float;","precision "+o.precision+" int;","#define SHADER_NAME "+n.name,M,o.alphaTest?"#define ALPHATEST "+o.alphaTest+(o.alphaTest%1?"":".0"):"","#define GAMMA_FACTOR "+S,o.useFog&&o.fog?"#define USE_FOG":"",o.useFog&&o.fogExp?"#define FOG_EXP2":"",o.map?"#define USE_MAP":"",o.envMap?"#define USE_ENVMAP":"",o.envMap?"#define "+p:"",o.envMap?"#define "+d:"",o.envMap?"#define "+f:"",o.lightMap?"#define USE_LIGHTMAP":"",o.aoMap?"#define USE_AOMAP":"",o.emissiveMap?"#define USE_EMISSIVEMAP":"",o.bumpMap?"#define USE_BUMPMAP":"",o.normalMap?"#define USE_NORMALMAP":"",o.normalMap&&o.objectSpaceNormalMap?"#define OBJECTSPACE_NORMALMAP":"",o.specularMap?"#define USE_SPECULARMAP":"",o.roughnessMap?"#define USE_ROUGHNESSMAP":"",o.metalnessMap?"#define USE_METALNESSMAP":"",o.alphaMap?"#define USE_ALPHAMAP":"",o.vertexColors?"#define USE_COLOR":"",o.gradientMap?"#define USE_GRADIENTMAP":"",o.flatShading?"#define FLAT_SHADED":"",o.doubleSided?"#define DOUBLE_SIDED":"",o.flipSided?"#define FLIP_SIDED":"",o.shadowMapEnabled?"#define USE_SHADOWMAP":"",o.shadowMapEnabled?"#define "+l:"",o.premultipliedAlpha?"#define PREMULTIPLIED_ALPHA":"",o.physicallyCorrectLights?"#define PHYSICALLY_CORRECT_LIGHTS":"",o.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",o.logarithmicDepthBuffer&&(a.isWebGL2||e.get("EXT_frag_depth"))?"#define USE_LOGDEPTHBUF_EXT":"",o.envMap&&(a.isWebGL2||e.get("EXT_shader_texture_lod"))?"#define TEXTURE_LOD_EXT":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;",o.toneMapping!==Tt?"#define TONE_MAPPING":"",o.toneMapping!==Tt?Li.tonemapping_pars_fragment:"",o.toneMapping!==Tt?function(t,e){var i;switch(e){case Ct:i="Linear";break;case It:i="Reinhard";break;case Ot:i="Uncharted2";break;case Lt:i="OptimizedCineon";break;default:throw new Error("unsupported toneMapping: "+e)}return"vec3 "+t+"( vec3 color ) { return "+i+"ToneMapping( color ); }"}("toneMapping",o.toneMapping):"",o.dithering?"#define DITHERING":"",o.outputEncoding||o.mapEncoding||o.envMapEncoding||o.emissiveMapEncoding?Li.encodings_pars_fragment:"",o.mapEncoding?Lo("mapTexelToLinear",o.mapEncoding):"",o.envMapEncoding?Lo("envMapTexelToLinear",o.envMapEncoding):"",o.emissiveMapEncoding?Lo("emissiveMapTexelToLinear",o.emissiveMapEncoding):"",o.outputEncoding?(x="linearToOutputTexel",_=o.outputEncoding,w=Oo(_),"vec4 "+x+"( vec4 value ) { return LinearTo"+w[0]+w[1]+"; }"):"",o.depthPacking?"#define DEPTH_PACKING "+r.depthPacking:"","\n"].filter(Ro).join("\n")),u=ko(u=Do(u=Bo(u),o),o),h=ko(h=Do(h=Bo(h),o),o),u=No(u),h=No(h),a.isWebGL2&&!r.isRawShaderMaterial){var P=!1,T=/^\s*#version\s+300\s+es\s*\n/;r.isShaderMaterial&&null!==u.match(T)&&null!==h.match(T)&&(P=!0,u=u.replace(T,""),h=h.replace(T,"")),y=["#version 300 es\n","#define attribute in","#define varying out","#define texture2D texture"].join("\n")+"\n"+y,b=["#version 300 es\n","#define varying in",P?"":"out highp vec4 pc_fragColor;",P?"":"#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"+b}var C=y+u,I=b+h,O=Co(s,s.VERTEX_SHADER,C),L=Co(s,s.FRAGMENT_SHADER,I);s.attachShader(E,O),s.attachShader(E,L),void 0!==r.index0AttributeName?s.bindAttribLocation(E,0,r.index0AttributeName):!0===o.morphTargets&&s.bindAttribLocation(E,0,"position"),s.linkProgram(E);var R,D,k=s.getProgramInfoLog(E).trim(),B=s.getShaderInfoLog(O).trim(),N=s.getShaderInfoLog(L).trim(),F=!0,z=!0;return!1===s.getProgramParameter(E,s.LINK_STATUS)?(F=!1,console.error("THREE.WebGLProgram: shader error: ",s.getError(),"gl.VALIDATE_STATUS",s.getProgramParameter(E,s.VALIDATE_STATUS),"gl.getProgramInfoLog",k,B,N)):""!==k?console.warn("THREE.WebGLProgram: gl.getProgramInfoLog()",k):""!==B&&""!==N||(z=!1),z&&(this.diagnostics={runnable:F,material:r,programLog:k,vertexShader:{log:B,prefix:y},fragmentShader:{log:N,prefix:b}}),s.deleteShader(O),s.deleteShader(L),this.getUniforms=function(){return void 0===R&&(R=new To(s,E,t)),R},this.getAttributes=function(){return void 0===D&&(D=function(t,e){for(var i={},r=t.getProgramParameter(e,t.ACTIVE_ATTRIBUTES),n=0;n<r;n++){var o=t.getActiveAttrib(e,n).name;i[o]=t.getAttribLocation(e,o)}return i}(s,E)),D},this.destroy=function(){s.deleteProgram(E),this.program=void 0},Object.defineProperties(this,{uniforms:{get:function(){return console.warn("THREE.WebGLProgram: .uniforms is now .getUniforms()."),this.getUniforms()}},attributes:{get:function(){return console.warn("THREE.WebGLProgram: .attributes is now .getAttributes()."),this.getAttributes()}}}),this.name=n.name,this.id=Io++,this.code=i,this.usedTimes=1,this.program=E,this.vertexShader=O,this.fragmentShader=L,this}function zo(l,c,p){var u=[],d={MeshDepthMaterial:"depth",MeshDistanceMaterial:"distanceRGBA",MeshNormalMaterial:"normal",MeshBasicMaterial:"basic",MeshLambertMaterial:"lambert",MeshPhongMaterial:"phong",MeshToonMaterial:"phong",MeshStandardMaterial:"physical",MeshPhysicalMaterial:"physical",LineBasicMaterial:"basic",LineDashedMaterial:"dashed",PointsMaterial:"points",ShadowMaterial:"shadow",SpriteMaterial:"sprite"},o=["precision","supportsVertexTextures","map","mapEncoding","envMap","envMapMode","envMapEncoding","lightMap","aoMap","emissiveMap","emissiveMapEncoding","bumpMap","normalMap","objectSpaceNormalMap","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","dithering"];function f(t,e){var i;return t?t.isTexture?i=t.encoding:t.isWebGLRenderTarget&&(console.warn("THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead."),i=t.texture.encoding):i=Ge,i===Ge&&e&&(i=He),i}this.getParameters=function(t,e,i,r,n,o,a){var s=d[t.type],c=a.isSkinnedMesh?function(t){var e=t.skeleton.bones;if(p.floatVertexTextures)return 1024;var i=p.maxVertexUniforms,r=Math.floor((i-20)/4),n=Math.min(r,e.length);return n<e.length?(console.warn("THREE.WebGLRenderer: Skeleton has "+e.length+" bones. This GPU supports "+n+"."),0):n}(a):0,u=p.precision;null!==t.precision&&(u=p.getMaxPrecision(t.precision))!==t.precision&&console.warn("THREE.WebGLProgram.getParameters:",t.precision,"not supported, using",u,"instead.");var h=l.getRenderTarget();return{shaderID:s,precision:u,supportsVertexTextures:p.vertexTextures,outputEncoding:f(h?h.texture:null,l.gammaOutput),map:!!t.map,mapEncoding:f(t.map,l.gammaInput),envMap:!!t.envMap,envMapMode:t.envMap&&t.envMap.mapping,envMapEncoding:f(t.envMap,l.gammaInput),envMapCubeUV:!!t.envMap&&(t.envMap.mapping===Ft||t.envMap.mapping===zt),lightMap:!!t.lightMap,aoMap:!!t.aoMap,emissiveMap:!!t.emissiveMap,emissiveMapEncoding:f(t.emissiveMap,l.gammaInput),bumpMap:!!t.bumpMap,normalMap:!!t.normalMap,objectSpaceNormalMap:t.normalMapType===Je,displacementMap:!!t.displacementMap,roughnessMap:!!t.roughnessMap,metalnessMap:!!t.metalnessMap,specularMap:!!t.specularMap,alphaMap:!!t.alphaMap,gradientMap:!!t.gradientMap,combine:t.combine,vertexColors:t.vertexColors,fog:!!r,useFog:t.fog,fogExp:r&&r.isFogExp2,flatShading:t.flatShading,sizeAttenuation:t.sizeAttenuation,logarithmicDepthBuffer:p.logarithmicDepthBuffer,skinning:t.skinning&&0<c,maxBones:c,useVertexTexture:p.floatVertexTextures,morphTargets:t.morphTargets,morphNormals:t.morphNormals,maxMorphTargets:l.maxMorphTargets,maxMorphNormals:l.maxMorphNormals,numDirLights:e.directional.length,numPointLights:e.point.length,numSpotLights:e.spot.length,numRectAreaLights:e.rectArea.length,numHemiLights:e.hemi.length,numClippingPlanes:n,numClipIntersection:o,dithering:t.dithering,shadowMapEnabled:l.shadowMap.enabled&&a.receiveShadow&&0<i.length,shadowMapType:l.shadowMap.type,toneMapping:l.toneMapping,physicallyCorrectLights:l.physicallyCorrectLights,premultipliedAlpha:t.premultipliedAlpha,alphaTest:t.alphaTest,doubleSided:t.side===et,flipSided:t.side===wt,depthPacking:void 0!==t.depthPacking&&t.depthPacking}},this.getProgramCode=function(t,e){var i=[];if(e.shaderID?i.push(e.shaderID):(i.push(t.fragmentShader),i.push(t.vertexShader)),void 0!==t.defines)for(var r in t.defines)i.push(r),i.push(t.defines[r]);for(var n=0;n<o.length;n++)i.push(e[o[n]]);return i.push(t.onBeforeCompile.toString()),i.push(l.gammaOutput),i.join()},this.acquireProgram=function(t,e,i,r){for(var n,o=0,a=u.length;o<a;o++){var s=u[o];if(s.code===r){++(n=s).usedTimes;break}}return void 0===n&&(n=new Fo(l,c,r,t,e,i,p),u.push(n)),n},this.releaseProgram=function(t){if(0==--t.usedTimes){var e=u.indexOf(t);u[e]=u[u.length-1],u.pop(),t.destroy()}},this.programs=u}function Uo(){var r=new WeakMap;return{get:function(t){var e=r.get(t);return void 0===e&&(e={},r.set(t,e)),e},remove:function(t){r.delete(t)},update:function(t,e,i){r.get(t)[e]=i},dispose:function(){r=new WeakMap}}}function jo(t,e){return t.renderOrder!==e.renderOrder?t.renderOrder-e.renderOrder:t.program&&e.program&&t.program!==e.program?t.program.id-e.program.id:t.material.id!==e.material.id?t.material.id-e.material.id:t.z!==e.z?t.z-e.z:t.id-e.id}function Go(t,e){return t.renderOrder!==e.renderOrder?t.renderOrder-e.renderOrder:t.z!==e.z?e.z-t.z:t.id-e.id}function Vo(){var a=[],s=0,c=[],u=[];return{opaque:c,transparent:u,init:function(){s=0,c.length=0,u.length=0},push:function(t,e,i,r,n){var o=a[s];void 0===o?(o={id:t.id,object:t,geometry:e,material:i,program:i.program,renderOrder:t.renderOrder,z:r,group:n},a[s]=o):(o.id=t.id,o.object=t,o.geometry=e,o.material=i,o.program=i.program,o.renderOrder=t.renderOrder,o.z=r,o.group=n),(!0===i.transparent?u:c).push(o),s++},sort:function(){1<c.length&&c.sort(jo),1<u.length&&u.sort(Go)}}}function Ho(){var n={};return{get:function(t,e){var i=t.id+","+e.id,r=n[i];return void 0===r&&(r=new Vo,n[i]=r),r},dispose:function(){n={}}}}function $o(){var i={};return{get:function(t){if(void 0!==i[t.id])return i[t.id];var e;switch(t.type){case"DirectionalLight":e={direction:new ri,color:new ki,shadow:!1,shadowBias:0,shadowRadius:1,shadowMapSize:new ti};break;case"SpotLight":e={position:new ri,direction:new ri,color:new ki,distance:0,coneCos:0,penumbraCos:0,decay:0,shadow:!1,shadowBias:0,shadowRadius:1,shadowMapSize:new ti};break;case"PointLight":e={position:new ri,color:new ki,distance:0,decay:0,shadow:!1,shadowBias:0,shadowRadius:1,shadowMapSize:new ti,shadowCameraNear:1,shadowCameraFar:1e3};break;case"HemisphereLight":e={direction:new ri,skyColor:new ki,groundColor:new ki};break;case"RectAreaLight":e={color:new ki,position:new ri,halfWidth:new ri,halfHeight:new ri}}return i[t.id]=e}}}var Wo,Xo,qo,Yo,Zo,Ko,Jo,Qo,ta,ea,ia,ra,na,oa,aa,sa,ca=0;function ua(){var _=new $o,w={id:ca++,hash:{stateID:-1,directionalLength:-1,pointLength:-1,spotLength:-1,rectAreaLength:-1,hemiLength:-1,shadowsLength:-1},ambient:[0,0,0],directional:[],directionalShadowMap:[],directionalShadowMatrix:[],spot:[],spotShadowMap:[],spotShadowMatrix:[],rectArea:[],point:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[]},S=new ri,A=new ei,M=new ei;return{setup:function(t,e,i){for(var r=0,n=0,o=0,a=0,s=0,c=0,u=0,h=0,l=i.matrixWorldInverse,p=0,d=t.length;p<d;p++){var f=t[p],m=f.color,g=f.intensity,v=f.distance,y=f.shadow&&f.shadow.map?f.shadow.map.texture:null;if(f.isAmbientLight)r+=m.r*g,n+=m.g*g,o+=m.b*g;else if(f.isDirectionalLight){if((x=_.get(f)).color.copy(f.color).multiplyScalar(f.intensity),x.direction.setFromMatrixPosition(f.matrixWorld),S.setFromMatrixPosition(f.target.matrixWorld),x.direction.sub(S),x.direction.transformDirection(l),x.shadow=f.castShadow,f.castShadow){var b=f.shadow;x.shadowBias=b.bias,x.shadowRadius=b.radius,x.shadowMapSize=b.mapSize}w.directionalShadowMap[a]=y,w.directionalShadowMatrix[a]=f.shadow.matrix,w.directional[a]=x,a++}else if(f.isSpotLight)(x=_.get(f)).position.setFromMatrixPosition(f.matrixWorld),x.position.applyMatrix4(l),x.color.copy(m).multiplyScalar(g),x.distance=v,x.direction.setFromMatrixPosition(f.matrixWorld),S.setFromMatrixPosition(f.target.matrixWorld),x.direction.sub(S),x.direction.transformDirection(l),x.coneCos=Math.cos(f.angle),x.penumbraCos=Math.cos(f.angle*(1-f.penumbra)),x.decay=0===f.distance?0:f.decay,x.shadow=f.castShadow,f.castShadow&&(b=f.shadow,x.shadowBias=b.bias,x.shadowRadius=b.radius,x.shadowMapSize=b.mapSize),w.spotShadowMap[c]=y,w.spotShadowMatrix[c]=f.shadow.matrix,w.spot[c]=x,c++;else if(f.isRectAreaLight)(x=_.get(f)).color.copy(m).multiplyScalar(g),x.position.setFromMatrixPosition(f.matrixWorld),x.position.applyMatrix4(l),M.identity(),A.copy(f.matrixWorld),A.premultiply(l),M.extractRotation(A),x.halfWidth.set(.5*f.width,0,0),x.halfHeight.set(0,.5*f.height,0),x.halfWidth.applyMatrix4(M),x.halfHeight.applyMatrix4(M),w.rectArea[u]=x,u++;else if(f.isPointLight)(x=_.get(f)).position.setFromMatrixPosition(f.matrixWorld),x.position.applyMatrix4(l),x.color.copy(f.color).multiplyScalar(f.intensity),x.distance=f.distance,x.decay=0===f.distance?0:f.decay,x.shadow=f.castShadow,f.castShadow&&(b=f.shadow,x.shadowBias=b.bias,x.shadowRadius=b.radius,x.shadowMapSize=b.mapSize,x.shadowCameraNear=b.camera.near,x.shadowCameraFar=b.camera.far),w.pointShadowMap[s]=y,w.pointShadowMatrix[s]=f.shadow.matrix,w.point[s]=x,s++;else if(f.isHemisphereLight){var x;(x=_.get(f)).direction.setFromMatrixPosition(f.matrixWorld),x.direction.transformDirection(l),x.direction.normalize(),x.skyColor.copy(f.color).multiplyScalar(g),x.groundColor.copy(f.groundColor).multiplyScalar(g),w.hemi[h]=x,h++}}w.ambient[0]=r,w.ambient[1]=n,w.ambient[2]=o,w.directional.length=a,w.spot.length=c,w.rectArea.length=u,w.point.length=s,w.hemi.length=h,w.hash.stateID=w.id,w.hash.directionalLength=a,w.hash.pointLength=s,w.hash.spotLength=c,w.hash.rectAreaLength=u,w.hash.hemiLength=h,w.hash.shadowsLength=e.length},state:w}}function ha(){var e=new ua,i=[],r=[];return{init:function(){i.length=0,r.length=0},state:{lightsArray:i,shadowsArray:r,lights:e},setupLights:function(t){e.setup(i,r,t)},pushLight:function(t){i.push(t)},pushShadow:function(t){r.push(t)}}}function la(){var r={};return{get:function(t,e){var i;return void 0===r[t.id]?(i=new ha,r[t.id]={},r[t.id][e.id]=i):void 0===r[t.id][e.id]?(i=new ha,r[t.id][e.id]=i):i=r[t.id][e.id],i},dispose:function(){r={}}}}function pa(t){wn.call(this),this.type="MeshDepthMaterial",this.depthPacking=Ye,this.skinning=!1,this.morphTargets=!1,this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.fog=!1,this.lights=!1,this.setValues(t)}function da(t){wn.call(this),this.type="MeshDistanceMaterial",this.referencePosition=new ri,this.nearDistance=1,this.farDistance=1e3,this.skinning=!1,this.morphTargets=!1,this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.fog=!1,this.lights=!1,this.setValues(t)}function fa(b,m,t){for(var x=new Ii,_=new ei,w=new ti,S=new ti(t,t),A=new ri,M=new ri,v=1,y=2,e=1+(v|y),E=new Array(e),P=new Array(e),T={},C={0:wt,1:G,2:et},I=[new ri(1,0,0),new ri(-1,0,0),new ri(0,0,1),new ri(0,0,-1),new ri(0,1,0),new ri(0,-1,0)],O=[new ri(0,1,0),new ri(0,1,0),new ri(0,1,0),new ri(0,1,0),new ri(0,0,1),new ri(0,0,-1)],L=[new Si,new Si,new Si,new Si,new Si,new Si],i=0;i!==e;++i){var r=0!=(i&v),n=0!=(i&y),o=new pa({depthPacking:Ze,morphTargets:r,skinning:n});E[i]=o;var a=new da({morphTargets:r,skinning:n});P[i]=a}var R=this;function g(t,e,i,r,n,o){var a=t.geometry,s=null,c=E,u=t.customDepthMaterial;if(i&&(c=P,u=t.customDistanceMaterial),u)s=u;else{var h=!1;e.morphTargets&&(a&&a.isBufferGeometry?h=a.morphAttributes&&a.morphAttributes.position&&0<a.morphAttributes.position.length:a&&a.isGeometry&&(h=a.morphTargets&&0<a.morphTargets.length)),t.isSkinnedMesh&&!1===e.skinning&&console.warn("THREE.WebGLShadowMap: THREE.SkinnedMesh with material.skinning set to false:",t);var l=t.isSkinnedMesh&&e.skinning,p=0;h&&(p|=v),l&&(p|=y),s=c[p]}if(b.localClippingEnabled&&!0===e.clipShadows&&0!==e.clippingPlanes.length){var d=s.uuid,f=e.uuid,m=T[d];void 0===m&&(m={},T[d]=m);var g=m[f];void 0===g&&(g=s.clone(),m[f]=g),s=g}return s.visible=e.visible,s.wireframe=e.wireframe,s.side=null!=e.shadowSide?e.shadowSide:C[e.side],s.clipShadows=e.clipShadows,s.clippingPlanes=e.clippingPlanes,s.clipIntersection=e.clipIntersection,s.wireframeLinewidth=e.wireframeLinewidth,s.linewidth=e.linewidth,i&&s.isMeshDistanceMaterial&&(s.referencePosition.copy(r),s.nearDistance=n,s.farDistance=o),s}function D(t,e,i,r){if(!1!==t.visible){if(t.layers.test(e.layers)&&(t.isMesh||t.isLine||t.isPoints)&&t.castShadow&&(!t.frustumCulled||x.intersectsObject(t))){t.modelViewMatrix.multiplyMatrices(i.matrixWorldInverse,t.matrixWorld);var n=m.update(t),o=t.material;if(Array.isArray(o))for(var a=n.groups,s=0,c=a.length;s<c;s++){var u=a[s],h=o[u.materialIndex];if(h&&h.visible){var l=g(t,h,r,M,i.near,i.far);b.renderBufferDirect(i,null,n,l,t,u)}}else if(o.visible){l=g(t,o,r,M,i.near,i.far);b.renderBufferDirect(i,null,n,l,t,null)}}for(var p=t.children,d=0,f=p.length;d<f;d++)D(p[d],e,i,r)}}this.enabled=!1,this.autoUpdate=!0,this.needsUpdate=!1,this.type=U,this.render=function(t,e,i){if(!1!==R.enabled&&(!1!==R.autoUpdate||!1!==R.needsUpdate)&&0!==t.length){var r,n=b.context,o=b.state;o.disable(n.BLEND),o.buffers.color.setClear(1,1,1,1),o.buffers.depth.setTest(!0),o.setScissorTest(!1);for(var a=0,s=t.length;a<s;a++){var c=t[a],u=c.shadow,h=c&&c.isPointLight;if(void 0!==u){var l=u.camera;if(w.copy(u.mapSize),w.min(S),h){var p=w.x,d=w.y;L[0].set(2*p,d,p,d),L[1].set(0,d,p,d),L[2].set(3*p,d,p,d),L[3].set(p,d,p,d),L[4].set(3*p,0,p,d),L[5].set(p,0,p,d),w.x*=4,w.y*=2}if(null===u.map){var f={minFilter:Vt,magFilter:Vt,format:ue};u.map=new Ai(w.x,w.y,f),u.map.texture.name=c.name+".shadowMap",l.updateProjectionMatrix()}u.isSpotLightShadow&&u.update(c);var m=u.map,g=u.matrix;M.setFromMatrixPosition(c.matrixWorld),l.position.copy(M),h?(r=6,g.makeTranslation(-M.x,-M.y,-M.z)):(r=1,A.setFromMatrixPosition(c.target.matrixWorld),l.lookAt(A),l.updateMatrixWorld(),g.set(.5,0,0,.5,0,.5,0,.5,0,0,.5,.5,0,0,0,1),g.multiply(l.projectionMatrix),g.multiply(l.matrixWorldInverse)),b.setRenderTarget(m),b.clear();for(var v=0;v<r;v++){if(h){A.copy(l.position),A.add(I[v]),l.up.copy(O[v]),l.lookAt(A),l.updateMatrixWorld();var y=L[v];o.viewport(y)}_.multiplyMatrices(l.projectionMatrix,l.matrixWorldInverse),x.setFromMatrix(_),D(e,i,l,h)}}else console.warn("THREE.WebGLShadowMap:",c,"has no shadow.")}R.needsUpdate=!1}}}function ma(h,i,c,r){var n=new function(){var e=!1,o=new Si,i=null,a=new Si(0,0,0,0);return{setMask:function(t){i===t||e||(h.colorMask(t,t,t,t),i=t)},setLocked:function(t){e=t},setClear:function(t,e,i,r,n){!0===n&&(t*=r,e*=r,i*=r),o.set(t,e,i,r),!1===a.equals(o)&&(h.clearColor(t,e,i,r),a.copy(o))},reset:function(){e=!1,i=null,a.set(-1,0,0,0)}}},o=new function(){var e=!1,i=null,r=null,n=null;return{setTest:function(t){t?F(h.DEPTH_TEST):z(h.DEPTH_TEST)},setMask:function(t){i===t||e||(h.depthMask(t),i=t)},setFunc:function(t){if(r!==t){if(t)switch(t){case gt:h.depthFunc(h.NEVER);break;case vt:h.depthFunc(h.ALWAYS);break;case yt:h.depthFunc(h.LESS);break;case bt:h.depthFunc(h.LEQUAL);break;case xt:h.depthFunc(h.EQUAL);break;case _t:h.depthFunc(h.GEQUAL);break;case St:h.depthFunc(h.GREATER);break;case At:h.depthFunc(h.NOTEQUAL);break;default:h.depthFunc(h.LEQUAL)}else h.depthFunc(h.LEQUAL);r=t}},setLocked:function(t){e=t},setClear:function(t){n!==t&&(h.clearDepth(t),n=t)},reset:function(){e=!1,n=r=i=null}}},e=new function(){var e=!1,i=null,r=null,n=null,o=null,a=null,s=null,c=null,u=null;return{setTest:function(t){t?F(h.STENCIL_TEST):z(h.STENCIL_TEST)},setMask:function(t){i===t||e||(h.stencilMask(t),i=t)},setFunc:function(t,e,i){r===t&&n===e&&o===i||(h.stencilFunc(t,e,i),r=t,n=e,o=i)},setOp:function(t,e,i){a===t&&s===e&&c===i||(h.stencilOp(t,e,i),a=t,s=e,c=i)},setLocked:function(t){e=t},setClear:function(t){u!==t&&(h.clearStencil(t),u=t)},reset:function(){e=!1,u=c=s=a=o=n=r=i=null}}},t=h.getParameter(h.MAX_VERTEX_ATTRIBS),a=new Uint8Array(t),s=new Uint8Array(t),u=new Uint8Array(t),l={},p=null,d=null,f=null,m=null,g=null,v=null,y=null,b=null,x=null,_=!1,w=null,S=null,A=null,M=null,E=null,P=h.getParameter(h.MAX_COMBINED_TEXTURE_IMAGE_UNITS),T=!1,C=0,I=h.getParameter(h.VERSION);-1!==I.indexOf("WebGL")?(C=parseFloat(/^WebGL\ ([0-9])/.exec(I)[1]),T=1<=C):-1!==I.indexOf("OpenGL ES")&&(C=parseFloat(/^OpenGL\ ES\ ([0-9])/.exec(I)[1]),T=2<=C);var O=null,L={},R=new Si,D=new Si;function k(t,e,i){var r=new Uint8Array(4),n=h.createTexture();h.bindTexture(t,n),h.texParameteri(t,h.TEXTURE_MIN_FILTER,h.NEAREST),h.texParameteri(t,h.TEXTURE_MAG_FILTER,h.NEAREST);for(var o=0;o<i;o++)h.texImage2D(e+o,0,h.RGBA,1,1,0,h.RGBA,h.UNSIGNED_BYTE,r);return n}var B={};function N(t,e){(a[t]=1,0===s[t]&&(h.enableVertexAttribArray(t),s[t]=1),u[t]!==e)&&((r.isWebGL2?h:i.get("ANGLE_instanced_arrays"))[r.isWebGL2?"vertexAttribDivisor":"vertexAttribDivisorANGLE"](t,e),u[t]=e)}function F(t){!0!==l[t]&&(h.enable(t),l[t]=!0)}function z(t){!1!==l[t]&&(h.disable(t),l[t]=!1)}function U(t,e,i,r,n,o,a,s){if(t!==q?F(h.BLEND):z(h.BLEND),t!==Q){if(t!==f||s!==_)switch(t){case Z:s?(h.blendEquationSeparate(h.FUNC_ADD,h.FUNC_ADD),h.blendFuncSeparate(h.ONE,h.ONE,h.ONE,h.ONE)):(h.blendEquation(h.FUNC_ADD),h.blendFunc(h.SRC_ALPHA,h.ONE));break;case K:s?(h.blendEquationSeparate(h.FUNC_ADD,h.FUNC_ADD),h.blendFuncSeparate(h.ZERO,h.ZERO,h.ONE_MINUS_SRC_COLOR,h.ONE_MINUS_SRC_ALPHA)):(h.blendEquation(h.FUNC_ADD),h.blendFunc(h.ZERO,h.ONE_MINUS_SRC_COLOR));break;case J:s?(h.blendEquationSeparate(h.FUNC_ADD,h.FUNC_ADD),h.blendFuncSeparate(h.ZERO,h.SRC_COLOR,h.ZERO,h.SRC_ALPHA)):(h.blendEquation(h.FUNC_ADD),h.blendFunc(h.ZERO,h.SRC_COLOR));break;default:s?(h.blendEquationSeparate(h.FUNC_ADD,h.FUNC_ADD),h.blendFuncSeparate(h.ONE,h.ONE_MINUS_SRC_ALPHA,h.ONE,h.ONE_MINUS_SRC_ALPHA)):(h.blendEquationSeparate(h.FUNC_ADD,h.FUNC_ADD),h.blendFuncSeparate(h.SRC_ALPHA,h.ONE_MINUS_SRC_ALPHA,h.ONE,h.ONE_MINUS_SRC_ALPHA))}x=b=y=v=g=m=null}else n=n||e,o=o||i,a=a||r,e===m&&n===y||(h.blendEquationSeparate(c.convert(e),c.convert(n)),m=e,y=n),i===g&&r===v&&o===b&&a===x||(h.blendFuncSeparate(c.convert(i),c.convert(r),c.convert(o),c.convert(a)),g=i,v=r,b=o,x=a);f=t,_=s}function j(t){w!==t&&(t?h.frontFace(h.CW):h.frontFace(h.CCW),w=t)}function G(t){t!==$?(F(h.CULL_FACE),t!==S&&(t===W?h.cullFace(h.BACK):t===X?h.cullFace(h.FRONT):h.cullFace(h.FRONT_AND_BACK))):z(h.CULL_FACE),S=t}function V(t,e,i){t?(F(h.POLYGON_OFFSET_FILL),M===e&&E===i||(h.polygonOffset(e,i),M=e,E=i)):z(h.POLYGON_OFFSET_FILL)}function H(t){void 0===t&&(t=h.TEXTURE0+P-1),O!==t&&(h.activeTexture(t),O=t)}return B[h.TEXTURE_2D]=k(h.TEXTURE_2D,h.TEXTURE_2D,1),B[h.TEXTURE_CUBE_MAP]=k(h.TEXTURE_CUBE_MAP,h.TEXTURE_CUBE_MAP_POSITIVE_X,6),n.setClear(0,0,0,1),o.setClear(1),e.setClear(0),F(h.DEPTH_TEST),o.setFunc(bt),j(!1),G(W),F(h.CULL_FACE),F(h.BLEND),U(Y),{buffers:{color:n,depth:o,stencil:e},initAttributes:function(){for(var t=0,e=a.length;t<e;t++)a[t]=0},enableAttribute:function(t){N(t,0)},enableAttributeAndDivisor:N,disableUnusedAttributes:function(){for(var t=0,e=s.length;t!==e;++t)s[t]!==a[t]&&(h.disableVertexAttribArray(t),s[t]=0)},enable:F,disable:z,getCompressedTextureFormats:function(){if(null===p&&(p=[],i.get("WEBGL_compressed_texture_pvrtc")||i.get("WEBGL_compressed_texture_s3tc")||i.get("WEBGL_compressed_texture_etc1")||i.get("WEBGL_compressed_texture_astc")))for(var t=h.getParameter(h.COMPRESSED_TEXTURE_FORMATS),e=0;e<t.length;e++)p.push(t[e]);return p},useProgram:function(t){return d!==t&&(h.useProgram(t),d=t,!0)},setBlending:U,setMaterial:function(t,e){t.side===et?z(h.CULL_FACE):F(h.CULL_FACE);var i=t.side===wt;e&&(i=!i),j(i),t.blending===Y&&!1===t.transparent?U(q):U(t.blending,t.blendEquation,t.blendSrc,t.blendDst,t.blendEquationAlpha,t.blendSrcAlpha,t.blendDstAlpha,t.premultipliedAlpha),o.setFunc(t.depthFunc),o.setTest(t.depthTest),o.setMask(t.depthWrite),n.setMask(t.colorWrite),V(t.polygonOffset,t.polygonOffsetFactor,t.polygonOffsetUnits)},setFlipSided:j,setCullFace:G,setLineWidth:function(t){t!==A&&(T&&h.lineWidth(t),A=t)},setPolygonOffset:V,setScissorTest:function(t){t?F(h.SCISSOR_TEST):z(h.SCISSOR_TEST)},activeTexture:H,bindTexture:function(t,e){null===O&&H();var i=L[O];void 0===i&&(i={type:void 0,texture:void 0},L[O]=i),i.type===t&&i.texture===e||(h.bindTexture(t,e||B[t]),i.type=t,i.texture=e)},compressedTexImage2D:function(){try{h.compressedTexImage2D.apply(h,arguments)}catch(t){console.error("THREE.WebGLState:",t)}},texImage2D:function(){try{h.texImage2D.apply(h,arguments)}catch(t){console.error("THREE.WebGLState:",t)}},scissor:function(t){!1===R.equals(t)&&(h.scissor(t.x,t.y,t.z,t.w),R.copy(t))},viewport:function(t){!1===D.equals(t)&&(h.viewport(t.x,t.y,t.z,t.w),D.copy(t))},reset:function(){for(var t=0;t<s.length;t++)1===s[t]&&(h.disableVertexAttribArray(t),s[t]=0);l={},L={},S=w=f=d=O=p=null,n.reset(),o.reset(),e.reset()}}}function ga(g,n,v,y,b,x,_){var f,s={};function w(t,e){if(t.width>e||t.height>e){if("data"in t)return void console.warn("THREE.WebGLRenderer: image in DataTexture is too big ("+t.width+"x"+t.height+").");var i=e/Math.max(t.width,t.height),r=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");return r.width=Math.floor(t.width*i),r.height=Math.floor(t.height*i),r.getContext("2d").drawImage(t,0,0,t.width,t.height,0,0,r.width,r.height),console.warn("THREE.WebGLRenderer: image is too big ("+t.width+"x"+t.height+"). Resized to "+r.width+"x"+r.height),r}return t}function S(t){return Qe.isPowerOfTwo(t.width)&&Qe.isPowerOfTwo(t.height)}function A(t,e){return t.generateMipmaps&&e&&t.minFilter!==Vt&&t.minFilter!==Wt}function M(t,e,i,r){g.generateMipmap(t),y.get(e).__maxMipLevel=Math.log(Math.max(i,r))*Math.LOG2E}function E(t,e){if(!b.isWebGL2)return t;if(t===g.RGB){if(e===g.FLOAT)return g.RGB32F;if(e===g.HALF_FLOAT)return g.RGB16F;if(e===g.UNSIGNED_BYTE)return g.RGB8}if(t===g.RGBA){if(e===g.FLOAT)return g.RGBA32F;if(e===g.HALF_FLOAT)return g.RGBA16F;if(e===g.UNSIGNED_BYTE)return g.RGBA8}return t}function o(t){return t===Vt||t===Ht||t===$t?g.NEAREST:g.LINEAR}function P(t){var e=t.target;e.removeEventListener("dispose",P),function(t){var e=y.get(t);if(t.image&&e.__image__webglTextureCube)g.deleteTexture(e.__image__webglTextureCube);else{if(void 0===e.__webglInit)return;g.deleteTexture(e.__webglTexture)}y.remove(t)}(e),e.isVideoTexture&&delete s[e.id],_.memory.textures--}function a(t){var e=t.target;e.removeEventListener("dispose",a),function(t){var e=y.get(t),i=y.get(t.texture);if(!t)return;void 0!==i.__webglTexture&&g.deleteTexture(i.__webglTexture);t.depthTexture&&t.depthTexture.dispose();if(t.isWebGLRenderTargetCube)for(var r=0;r<6;r++)g.deleteFramebuffer(e.__webglFramebuffer[r]),e.__webglDepthbuffer&&g.deleteRenderbuffer(e.__webglDepthbuffer[r]);else g.deleteFramebuffer(e.__webglFramebuffer),e.__webglDepthbuffer&&g.deleteRenderbuffer(e.__webglDepthbuffer);y.remove(t.texture),y.remove(t)}(e),_.memory.textures--}function c(t,e){var i,r,n,o=y.get(t);if(t.isVideoTexture&&(r=(i=t).id,n=_.render.frame,s[r]!==n&&(s[r]=n,i.update())),0<t.version&&o.__version!==t.version){var a=t.image;if(void 0===a)console.warn("THREE.WebGLRenderer: Texture marked for update but image is undefined");else{if(!1!==a.complete)return void function(t,e,i){void 0===t.__webglInit&&(t.__webglInit=!0,e.addEventListener("dispose",P),t.__webglTexture=g.createTexture(),_.memory.textures++);v.activeTexture(g.TEXTURE0+i),v.bindTexture(g.TEXTURE_2D,t.__webglTexture),g.pixelStorei(g.UNPACK_FLIP_Y_WEBGL,e.flipY),g.pixelStorei(g.UNPACK_PREMULTIPLY_ALPHA_WEBGL,e.premultiplyAlpha),g.pixelStorei(g.UNPACK_ALIGNMENT,e.unpackAlignment);var r=w(e.image,b.maxTextureSize);o=e,b.isWebGL2||o.wrapS===jt&&o.wrapT===jt&&(o.minFilter===Vt||o.minFilter===Wt)||!1!==S(r)||(r=(n=r)instanceof HTMLImageElement||n instanceof HTMLCanvasElement||n instanceof ImageBitmap?(void 0===f&&(f=document.createElementNS("http://www.w3.org/1999/xhtml","canvas")),f.width=Qe.floorPowerOfTwo(n.width),f.height=Qe.floorPowerOfTwo(n.height),f.getContext("2d").drawImage(n,0,0,f.width,f.height),console.warn("THREE.WebGLRenderer: image is not power of two ("+n.width+"x"+n.height+"). Resized to "+f.width+"x"+f.height),f):n);var n;var o;var a=S(r),s=x.convert(e.format),c=x.convert(e.type),u=E(s,c);T(g.TEXTURE_2D,e,a);var h,l=e.mipmaps;if(e.isDepthTexture){if(u=g.DEPTH_COMPONENT,e.type===ee){if(!b.isWebGL2)throw new Error("Float Depth Texture only supported in WebGL2.0");u=g.DEPTH_COMPONENT32F}else b.isWebGL2&&(u=g.DEPTH_COMPONENT16);e.format===pe&&u===g.DEPTH_COMPONENT&&e.type!==Jt&&e.type!==te&&(console.warn("THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture."),e.type=Jt,c=x.convert(e.type)),e.format===fe&&(u=g.DEPTH_STENCIL,e.type!==ae&&(console.warn("THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture."),e.type=ae,c=x.convert(e.type))),v.texImage2D(g.TEXTURE_2D,0,u,r.width,r.height,0,s,c,null)}else if(e.isDataTexture)if(0<l.length&&a){for(var p=0,d=l.length;p<d;p++)h=l[p],v.texImage2D(g.TEXTURE_2D,p,u,h.width,h.height,0,s,c,h.data);e.generateMipmaps=!1,t.__maxMipLevel=l.length-1}else v.texImage2D(g.TEXTURE_2D,0,u,r.width,r.height,0,s,c,r.data),t.__maxMipLevel=0;else if(e.isCompressedTexture){for(var p=0,d=l.length;p<d;p++)h=l[p],e.format!==ue&&e.format!==ce?-1<v.getCompressedTextureFormats().indexOf(s)?v.compressedTexImage2D(g.TEXTURE_2D,p,u,h.width,h.height,0,h.data):console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()"):v.texImage2D(g.TEXTURE_2D,p,u,h.width,h.height,0,s,c,h.data);t.__maxMipLevel=l.length-1}else if(0<l.length&&a){for(var p=0,d=l.length;p<d;p++)h=l[p],v.texImage2D(g.TEXTURE_2D,p,u,s,c,h);e.generateMipmaps=!1,t.__maxMipLevel=l.length-1}else v.texImage2D(g.TEXTURE_2D,0,u,s,c,r),t.__maxMipLevel=0;A(e,a)&&M(g.TEXTURE_2D,e,r.width,r.height);t.__version=e.version,e.onUpdate&&e.onUpdate(e)}(o,t,e);console.warn("THREE.WebGLRenderer: Texture marked for update but image is incomplete")}}v.activeTexture(g.TEXTURE0+e),v.bindTexture(g.TEXTURE_2D,o.__webglTexture)}function T(t,e,i){var r;if(i?(g.texParameteri(t,g.TEXTURE_WRAP_S,x.convert(e.wrapS)),g.texParameteri(t,g.TEXTURE_WRAP_T,x.convert(e.wrapT)),g.texParameteri(t,g.TEXTURE_MAG_FILTER,x.convert(e.magFilter)),g.texParameteri(t,g.TEXTURE_MIN_FILTER,x.convert(e.minFilter))):(g.texParameteri(t,g.TEXTURE_WRAP_S,g.CLAMP_TO_EDGE),g.texParameteri(t,g.TEXTURE_WRAP_T,g.CLAMP_TO_EDGE),e.wrapS===jt&&e.wrapT===jt||console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping."),g.texParameteri(t,g.TEXTURE_MAG_FILTER,o(e.magFilter)),g.texParameteri(t,g.TEXTURE_MIN_FILTER,o(e.minFilter)),e.minFilter!==Vt&&e.minFilter!==Wt&&console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.")),r=n.get("EXT_texture_filter_anisotropic")){if(e.type===ee&&null===n.get("OES_texture_float_linear"))return;if(e.type===ie&&null===(b.isWebGL2||n.get("OES_texture_half_float_linear")))return;(1<e.anisotropy||y.get(e).__currentAnisotropy)&&(g.texParameterf(t,r.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(e.anisotropy,b.getMaxAnisotropy())),y.get(e).__currentAnisotropy=e.anisotropy)}}function u(t,e,i,r){var n=x.convert(e.texture.format),o=x.convert(e.texture.type),a=E(n,o);v.texImage2D(r,0,a,e.width,e.height,0,n,o,null),g.bindFramebuffer(g.FRAMEBUFFER,t),g.framebufferTexture2D(g.FRAMEBUFFER,i,r,y.get(e.texture).__webglTexture,0),g.bindFramebuffer(g.FRAMEBUFFER,null)}function h(t,e){g.bindRenderbuffer(g.RENDERBUFFER,t),e.depthBuffer&&!e.stencilBuffer?(g.renderbufferStorage(g.RENDERBUFFER,g.DEPTH_COMPONENT16,e.width,e.height),g.framebufferRenderbuffer(g.FRAMEBUFFER,g.DEPTH_ATTACHMENT,g.RENDERBUFFER,t)):e.depthBuffer&&e.stencilBuffer?(g.renderbufferStorage(g.RENDERBUFFER,g.DEPTH_STENCIL,e.width,e.height),g.framebufferRenderbuffer(g.FRAMEBUFFER,g.DEPTH_STENCIL_ATTACHMENT,g.RENDERBUFFER,t)):g.renderbufferStorage(g.RENDERBUFFER,g.RGBA4,e.width,e.height),g.bindRenderbuffer(g.RENDERBUFFER,null)}function l(t){var e=y.get(t),i=!0===t.isWebGLRenderTargetCube;if(t.depthTexture){if(i)throw new Error("target.depthTexture not supported in Cube render targets");!function(t,e){if(e&&e.isWebGLRenderTargetCube)throw new Error("Depth Texture with cube render targets is not supported");if(g.bindFramebuffer(g.FRAMEBUFFER,t),!e.depthTexture||!e.depthTexture.isDepthTexture)throw new Error("renderTarget.depthTexture must be an instance of THREE.DepthTexture");y.get(e.depthTexture).__webglTexture&&e.depthTexture.image.width===e.width&&e.depthTexture.image.height===e.height||(e.depthTexture.image.width=e.width,e.depthTexture.image.height=e.height,e.depthTexture.needsUpdate=!0),c(e.depthTexture,0);var i=y.get(e.depthTexture).__webglTexture;if(e.depthTexture.format===pe)g.framebufferTexture2D(g.FRAMEBUFFER,g.DEPTH_ATTACHMENT,g.TEXTURE_2D,i,0);else{if(e.depthTexture.format!==fe)throw new Error("Unknown depthTexture format");g.framebufferTexture2D(g.FRAMEBUFFER,g.DEPTH_STENCIL_ATTACHMENT,g.TEXTURE_2D,i,0)}}(e.__webglFramebuffer,t)}else if(i){e.__webglDepthbuffer=[];for(var r=0;r<6;r++)g.bindFramebuffer(g.FRAMEBUFFER,e.__webglFramebuffer[r]),e.__webglDepthbuffer[r]=g.createRenderbuffer(),h(e.__webglDepthbuffer[r],t)}else g.bindFramebuffer(g.FRAMEBUFFER,e.__webglFramebuffer),e.__webglDepthbuffer=g.createRenderbuffer(),h(e.__webglDepthbuffer,t);g.bindFramebuffer(g.FRAMEBUFFER,null)}this.setTexture2D=c,this.setTextureCube=function(t,e){var i=y.get(t);if(6===t.image.length)if(0<t.version&&i.__version!==t.version){i.__image__webglTextureCube||(t.addEventListener("dispose",P),i.__image__webglTextureCube=g.createTexture(),_.memory.textures++),v.activeTexture(g.TEXTURE0+e),v.bindTexture(g.TEXTURE_CUBE_MAP,i.__image__webglTextureCube),g.pixelStorei(g.UNPACK_FLIP_Y_WEBGL,t.flipY);for(var r=t&&t.isCompressedTexture,n=t.image[0]&&t.image[0].isDataTexture,o=[],a=0;a<6;a++)o[a]=r||n?n?t.image[a].image:t.image[a]:w(t.image[a],b.maxCubemapSize);var s=o[0],c=S(s),u=x.convert(t.format),h=x.convert(t.type),l=E(u,h);for(T(g.TEXTURE_CUBE_MAP,t,c),a=0;a<6;a++)if(r)for(var p,d=o[a].mipmaps,f=0,m=d.length;f<m;f++)p=d[f],t.format!==ue&&t.format!==ce?-1<v.getCompressedTextureFormats().indexOf(u)?v.compressedTexImage2D(g.TEXTURE_CUBE_MAP_POSITIVE_X+a,f,l,p.width,p.height,0,p.data):console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()"):v.texImage2D(g.TEXTURE_CUBE_MAP_POSITIVE_X+a,f,l,p.width,p.height,0,u,h,p.data);else n?v.texImage2D(g.TEXTURE_CUBE_MAP_POSITIVE_X+a,0,l,o[a].width,o[a].height,0,u,h,o[a].data):v.texImage2D(g.TEXTURE_CUBE_MAP_POSITIVE_X+a,0,l,u,h,o[a]);i.__maxMipLevel=r?d.length-1:0,A(t,c)&&M(g.TEXTURE_CUBE_MAP,t,s.width,s.height),i.__version=t.version,t.onUpdate&&t.onUpdate(t)}else v.activeTexture(g.TEXTURE0+e),v.bindTexture(g.TEXTURE_CUBE_MAP,i.__image__webglTextureCube)},this.setTextureCubeDynamic=function(t,e){v.activeTexture(g.TEXTURE0+e),v.bindTexture(g.TEXTURE_CUBE_MAP,y.get(t).__webglTexture)},this.setupRenderTarget=function(t){var e=y.get(t),i=y.get(t.texture);t.addEventListener("dispose",a),i.__webglTexture=g.createTexture(),_.memory.textures++;var r=!0===t.isWebGLRenderTargetCube,n=S(t);if(r){e.__webglFramebuffer=[];for(var o=0;o<6;o++)e.__webglFramebuffer[o]=g.createFramebuffer()}else e.__webglFramebuffer=g.createFramebuffer();if(r){for(v.bindTexture(g.TEXTURE_CUBE_MAP,i.__webglTexture),T(g.TEXTURE_CUBE_MAP,t.texture,n),o=0;o<6;o++)u(e.__webglFramebuffer[o],t,g.COLOR_ATTACHMENT0,g.TEXTURE_CUBE_MAP_POSITIVE_X+o);A(t.texture,n)&&M(g.TEXTURE_CUBE_MAP,t.texture,t.width,t.height),v.bindTexture(g.TEXTURE_CUBE_MAP,null)}else v.bindTexture(g.TEXTURE_2D,i.__webglTexture),T(g.TEXTURE_2D,t.texture,n),u(e.__webglFramebuffer,t,g.COLOR_ATTACHMENT0,g.TEXTURE_2D),A(t.texture,n)&&M(g.TEXTURE_2D,t.texture,t.width,t.height),v.bindTexture(g.TEXTURE_2D,null);t.depthBuffer&&l(t)},this.updateRenderTargetMipmap=function(t){var e=t.texture;if(A(e,S(t))){var i=t.isWebGLRenderTargetCube?g.TEXTURE_CUBE_MAP:g.TEXTURE_2D,r=y.get(e).__webglTexture;v.bindTexture(i,r),M(i,e,t.width,t.height),v.bindTexture(i,null)}}}function va(i,r,n){return{convert:function(t){var e;if(t===Ut)return i.REPEAT;if(t===jt)return i.CLAMP_TO_EDGE;if(t===Gt)return i.MIRRORED_REPEAT;if(t===Vt)return i.NEAREST;if(t===Ht)return i.NEAREST_MIPMAP_NEAREST;if(t===$t)return i.NEAREST_MIPMAP_LINEAR;if(t===Wt)return i.LINEAR;if(t===Xt)return i.LINEAR_MIPMAP_NEAREST;if(t===qt)return i.LINEAR_MIPMAP_LINEAR;if(t===Yt)return i.UNSIGNED_BYTE;if(t===re)return i.UNSIGNED_SHORT_4_4_4_4;if(t===ne)return i.UNSIGNED_SHORT_5_5_5_1;if(t===oe)return i.UNSIGNED_SHORT_5_6_5;if(t===Zt)return i.BYTE;if(t===Kt)return i.SHORT;if(t===Jt)return i.UNSIGNED_SHORT;if(t===Qt)return i.INT;if(t===te)return i.UNSIGNED_INT;if(t===ee)return i.FLOAT;if(t===ie){if(n.isWebGL2)return i.HALF_FLOAT;if(null!==(e=r.get("OES_texture_half_float")))return e.HALF_FLOAT_OES}if(t===se)return i.ALPHA;if(t===ce)return i.RGB;if(t===ue)return i.RGBA;if(t===he)return i.LUMINANCE;if(t===le)return i.LUMINANCE_ALPHA;if(t===pe)return i.DEPTH_COMPONENT;if(t===fe)return i.DEPTH_STENCIL;if(t===H)return i.FUNC_ADD;if(t===tt)return i.FUNC_SUBTRACT;if(t===it)return i.FUNC_REVERSE_SUBTRACT;if(t===ot)return i.ZERO;if(t===at)return i.ONE;if(t===st)return i.SRC_COLOR;if(t===ct)return i.ONE_MINUS_SRC_COLOR;if(t===ut)return i.SRC_ALPHA;if(t===ht)return i.ONE_MINUS_SRC_ALPHA;if(t===lt)return i.DST_ALPHA;if(t===pt)return i.ONE_MINUS_DST_ALPHA;if(t===dt)return i.DST_COLOR;if(t===ft)return i.ONE_MINUS_DST_COLOR;if(t===mt)return i.SRC_ALPHA_SATURATE;if((t===ge||t===ve||t===ye||t===be)&&null!==(e=r.get("WEBGL_compressed_texture_s3tc"))){if(t===ge)return e.COMPRESSED_RGB_S3TC_DXT1_EXT;if(t===ve)return e.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(t===ye)return e.COMPRESSED_RGBA_S3TC_DXT3_EXT;if(t===be)return e.COMPRESSED_RGBA_S3TC_DXT5_EXT}if((t===xe||t===_e||t===we||t===Se)&&null!==(e=r.get("WEBGL_compressed_texture_pvrtc"))){if(t===xe)return e.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;if(t===_e)return e.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;if(t===we)return e.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;if(t===Se)return e.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG}if(t===Ae&&null!==(e=r.get("WEBGL_compressed_texture_etc1")))return e.COMPRESSED_RGB_ETC1_WEBGL;if((t===Me||t===Ee||t===Pe||t===Te||t===Ce||t===Ie||t===Oe||t===Le||t===Re||t===De||t===ke||t===Be||t===Ne||t===Fe)&&null!==(e=r.get("WEBGL_compressed_texture_astc")))return t;if(t===rt||t===nt){if(n.isWebGL2){if(t===rt)return i.MIN;if(t===nt)return i.MAX}if(null!==(e=r.get("EXT_blend_minmax"))){if(t===rt)return e.MIN_EXT;if(t===nt)return e.MAX_EXT}}if(t===ae){if(n.isWebGL2)return i.UNSIGNED_INT_24_8;if(null!==(e=r.get("WEBGL_depth_texture")))return e.UNSIGNED_INT_24_8_WEBGL}return 0}}}function ya(){ur.call(this),this.type="Group"}function ba(t,e,i,r){hr.call(this),this.type="PerspectiveCamera",this.fov=void 0!==t?t:50,this.zoom=1,this.near=void 0!==i?i:.1,this.far=void 0!==r?r:2e3,this.focus=10,this.aspect=void 0!==e?e:1,this.view=null,this.filmGauge=35,this.filmOffset=0,this.updateProjectionMatrix()}function xa(t){ba.call(this),this.cameras=t||[]}function _a(r){var s=this,c=null,u=null,h=null,l=[],p=new ei,d=new ei;"undefined"!=typeof window&&"VRFrameData"in window&&(u=new window.VRFrameData,window.addEventListener("vrdisplaypresentchange",t,!1));var f=new ei,m=new ii,g=new ri,v=new ba;v.bounds=new Si(0,0,.5,1),v.layers.enable(1);var y=new ba;y.bounds=new Si(.5,0,.5,1),y.layers.enable(2);var n,o,b=new xa([v,y]);function a(){return null!==c&&!0===c.isPresenting}function t(){if(a()){var t=c.getEyeParameters("left"),e=t.renderWidth,i=t.renderHeight;o=r.getPixelRatio(),n=r.getSize(),r.setDrawingBufferSize(2*e,i,1),w.start()}else s.enabled&&(r.setDrawingBufferSize(n.width,n.height,o),w.stop())}b.layers.enable(1),b.layers.enable(2);var x=[];function _(t){for(var e=navigator.getGamepads&&navigator.getGamepads(),i=0,r=0,n=e.length;i<n;i++){var o=e[i];if(o&&("Daydream Controller"===o.id||"Gear VR Controller"===o.id||"Oculus Go Controller"===o.id||"OpenVR Gamepad"===o.id||o.id.startsWith("Oculus Touch")||o.id.startsWith("Spatial Controller"))){if(r===t)return o;r++}}}this.enabled=!1,this.userHeight=1.6,this.getController=function(t){var e=l[t];return void 0===e&&((e=new ya).matrixAutoUpdate=!1,e.visible=!1,l[t]=e),e},this.getDevice=function(){return c},this.setDevice=function(t){void 0!==t&&(c=t),w.setContext(t)},this.setPoseTarget=function(t){void 0!==t&&(h=t)},this.getCamera=function(t){if(null===c)return t.position.set(0,s.userHeight,0),t;c.depthNear=t.near,c.depthFar=t.far,c.getFrameData(u);var e=c.stageParameters;e?p.fromArray(e.sittingToStandingTransform):p.makeTranslation(0,s.userHeight,0);var i=u.pose,r=null!==h?h:t;if(r.matrix.copy(p),r.matrix.decompose(r.position,r.quaternion,r.scale),null!==i.orientation&&(m.fromArray(i.orientation),r.quaternion.multiply(m)),null!==i.position&&(m.setFromRotationMatrix(p),g.fromArray(i.position),g.applyQuaternion(m),r.position.add(g)),r.updateMatrixWorld(),!1===c.isPresenting)return t;v.near=t.near,y.near=t.near,v.far=t.far,y.far=t.far,b.matrixWorld.copy(t.matrixWorld),b.matrixWorldInverse.copy(t.matrixWorldInverse),v.matrixWorldInverse.fromArray(u.leftViewMatrix),y.matrixWorldInverse.fromArray(u.rightViewMatrix),d.getInverse(p),v.matrixWorldInverse.multiply(d),y.matrixWorldInverse.multiply(d);var n=r.parent;null!==n&&(f.getInverse(n.matrixWorld),v.matrixWorldInverse.multiply(f),y.matrixWorldInverse.multiply(f)),v.matrixWorld.getInverse(v.matrixWorldInverse),y.matrixWorld.getInverse(y.matrixWorldInverse),v.projectionMatrix.fromArray(u.leftProjectionMatrix),y.projectionMatrix.fromArray(u.rightProjectionMatrix),b.projectionMatrix.copy(v.projectionMatrix);var o=c.getLayers();if(o.length){var a=o[0];null!==a.leftBounds&&4===a.leftBounds.length&&v.bounds.fromArray(a.leftBounds),null!==a.rightBounds&&4===a.rightBounds.length&&y.bounds.fromArray(a.rightBounds)}return function(){for(var t=0;t<l.length;t++){var e=l[t],i=_(t);if(void 0!==i&&void 0!==i.pose){if(null===i.pose)return;var r=i.pose;!1===r.hasPosition&&e.position.set(.2,-.6,-.05),null!==r.position&&e.position.fromArray(r.position),null!==r.orientation&&e.quaternion.fromArray(r.orientation),e.matrix.compose(e.position,e.quaternion,e.scale),e.matrix.premultiply(p),e.matrix.decompose(e.position,e.quaternion,e.scale),e.matrixWorldNeedsUpdate=!0,e.visible=!0;var n="Daydream Controller"===i.id?0:1;x[t]!==i.buttons[n].pressed&&(x[t]=i.buttons[n].pressed,!0===x[t]?e.dispatchEvent({type:"selectstart"}):(e.dispatchEvent({type:"selectend"}),e.dispatchEvent({type:"select"})))}else e.visible=!1}}(),b},this.getStandingMatrix=function(){return p},this.isPresenting=a;var w=new Ui;this.setAnimationLoop=function(t){w.setAnimationLoop(t)},this.submitFrame=function(){a()&&c.submitFrame()},this.dispose=function(){"undefined"!=typeof window&&window.removeEventListener("vrdisplaypresentchange",t)}}function wa(i){var r=i.context,e=null,p=null,d=null,f=null,m=[],g=[];function a(){return null!==p&&null!==d}var t=new ba;t.layers.enable(1),t.viewport=new Si;var n=new ba;n.layers.enable(2),n.viewport=new Si;var v=new xa([t,n]);function o(t){var e=m[g.indexOf(t.inputSource)];e&&e.dispatchEvent({type:t.type})}function s(){i.setFramebuffer(null),u.stop()}function c(t,e){null===e?t.matrixWorld.copy(t.matrix):t.matrixWorld.multiplyMatrices(e.matrixWorld,t.matrix),t.matrixWorldInverse.getInverse(t.matrixWorld)}v.layers.enable(1),v.layers.enable(2),this.enabled=!1,this.getController=function(t){var e=m[t];return void 0===e&&((e=new ya).matrixAutoUpdate=!1,e.visible=!1,m[t]=e),e},this.getDevice=function(){return e},this.setDevice=function(t){void 0!==t&&(e=t),t instanceof XRDevice&&r.setCompatibleXRDevice(t)},this.setSession=function(t,e){null!==(p=t)&&(p.addEventListener("select",o),p.addEventListener("selectstart",o),p.addEventListener("selectend",o),p.addEventListener("end",s),p.baseLayer=new XRWebGLLayer(p,r),p.requestFrameOfReference(e.frameOfReferenceType).then(function(t){d=t,i.setFramebuffer(p.baseLayer.framebuffer),u.setContext(p),u.start()}),g=p.getInputSources(),p.addEventListener("inputsourceschange",function(){g=p.getInputSources(),console.log(g)}))},this.getCamera=function(t){if(a()){var e=t.parent,i=v.cameras;c(v,e);for(var r=0;r<i.length;r++)c(i[r],e);t.matrixWorld.copy(v.matrixWorld);for(var n=t.children,o=(r=0,n.length);r<o;r++)n[r].updateMatrixWorld(!0);return v}return t},this.isPresenting=a;var y=null;var u=new Ui;u.setAnimationLoop(function(t,e){if(null!==(f=e.getDevicePose(d)))for(var i=p.baseLayer,r=e.views,n=0;n<r.length;n++){var o=r[n],a=i.getViewport(o),s=f.getViewMatrix(o),c=v.cameras[n];c.matrix.fromArray(s).getInverse(c.matrix),c.projectionMatrix.fromArray(o.projectionMatrix),c.viewport.set(a.x,a.y,a.width,a.height),0===n&&(v.matrix.copy(c.matrix),v.projectionMatrix.copy(c.projectionMatrix))}for(n=0;n<m.length;n++){var u=m[n],h=g[n];if(h){var l=e.getInputPose(h,d);if(null!==l){u.matrix.elements=l.pointerMatrix,u.matrix.decompose(u.position,u.rotation,u.scale),u.visible=!0;continue}}u.visible=!1}y&&y(t)}),this.setAnimationLoop=function(t){y=t},this.dispose=function(){},this.getStandingMatrix=function(){return console.warn("THREE.WebXRManager: getStandingMatrix() is no longer needed."),new THREE.Matrix4},this.submitFrame=function(){}}function Sa(t){console.log("THREE.WebGLRenderer","95");var r=void 0!==(t=t||{}).canvas?t.canvas:document.createElementNS("http://www.w3.org/1999/xhtml","canvas"),e=void 0!==t.context?t.context:null,i=void 0!==t.alpha&&t.alpha,n=void 0===t.depth||t.depth,o=void 0===t.stencil||t.stencil,a=void 0!==t.antialias&&t.antialias,s=void 0===t.premultipliedAlpha||t.premultipliedAlpha,c=void 0!==t.preserveDrawingBuffer&&t.preserveDrawingBuffer,u=void 0!==t.powerPreference?t.powerPreference:"default",d=null,j=null;this.domElement=r,this.context=null,this.autoClear=!0,this.autoClearColor=!0,this.autoClearDepth=!0,this.autoClearStencil=!0,this.sortObjects=!0,this.clippingPlanes=[],this.localClippingEnabled=!1,this.gammaFactor=2,this.gammaInput=!1,this.gammaOutput=!1,this.physicallyCorrectLights=!1,this.toneMapping=Ct,this.toneMappingExposure=1,this.toneMappingWhitePoint=1,this.maxMorphTargets=8,this.maxMorphNormals=4;var G,S,V,H,h,$,l,A,M,f,y,p,m,g,E,P,T,v,W=this,b=!1,x=null,_=null,w=null,X=-1,C={geometry:null,program:null,wireframe:!1},q=null,Y=null,I=new Si,O=new Si,L=null,Z=0,R=r.width,K=r.height,J=1,D=new Si(0,0,R,K),k=new Si(0,0,R,K),B=!1,N=new Ii,Q=new On,tt=!1,et=!1,F=new ei,it=new ri;function z(){return null===_?J:1}try{var U={alpha:i,depth:n,stencil:o,antialias:a,premultipliedAlpha:s,preserveDrawingBuffer:c,powerPreference:u};if(r.addEventListener("webglcontextlost",at,!1),r.addEventListener("webglcontextrestored",st,!1),null===(G=e||r.getContext("webgl",U)||r.getContext("experimental-webgl",U)))throw null!==r.getContext("webgl")?new Error("Error creating WebGL context with your selected attributes."):new Error("Error creating WebGL context.");void 0===G.getShaderPrecisionFormat&&(G.getShaderPrecisionFormat=function(){return{rangeMin:1,rangeMax:1,precision:1}})}catch(t){console.error("THREE.WebGLRenderer: "+t.message)}function rt(){S=new Ln(G),(V=new In(G,S,t)).isWebGL2||(S.get("WEBGL_depth_texture"),S.get("OES_texture_float"),S.get("OES_texture_half_float"),S.get("OES_texture_half_float_linear"),S.get("OES_standard_derivatives"),S.get("OES_element_index_uint"),S.get("ANGLE_instanced_arrays")),S.get("OES_texture_float_linear"),v=new va(G,S,V),(H=new ma(G,S,v,V)).scissor(O.copy(k).multiplyScalar(J)),H.viewport(I.copy(D).multiplyScalar(J)),h=new kn(G),$=new Uo,l=new ga(G,S,H,$,V,v,h),A=new ji(G),M=new Rn(G,A,h),f=new Fn(M,h),E=new Nn(G),y=new zo(W,S,V),p=new Ho,m=new la,g=new Tn(W,H,f,s),P=new Cn(G,S,h,V),T=new Dn(G,S,h,V),h.programs=y.programs,W.context=G,W.capabilities=V,W.extensions=S,W.properties=$,W.renderLists=p,W.state=H,W.info=h}rt();var nt="xr"in navigator?new wa(W):new _a(W);this.vr=nt;var ot=new fa(W,f,V.maxTextureSize);function at(t){t.preventDefault(),console.log("THREE.WebGLRenderer: Context Lost."),b=!0}function st(){console.log("THREE.WebGLRenderer: Context Restored."),b=!1,rt()}function ct(t){var e,i=t.target;i.removeEventListener("dispose",ct),ut(e=i),$.remove(e)}function ut(t){var e=$.get(t).program;(t.program=void 0)!==e&&y.releaseProgram(e)}this.shadowMap=ot,this.getContext=function(){return G},this.getContextAttributes=function(){return G.getContextAttributes()},this.forceContextLoss=function(){var t=S.get("WEBGL_lose_context");t&&t.loseContext()},this.forceContextRestore=function(){var t=S.get("WEBGL_lose_context");t&&t.restoreContext()},this.getPixelRatio=function(){return J},this.setPixelRatio=function(t){void 0!==t&&(J=t,this.setSize(R,K,!1))},this.getSize=function(){return{width:R,height:K}},this.setSize=function(t,e,i){nt.isPresenting()?console.warn("THREE.WebGLRenderer: Can't change size while VR device is presenting."):(R=t,K=e,r.width=t*J,r.height=e*J,!1!==i&&(r.style.width=t+"px",r.style.height=e+"px"),this.setViewport(0,0,t,e))},this.getDrawingBufferSize=function(){return{width:R*J,height:K*J}},this.setDrawingBufferSize=function(t,e,i){R=t,K=e,J=i,r.width=t*i,r.height=e*i,this.setViewport(0,0,t,e)},this.getCurrentViewport=function(){return I},this.setViewport=function(t,e,i,r){D.set(t,K-e-r,i,r),H.viewport(I.copy(D).multiplyScalar(J))},this.setScissor=function(t,e,i,r){k.set(t,K-e-r,i,r),H.scissor(O.copy(k).multiplyScalar(J))},this.setScissorTest=function(t){H.setScissorTest(B=t)},this.getClearColor=function(){return g.getClearColor()},this.setClearColor=function(){g.setClearColor.apply(g,arguments)},this.getClearAlpha=function(){return g.getClearAlpha()},this.setClearAlpha=function(){g.setClearAlpha.apply(g,arguments)},this.clear=function(t,e,i){var r=0;(void 0===t||t)&&(r|=G.COLOR_BUFFER_BIT),(void 0===e||e)&&(r|=G.DEPTH_BUFFER_BIT),(void 0===i||i)&&(r|=G.STENCIL_BUFFER_BIT),G.clear(r)},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(t,e,i,r){this.setRenderTarget(t),this.clear(e,i,r)},this.dispose=function(){r.removeEventListener("webglcontextlost",at,!1),r.removeEventListener("webglcontextrestored",st,!1),p.dispose(),m.dispose(),$.dispose(),f.dispose(),nt.dispose(),ft.stop()},this.renderBufferImmediate=function(t,e){H.initAttributes();var i=$.get(t);t.hasPositions&&!i.position&&(i.position=G.createBuffer()),t.hasNormals&&!i.normal&&(i.normal=G.createBuffer()),t.hasUvs&&!i.uv&&(i.uv=G.createBuffer()),t.hasColors&&!i.color&&(i.color=G.createBuffer());var r=e.getAttributes();t.hasPositions&&(G.bindBuffer(G.ARRAY_BUFFER,i.position),G.bufferData(G.ARRAY_BUFFER,t.positionArray,G.DYNAMIC_DRAW),H.enableAttribute(r.position),G.vertexAttribPointer(r.position,3,G.FLOAT,!1,0,0)),t.hasNormals&&(G.bindBuffer(G.ARRAY_BUFFER,i.normal),G.bufferData(G.ARRAY_BUFFER,t.normalArray,G.DYNAMIC_DRAW),H.enableAttribute(r.normal),G.vertexAttribPointer(r.normal,3,G.FLOAT,!1,0,0)),t.hasUvs&&(G.bindBuffer(G.ARRAY_BUFFER,i.uv),G.bufferData(G.ARRAY_BUFFER,t.uvArray,G.DYNAMIC_DRAW),H.enableAttribute(r.uv),G.vertexAttribPointer(r.uv,2,G.FLOAT,!1,0,0)),t.hasColors&&(G.bindBuffer(G.ARRAY_BUFFER,i.color),G.bufferData(G.ARRAY_BUFFER,t.colorArray,G.DYNAMIC_DRAW),H.enableAttribute(r.color),G.vertexAttribPointer(r.color,3,G.FLOAT,!1,0,0)),H.disableUnusedAttributes(),G.drawArrays(G.TRIANGLES,0,t.count),t.count=0},this.renderBufferDirect=function(t,e,i,r,n,o){var a=n.isMesh&&n.normalMatrix.determinant()<0;H.setMaterial(r,a);var s=yt(t,e,r,n),c=!1;C.geometry===i.id&&C.program===s.id&&C.wireframe===(!0===r.wireframe)||(C.geometry=i.id,C.program=s.id,C.wireframe=!0===r.wireframe,c=!0),n.morphTargetInfluences&&(E.update(n,i,r,s),c=!0);var u,h=i.index,l=i.attributes.position,p=1;!0===r.wireframe&&(h=M.getWireframeAttribute(i),p=2);var d=P;null!==h&&(u=A.get(h),(d=T).setIndex(u)),c&&(!function(t,e,i){if(i&&i.isInstancedBufferGeometry&!V.isWebGL2&&null===S.get("ANGLE_instanced_arrays"))return console.error("THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");H.initAttributes();var r=i.attributes,n=e.getAttributes(),o=t.defaultAttributeValues;for(var a in n){var s=n[a];if(0<=s){var c=r[a];if(void 0!==c){var u=c.normalized,h=c.itemSize,l=A.get(c);if(void 0===l)continue;var p=l.buffer,d=l.type,f=l.bytesPerElement;if(c.isInterleavedBufferAttribute){var m=c.data,g=m.stride,v=c.offset;m&&m.isInstancedInterleavedBuffer?(H.enableAttributeAndDivisor(s,m.meshPerAttribute),void 0===i.maxInstancedCount&&(i.maxInstancedCount=m.meshPerAttribute*m.count)):H.enableAttribute(s),G.bindBuffer(G.ARRAY_BUFFER,p),G.vertexAttribPointer(s,h,d,u,g*f,v*f)}else c.isInstancedBufferAttribute?(H.enableAttributeAndDivisor(s,c.meshPerAttribute),void 0===i.maxInstancedCount&&(i.maxInstancedCount=c.meshPerAttribute*c.count)):H.enableAttribute(s),G.bindBuffer(G.ARRAY_BUFFER,p),G.vertexAttribPointer(s,h,d,u,0,0)}else if(void 0!==o){var y=o[a];if(void 0!==y)switch(y.length){case 2:G.vertexAttrib2fv(s,y);break;case 3:G.vertexAttrib3fv(s,y);break;case 4:G.vertexAttrib4fv(s,y);break;default:G.vertexAttrib1fv(s,y)}}}}H.disableUnusedAttributes()}(r,s,i),null!==h&&G.bindBuffer(G.ELEMENT_ARRAY_BUFFER,u.buffer));var f=1/0;null!==h?f=h.count:void 0!==l&&(f=l.count);var m=i.drawRange.start*p,g=i.drawRange.count*p,v=null!==o?o.start*p:0,y=null!==o?o.count*p:1/0,b=Math.max(m,v),x=Math.min(f,m+g,v+y)-1,_=Math.max(0,x-b+1);if(0!==_){if(n.isMesh)if(!0===r.wireframe)H.setLineWidth(r.wireframeLinewidth*z()),d.setMode(G.LINES);else switch(n.drawMode){case je:d.setMode(G.TRIANGLES);break;case 1:d.setMode(G.TRIANGLE_STRIP);break;case 2:d.setMode(G.TRIANGLE_FAN)}else if(n.isLine){var w=r.linewidth;void 0===w&&(w=1),H.setLineWidth(w*z()),n.isLineSegments?d.setMode(G.LINES):n.isLineLoop?d.setMode(G.LINE_LOOP):d.setMode(G.LINE_STRIP)}else n.isPoints?d.setMode(G.POINTS):n.isSprite&&d.setMode(G.TRIANGLES);i&&i.isInstancedBufferGeometry?0<i.maxInstancedCount&&d.renderInstances(i,b,_):d.render(b,_)}},this.compile=function(i,t){(j=m.get(i,t)).init(),i.traverse(function(t){t.isLight&&(j.pushLight(t),t.castShadow&&j.pushShadow(t))}),j.setupLights(t),i.traverse(function(t){if(t.material)if(Array.isArray(t.material))for(var e=0;e<t.material.length;e++)vt(t.material[e],i.fog,t);else vt(t.material,i.fog,t)})};var ht=null;var lt,pt,dt,ft=new Ui;function mt(t,e,i,r){for(var n=0,o=t.length;n<o;n++){var a=t[n],s=a.object,c=a.geometry,u=void 0===r?a.material:r,h=a.group;if(i.isArrayCamera)for(var l=(Y=i).cameras,p=0,d=l.length;p<d;p++){var f=l[p];if(s.layers.test(f.layers)){if("viewport"in f)H.viewport(I.copy(f.viewport));else{var m=f.bounds,g=m.x*R,v=m.y*K,y=m.z*R,b=m.w*K;H.viewport(I.set(g,v,y,b).multiplyScalar(J))}gt(s,e,f,c,u,h)}}else Y=null,gt(s,e,i,c,u,h)}}function gt(t,e,i,r,n,o){if(t.onBeforeRender(W,e,i,r,n,o),j=m.get(e,Y||i),t.modelViewMatrix.multiplyMatrices(i.matrixWorldInverse,t.matrixWorld),t.normalMatrix.getNormalMatrix(t.modelViewMatrix),t.isImmediateRenderObject){H.setMaterial(n);var a=yt(i,e.fog,n,t);C.geometry=null,C.program=null,C.wireframe=!1,s=a,t.render(function(t){W.renderBufferImmediate(t,s)})}else W.renderBufferDirect(i,e.fog,r,n,t,o);var s;t.onAfterRender(W,e,i,r,n,o),j=m.get(e,Y||i)}function vt(t,e,i){var r=$.get(t),n=j.state.lights,o=j.state.shadowsArray,a=r.lightsHash,s=n.state.hash,c=y.getParameters(t,n.state,o,e,Q.numPlanes,Q.numIntersection,i),u=y.getProgramCode(t,c),h=r.program,l=!0;if(void 0===h)t.addEventListener("dispose",ct);else if(h.code!==u)ut(t);else if(a.stateID!==s.stateID||a.directionalLength!==s.directionalLength||a.pointLength!==s.pointLength||a.spotLength!==s.spotLength||a.rectAreaLength!==s.rectAreaLength||a.hemiLength!==s.hemiLength||a.shadowsLength!==s.shadowsLength)a.stateID=s.stateID,a.directionalLength=s.directionalLength,a.pointLength=s.pointLength,a.spotLength=s.spotLength,a.rectAreaLength=s.rectAreaLength,a.hemiLength=s.hemiLength,a.shadowsLength=s.shadowsLength,l=!1;else{if(void 0!==c.shaderID)return;l=!1}if(l){if(c.shaderID){var p=zi[c.shaderID];r.shader={name:t.type,uniforms:Ri.clone(p.uniforms),vertexShader:p.vertexShader,fragmentShader:p.fragmentShader}}else r.shader={name:t.type,uniforms:t.uniforms,vertexShader:t.vertexShader,fragmentShader:t.fragmentShader};t.onBeforeCompile(r.shader,W),u=y.getProgramCode(t,c),h=y.acquireProgram(t,r.shader,c,u),r.program=h,t.program=h}var d=h.getAttributes();if(t.morphTargets)for(var f=t.numSupportedMorphTargets=0;f<W.maxMorphTargets;f++)0<=d["morphTarget"+f]&&t.numSupportedMorphTargets++;if(t.morphNormals)for(f=t.numSupportedMorphNormals=0;f<W.maxMorphNormals;f++)0<=d["morphNormal"+f]&&t.numSupportedMorphNormals++;var m=r.shader.uniforms;(t.isShaderMaterial||t.isRawShaderMaterial)&&!0!==t.clipping||(r.numClippingPlanes=Q.numPlanes,r.numIntersection=Q.numIntersection,m.clippingPlanes=Q.uniform),r.fog=e,void 0===a&&(r.lightsHash=a={}),a.stateID=s.stateID,a.directionalLength=s.directionalLength,a.pointLength=s.pointLength,a.spotLength=s.spotLength,a.rectAreaLength=s.rectAreaLength,a.hemiLength=s.hemiLength,a.shadowsLength=s.shadowsLength,t.lights&&(m.ambientLightColor.value=n.state.ambient,m.directionalLights.value=n.state.directional,m.spotLights.value=n.state.spot,m.rectAreaLights.value=n.state.rectArea,m.pointLights.value=n.state.point,m.hemisphereLights.value=n.state.hemi,m.directionalShadowMap.value=n.state.directionalShadowMap,m.directionalShadowMatrix.value=n.state.directionalShadowMatrix,m.spotShadowMap.value=n.state.spotShadowMap,m.spotShadowMatrix.value=n.state.spotShadowMatrix,m.pointShadowMap.value=n.state.pointShadowMap,m.pointShadowMatrix.value=n.state.pointShadowMatrix);var g=r.program.getUniforms(),v=To.seqWithValue(g.seq,m);r.uniformsList=v}function yt(t,e,i,r){Z=0;var n=$.get(i),o=j.state.lights,a=n.lightsHash,s=o.state.hash;if(tt&&(et||t!==q)){var c=t===q&&i.id===X;Q.setState(i.clippingPlanes,i.clipIntersection,i.clipShadows,t,n,c)}!1===i.needsUpdate&&(void 0===n.program?i.needsUpdate=!0:i.fog&&n.fog!==e?i.needsUpdate=!0:(!i.lights||a.stateID===s.stateID&&a.directionalLength===s.directionalLength&&a.pointLength===s.pointLength&&a.spotLength===s.spotLength&&a.rectAreaLength===s.rectAreaLength&&a.hemiLength===s.hemiLength&&a.shadowsLength===s.shadowsLength)&&(void 0===n.numClippingPlanes||n.numClippingPlanes===Q.numPlanes&&n.numIntersection===Q.numIntersection)||(i.needsUpdate=!0)),i.needsUpdate&&(vt(i,e,r),i.needsUpdate=!1);var u,h,l,p,d,f,m,g,v,y,b,x,_,w,S,A,M,E,P,T,C=!1,I=!1,O=!1,L=n.program,R=L.getUniforms(),D=n.shader.uniforms;if(H.useProgram(L.program)&&(O=I=C=!0),i.id!==X&&(X=i.id,I=!0),C||t!==q){if(R.setValue(G,"projectionMatrix",t.projectionMatrix),V.logarithmicDepthBuffer&&R.setValue(G,"logDepthBufFC",2/(Math.log(t.far+1)/Math.LN2)),q!==(Y||t)&&(q=Y||t,O=I=!0),i.isShaderMaterial||i.isMeshPhongMaterial||i.isMeshStandardMaterial||i.envMap){var k=R.map.cameraPosition;void 0!==k&&k.setValue(G,it.setFromMatrixPosition(t.matrixWorld))}(i.isMeshPhongMaterial||i.isMeshLambertMaterial||i.isMeshBasicMaterial||i.isMeshStandardMaterial||i.isShaderMaterial||i.skinning)&&R.setValue(G,"viewMatrix",t.matrixWorldInverse)}if(i.skinning){R.setOptional(G,r,"bindMatrix"),R.setOptional(G,r,"bindMatrixInverse");var B=r.skeleton;if(B){var N=B.bones;if(V.floatVertexTextures){if(void 0===B.boneTexture){var F=Math.sqrt(4*N.length);F=Qe.ceilPowerOfTwo(F),F=Math.max(F,4);var z=new Float32Array(F*F*4);z.set(B.boneMatrices);var U=new Ei(z,F,F,ue,ee);U.needsUpdate=!0,B.boneMatrices=z,B.boneTexture=U,B.boneTextureSize=F}R.setValue(G,"boneTexture",B.boneTexture),R.setValue(G,"boneTextureSize",B.boneTextureSize)}else R.setOptional(G,B,"boneMatrices")}}return I&&(R.setValue(G,"toneMappingExposure",W.toneMappingExposure),R.setValue(G,"toneMappingWhitePoint",W.toneMappingWhitePoint),i.lights&&(T=O,(P=D).ambientLightColor.needsUpdate=T,P.directionalLights.needsUpdate=T,P.pointLights.needsUpdate=T,P.spotLights.needsUpdate=T,P.rectAreaLights.needsUpdate=T,P.hemisphereLights.needsUpdate=T),e&&i.fog&&(E=e,(M=D).fogColor.value=E.color,E.isFog?(M.fogNear.value=E.near,M.fogFar.value=E.far):E.isFogExp2&&(M.fogDensity.value=E.density)),i.isMeshBasicMaterial?bt(D,i):i.isMeshLambertMaterial?(bt(D,i),S=D,(A=i).emissiveMap&&(S.emissiveMap.value=A.emissiveMap)):i.isMeshPhongMaterial?(bt(D,i),i.isMeshToonMaterial?(xt(_=D,w=i),w.gradientMap&&(_.gradientMap.value=w.gradientMap)):xt(D,i)):i.isMeshStandardMaterial?(bt(D,i),i.isMeshPhysicalMaterial?(_t(b=D,x=i),b.reflectivity.value=x.reflectivity,b.clearCoat.value=x.clearCoat,b.clearCoatRoughness.value=x.clearCoatRoughness):_t(D,i)):i.isMeshDepthMaterial?(bt(D,i),v=D,(y=i).displacementMap&&(v.displacementMap.value=y.displacementMap,v.displacementScale.value=y.displacementScale,v.displacementBias.value=y.displacementBias)):i.isMeshDistanceMaterial?(bt(D,i),function(t,e){e.displacementMap&&(t.displacementMap.value=e.displacementMap,t.displacementScale.value=e.displacementScale,t.displacementBias.value=e.displacementBias);t.referencePosition.value.copy(e.referencePosition),t.nearDistance.value=e.nearDistance,t.farDistance.value=e.farDistance}(D,i)):i.isMeshNormalMaterial?(bt(D,i),function(t,e){e.bumpMap&&(t.bumpMap.value=e.bumpMap,t.bumpScale.value=e.bumpScale,e.side===wt&&(t.bumpScale.value*=-1));e.normalMap&&(t.normalMap.value=e.normalMap,t.normalScale.value.copy(e.normalScale),e.side===wt&&t.normalScale.value.negate());e.displacementMap&&(t.displacementMap.value=e.displacementMap,t.displacementScale.value=e.displacementScale,t.displacementBias.value=e.displacementBias)}(D,i)):i.isLineBasicMaterial?(g=i,(m=D).diffuse.value=g.color,m.opacity.value=g.opacity,i.isLineDashedMaterial&&(f=i,(d=D).dashSize.value=f.dashSize,d.totalSize.value=f.dashSize+f.gapSize,d.scale.value=f.scale)):i.isPointsMaterial?(p=i,(l=D).diffuse.value=p.color,l.opacity.value=p.opacity,l.size.value=p.size*J,l.scale.value=.5*K,l.map.value=p.map,null!==p.map&&(!0===p.map.matrixAutoUpdate&&p.map.updateMatrix(),l.uvTransform.value.copy(p.map.matrix))):i.isSpriteMaterial?(h=i,(u=D).diffuse.value=h.color,u.opacity.value=h.opacity,u.rotation.value=h.rotation,u.map.value=h.map,null!==h.map&&(!0===h.map.matrixAutoUpdate&&h.map.updateMatrix(),u.uvTransform.value.copy(h.map.matrix))):i.isShadowMaterial&&(D.color.value=i.color,D.opacity.value=i.opacity),void 0!==D.ltc_1&&(D.ltc_1.value=Fi.LTC_1),void 0!==D.ltc_2&&(D.ltc_2.value=Fi.LTC_2),To.upload(G,n.uniformsList,D,W)),i.isShaderMaterial&&!0===i.uniformsNeedUpdate&&(To.upload(G,n.uniformsList,D,W),i.uniformsNeedUpdate=!1),i.isSpriteMaterial&&R.setValue(G,"center",r.center),R.setValue(G,"modelViewMatrix",r.modelViewMatrix),R.setValue(G,"normalMatrix",r.normalMatrix),R.setValue(G,"modelMatrix",r.matrixWorld),L}function bt(t,e){var i;t.opacity.value=e.opacity,e.color&&(t.diffuse.value=e.color),e.emissive&&t.emissive.value.copy(e.emissive).multiplyScalar(e.emissiveIntensity),e.map&&(t.map.value=e.map),e.alphaMap&&(t.alphaMap.value=e.alphaMap),e.specularMap&&(t.specularMap.value=e.specularMap),e.envMap&&(t.envMap.value=e.envMap,t.flipEnvMap.value=e.envMap&&e.envMap.isCubeTexture?-1:1,t.reflectivity.value=e.reflectivity,t.refractionRatio.value=e.refractionRatio,t.maxMipLevel.value=$.get(e.envMap).__maxMipLevel),e.lightMap&&(t.lightMap.value=e.lightMap,t.lightMapIntensity.value=e.lightMapIntensity),e.aoMap&&(t.aoMap.value=e.aoMap,t.aoMapIntensity.value=e.aoMapIntensity),e.map?i=e.map:e.specularMap?i=e.specularMap:e.displacementMap?i=e.displacementMap:e.normalMap?i=e.normalMap:e.bumpMap?i=e.bumpMap:e.roughnessMap?i=e.roughnessMap:e.metalnessMap?i=e.metalnessMap:e.alphaMap?i=e.alphaMap:e.emissiveMap&&(i=e.emissiveMap),void 0!==i&&(i.isWebGLRenderTarget&&(i=i.texture),!0===i.matrixAutoUpdate&&i.updateMatrix(),t.uvTransform.value.copy(i.matrix))}function xt(t,e){t.specular.value=e.specular,t.shininess.value=Math.max(e.shininess,1e-4),e.emissiveMap&&(t.emissiveMap.value=e.emissiveMap),e.bumpMap&&(t.bumpMap.value=e.bumpMap,t.bumpScale.value=e.bumpScale,e.side===wt&&(t.bumpScale.value*=-1)),e.normalMap&&(t.normalMap.value=e.normalMap,t.normalScale.value.copy(e.normalScale),e.side===wt&&t.normalScale.value.negate()),e.displacementMap&&(t.displacementMap.value=e.displacementMap,t.displacementScale.value=e.displacementScale,t.displacementBias.value=e.displacementBias)}function _t(t,e){t.roughness.value=e.roughness,t.metalness.value=e.metalness,e.roughnessMap&&(t.roughnessMap.value=e.roughnessMap),e.metalnessMap&&(t.metalnessMap.value=e.metalnessMap),e.emissiveMap&&(t.emissiveMap.value=e.emissiveMap),e.bumpMap&&(t.bumpMap.value=e.bumpMap,t.bumpScale.value=e.bumpScale,e.side===wt&&(t.bumpScale.value*=-1)),e.normalMap&&(t.normalMap.value=e.normalMap,t.normalScale.value.copy(e.normalScale),e.side===wt&&t.normalScale.value.negate()),e.displacementMap&&(t.displacementMap.value=e.displacementMap,t.displacementScale.value=e.displacementScale,t.displacementBias.value=e.displacementBias),e.envMap&&(t.envMapIntensity.value=e.envMapIntensity)}ft.setAnimationLoop(function(t){nt.isPresenting()||ht&&ht(t)}),"undefined"!=typeof window&&ft.setContext(window),this.setAnimationLoop=function(t){ht=t,nt.setAnimationLoop(t),ft.start()},this.render=function(t,e,i,r){if(e&&e.isCamera){if(!b){C.geometry=null,C.program=null,C.wireframe=!1,X=-1,!(q=null)===t.autoUpdate&&t.updateMatrixWorld(),null===e.parent&&e.updateMatrixWorld(),nt.enabled&&(e=nt.getCamera(e)),(j=m.get(t,e)).init(),t.onBeforeRender(W,t,e,i),F.multiplyMatrices(e.projectionMatrix,e.matrixWorldInverse),N.setFromMatrix(F),et=this.localClippingEnabled,tt=Q.init(this.clippingPlanes,et,e),(d=p.get(t,e)).init(),function t(e,i,r){if(!1===e.visible)return;var n=e.layers.test(i.layers);if(n)if(e.isLight)j.pushLight(e),e.castShadow&&j.pushShadow(e);else if(e.isSprite){if(!e.frustumCulled||N.intersectsSprite(e)){r&&it.setFromMatrixPosition(e.matrixWorld).applyMatrix4(F);var o=f.update(e),a=e.material;d.push(e,o,a,it.z,null)}}else if(e.isImmediateRenderObject)r&&it.setFromMatrixPosition(e.matrixWorld).applyMatrix4(F),d.push(e,null,e.material,it.z,null);else if((e.isMesh||e.isLine||e.isPoints)&&(e.isSkinnedMesh&&e.skeleton.update(),!e.frustumCulled||N.intersectsObject(e))){r&&it.setFromMatrixPosition(e.matrixWorld).applyMatrix4(F);var o=f.update(e),a=e.material;if(Array.isArray(a))for(var s=o.groups,c=0,u=s.length;c<u;c++){var h=s[c],l=a[h.materialIndex];l&&l.visible&&d.push(e,o,l,it.z,h)}else a.visible&&d.push(e,o,a,it.z,null)}var p=e.children;for(var c=0,u=p.length;c<u;c++)t(p[c],i,r)}(t,e,W.sortObjects),!0===W.sortObjects&&d.sort(),tt&&Q.beginShadows();var n=j.state.shadowsArray;ot.render(n,t,e),j.setupLights(e),tt&&Q.endShadows(),this.info.autoReset&&this.info.reset(),void 0===i&&(i=null),this.setRenderTarget(i),g.render(d,t,e,r);var o=d.opaque,a=d.transparent;if(t.overrideMaterial){var s=t.overrideMaterial;o.length&&mt(o,t,e,s),a.length&&mt(a,t,e,s)}else o.length&&mt(o,t,e),a.length&&mt(a,t,e);i&&l.updateRenderTargetMipmap(i),H.buffers.depth.setTest(!0),H.buffers.depth.setMask(!0),H.buffers.color.setMask(!0),H.setPolygonOffset(!1),t.onAfterRender(W,t,e),nt.enabled&&nt.submitFrame(),j=d=null}}else console.error("THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.")},this.allocTextureUnit=function(){var t=Z;return t>=V.maxTextures&&console.warn("THREE.WebGLRenderer: Trying to use "+t+" texture units while this GPU supports only "+V.maxTextures),Z+=1,t},this.setTexture2D=(lt=!1,function(t,e){t&&t.isWebGLRenderTarget&&(lt||(console.warn("THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead."),lt=!0),t=t.texture),l.setTexture2D(t,e)}),this.setTexture=(pt=!1,function(t,e){pt||(console.warn("THREE.WebGLRenderer: .setTexture is deprecated, use setTexture2D instead."),pt=!0),l.setTexture2D(t,e)}),this.setTextureCube=(dt=!1,function(t,e){t&&t.isWebGLRenderTargetCube&&(dt||(console.warn("THREE.WebGLRenderer.setTextureCube: don't use cube render targets as textures. Use their .texture property instead."),dt=!0),t=t.texture),t&&t.isCubeTexture||Array.isArray(t.image)&&6===t.image.length?l.setTextureCube(t,e):l.setTextureCubeDynamic(t,e)}),this.setFramebuffer=function(t){x=t},this.getRenderTarget=function(){return _},this.setRenderTarget=function(t){(_=t)&&void 0===$.get(t).__webglFramebuffer&&l.setupRenderTarget(t);var e=x,i=!1;if(t){var r=$.get(t).__webglFramebuffer;t.isWebGLRenderTargetCube?(e=r[t.activeCubeFace],i=!0):e=r,I.copy(t.viewport),O.copy(t.scissor),L=t.scissorTest}else I.copy(D).multiplyScalar(J),O.copy(k).multiplyScalar(J),L=B;if(w!==e&&(G.bindFramebuffer(G.FRAMEBUFFER,e),w=e),H.viewport(I),H.scissor(O),H.setScissorTest(L),i){var n=$.get(t.texture);G.framebufferTexture2D(G.FRAMEBUFFER,G.COLOR_ATTACHMENT0,G.TEXTURE_CUBE_MAP_POSITIVE_X+t.activeCubeFace,n.__webglTexture,t.activeMipMapLevel)}},this.readRenderTargetPixels=function(t,e,i,r,n,o){if(t&&t.isWebGLRenderTarget){var a=$.get(t).__webglFramebuffer;if(a){var s=!1;a!==w&&(G.bindFramebuffer(G.FRAMEBUFFER,a),s=!0);try{var c=t.texture,u=c.format,h=c.type;if(u!==ue&&v.convert(u)!==G.getParameter(G.IMPLEMENTATION_COLOR_READ_FORMAT))return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.");if(!(h===Yt||v.convert(h)===G.getParameter(G.IMPLEMENTATION_COLOR_READ_TYPE)||h===ee&&(V.isWebGL2||S.get("OES_texture_float")||S.get("WEBGL_color_buffer_float"))||h===ie&&(V.isWebGL2?S.get("EXT_color_buffer_float"):S.get("EXT_color_buffer_half_float"))))return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.");G.checkFramebufferStatus(G.FRAMEBUFFER)===G.FRAMEBUFFER_COMPLETE?0<=e&&e<=t.width-r&&0<=i&&i<=t.height-n&&G.readPixels(e,i,r,n,v.convert(u),v.convert(h),o):console.error("THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.")}finally{s&&G.bindFramebuffer(G.FRAMEBUFFER,w)}}}else console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.")},this.copyFramebufferToTexture=function(t,e,i){var r=e.image.width,n=e.image.height,o=v.convert(e.format);this.setTexture2D(e,0),G.copyTexImage2D(G.TEXTURE_2D,i||0,o,t.x,t.y,r,n,0)},this.copyTextureToTexture=function(t,e,i,r){var n=e.image.width,o=e.image.height,a=v.convert(i.format),s=v.convert(i.type);this.setTexture2D(i,0),e.isDataTexture?G.texSubImage2D(G.TEXTURE_2D,r||0,t.x,t.y,n,o,a,s,e.image.data):G.texSubImage2D(G.TEXTURE_2D,r||0,t.x,t.y,a,s,e.image)}}function Aa(t,e){this.name="",this.color=new ki(t),this.density=void 0!==e?e:25e-5}function Ma(t,e,i){this.name="",this.color=new ki(t),this.near=void 0!==e?e:1,this.far=void 0!==i?i:1e3}function Ea(){ur.call(this),this.type="Scene",this.background=null,this.fog=null,this.overrideMaterial=null,this.autoUpdate=!0}function Pa(t,e){this.array=t,this.stride=e,this.count=void 0!==t?t.length/e:0,this.dynamic=!1,this.updateRange={offset:0,count:-1},this.version=0}function Ta(t,e,i,r){this.data=t,this.itemSize=e,this.offset=i,this.normalized=!0===r}function Ca(t){wn.call(this),this.type="SpriteMaterial",this.color=new ki(16777215),this.map=null,this.rotation=0,this.lights=!1,this.transparent=!0,this.setValues(t)}function Ia(t){if(ur.call(this),this.type="Sprite",void 0===Wo){Wo=new $r;var e=new Pa(new Float32Array([-.5,-.5,0,0,0,.5,-.5,0,1,0,.5,.5,0,1,1,-.5,.5,0,0,1]),5);Wo.setIndex([0,1,2,0,2,3]),Wo.addAttribute("position",new Ta(e,3,0,!1)),Wo.addAttribute("uv",new Ta(e,2,3,!1))}this.geometry=Wo,this.material=void 0!==t?t:new Ca,this.center=new ti(.5,.5)}function Oa(){ur.call(this),this.type="LOD",Object.defineProperties(this,{levels:{enumerable:!0,value:[]}})}function La(t,e){if(t=t||[],this.bones=t.slice(0),this.boneMatrices=new Float32Array(16*this.bones.length),void 0===e)this.calculateInverses();else if(this.bones.length===e.length)this.boneInverses=e.slice(0);else{console.warn("THREE.Skeleton boneInverses is the wrong length."),this.boneInverses=[];for(var i=0,r=this.bones.length;i<r;i++)this.boneInverses.push(new ei)}}function Ra(){ur.call(this),this.type="Bone"}function Da(t,e){Pn.call(this,t,e),this.type="SkinnedMesh",this.bindMode="attached",this.bindMatrix=new ei,this.bindMatrixInverse=new ei;var i=new La(this.initBones());this.bind(i,this.matrixWorld),this.normalizeSkinWeights()}function ka(t){wn.call(this),this.type="LineBasicMaterial",this.color=new ki(16777215),this.linewidth=1,this.linecap="round",this.linejoin="round",this.lights=!1,this.setValues(t)}function Ba(t,e,i){1===i&&console.error("THREE.Line: parameter THREE.LinePieces no longer supported. Use THREE.LineSegments instead."),ur.call(this),this.type="Line",this.geometry=void 0!==t?t:new $r,this.material=void 0!==e?e:new ka({color:16777215*Math.random()})}function Na(t,e){Ba.call(this,t,e),this.type="LineSegments"}function Fa(t,e){Ba.call(this,t,e),this.type="LineLoop"}function za(t){wn.call(this),this.type="PointsMaterial",this.color=new ki(16777215),this.map=null,this.size=1,this.sizeAttenuation=!0,this.morphTargets=!1,this.lights=!1,this.setValues(t)}function Ua(t,e){ur.call(this),this.type="Points",this.geometry=void 0!==t?t:new $r,this.material=void 0!==e?e:new za({color:16777215*Math.random()})}function ja(t,e,i,r,n,o,a,s,c){wi.call(this,t,e,i,r,n,o,a,s,c),this.generateMipmaps=!1}function Ga(t,e,i,r,n,o,a,s,c,u,h,l){wi.call(this,null,o,a,s,c,u,r,n,h,l),this.image={width:e,height:i},this.mipmaps=t,this.flipY=!1,this.generateMipmaps=!1}function Va(t,e,i,r,n,o,a,s,c){wi.call(this,t,e,i,r,n,o,a,s,c),this.needsUpdate=!0}function Ha(t,e,i,r,n,o,a,s,c,u){if((u=void 0!==u?u:pe)!==pe&&u!==fe)throw new Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");void 0===i&&u===pe&&(i=Jt),void 0===i&&u===fe&&(i=ae),wi.call(this,null,r,n,o,a,s,u,i,c),this.image={width:t,height:e},this.magFilter=void 0!==a?a:Vt,this.minFilter=void 0!==s?s:Vt,this.flipY=!1,this.generateMipmaps=!1}function $a(t){$r.call(this),this.type="WireframeGeometry";var e,i,r,n,o,a,s,c,u,h,l=[],p=[0,0],d={},f=["a","b","c"];if(t&&t.isGeometry){var m=t.faces;for(e=0,r=m.length;e<r;e++){var g=m[e];for(i=0;i<3;i++)s=g[f[i]],c=g[f[(i+1)%3]],p[0]=Math.min(s,c),p[1]=Math.max(s,c),void 0===d[u=p[0]+","+p[1]]&&(d[u]={index1:p[0],index2:p[1]})}for(u in d)a=d[u],h=t.vertices[a.index1],l.push(h.x,h.y,h.z),h=t.vertices[a.index2],l.push(h.x,h.y,h.z)}else if(t&&t.isBufferGeometry){var v,y,b,x,_,w;if(h=new ri,null!==t.index){for(v=t.attributes.position,y=t.index,0===(b=t.groups).length&&(b=[{start:0,count:y.count,materialIndex:0}]),n=0,o=b.length;n<o;++n)for(r=(e=(x=b[n]).start)+x.count;e<r;e+=3)for(i=0;i<3;i++)s=y.getX(e+i),c=y.getX(e+(i+1)%3),p[0]=Math.min(s,c),p[1]=Math.max(s,c),void 0===d[u=p[0]+","+p[1]]&&(d[u]={index1:p[0],index2:p[1]});for(u in d)a=d[u],h.fromBufferAttribute(v,a.index1),l.push(h.x,h.y,h.z),h.fromBufferAttribute(v,a.index2),l.push(h.x,h.y,h.z)}else for(e=0,r=(v=t.attributes.position).count/3;e<r;e++)for(i=0;i<3;i++)_=3*e+i,h.fromBufferAttribute(v,_),l.push(h.x,h.y,h.z),w=3*e+(i+1)%3,h.fromBufferAttribute(v,w),l.push(h.x,h.y,h.z)}this.addAttribute("position",new Ir(l,3))}function Wa(t,e,i){_r.call(this),this.type="ParametricGeometry",this.parameters={func:t,slices:e,stacks:i},this.fromBufferGeometry(new Xa(t,e,i)),this.mergeVertices()}function Xa(t,e,i){$r.call(this),this.type="ParametricBufferGeometry",this.parameters={func:t,slices:e,stacks:i};var r,n,o=[],a=[],s=[],c=[],u=new ri,h=new ri,l=new ri,p=new ri,d=new ri;t.length<3&&console.error("THREE.ParametricGeometry: Function must now modify a Vector3 as third parameter.");var f=e+1;for(r=0;r<=i;r++){var m=r/i;for(n=0;n<=e;n++){var g=n/e;t(g,m,h),a.push(h.x,h.y,h.z),0<=g-1e-5?(t(g-1e-5,m,l),p.subVectors(h,l)):(t(g+1e-5,m,l),p.subVectors(l,h)),0<=m-1e-5?(t(g,m-1e-5,l),d.subVectors(h,l)):(t(g,m+1e-5,l),d.subVectors(l,h)),u.crossVectors(p,d).normalize(),s.push(u.x,u.y,u.z),c.push(g,m)}}for(r=0;r<i;r++)for(n=0;n<e;n++){var v=r*f+n,y=r*f+n+1,b=(r+1)*f+n+1,x=(r+1)*f+n;o.push(v,y,x),o.push(y,b,x)}this.setIndex(o),this.addAttribute("position",new Ir(a,3)),this.addAttribute("normal",new Ir(s,3)),this.addAttribute("uv",new Ir(c,2))}function qa(t,e,i,r){_r.call(this),this.type="PolyhedronGeometry",this.parameters={vertices:t,indices:e,radius:i,detail:r},this.fromBufferGeometry(new Ya(t,e,i,r)),this.mergeVertices()}function Ya(r,o,t,e){$r.call(this),this.type="PolyhedronBufferGeometry",this.parameters={vertices:r,indices:o,radius:t,detail:e},t=t||1;var h=[],l=[];function a(t,e,i,r){var n,o,a=Math.pow(2,r),s=[];for(n=0;n<=a;n++){s[n]=[];var c=t.clone().lerp(i,n/a),u=e.clone().lerp(i,n/a),h=a-n;for(o=0;o<=h;o++)s[n][o]=0===o&&n===a?c:c.clone().lerp(u,o/h)}for(n=0;n<a;n++)for(o=0;o<2*(a-n)-1;o++){var l=Math.floor(o/2);o%2==0?(p(s[n][l+1]),p(s[n+1][l]),p(s[n][l])):(p(s[n][l+1]),p(s[n+1][l+1]),p(s[n+1][l]))}}function p(t){h.push(t.x,t.y,t.z)}function s(t,e){var i=3*t;e.x=r[i+0],e.y=r[i+1],e.z=r[i+2]}function d(t,e,i,r){r<0&&1===t.x&&(l[e]=t.x-1),0===i.x&&0===i.z&&(l[e]=r/2/Math.PI+.5)}function f(t){return Math.atan2(t.z,-t.x)}!function(t){for(var e=new ri,i=new ri,r=new ri,n=0;n<o.length;n+=3)s(o[n+0],e),s(o[n+1],i),s(o[n+2],r),a(e,i,r,t)}(e=e||0),function(t){for(var e=new ri,i=0;i<h.length;i+=3)e.x=h[i+0],e.y=h[i+1],e.z=h[i+2],e.normalize().multiplyScalar(t),h[i+0]=e.x,h[i+1]=e.y,h[i+2]=e.z}(t),function(){for(var t=new ri,e=0;e<h.length;e+=3){t.x=h[e+0],t.y=h[e+1],t.z=h[e+2];var i=f(t)/2/Math.PI+.5,r=(n=t,Math.atan2(-n.y,Math.sqrt(n.x*n.x+n.z*n.z))/Math.PI+.5);l.push(i,1-r)}var n;(function(){for(var t=new ri,e=new ri,i=new ri,r=new ri,n=new ti,o=new ti,a=new ti,s=0,c=0;s<h.length;s+=9,c+=6){t.set(h[s+0],h[s+1],h[s+2]),e.set(h[s+3],h[s+4],h[s+5]),i.set(h[s+6],h[s+7],h[s+8]),n.set(l[c+0],l[c+1]),o.set(l[c+2],l[c+3]),a.set(l[c+4],l[c+5]),r.copy(t).add(e).add(i).divideScalar(3);var u=f(r);d(n,c+0,t,u),d(o,c+2,e,u),d(a,c+4,i,u)}})(),function(){for(var t=0;t<l.length;t+=6){var e=l[t+0],i=l[t+2],r=l[t+4],n=Math.max(e,i,r),o=Math.min(e,i,r);.9<n&&o<.1&&(e<.2&&(l[t+0]+=1),i<.2&&(l[t+2]+=1),r<.2&&(l[t+4]+=1))}}()}(),this.addAttribute("position",new Ir(h,3)),this.addAttribute("normal",new Ir(h.slice(),3)),this.addAttribute("uv",new Ir(l,2)),0===e?this.computeVertexNormals():this.normalizeNormals()}function Za(t,e){_r.call(this),this.type="TetrahedronGeometry",this.parameters={radius:t,detail:e},this.fromBufferGeometry(new Ka(t,e)),this.mergeVertices()}function Ka(t,e){Ya.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],t,e),this.type="TetrahedronBufferGeometry",this.parameters={radius:t,detail:e}}function Ja(t,e){_r.call(this),this.type="OctahedronGeometry",this.parameters={radius:t,detail:e},this.fromBufferGeometry(new Qa(t,e)),this.mergeVertices()}function Qa(t,e){Ya.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],t,e),this.type="OctahedronBufferGeometry",this.parameters={radius:t,detail:e}}function ts(t,e){_r.call(this),this.type="IcosahedronGeometry",this.parameters={radius:t,detail:e},this.fromBufferGeometry(new es(t,e)),this.mergeVertices()}function es(t,e){var i=(1+Math.sqrt(5))/2;Ya.call(this,[-1,i,0,1,i,0,-1,-i,0,1,-i,0,0,-1,i,0,1,i,0,-1,-i,0,1,-i,i,0,-1,i,0,1,-i,0,-1,-i,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],t,e),this.type="IcosahedronBufferGeometry",this.parameters={radius:t,detail:e}}function is(t,e){_r.call(this),this.type="DodecahedronGeometry",this.parameters={radius:t,detail:e},this.fromBufferGeometry(new rs(t,e)),this.mergeVertices()}function rs(t,e){var i=(1+Math.sqrt(5))/2,r=1/i;Ya.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,-r,-i,0,-r,i,0,r,-i,0,r,i,-r,-i,0,-r,i,0,r,-i,0,r,i,0,-i,0,-r,i,0,-r,-i,0,r,i,0,r],[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],t,e),this.type="DodecahedronBufferGeometry",this.parameters={radius:t,detail:e}}function ns(t,e,i,r,n,o){_r.call(this),this.type="TubeGeometry",this.parameters={path:t,tubularSegments:e,radius:i,radialSegments:r,closed:n},void 0!==o&&console.warn("THREE.TubeGeometry: taper has been removed.");var a=new os(t,e,i,r,n);this.tangents=a.tangents,this.normals=a.normals,this.binormals=a.binormals,this.fromBufferGeometry(a),this.mergeVertices()}function os(a,s,c,u,t){$r.call(this),this.type="TubeBufferGeometry",this.parameters={path:a,tubularSegments:s,radius:c,radialSegments:u,closed:t},s=s||64,c=c||1,u=u||8,t=t||!1;var h=a.computeFrenetFrames(s,t);this.tangents=h.tangents,this.normals=h.normals,this.binormals=h.binormals;var n,l,p=new ri,d=new ri,e=new ti,f=new ri,m=[],g=[],i=[],o=[];function r(t){f=a.getPointAt(t/s,f);var e=h.normals[t],i=h.binormals[t];for(l=0;l<=u;l++){var r=l/u*Math.PI*2,n=Math.sin(r),o=-Math.cos(r);d.x=o*e.x+n*i.x,d.y=o*e.y+n*i.y,d.z=o*e.z+n*i.z,d.normalize(),g.push(d.x,d.y,d.z),p.x=f.x+c*d.x,p.y=f.y+c*d.y,p.z=f.z+c*d.z,m.push(p.x,p.y,p.z)}}!function(){for(n=0;n<s;n++)r(n);r(!1===t?s:0),function(){for(n=0;n<=s;n++)for(l=0;l<=u;l++)e.x=n/s,e.y=l/u,i.push(e.x,e.y)}(),function(){for(l=1;l<=s;l++)for(n=1;n<=u;n++){var t=(u+1)*(l-1)+(n-1),e=(u+1)*l+(n-1),i=(u+1)*l+n,r=(u+1)*(l-1)+n;o.push(t,e,r),o.push(e,i,r)}}()}(),this.setIndex(o),this.addAttribute("position",new Ir(m,3)),this.addAttribute("normal",new Ir(g,3)),this.addAttribute("uv",new Ir(i,2))}function as(t,e,i,r,n,o,a){_r.call(this),this.type="TorusKnotGeometry",this.parameters={radius:t,tube:e,tubularSegments:i,radialSegments:r,p:n,q:o},void 0!==a&&console.warn("THREE.TorusKnotGeometry: heightScale has been deprecated. Use .scale( x, y, z ) instead."),this.fromBufferGeometry(new ss(t,e,i,r,n,o)),this.mergeVertices()}function ss(t,e,i,r,n,o){$r.call(this),this.type="TorusKnotBufferGeometry",this.parameters={radius:t,tube:e,tubularSegments:i,radialSegments:r,p:n,q:o},t=t||1,e=e||.4,i=Math.floor(i)||64,r=Math.floor(r)||8,n=n||2,o=o||3;var a,s,c=[],u=[],h=[],l=[],p=new ri,d=new ri,f=new ri,m=new ri,g=new ri,v=new ri,y=new ri;for(a=0;a<=i;++a){var b=a/i*n*Math.PI*2;for(P(b,n,o,t,f),P(b+.01,n,o,t,m),v.subVectors(m,f),y.addVectors(m,f),g.crossVectors(v,y),y.crossVectors(g,v),g.normalize(),y.normalize(),s=0;s<=r;++s){var x=s/r*Math.PI*2,_=-e*Math.cos(x),w=e*Math.sin(x);p.x=f.x+(_*y.x+w*g.x),p.y=f.y+(_*y.y+w*g.y),p.z=f.z+(_*y.z+w*g.z),u.push(p.x,p.y,p.z),d.subVectors(p,f).normalize(),h.push(d.x,d.y,d.z),l.push(a/i),l.push(s/r)}}for(s=1;s<=i;s++)for(a=1;a<=r;a++){var S=(r+1)*(s-1)+(a-1),A=(r+1)*s+(a-1),M=(r+1)*s+a,E=(r+1)*(s-1)+a;c.push(S,A,E),c.push(A,M,E)}function P(t,e,i,r,n){var o=Math.cos(t),a=Math.sin(t),s=i/e*t,c=Math.cos(s);n.x=r*(2+c)*.5*o,n.y=r*(2+c)*a*.5,n.z=r*Math.sin(s)*.5}this.setIndex(c),this.addAttribute("position",new Ir(u,3)),this.addAttribute("normal",new Ir(h,3)),this.addAttribute("uv",new Ir(l,2))}function cs(t,e,i,r,n){_r.call(this),this.type="TorusGeometry",this.parameters={radius:t,tube:e,radialSegments:i,tubularSegments:r,arc:n},this.fromBufferGeometry(new us(t,e,i,r,n)),this.mergeVertices()}function us(t,e,i,r,n){$r.call(this),this.type="TorusBufferGeometry",this.parameters={radius:t,tube:e,radialSegments:i,tubularSegments:r,arc:n},t=t||1,e=e||.4,i=Math.floor(i)||8,r=Math.floor(r)||6,n=n||2*Math.PI;var o,a,s=[],c=[],u=[],h=[],l=new ri,p=new ri,d=new ri;for(o=0;o<=i;o++)for(a=0;a<=r;a++){var f=a/r*n,m=o/i*Math.PI*2;p.x=(t+e*Math.cos(m))*Math.cos(f),p.y=(t+e*Math.cos(m))*Math.sin(f),p.z=e*Math.sin(m),c.push(p.x,p.y,p.z),l.x=t*Math.cos(f),l.y=t*Math.sin(f),d.subVectors(p,l).normalize(),u.push(d.x,d.y,d.z),h.push(a/r),h.push(o/i)}for(o=1;o<=i;o++)for(a=1;a<=r;a++){var g=(r+1)*o+a-1,v=(r+1)*(o-1)+a-1,y=(r+1)*(o-1)+a,b=(r+1)*o+a;s.push(g,v,b),s.push(v,y,b)}this.setIndex(s),this.addAttribute("position",new Ir(c,3)),this.addAttribute("normal",new Ir(u,3)),this.addAttribute("uv",new Ir(h,2))}((pa.prototype=Object.create(wn.prototype)).constructor=pa).prototype.isMeshDepthMaterial=!0,pa.prototype.copy=function(t){return wn.prototype.copy.call(this,t),this.depthPacking=t.depthPacking,this.skinning=t.skinning,this.morphTargets=t.morphTargets,this.map=t.map,this.alphaMap=t.alphaMap,this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this},((da.prototype=Object.create(wn.prototype)).constructor=da).prototype.isMeshDistanceMaterial=!0,da.prototype.copy=function(t){return wn.prototype.copy.call(this,t),this.referencePosition.copy(t.referencePosition),this.nearDistance=t.nearDistance,this.farDistance=t.farDistance,this.skinning=t.skinning,this.morphTargets=t.morphTargets,this.map=t.map,this.alphaMap=t.alphaMap,this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this},ya.prototype=Object.assign(Object.create(ur.prototype),{constructor:ya,isGroup:!0}),ba.prototype=Object.assign(Object.create(hr.prototype),{constructor:ba,isPerspectiveCamera:!0,copy:function(t,e){return hr.prototype.copy.call(this,t,e),this.fov=t.fov,this.zoom=t.zoom,this.near=t.near,this.far=t.far,this.focus=t.focus,this.aspect=t.aspect,this.view=null===t.view?null:Object.assign({},t.view),this.filmGauge=t.filmGauge,this.filmOffset=t.filmOffset,this},setFocalLength:function(t){var e=.5*this.getFilmHeight()/t;this.fov=2*Qe.RAD2DEG*Math.atan(e),this.updateProjectionMatrix()},getFocalLength:function(){var t=Math.tan(.5*Qe.DEG2RAD*this.fov);return.5*this.getFilmHeight()/t},getEffectiveFOV:function(){return 2*Qe.RAD2DEG*Math.atan(Math.tan(.5*Qe.DEG2RAD*this.fov)/this.zoom)},getFilmWidth:function(){return this.filmGauge*Math.min(this.aspect,1)},getFilmHeight:function(){return this.filmGauge/Math.max(this.aspect,1)},setViewOffset:function(t,e,i,r,n,o){this.aspect=t/e,null===this.view&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=t,this.view.fullHeight=e,this.view.offsetX=i,this.view.offsetY=r,this.view.width=n,this.view.height=o,this.updateProjectionMatrix()},clearViewOffset:function(){null!==this.view&&(this.view.enabled=!1),this.updateProjectionMatrix()},updateProjectionMatrix:function(){var t=this.near,e=t*Math.tan(.5*Qe.DEG2RAD*this.fov)/this.zoom,i=2*e,r=this.aspect*i,n=-.5*r,o=this.view;if(null!==this.view&&this.view.enabled){var a=o.fullWidth,s=o.fullHeight;n+=o.offsetX*r/a,e-=o.offsetY*i/s,r*=o.width/a,i*=o.height/s}var c=this.filmOffset;0!==c&&(n+=t*c/this.getFilmWidth()),this.projectionMatrix.makePerspective(n,n+r,e,e-i,t,this.far)},toJSON:function(t){var e=ur.prototype.toJSON.call(this,t);return e.object.fov=this.fov,e.object.zoom=this.zoom,e.object.near=this.near,e.object.far=this.far,e.object.focus=this.focus,e.object.aspect=this.aspect,null!==this.view&&(e.object.view=Object.assign({},this.view)),e.object.filmGauge=this.filmGauge,e.object.filmOffset=this.filmOffset,e}}),xa.prototype=Object.assign(Object.create(ba.prototype),{constructor:xa,isArrayCamera:!0}),Aa.prototype.isFogExp2=!0,Aa.prototype.clone=function(){return new Aa(this.color,this.density)},Aa.prototype.toJSON=function(){return{type:"FogExp2",color:this.color.getHex(),density:this.density}},Ma.prototype.isFog=!0,Ma.prototype.clone=function(){return new Ma(this.color,this.near,this.far)},Ma.prototype.toJSON=function(){return{type:"Fog",color:this.color.getHex(),near:this.near,far:this.far}},Ea.prototype=Object.assign(Object.create(ur.prototype),{constructor:Ea,copy:function(t,e){return ur.prototype.copy.call(this,t,e),null!==t.background&&(this.background=t.background.clone()),null!==t.fog&&(this.fog=t.fog.clone()),null!==t.overrideMaterial&&(this.overrideMaterial=t.overrideMaterial.clone()),this.autoUpdate=t.autoUpdate,this.matrixAutoUpdate=t.matrixAutoUpdate,this},toJSON:function(t){var e=ur.prototype.toJSON.call(this,t);return null!==this.background&&(e.object.background=this.background.toJSON(t)),null!==this.fog&&(e.object.fog=this.fog.toJSON()),e}}),Object.defineProperty(Pa.prototype,"needsUpdate",{set:function(t){!0===t&&this.version++}}),Object.assign(Pa.prototype,{isInterleavedBuffer:!0,onUploadCallback:function(){},setArray:function(t){if(Array.isArray(t))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");return this.count=void 0!==t?t.length/this.stride:0,this.array=t,this},setDynamic:function(t){return this.dynamic=t,this},copy:function(t){return this.array=new t.array.constructor(t.array),this.count=t.count,this.stride=t.stride,this.dynamic=t.dynamic,this},copyAt:function(t,e,i){t*=this.stride,i*=e.stride;for(var r=0,n=this.stride;r<n;r++)this.array[t+r]=e.array[i+r];return this},set:function(t,e){return void 0===e&&(e=0),this.array.set(t,e),this},clone:function(){return(new this.constructor).copy(this)},onUpload:function(t){return this.onUploadCallback=t,this}}),Object.defineProperties(Ta.prototype,{count:{get:function(){return this.data.count}},array:{get:function(){return this.data.array}}}),Object.assign(Ta.prototype,{isInterleavedBufferAttribute:!0,setX:function(t,e){return this.data.array[t*this.data.stride+this.offset]=e,this},setY:function(t,e){return this.data.array[t*this.data.stride+this.offset+1]=e,this},setZ:function(t,e){return this.data.array[t*this.data.stride+this.offset+2]=e,this},setW:function(t,e){return this.data.array[t*this.data.stride+this.offset+3]=e,this},getX:function(t){return this.data.array[t*this.data.stride+this.offset]},getY:function(t){return this.data.array[t*this.data.stride+this.offset+1]},getZ:function(t){return this.data.array[t*this.data.stride+this.offset+2]},getW:function(t){return this.data.array[t*this.data.stride+this.offset+3]},setXY:function(t,e,i){return t=t*this.data.stride+this.offset,this.data.array[t+0]=e,this.data.array[t+1]=i,this},setXYZ:function(t,e,i,r){return t=t*this.data.stride+this.offset,this.data.array[t+0]=e,this.data.array[t+1]=i,this.data.array[t+2]=r,this},setXYZW:function(t,e,i,r,n){return t=t*this.data.stride+this.offset,this.data.array[t+0]=e,this.data.array[t+1]=i,this.data.array[t+2]=r,this.data.array[t+3]=n,this}}),((Ca.prototype=Object.create(wn.prototype)).constructor=Ca).prototype.isSpriteMaterial=!0,Ca.prototype.copy=function(t){return wn.prototype.copy.call(this,t),this.color.copy(t.color),this.map=t.map,this.rotation=t.rotation,this},Ia.prototype=Object.assign(Object.create(ur.prototype),{constructor:Ia,isSprite:!0,raycast:function(){var c=new ri,u=new ri,h=new ri,a=new ti,s=new ti,l=new ei,p=new ri,d=new ri,f=new ri;function m(t,e,i,r,n,o){a.subVectors(t,i).addScalar(.5).multiply(r),void 0!==n?(s.x=o*a.x-n*a.y,s.y=n*a.x+o*a.y):s.copy(a),t.copy(e),t.x+=s.x,t.y+=s.y,t.applyMatrix4(l)}return function(t,e){u.setFromMatrixScale(this.matrixWorld),l.getInverse(this.modelViewMatrix).premultiply(this.matrixWorld),h.setFromMatrixPosition(this.modelViewMatrix);var i,r,n=this.material.rotation;0!==n&&(r=Math.cos(n),i=Math.sin(n));var o=this.center;m(p.set(-.5,-.5,0),h,o,u,i,r),m(d.set(.5,-.5,0),h,o,u,i,r),m(f.set(.5,.5,0),h,o,u,i,r);var a=t.ray.intersectTriangle(p,d,f,!1,c);if(null!==a||(m(d.set(-.5,.5,0),h,o,u,i,r),null!==(a=t.ray.intersectTriangle(p,f,d,!1,c)))){var s=t.ray.origin.distanceTo(c);s<t.near||s>t.far||e.push({distance:s,point:c.clone(),face:null,object:this})}}}(),clone:function(){return new this.constructor(this.material).copy(this)},copy:function(t){return ur.prototype.copy.call(this,t),void 0!==t.center&&this.center.copy(t.center),this}}),Oa.prototype=Object.assign(Object.create(ur.prototype),{constructor:Oa,copy:function(t){ur.prototype.copy.call(this,t,!1);for(var e=t.levels,i=0,r=e.length;i<r;i++){var n=e[i];this.addLevel(n.object.clone(),n.distance)}return this},addLevel:function(t,e){void 0===e&&(e=0),e=Math.abs(e);for(var i=this.levels,r=0;r<i.length&&!(e<i[r].distance);r++);i.splice(r,0,{distance:e,object:t}),this.add(t)},getObjectForDistance:function(t){for(var e=this.levels,i=1,r=e.length;i<r&&!(t<e[i].distance);i++);return e[i-1].object},raycast:(Yo=new ri,function(t,e){Yo.setFromMatrixPosition(this.matrixWorld);var i=t.ray.origin.distanceTo(Yo);this.getObjectForDistance(i).raycast(t,e)}),update:(Xo=new ri,qo=new ri,function(t){var e=this.levels;if(1<e.length){Xo.setFromMatrixPosition(t.matrixWorld),qo.setFromMatrixPosition(this.matrixWorld);var i=Xo.distanceTo(qo);e[0].object.visible=!0;for(var r=1,n=e.length;r<n&&i>=e[r].distance;r++)e[r-1].object.visible=!1,e[r].object.visible=!0;for(;r<n;r++)e[r].object.visible=!1}}),toJSON:function(t){var e=ur.prototype.toJSON.call(this,t);e.object.levels=[];for(var i=this.levels,r=0,n=i.length;r<n;r++){var o=i[r];e.object.levels.push({object:o.object.uuid,distance:o.distance})}return e}}),Object.assign(La.prototype,{calculateInverses:function(){this.boneInverses=[];for(var t=0,e=this.bones.length;t<e;t++){var i=new ei;this.bones[t]&&i.getInverse(this.bones[t].matrixWorld),this.boneInverses.push(i)}},pose:function(){var t,e,i;for(e=0,i=this.bones.length;e<i;e++)(t=this.bones[e])&&t.matrixWorld.getInverse(this.boneInverses[e]);for(e=0,i=this.bones.length;e<i;e++)(t=this.bones[e])&&(t.parent&&t.parent.isBone?(t.matrix.getInverse(t.parent.matrixWorld),t.matrix.multiply(t.matrixWorld)):t.matrix.copy(t.matrixWorld),t.matrix.decompose(t.position,t.quaternion,t.scale))},update:(Zo=new ei,Ko=new ei,function(){for(var t=this.bones,e=this.boneInverses,i=this.boneMatrices,r=this.boneTexture,n=0,o=t.length;n<o;n++){var a=t[n]?t[n].matrixWorld:Ko;Zo.multiplyMatrices(a,e[n]),Zo.toArray(i,16*n)}void 0!==r&&(r.needsUpdate=!0)}),clone:function(){return new La(this.bones,this.boneInverses)},getBoneByName:function(t){for(var e=0,i=this.bones.length;e<i;e++){var r=this.bones[e];if(r.name===t)return r}}}),Ra.prototype=Object.assign(Object.create(ur.prototype),{constructor:Ra,isBone:!0}),Da.prototype=Object.assign(Object.create(Pn.prototype),{constructor:Da,isSkinnedMesh:!0,initBones:function(){var t,e,i,r,n=[];if(this.geometry&&void 0!==this.geometry.bones){for(i=0,r=this.geometry.bones.length;i<r;i++)e=this.geometry.bones[i],t=new Ra,n.push(t),t.name=e.name,t.position.fromArray(e.pos),t.quaternion.fromArray(e.rotq),void 0!==e.scl&&t.scale.fromArray(e.scl);for(i=0,r=this.geometry.bones.length;i<r;i++)-1!==(e=this.geometry.bones[i]).parent&&null!==e.parent&&void 0!==n[e.parent]?n[e.parent].add(n[i]):this.add(n[i])}return this.updateMatrixWorld(!0),n},bind:function(t,e){this.skeleton=t,void 0===e&&(this.updateMatrixWorld(!0),this.skeleton.calculateInverses(),e=this.matrixWorld),this.bindMatrix.copy(e),this.bindMatrixInverse.getInverse(e)},pose:function(){this.skeleton.pose()},normalizeSkinWeights:function(){var t,e;if(this.geometry&&this.geometry.isGeometry)for(e=0;e<this.geometry.skinWeights.length;e++){var i=this.geometry.skinWeights[e];(t=1/i.manhattanLength())!==1/0?i.multiplyScalar(t):i.set(1,0,0,0)}else if(this.geometry&&this.geometry.isBufferGeometry){var r=new Si,n=this.geometry.attributes.skinWeight;for(e=0;e<n.count;e++)r.x=n.getX(e),r.y=n.getY(e),r.z=n.getZ(e),r.w=n.getW(e),(t=1/r.manhattanLength())!==1/0?r.multiplyScalar(t):r.set(1,0,0,0),n.setXYZW(e,r.x,r.y,r.z,r.w)}},updateMatrixWorld:function(t){Pn.prototype.updateMatrixWorld.call(this,t),"attached"===this.bindMode?this.bindMatrixInverse.getInverse(this.matrixWorld):"detached"===this.bindMode?this.bindMatrixInverse.getInverse(this.bindMatrix):console.warn("THREE.SkinnedMesh: Unrecognized bindMode: "+this.bindMode)},clone:function(){return new this.constructor(this.geometry,this.material).copy(this)}}),((ka.prototype=Object.create(wn.prototype)).constructor=ka).prototype.isLineBasicMaterial=!0,ka.prototype.copy=function(t){return wn.prototype.copy.call(this,t),this.color.copy(t.color),this.linewidth=t.linewidth,this.linecap=t.linecap,this.linejoin=t.linejoin,this},Ba.prototype=Object.assign(Object.create(ur.prototype),{constructor:Ba,isLine:!0,computeLineDistances:(ea=new ri,ia=new ri,function(){var t=this.geometry;if(t.isBufferGeometry)if(null===t.index){for(var e=t.attributes.position,i=[0],r=1,n=e.count;r<n;r++)ea.fromBufferAttribute(e,r-1),ia.fromBufferAttribute(e,r),i[r]=i[r-1],i[r]+=ea.distanceTo(ia);t.addAttribute("lineDistance",new Ir(i,1))}else console.warn("THREE.Line.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.");else if(t.isGeometry){var o=t.vertices;for((i=t.lineDistances)[0]=0,r=1,n=o.length;r<n;r++)i[r]=i[r-1],i[r]+=o[r-1].distanceTo(o[r])}return this}),raycast:(Jo=new ei,Qo=new Mn,ta=new Ti,function(t,e){var i=t.linePrecision,r=i*i,n=this.geometry,o=this.matrixWorld;if(null===n.boundingSphere&&n.computeBoundingSphere(),ta.copy(n.boundingSphere),ta.applyMatrix4(o),!1!==t.ray.intersectsSphere(ta)){Jo.getInverse(o),Qo.copy(t.ray).applyMatrix4(Jo);var a=new ri,s=new ri,c=new ri,u=new ri,h=this&&this.isLineSegments?2:1;if(n.isBufferGeometry){var l=n.index,p=n.attributes.position.array;if(null!==l)for(var d=l.array,f=0,m=d.length-1;f<m;f+=h){var g=d[f],v=d[f+1];a.fromArray(p,3*g),s.fromArray(p,3*v),r<Qo.distanceSqToSegment(a,s,u,c)||(u.applyMatrix4(this.matrixWorld),(x=t.ray.origin.distanceTo(u))<t.near||x>t.far||e.push({distance:x,point:c.clone().applyMatrix4(this.matrixWorld),index:f,face:null,faceIndex:null,object:this}))}else for(f=0,m=p.length/3-1;f<m;f+=h)a.fromArray(p,3*f),s.fromArray(p,3*f+3),r<Qo.distanceSqToSegment(a,s,u,c)||(u.applyMatrix4(this.matrixWorld),(x=t.ray.origin.distanceTo(u))<t.near||x>t.far||e.push({distance:x,point:c.clone().applyMatrix4(this.matrixWorld),index:f,face:null,faceIndex:null,object:this}))}else if(n.isGeometry){var y=n.vertices,b=y.length;for(f=0;f<b-1;f+=h){var x;r<Qo.distanceSqToSegment(y[f],y[f+1],u,c)||(u.applyMatrix4(this.matrixWorld),(x=t.ray.origin.distanceTo(u))<t.near||x>t.far||e.push({distance:x,point:c.clone().applyMatrix4(this.matrixWorld),index:f,face:null,faceIndex:null,object:this}))}}}}),clone:function(){return new this.constructor(this.geometry,this.material).copy(this)}}),Na.prototype=Object.assign(Object.create(Ba.prototype),{constructor:Na,isLineSegments:!0,computeLineDistances:(ra=new ri,na=new ri,function(){var t=this.geometry;if(t.isBufferGeometry)if(null===t.index){for(var e=t.attributes.position,i=[],r=0,n=e.count;r<n;r+=2)ra.fromBufferAttribute(e,r),na.fromBufferAttribute(e,r+1),i[r]=0===r?0:i[r-1],i[r+1]=i[r]+ra.distanceTo(na);t.addAttribute("lineDistance",new Ir(i,1))}else console.warn("THREE.LineSegments.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.");else if(t.isGeometry){var o=t.vertices;for(i=t.lineDistances,r=0,n=o.length;r<n;r+=2)ra.copy(o[r]),na.copy(o[r+1]),i[r]=0===r?0:i[r-1],i[r+1]=i[r]+ra.distanceTo(na)}return this})}),Fa.prototype=Object.assign(Object.create(Ba.prototype),{constructor:Fa,isLineLoop:!0}),((za.prototype=Object.create(wn.prototype)).constructor=za).prototype.isPointsMaterial=!0,za.prototype.copy=function(t){return wn.prototype.copy.call(this,t),this.color.copy(t.color),this.map=t.map,this.size=t.size,this.sizeAttenuation=t.sizeAttenuation,this.morphTargets=t.morphTargets,this},Ua.prototype=Object.assign(Object.create(ur.prototype),{constructor:Ua,isPoints:!0,raycast:(oa=new ei,aa=new Mn,sa=new Ti,function(n,o){var a=this,t=this.geometry,s=this.matrixWorld,e=n.params.Points.threshold;if(null===t.boundingSphere&&t.computeBoundingSphere(),sa.copy(t.boundingSphere),sa.applyMatrix4(s),sa.radius+=e,!1!==n.ray.intersectsSphere(sa)){oa.getInverse(s),aa.copy(n.ray).applyMatrix4(oa);var i=e/((this.scale.x+this.scale.y+this.scale.z)/3),c=i*i,r=new ri,u=new ri;if(t.isBufferGeometry){var h=t.index,l=t.attributes.position.array;if(null!==h)for(var p=h.array,d=0,f=p.length;d<f;d++){var m=p[d];r.fromArray(l,3*m),y(r,m)}else{d=0;for(var g=l.length/3;d<g;d++)r.fromArray(l,3*d),y(r,d)}}else{var v=t.vertices;for(d=0,g=v.length;d<g;d++)y(v[d],d)}}function y(t,e){var i=aa.distanceSqToPoint(t);if(i<c){aa.closestPointToPoint(t,u),u.applyMatrix4(s);var r=n.ray.origin.distanceTo(u);if(r<n.near||r>n.far)return;o.push({distance:r,distanceToRay:Math.sqrt(i),point:u.clone(),index:e,face:null,object:a})}}}),clone:function(){return new this.constructor(this.geometry,this.material).copy(this)}}),ja.prototype=Object.assign(Object.create(wi.prototype),{constructor:ja,isVideoTexture:!0,update:function(){var t=this.image;t.readyState>=t.HAVE_CURRENT_DATA&&(this.needsUpdate=!0)}}),((Ga.prototype=Object.create(wi.prototype)).constructor=Ga).prototype.isCompressedTexture=!0,((Va.prototype=Object.create(wi.prototype)).constructor=Va).prototype.isCanvasTexture=!0,((Ha.prototype=Object.create(wi.prototype)).constructor=Ha).prototype.isDepthTexture=!0,($a.prototype=Object.create($r.prototype)).constructor=$a,(Wa.prototype=Object.create(_r.prototype)).constructor=Wa,(Xa.prototype=Object.create($r.prototype)).constructor=Xa,(qa.prototype=Object.create(_r.prototype)).constructor=qa,(Ya.prototype=Object.create($r.prototype)).constructor=Ya,(Za.prototype=Object.create(_r.prototype)).constructor=Za,(Ka.prototype=Object.create(Ya.prototype)).constructor=Ka,(Ja.prototype=Object.create(_r.prototype)).constructor=Ja,(Qa.prototype=Object.create(Ya.prototype)).constructor=Qa,(ts.prototype=Object.create(_r.prototype)).constructor=ts,(es.prototype=Object.create(Ya.prototype)).constructor=es,(is.prototype=Object.create(_r.prototype)).constructor=is,(rs.prototype=Object.create(Ya.prototype)).constructor=rs,(ns.prototype=Object.create(_r.prototype)).constructor=ns,(os.prototype=Object.create($r.prototype)).constructor=os,(as.prototype=Object.create(_r.prototype)).constructor=as,(ss.prototype=Object.create($r.prototype)).constructor=ss,(cs.prototype=Object.create(_r.prototype)).constructor=cs,(us.prototype=Object.create($r.prototype)).constructor=us;var hs=function(t,e,i){i=i||2;var r,n,o,a,s,c,u,h=e&&e.length,l=h?e[0]*i:t.length,p=ls(t,0,l,i,!0),d=[];if(!p)return d;if(h&&(p=function(t,e,i,r){var n,o,a,s,c,u=[];for(n=0,o=e.length;n<o;n++)a=e[n]*r,s=n<o-1?e[n+1]*r:t.length,(c=ls(t,a,s,r,!1))===c.next&&(c.steiner=!0),u.push(_s(c));for(u.sort(ys),n=0;n<u.length;n++)bs(u[n],i),i=ps(i,i.next);return i}(t,e,p,i)),t.length>80*i){r=o=t[0],n=a=t[1];for(var f=i;f<l;f+=i)(s=t[f])<r&&(r=s),(c=t[f+1])<n&&(n=c),o<s&&(o=s),a<c&&(a=c);u=0!==(u=Math.max(o-r,a-n))?1/u:0}return ds(p,d,i,r,n,u),d};function ls(t,e,i,r,n){var o,a;if(n===0<function(t,e,i,r){for(var n=0,o=e,a=i-r;o<i;o+=r)n+=(t[a]-t[o])*(t[o+1]+t[a+1]),a=o;return n}(t,e,i,r))for(o=e;o<i;o+=r)a=Ts(o,t[o],t[o+1],a);else for(o=i-r;e<=o;o-=r)a=Ts(o,t[o],t[o+1],a);return a&&As(a,a.next)&&(Cs(a),a=a.next),a}function ps(t,e){if(!t)return t;e||(e=t);var i,r=t;do{if(i=!1,r.steiner||!As(r,r.next)&&0!==Ss(r.prev,r,r.next))r=r.next;else{if(Cs(r),(r=e=r.prev)===r.next)break;i=!0}}while(i||r!==e);return e}function ds(t,e,i,r,n,o,a){if(t){!a&&o&&function(t,e,i,r){var n=t;for(;null===n.z&&(n.z=xs(n.x,n.y,e,i,r)),n.prevZ=n.prev,n.nextZ=n.next,n=n.next,n!==t;);n.prevZ.nextZ=null,n.prevZ=null,function(t){var e,i,r,n,o,a,s,c,u=1;do{for(i=t,o=t=null,a=0;i;){for(a++,r=i,e=s=0;e<u&&(s++,r=r.nextZ);e++);for(c=u;0<s||0<c&&r;)0!==s&&(0===c||!r||i.z<=r.z)?(i=(n=i).nextZ,s--):(r=(n=r).nextZ,c--),o?o.nextZ=n:t=n,n.prevZ=o,o=n;i=r}o.nextZ=null,u*=2}while(1<a)}(n)}(t,r,n,o);for(var s,c,u=t;t.prev!==t.next;)if(s=t.prev,c=t.next,o?ms(t,r,n,o):fs(t))e.push(s.i/i),e.push(t.i/i),e.push(c.i/i),Cs(t),t=c.next,u=c.next;else if((t=c)===u){a?1===a?ds(t=gs(t,e,i),e,i,r,n,o,2):2===a&&vs(t,e,i,r,n,o):ds(ps(t),e,i,r,n,o,1);break}}}function fs(t){var e=t.prev,i=t,r=t.next;if(0<=Ss(e,i,r))return!1;for(var n=t.next.next;n!==t.prev;){if(ws(e.x,e.y,i.x,i.y,r.x,r.y,n.x,n.y)&&0<=Ss(n.prev,n,n.next))return!1;n=n.next}return!0}function ms(t,e,i,r){var n=t.prev,o=t,a=t.next;if(0<=Ss(n,o,a))return!1;for(var s=n.x<o.x?n.x<a.x?n.x:a.x:o.x<a.x?o.x:a.x,c=n.y<o.y?n.y<a.y?n.y:a.y:o.y<a.y?o.y:a.y,u=n.x>o.x?n.x>a.x?n.x:a.x:o.x>a.x?o.x:a.x,h=n.y>o.y?n.y>a.y?n.y:a.y:o.y>a.y?o.y:a.y,l=xs(s,c,e,i,r),p=xs(u,h,e,i,r),d=t.nextZ;d&&d.z<=p;){if(d!==t.prev&&d!==t.next&&ws(n.x,n.y,o.x,o.y,a.x,a.y,d.x,d.y)&&0<=Ss(d.prev,d,d.next))return!1;d=d.nextZ}for(d=t.prevZ;d&&d.z>=l;){if(d!==t.prev&&d!==t.next&&ws(n.x,n.y,o.x,o.y,a.x,a.y,d.x,d.y)&&0<=Ss(d.prev,d,d.next))return!1;d=d.prevZ}return!0}function gs(t,e,i){var r=t;do{var n=r.prev,o=r.next.next;!As(n,o)&&Ms(n,r,r.next,o)&&Es(n,o)&&Es(o,n)&&(e.push(n.i/i),e.push(r.i/i),e.push(o.i/i),Cs(r),Cs(r.next),r=t=o),r=r.next}while(r!==t);return r}function vs(t,e,i,r,n,o){var a,s,c=t;do{for(var u=c.next.next;u!==c.prev;){if(c.i!==u.i&&(s=u,(a=c).next.i!==s.i&&a.prev.i!==s.i&&!function(t,e){var i=t;do{if(i.i!==t.i&&i.next.i!==t.i&&i.i!==e.i&&i.next.i!==e.i&&Ms(i,i.next,t,e))return!0;i=i.next}while(i!==t);return!1}(a,s)&&Es(a,s)&&Es(s,a)&&function(t,e){var i=t,r=!1,n=(t.x+e.x)/2,o=(t.y+e.y)/2;for(;i.y>o!=i.next.y>o&&i.next.y!==i.y&&n<(i.next.x-i.x)*(o-i.y)/(i.next.y-i.y)+i.x&&(r=!r),i=i.next,i!==t;);return r}(a,s))){var h=Ps(c,u);return c=ps(c,c.next),h=ps(h,h.next),ds(c,e,i,r,n,o),void ds(h,e,i,r,n,o)}u=u.next}c=c.next}while(c!==t)}function ys(t,e){return t.x-e.x}function bs(t,e){if(e=function(t,e){var i,r=e,n=t.x,o=t.y,a=-1/0;do{if(o<=r.y&&o>=r.next.y&&r.next.y!==r.y){var s=r.x+(o-r.y)*(r.next.x-r.x)/(r.next.y-r.y);if(s<=n&&a<s){if((a=s)===n){if(o===r.y)return r;if(o===r.next.y)return r.next}i=r.x<r.next.x?r:r.next}}r=r.next}while(r!==e);if(!i)return null;if(n===a)return i.prev;var c,u=i,h=i.x,l=i.y,p=1/0;r=i.next;for(;r!==u;)n>=r.x&&r.x>=h&&n!==r.x&&ws(o<l?n:a,o,h,l,o<l?a:n,o,r.x,r.y)&&((c=Math.abs(o-r.y)/(n-r.x))<p||c===p&&r.x>i.x)&&Es(r,t)&&(i=r,p=c),r=r.next;return i}(t,e)){var i=Ps(e,t);ps(i,i.next)}}function xs(t,e,i,r,n){return(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t=32767*(t-i)*n)|t<<8))|t<<4))|t<<2))|t<<1))|(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e=32767*(e-r)*n)|e<<8))|e<<4))|e<<2))|e<<1))<<1}function _s(t){for(var e=t,i=t;e.x<i.x&&(i=e),(e=e.next)!==t;);return i}function ws(t,e,i,r,n,o,a,s){return 0<=(n-a)*(e-s)-(t-a)*(o-s)&&0<=(t-a)*(r-s)-(i-a)*(e-s)&&0<=(i-a)*(o-s)-(n-a)*(r-s)}function Ss(t,e,i){return(e.y-t.y)*(i.x-e.x)-(e.x-t.x)*(i.y-e.y)}function As(t,e){return t.x===e.x&&t.y===e.y}function Ms(t,e,i,r){return!!(As(t,e)&&As(i,r)||As(t,r)&&As(i,e))||0<Ss(t,e,i)!=0<Ss(t,e,r)&&0<Ss(i,r,t)!=0<Ss(i,r,e)}function Es(t,e){return Ss(t.prev,t,t.next)<0?0<=Ss(t,e,t.next)&&0<=Ss(t,t.prev,e):Ss(t,e,t.prev)<0||Ss(t,t.next,e)<0}function Ps(t,e){var i=new Is(t.i,t.x,t.y),r=new Is(e.i,e.x,e.y),n=t.next,o=e.prev;return(t.next=e).prev=t,(i.next=n).prev=i,(r.next=i).prev=r,(o.next=r).prev=o,r}function Ts(t,e,i,r){var n=new Is(t,e,i);return r?(n.next=r.next,(n.prev=r).next.prev=n,r.next=n):(n.prev=n).next=n,n}function Cs(t){t.next.prev=t.prev,t.prev.next=t.next,t.prevZ&&(t.prevZ.nextZ=t.nextZ),t.nextZ&&(t.nextZ.prevZ=t.prevZ)}function Is(t,e,i){this.i=t,this.x=e,this.y=i,this.prev=null,this.next=null,this.z=null,this.prevZ=null,this.nextZ=null,this.steiner=!1}var Os={area:function(t){for(var e=t.length,i=0,r=e-1,n=0;n<e;r=n++)i+=t[r].x*t[n].y-t[n].x*t[r].y;return.5*i},isClockWise:function(t){return Os.area(t)<0},triangulateShape:function(t,e){var i=[],r=[],n=[];Ls(t),Rs(i,t);var o=t.length;e.forEach(Ls);for(var a=0;a<e.length;a++)r.push(o),o+=e[a].length,Rs(i,e[a]);var s=hs(i,r);for(a=0;a<s.length;a+=3)n.push(s.slice(a,a+3));return n}};function Ls(t){var e=t.length;2<e&&t[e-1].equals(t[0])&&t.pop()}function Rs(t,e){for(var i=0;i<e.length;i++)t.push(e[i].x),t.push(e[i].y)}function Ds(t,e){_r.call(this),this.type="ExtrudeGeometry",this.parameters={shapes:t,options:e},this.fromBufferGeometry(new ks(t,e)),this.mergeVertices()}function ks(t,Z){$r.call(this),this.type="ExtrudeBufferGeometry",this.parameters={shapes:t,options:Z},t=Array.isArray(t)?t:[t];for(var K=this,J=[],Q=[],e=0,i=t.length;e<i;e++){r(t[e])}function r(t){var r=[],e=void 0!==Z.curveSegments?Z.curveSegments:12,c=void 0!==Z.steps?Z.steps:1,i=void 0!==Z.depth?Z.depth:100,n=void 0===Z.bevelEnabled||Z.bevelEnabled,o=void 0!==Z.bevelThickness?Z.bevelThickness:6,a=void 0!==Z.bevelSize?Z.bevelSize:o-2,u=void 0!==Z.bevelSegments?Z.bevelSegments:3,s=Z.extrudePath,h=void 0!==Z.UVGenerator?Z.UVGenerator:Bs;void 0!==Z.amount&&(console.warn("THREE.ExtrudeBufferGeometry: amount has been renamed to depth."),i=Z.amount);var l,p,d,f,m,g,v,y,b=!1;s&&(l=s.getSpacedPoints(c),n=!(b=!0),p=s.computeFrenetFrames(c,!1),d=new ri,f=new ri,m=new ri),n||(a=o=u=0);var x=t.extractPoints(e),_=x.shape,w=x.holes;if(!Os.isClockWise(_))for(_=_.reverse(),v=0,y=w.length;v<y;v++)g=w[v],Os.isClockWise(g)&&(w[v]=g.reverse());var S=Os.triangulateShape(_,w),A=_;for(v=0,y=w.length;v<y;v++)g=w[v],_=_.concat(g);function M(t,e,i){return e||console.error("THREE.ExtrudeGeometry: vec does not exist"),e.clone().multiplyScalar(i).add(t)}var E,P,T,C,I,O,L=_.length,R=S.length;function D(t,e,i){var r,n,o,a=t.x-e.x,s=t.y-e.y,c=i.x-t.x,u=i.y-t.y,h=a*a+s*s,l=a*u-s*c;if(Math.abs(l)>Number.EPSILON){var p=Math.sqrt(h),d=Math.sqrt(c*c+u*u),f=e.x-s/p,m=e.y+a/p,g=((i.x-u/d-f)*u-(i.y+c/d-m)*c)/(a*u-s*c),v=(r=f+a*g-t.x)*r+(n=m+s*g-t.y)*n;if(v<=2)return new ti(r,n);o=Math.sqrt(v/2)}else{var y=!1;a>Number.EPSILON?c>Number.EPSILON&&(y=!0):a<-Number.EPSILON?c<-Number.EPSILON&&(y=!0):Math.sign(s)===Math.sign(u)&&(y=!0),y?(r=-s,n=a,o=Math.sqrt(h)):(r=a,n=s,o=Math.sqrt(h/2))}return new ti(r/o,n/o)}for(var k=[],B=0,N=A.length,F=N-1,z=B+1;B<N;B++,F++,z++)F===N&&(F=0),z===N&&(z=0),k[B]=D(A[B],A[F],A[z]);var U,j,G=[],V=k.concat();for(v=0,y=w.length;v<y;v++){for(g=w[v],U=[],B=0,F=(N=g.length)-1,z=B+1;B<N;B++,F++,z++)F===N&&(F=0),z===N&&(z=0),U[B]=D(g[B],g[F],g[z]);G.push(U),V=V.concat(U)}for(E=0;E<u;E++){for(T=E/u,C=o*Math.cos(T*Math.PI/2),P=a*Math.sin(T*Math.PI/2),B=0,N=A.length;B<N;B++)$((I=M(A[B],k[B],P)).x,I.y,-C);for(v=0,y=w.length;v<y;v++)for(g=w[v],U=G[v],B=0,N=g.length;B<N;B++)$((I=M(g[B],U[B],P)).x,I.y,-C)}for(P=a,B=0;B<L;B++)I=n?M(_[B],V[B],P):_[B],b?(f.copy(p.normals[0]).multiplyScalar(I.x),d.copy(p.binormals[0]).multiplyScalar(I.y),m.copy(l[0]).add(f).add(d),$(m.x,m.y,m.z)):$(I.x,I.y,0);for(j=1;j<=c;j++)for(B=0;B<L;B++)I=n?M(_[B],V[B],P):_[B],b?(f.copy(p.normals[j]).multiplyScalar(I.x),d.copy(p.binormals[j]).multiplyScalar(I.y),m.copy(l[j]).add(f).add(d),$(m.x,m.y,m.z)):$(I.x,I.y,i/c*j);for(E=u-1;0<=E;E--){for(T=E/u,C=o*Math.cos(T*Math.PI/2),P=a*Math.sin(T*Math.PI/2),B=0,N=A.length;B<N;B++)$((I=M(A[B],k[B],P)).x,I.y,i+C);for(v=0,y=w.length;v<y;v++)for(g=w[v],U=G[v],B=0,N=g.length;B<N;B++)I=M(g[B],U[B],P),b?$(I.x,I.y+l[c-1].y,l[c-1].x+C):$(I.x,I.y,i+C)}function H(t,e){var i,r;for(B=t.length;0<=--B;){(r=(i=B)-1)<0&&(r=t.length-1);var n=0,o=c+2*u;for(n=0;n<o;n++){var a=L*n,s=L*(n+1);X(e+i+a,e+r+a,e+r+s,e+i+s)}}}function $(t,e,i){r.push(t),r.push(e),r.push(i)}function W(t,e,i){q(t),q(e),q(i);var r=J.length/3,n=h.generateTopUV(K,J,r-3,r-2,r-1);Y(n[0]),Y(n[1]),Y(n[2])}function X(t,e,i,r){q(t),q(e),q(r),q(e),q(i),q(r);var n=J.length/3,o=h.generateSideWallUV(K,J,n-6,n-3,n-2,n-1);Y(o[0]),Y(o[1]),Y(o[3]),Y(o[1]),Y(o[2]),Y(o[3])}function q(t){J.push(r[3*t+0]),J.push(r[3*t+1]),J.push(r[3*t+2])}function Y(t){Q.push(t.x),Q.push(t.y)}!function(){var t=J.length/3;if(n){var e=0,i=L*e;for(B=0;B<R;B++)W((O=S[B])[2]+i,O[1]+i,O[0]+i);for(i=L*(e=c+2*u),B=0;B<R;B++)W((O=S[B])[0]+i,O[1]+i,O[2]+i)}else{for(B=0;B<R;B++)W((O=S[B])[2],O[1],O[0]);for(B=0;B<R;B++)W((O=S[B])[0]+L*c,O[1]+L*c,O[2]+L*c)}K.addGroup(t,J.length/3-t,0)}(),function(){var t=J.length/3,e=0;for(H(A,e),e+=A.length,v=0,y=w.length;v<y;v++)H(g=w[v],e),e+=g.length;K.addGroup(t,J.length/3-t,1)}()}this.addAttribute("position",new Ir(J,3)),this.addAttribute("uv",new Ir(Q,2)),this.computeVertexNormals()}((Ds.prototype=Object.create(_r.prototype)).constructor=Ds).prototype.toJSON=function(){var t=_r.prototype.toJSON.call(this);return Ns(this.parameters.shapes,this.parameters.options,t)},((ks.prototype=Object.create($r.prototype)).constructor=ks).prototype.toJSON=function(){var t=$r.prototype.toJSON.call(this);return Ns(this.parameters.shapes,this.parameters.options,t)};var Bs={generateTopUV:function(t,e,i,r,n){var o=e[3*i],a=e[3*i+1],s=e[3*r],c=e[3*r+1],u=e[3*n],h=e[3*n+1];return[new ti(o,a),new ti(s,c),new ti(u,h)]},generateSideWallUV:function(t,e,i,r,n,o){var a=e[3*i],s=e[3*i+1],c=e[3*i+2],u=e[3*r],h=e[3*r+1],l=e[3*r+2],p=e[3*n],d=e[3*n+1],f=e[3*n+2],m=e[3*o],g=e[3*o+1],v=e[3*o+2];return Math.abs(s-h)<.01?[new ti(a,1-c),new ti(u,1-l),new ti(p,1-f),new ti(m,1-v)]:[new ti(s,1-c),new ti(h,1-l),new ti(d,1-f),new ti(g,1-v)]}};function Ns(t,e,i){if(i.shapes=[],Array.isArray(t))for(var r=0,n=t.length;r<n;r++){var o=t[r];i.shapes.push(o.uuid)}else i.shapes.push(t.uuid);return void 0!==e.extrudePath&&(i.options.extrudePath=e.extrudePath.toJSON()),i}function Fs(t,e){_r.call(this),this.type="TextGeometry",this.parameters={text:t,parameters:e},this.fromBufferGeometry(new zs(t,e)),this.mergeVertices()}function zs(t,e){var i=(e=e||{}).font;if(!i||!i.isFont)return console.error("THREE.TextGeometry: font parameter is not an instance of THREE.Font."),new _r;var r=i.generateShapes(t,e.size);e.depth=void 0!==e.height?e.height:50,void 0===e.bevelThickness&&(e.bevelThickness=10),void 0===e.bevelSize&&(e.bevelSize=8),void 0===e.bevelEnabled&&(e.bevelEnabled=!1),ks.call(this,r,e),this.type="TextBufferGeometry"}function Us(t,e,i,r,n,o,a){_r.call(this),this.type="SphereGeometry",this.parameters={radius:t,widthSegments:e,heightSegments:i,phiStart:r,phiLength:n,thetaStart:o,thetaLength:a},this.fromBufferGeometry(new js(t,e,i,r,n,o,a)),this.mergeVertices()}function js(t,e,i,r,n,o,a){$r.call(this),this.type="SphereBufferGeometry",this.parameters={radius:t,widthSegments:e,heightSegments:i,phiStart:r,phiLength:n,thetaStart:o,thetaLength:a},t=t||1,e=Math.max(3,Math.floor(e)||8),i=Math.max(2,Math.floor(i)||6),r=void 0!==r?r:0,n=void 0!==n?n:2*Math.PI;var s,c,u=(o=void 0!==o?o:0)+(a=void 0!==a?a:Math.PI),h=0,l=[],p=new ri,d=new ri,f=[],m=[],g=[],v=[];for(c=0;c<=i;c++){var y=[],b=c/i;for(s=0;s<=e;s++){var x=s/e;p.x=-t*Math.cos(r+x*n)*Math.sin(o+b*a),p.y=t*Math.cos(o+b*a),p.z=t*Math.sin(r+x*n)*Math.sin(o+b*a),m.push(p.x,p.y,p.z),d.set(p.x,p.y,p.z).normalize(),g.push(d.x,d.y,d.z),v.push(x,1-b),y.push(h++)}l.push(y)}for(c=0;c<i;c++)for(s=0;s<e;s++){var _=l[c][s+1],w=l[c][s],S=l[c+1][s],A=l[c+1][s+1];(0!==c||0<o)&&f.push(_,w,A),(c!==i-1||u<Math.PI)&&f.push(w,S,A)}this.setIndex(f),this.addAttribute("position",new Ir(m,3)),this.addAttribute("normal",new Ir(g,3)),this.addAttribute("uv",new Ir(v,2))}function Gs(t,e,i,r,n,o){_r.call(this),this.type="RingGeometry",this.parameters={innerRadius:t,outerRadius:e,thetaSegments:i,phiSegments:r,thetaStart:n,thetaLength:o},this.fromBufferGeometry(new Vs(t,e,i,r,n,o)),this.mergeVertices()}function Vs(t,e,i,r,n,o){$r.call(this),this.type="RingBufferGeometry",this.parameters={innerRadius:t,outerRadius:e,thetaSegments:i,phiSegments:r,thetaStart:n,thetaLength:o},t=t||.5,e=e||1,n=void 0!==n?n:0,o=void 0!==o?o:2*Math.PI,i=void 0!==i?Math.max(3,i):8;var a,s,c,u=[],h=[],l=[],p=[],d=t,f=(e-t)/(r=void 0!==r?Math.max(1,r):1),m=new ri,g=new ti;for(s=0;s<=r;s++){for(c=0;c<=i;c++)a=n+c/i*o,m.x=d*Math.cos(a),m.y=d*Math.sin(a),h.push(m.x,m.y,m.z),l.push(0,0,1),g.x=(m.x/e+1)/2,g.y=(m.y/e+1)/2,p.push(g.x,g.y);d+=f}for(s=0;s<r;s++){var v=s*(i+1);for(c=0;c<i;c++){var y=a=c+v,b=a+i+1,x=a+i+2,_=a+1;u.push(y,b,_),u.push(b,x,_)}}this.setIndex(u),this.addAttribute("position",new Ir(h,3)),this.addAttribute("normal",new Ir(l,3)),this.addAttribute("uv",new Ir(p,2))}function Hs(t,e,i,r){_r.call(this),this.type="LatheGeometry",this.parameters={points:t,segments:e,phiStart:i,phiLength:r},this.fromBufferGeometry(new $s(t,e,i,r)),this.mergeVertices()}function $s(t,e,i,r){$r.call(this),this.type="LatheBufferGeometry",this.parameters={points:t,segments:e,phiStart:i,phiLength:r},e=Math.floor(e)||12,i=i||0,r=r||2*Math.PI,r=Qe.clamp(r,0,2*Math.PI);var n,o,a,s=[],c=[],u=[],h=1/e,l=new ri,p=new ti;for(o=0;o<=e;o++){var d=i+o*h*r,f=Math.sin(d),m=Math.cos(d);for(a=0;a<=t.length-1;a++)l.x=t[a].x*f,l.y=t[a].y,l.z=t[a].x*m,c.push(l.x,l.y,l.z),p.x=o/e,p.y=a/(t.length-1),u.push(p.x,p.y)}for(o=0;o<e;o++)for(a=0;a<t.length-1;a++){var g=n=a+o*t.length,v=n+t.length,y=n+t.length+1,b=n+1;s.push(g,v,b),s.push(v,y,b)}if(this.setIndex(s),this.addAttribute("position",new Ir(c,3)),this.addAttribute("uv",new Ir(u,2)),this.computeVertexNormals(),r===2*Math.PI){var x=this.attributes.normal.array,_=new ri,w=new ri,S=new ri;for(n=e*t.length*3,a=o=0;o<t.length;o++,a+=3)_.x=x[a+0],_.y=x[a+1],_.z=x[a+2],w.x=x[n+a+0],w.y=x[n+a+1],w.z=x[n+a+2],S.addVectors(_,w).normalize(),x[a+0]=x[n+a+0]=S.x,x[a+1]=x[n+a+1]=S.y,x[a+2]=x[n+a+2]=S.z}}function Ws(t,e){_r.call(this),this.type="ShapeGeometry","object"==typeof e&&(console.warn("THREE.ShapeGeometry: Options parameter has been removed."),e=e.curveSegments),this.parameters={shapes:t,curveSegments:e},this.fromBufferGeometry(new Xs(t,e)),this.mergeVertices()}function Xs(t,f){$r.call(this),this.type="ShapeBufferGeometry",this.parameters={shapes:t,curveSegments:f},f=f||12;var m=[],g=[],v=[],y=[],e=0,b=0;if(!1===Array.isArray(t))r(t);else for(var i=0;i<t.length;i++)r(t[i]),this.addGroup(e,b,i),e+=b,b=0;function r(t){var e,i,r,n=g.length/3,o=t.extractPoints(f),a=o.shape,s=o.holes;if(!1===Os.isClockWise(a))for(a=a.reverse(),e=0,i=s.length;e<i;e++)r=s[e],!0===Os.isClockWise(r)&&(s[e]=r.reverse());var c=Os.triangulateShape(a,s);for(e=0,i=s.length;e<i;e++)r=s[e],a=a.concat(r);for(e=0,i=a.length;e<i;e++){var u=a[e];g.push(u.x,u.y,0),v.push(0,0,1),y.push(u.x,u.y)}for(e=0,i=c.length;e<i;e++){var h=c[e],l=h[0]+n,p=h[1]+n,d=h[2]+n;m.push(l,p,d),b+=3}}this.setIndex(m),this.addAttribute("position",new Ir(g,3)),this.addAttribute("normal",new Ir(v,3)),this.addAttribute("uv",new Ir(y,2))}function qs(t,e){if(e.shapes=[],Array.isArray(t))for(var i=0,r=t.length;i<r;i++){var n=t[i];e.shapes.push(n.uuid)}else e.shapes.push(t.uuid);return e}function Ys(t,e){$r.call(this),this.type="EdgesGeometry",this.parameters={thresholdAngle:e},e=void 0!==e?e:1;var i,r,n,o,a=[],s=Math.cos(Qe.DEG2RAD*e),c=[0,0],u={},h=["a","b","c"];t.isBufferGeometry?(o=new _r).fromBufferGeometry(t):o=t.clone(),o.mergeVertices(),o.computeFaceNormals();for(var l=o.vertices,p=o.faces,d=0,f=p.length;d<f;d++)for(var m=p[d],g=0;g<3;g++)i=m[h[g]],r=m[h[(g+1)%3]],c[0]=Math.min(i,r),c[1]=Math.max(i,r),void 0===u[n=c[0]+","+c[1]]?u[n]={index1:c[0],index2:c[1],face1:d,face2:void 0}:u[n].face2=d;for(n in u){var v=u[n];if(void 0===v.face2||p[v.face1].normal.dot(p[v.face2].normal)<=s){var y=l[v.index1];a.push(y.x,y.y,y.z),y=l[v.index2],a.push(y.x,y.y,y.z)}}this.addAttribute("position",new Ir(a,3))}function Zs(t,e,i,r,n,o,a,s){_r.call(this),this.type="CylinderGeometry",this.parameters={radiusTop:t,radiusBottom:e,height:i,radialSegments:r,heightSegments:n,openEnded:o,thetaStart:a,thetaLength:s},this.fromBufferGeometry(new Ks(t,e,i,r,n,o,a,s)),this.mergeVertices()}function Ks(v,y,b,x,_,t,w,S){$r.call(this),this.type="CylinderBufferGeometry",this.parameters={radiusTop:v,radiusBottom:y,height:b,radialSegments:x,heightSegments:_,openEnded:t,thetaStart:w,thetaLength:S};var A=this;v=void 0!==v?v:1,y=void 0!==y?y:1,b=b||1,x=Math.floor(x)||8,_=Math.floor(_)||1,t=void 0!==t&&t,w=void 0!==w?w:0,S=void 0!==S?S:2*Math.PI;var M=[],E=[],P=[],T=[],C=0,I=[],O=b/2,L=0;function e(t){var e,i,r,n=new ti,o=new ri,a=0,s=!0===t?v:y,c=!0===t?1:-1;for(i=C,e=1;e<=x;e++)E.push(0,O*c,0),P.push(0,c,0),T.push(.5,.5),C++;for(r=C,e=0;e<=x;e++){var u=e/x*S+w,h=Math.cos(u),l=Math.sin(u);o.x=s*l,o.y=O*c,o.z=s*h,E.push(o.x,o.y,o.z),P.push(0,c,0),n.x=.5*h+.5,n.y=.5*l*c+.5,T.push(n.x,n.y),C++}for(e=0;e<x;e++){var p=i+e,d=r+e;!0===t?M.push(d,d+1,p):M.push(d+1,d,p),a+=3}A.addGroup(L,a,!0===t?1:2),L+=a}!function(){var t,e,i=new ri,r=new ri,n=0,o=(y-v)/b;for(e=0;e<=_;e++){var a=[],s=e/_,c=s*(y-v)+v;for(t=0;t<=x;t++){var u=t/x,h=u*S+w,l=Math.sin(h),p=Math.cos(h);r.x=c*l,r.y=-s*b+O,r.z=c*p,E.push(r.x,r.y,r.z),i.set(l,o,p).normalize(),P.push(i.x,i.y,i.z),T.push(u,1-s),a.push(C++)}I.push(a)}for(t=0;t<x;t++)for(e=0;e<_;e++){var d=I[e][t],f=I[e+1][t],m=I[e+1][t+1],g=I[e][t+1];M.push(d,f,g),M.push(f,m,g),n+=6}A.addGroup(L,n,0),L+=n}(),!1===t&&(0<v&&e(!0),0<y&&e(!1)),this.setIndex(M),this.addAttribute("position",new Ir(E,3)),this.addAttribute("normal",new Ir(P,3)),this.addAttribute("uv",new Ir(T,2))}function Js(t,e,i,r,n,o,a){Zs.call(this,0,t,e,i,r,n,o,a),this.type="ConeGeometry",this.parameters={radius:t,height:e,radialSegments:i,heightSegments:r,openEnded:n,thetaStart:o,thetaLength:a}}function Qs(t,e,i,r,n,o,a){Ks.call(this,0,t,e,i,r,n,o,a),this.type="ConeBufferGeometry",this.parameters={radius:t,height:e,radialSegments:i,heightSegments:r,openEnded:n,thetaStart:o,thetaLength:a}}function tc(t,e,i,r){_r.call(this),this.type="CircleGeometry",this.parameters={radius:t,segments:e,thetaStart:i,thetaLength:r},this.fromBufferGeometry(new ec(t,e,i,r)),this.mergeVertices()}function ec(t,e,i,r){$r.call(this),this.type="CircleBufferGeometry",this.parameters={radius:t,segments:e,thetaStart:i,thetaLength:r},t=t||1,e=void 0!==e?Math.max(3,e):8,i=void 0!==i?i:0,r=void 0!==r?r:2*Math.PI;var n,o,a=[],s=[],c=[],u=[],h=new ri,l=new ti;for(s.push(0,0,0),c.push(0,0,1),u.push(.5,.5),o=0,n=3;o<=e;o++,n+=3){var p=i+o/e*r;h.x=t*Math.cos(p),h.y=t*Math.sin(p),s.push(h.x,h.y,h.z),c.push(0,0,1),l.x=(s[n]/t+1)/2,l.y=(s[n+1]/t+1)/2,u.push(l.x,l.y)}for(n=1;n<=e;n++)a.push(n,n+1,0);this.setIndex(a),this.addAttribute("position",new Ir(s,3)),this.addAttribute("normal",new Ir(c,3)),this.addAttribute("uv",new Ir(u,2))}(Fs.prototype=Object.create(_r.prototype)).constructor=Fs,(zs.prototype=Object.create(ks.prototype)).constructor=zs,(Us.prototype=Object.create(_r.prototype)).constructor=Us,(js.prototype=Object.create($r.prototype)).constructor=js,(Gs.prototype=Object.create(_r.prototype)).constructor=Gs,(Vs.prototype=Object.create($r.prototype)).constructor=Vs,(Hs.prototype=Object.create(_r.prototype)).constructor=Hs,($s.prototype=Object.create($r.prototype)).constructor=$s,((Ws.prototype=Object.create(_r.prototype)).constructor=Ws).prototype.toJSON=function(){var t=_r.prototype.toJSON.call(this);return qs(this.parameters.shapes,t)},((Xs.prototype=Object.create($r.prototype)).constructor=Xs).prototype.toJSON=function(){var t=$r.prototype.toJSON.call(this);return qs(this.parameters.shapes,t)},(Ys.prototype=Object.create($r.prototype)).constructor=Ys,(Zs.prototype=Object.create(_r.prototype)).constructor=Zs,(Ks.prototype=Object.create($r.prototype)).constructor=Ks,(Js.prototype=Object.create(Zs.prototype)).constructor=Js,(Qs.prototype=Object.create(Ks.prototype)).constructor=Qs,(tc.prototype=Object.create(_r.prototype)).constructor=tc,(ec.prototype=Object.create($r.prototype)).constructor=ec;var ic=Object.freeze({WireframeGeometry:$a,ParametricGeometry:Wa,ParametricBufferGeometry:Xa,TetrahedronGeometry:Za,TetrahedronBufferGeometry:Ka,OctahedronGeometry:Ja,OctahedronBufferGeometry:Qa,IcosahedronGeometry:ts,IcosahedronBufferGeometry:es,DodecahedronGeometry:is,DodecahedronBufferGeometry:rs,PolyhedronGeometry:qa,PolyhedronBufferGeometry:Ya,TubeGeometry:ns,TubeBufferGeometry:os,TorusKnotGeometry:as,TorusKnotBufferGeometry:ss,TorusGeometry:cs,TorusBufferGeometry:us,TextGeometry:Fs,TextBufferGeometry:zs,SphereGeometry:Us,SphereBufferGeometry:js,RingGeometry:Gs,RingBufferGeometry:Vs,PlaneGeometry:qr,PlaneBufferGeometry:Yr,LatheGeometry:Hs,LatheBufferGeometry:$s,ShapeGeometry:Ws,ShapeBufferGeometry:Xs,ExtrudeGeometry:Ds,ExtrudeBufferGeometry:ks,EdgesGeometry:Ys,ConeGeometry:Js,ConeBufferGeometry:Qs,CylinderGeometry:Zs,CylinderBufferGeometry:Ks,CircleGeometry:tc,CircleBufferGeometry:ec,BoxGeometry:Wr,BoxBufferGeometry:Xr});function rc(t){wn.call(this),this.type="ShadowMaterial",this.color=new ki(0),this.transparent=!0,this.setValues(t)}function nc(t){An.call(this,t),this.type="RawShaderMaterial"}function oc(t){wn.call(this),this.defines={STANDARD:""},this.type="MeshStandardMaterial",this.color=new ki(16777215),this.roughness=.5,this.metalness=.5,this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new ki(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=Ke,this.normalScale=new ti(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.roughnessMap=null,this.metalnessMap=null,this.alphaMap=null,this.envMap=null,this.envMapIntensity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.skinning=!1,this.morphTargets=!1,this.morphNormals=!1,this.setValues(t)}function ac(t){oc.call(this),this.defines={PHYSICAL:""},this.type="MeshPhysicalMaterial",this.reflectivity=.5,this.clearCoat=0,this.clearCoatRoughness=0,this.setValues(t)}function sc(t){wn.call(this),this.type="MeshPhongMaterial",this.color=new ki(16777215),this.specular=new ki(1118481),this.shininess=30,this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new ki(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=Ke,this.normalScale=new ti(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.combine=Mt,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.skinning=!1,this.morphTargets=!1,this.morphNormals=!1,this.setValues(t)}function cc(t){sc.call(this),this.defines={TOON:""},this.type="MeshToonMaterial",this.gradientMap=null,this.setValues(t)}function uc(t){wn.call(this),this.type="MeshNormalMaterial",this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=Ke,this.normalScale=new ti(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.fog=!1,this.lights=!1,this.skinning=!1,this.morphTargets=!1,this.morphNormals=!1,this.setValues(t)}function hc(t){wn.call(this),this.type="MeshLambertMaterial",this.color=new ki(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new ki(0),this.emissiveIntensity=1,this.emissiveMap=null,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.combine=Mt,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.skinning=!1,this.morphTargets=!1,this.morphNormals=!1,this.setValues(t)}function lc(t){ka.call(this),this.type="LineDashedMaterial",this.scale=1,this.dashSize=3,this.gapSize=1,this.setValues(t)}((rc.prototype=Object.create(wn.prototype)).constructor=rc).prototype.isShadowMaterial=!0,rc.prototype.copy=function(t){return wn.prototype.copy.call(this,t),this.color.copy(t.color),this},((nc.prototype=Object.create(An.prototype)).constructor=nc).prototype.isRawShaderMaterial=!0,((oc.prototype=Object.create(wn.prototype)).constructor=oc).prototype.isMeshStandardMaterial=!0,oc.prototype.copy=function(t){return wn.prototype.copy.call(this,t),this.defines={STANDARD:""},this.color.copy(t.color),this.roughness=t.roughness,this.metalness=t.metalness,this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.roughnessMap=t.roughnessMap,this.metalnessMap=t.metalnessMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.envMapIntensity=t.envMapIntensity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.skinning=t.skinning,this.morphTargets=t.morphTargets,this.morphNormals=t.morphNormals,this},((ac.prototype=Object.create(oc.prototype)).constructor=ac).prototype.isMeshPhysicalMaterial=!0,ac.prototype.copy=function(t){return oc.prototype.copy.call(this,t),this.defines={PHYSICAL:""},this.reflectivity=t.reflectivity,this.clearCoat=t.clearCoat,this.clearCoatRoughness=t.clearCoatRoughness,this},((sc.prototype=Object.create(wn.prototype)).constructor=sc).prototype.isMeshPhongMaterial=!0,sc.prototype.copy=function(t){return wn.prototype.copy.call(this,t),this.color.copy(t.color),this.specular.copy(t.specular),this.shininess=t.shininess,this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.skinning=t.skinning,this.morphTargets=t.morphTargets,this.morphNormals=t.morphNormals,this},((cc.prototype=Object.create(sc.prototype)).constructor=cc).prototype.isMeshToonMaterial=!0,cc.prototype.copy=function(t){return sc.prototype.copy.call(this,t),this.gradientMap=t.gradientMap,this},((uc.prototype=Object.create(wn.prototype)).constructor=uc).prototype.isMeshNormalMaterial=!0,uc.prototype.copy=function(t){return wn.prototype.copy.call(this,t),this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.skinning=t.skinning,this.morphTargets=t.morphTargets,this.morphNormals=t.morphNormals,this},((hc.prototype=Object.create(wn.prototype)).constructor=hc).prototype.isMeshLambertMaterial=!0,hc.prototype.copy=function(t){return wn.prototype.copy.call(this,t),this.color.copy(t.color),this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.skinning=t.skinning,this.morphTargets=t.morphTargets,this.morphNormals=t.morphNormals,this},((lc.prototype=Object.create(ka.prototype)).constructor=lc).prototype.isLineDashedMaterial=!0,lc.prototype.copy=function(t){return ka.prototype.copy.call(this,t),this.scale=t.scale,this.dashSize=t.dashSize,this.gapSize=t.gapSize,this};var pc=Object.freeze({ShadowMaterial:rc,SpriteMaterial:Ca,RawShaderMaterial:nc,ShaderMaterial:An,PointsMaterial:za,MeshPhysicalMaterial:ac,MeshStandardMaterial:oc,MeshPhongMaterial:sc,MeshToonMaterial:cc,MeshNormalMaterial:uc,MeshLambertMaterial:hc,MeshDepthMaterial:pa,MeshDistanceMaterial:da,MeshBasicMaterial:Sn,LineDashedMaterial:lc,LineBasicMaterial:ka,Material:wn}),dc={enabled:!1,files:{},add:function(t,e){!1!==this.enabled&&(this.files[t]=e)},get:function(t){if(!1!==this.enabled)return this.files[t]},remove:function(t){delete this.files[t]},clear:function(){this.files={}}};function fc(t,e,i){var r=this,n=!1,o=0,a=0,s=void 0;this.onStart=void 0,this.onLoad=t,this.onProgress=e,this.onError=i,this.itemStart=function(t){a++,!1===n&&void 0!==r.onStart&&r.onStart(t,o,a),n=!0},this.itemEnd=function(t){o++,void 0!==r.onProgress&&r.onProgress(t,o,a),o===a&&(n=!1,void 0!==r.onLoad&&r.onLoad())},this.itemError=function(t){void 0!==r.onError&&r.onError(t)},this.resolveURL=function(t){return s?s(t):t},this.setURLModifier=function(t){return s=t,this}}var mc=new fc,gc={};function vc(t){this.manager=void 0!==t?t:mc}function yc(t){this.manager=void 0!==t?t:mc}function bc(t){this.manager=void 0!==t?t:mc}function xc(t){this.manager=void 0!==t?t:mc}function _c(){this.type="Curve",this.arcLengthDivisions=200}function wc(t,e,i,r,n,o,a,s){_c.call(this),this.type="EllipseCurve",this.aX=t||0,this.aY=e||0,this.xRadius=i||1,this.yRadius=r||1,this.aStartAngle=n||0,this.aEndAngle=o||2*Math.PI,this.aClockwise=a||!1,this.aRotation=s||0}function Sc(t,e,i,r,n,o){wc.call(this,t,e,i,i,r,n,o),this.type="ArcCurve"}function Ac(){var n=0,o=0,a=0,s=0;function u(t,e,i,r){a=-3*(n=t)+3*e-2*(o=i)-r,s=2*t-2*e+i+r}return{initCatmullRom:function(t,e,i,r,n){u(e,i,n*(i-t),n*(r-e))},initNonuniformCatmullRom:function(t,e,i,r,n,o,a){var s=(e-t)/n-(i-t)/(n+o)+(i-e)/o,c=(i-e)/o-(r-e)/(o+a)+(r-i)/a;u(e,i,s*=o,c*=o)},calc:function(t){var e=t*t;return n+o*t+a*e+s*(e*t)}}}Object.assign(vc.prototype,{load:function(a,t,e,i){void 0===a&&(a=""),void 0!==this.path&&(a=this.path+a),a=this.manager.resolveURL(a);var s=this,r=dc.get(a);if(void 0!==r)return s.manager.itemStart(a),setTimeout(function(){t&&t(r),s.manager.itemEnd(a)},0),r;if(void 0===gc[a]){var n=a.match(/^data:(.*?)(;base64)?,(.*)$/);if(n){var o=n[1],c=!!n[2],u=n[3];u=window.decodeURIComponent(u),c&&(u=window.atob(u));try{var h,l=(this.responseType||"").toLowerCase();switch(l){case"arraybuffer":case"blob":for(var p=new Uint8Array(u.length),d=0;d<u.length;d++)p[d]=u.charCodeAt(d);h="blob"===l?new Blob([p.buffer],{type:o}):p.buffer;break;case"document":var f=new DOMParser;h=f.parseFromString(u,o);break;case"json":h=JSON.parse(u);break;default:h=u}window.setTimeout(function(){t&&t(h),s.manager.itemEnd(a)},0)}catch(t){window.setTimeout(function(){i&&i(t),s.manager.itemEnd(a),s.manager.itemError(a)},0)}}else{gc[a]=[],gc[a].push({onLoad:t,onProgress:e,onError:i});var m=new XMLHttpRequest;for(var g in m.open("GET",a,!0),m.addEventListener("load",function(t){var e=this.response;dc.add(a,e);var i=gc[a];if(delete gc[a],200===this.status||0===this.status){0===this.status&&console.warn("THREE.FileLoader: HTTP Status 0 received.");for(var r=0,n=i.length;r<n;r++){(o=i[r]).onLoad&&o.onLoad(e)}s.manager.itemEnd(a)}else{for(r=0,n=i.length;r<n;r++){var o;(o=i[r]).onError&&o.onError(t)}s.manager.itemEnd(a),s.manager.itemError(a)}},!1),m.addEventListener("progress",function(t){for(var e=gc[a],i=0,r=e.length;i<r;i++){var n=e[i];n.onProgress&&n.onProgress(t)}},!1),m.addEventListener("error",function(t){var e=gc[a];delete gc[a];for(var i=0,r=e.length;i<r;i++){var n=e[i];n.onError&&n.onError(t)}s.manager.itemEnd(a),s.manager.itemError(a)},!1),void 0!==this.responseType&&(m.responseType=this.responseType),void 0!==this.withCredentials&&(m.withCredentials=this.withCredentials),m.overrideMimeType&&m.overrideMimeType(void 0!==this.mimeType?this.mimeType:"text/plain"),this.requestHeader)m.setRequestHeader(g,this.requestHeader[g]);m.send(null)}return s.manager.itemStart(a),m}gc[a].push({onLoad:t,onProgress:e,onError:i})},setPath:function(t){return this.path=t,this},setResponseType:function(t){return this.responseType=t,this},setWithCredentials:function(t){return this.withCredentials=t,this},setMimeType:function(t){return this.mimeType=t,this},setRequestHeader:function(t){return this.requestHeader=t,this}}),Object.assign(function(t){this.manager=void 0!==t?t:mc,this._parser=null}.prototype,{load:function(t,o,e,r){var a=this,s=[],c=new Ga;c.image=s;var n=new vc(this.manager);function i(i){n.load(t[i],function(t){var e=a._parser(t,!0);s[i]={width:e.width,height:e.height,format:e.format,mipmaps:e.mipmaps},6===(u+=1)&&(1===e.mipmapCount&&(c.minFilter=Wt),c.format=e.format,c.needsUpdate=!0,o&&o(c))},e,r)}if(n.setPath(this.path),n.setResponseType("arraybuffer"),Array.isArray(t))for(var u=0,h=0,l=t.length;h<l;++h)i(h);else n.load(t,function(t){var e=a._parser(t,!0);if(e.isCubemap)for(var i=e.mipmaps.length/e.mipmapCount,r=0;r<i;r++){s[r]={mipmaps:[]};for(var n=0;n<e.mipmapCount;n++)s[r].mipmaps.push(e.mipmaps[r*e.mipmapCount+n]),s[r].format=e.format,s[r].width=e.width,s[r].height=e.height}else c.image.width=e.width,c.image.height=e.height,c.mipmaps=e.mipmaps;1===e.mipmapCount&&(c.minFilter=Wt),c.format=e.format,c.needsUpdate=!0,o&&o(c)},e,r);return c},setPath:function(t){return this.path=t,this}}),Object.assign(function(t){this.manager=void 0!==t?t:mc,this._parser=null}.prototype,{load:function(t,i,e,r){var n=this,o=new Ei,a=new vc(this.manager);return a.setResponseType("arraybuffer"),a.load(t,function(t){var e=n._parser(t);e&&(void 0!==e.image?o.image=e.image:void 0!==e.data&&(o.image.width=e.width,o.image.height=e.height,o.image.data=e.data),o.wrapS=void 0!==e.wrapS?e.wrapS:jt,o.wrapT=void 0!==e.wrapT?e.wrapT:jt,o.magFilter=void 0!==e.magFilter?e.magFilter:Wt,o.minFilter=void 0!==e.minFilter?e.minFilter:qt,o.anisotropy=void 0!==e.anisotropy?e.anisotropy:1,void 0!==e.format&&(o.format=e.format),void 0!==e.type&&(o.type=e.type),void 0!==e.mipmaps&&(o.mipmaps=e.mipmaps),1===e.mipmapCount&&(o.minFilter=Wt),o.needsUpdate=!0,i&&i(o,e))},e,r),o}}),Object.assign(yc.prototype,{crossOrigin:"anonymous",load:function(e,t,i,r){void 0===e&&(e=""),void 0!==this.path&&(e=this.path+e),e=this.manager.resolveURL(e);var n=this,o=dc.get(e);if(void 0!==o)return n.manager.itemStart(e),setTimeout(function(){t&&t(o),n.manager.itemEnd(e)},0),o;var a=document.createElementNS("http://www.w3.org/1999/xhtml","img");function s(){a.removeEventListener("load",s,!1),a.removeEventListener("error",c,!1),dc.add(e,this),t&&t(this),n.manager.itemEnd(e)}function c(t){a.removeEventListener("load",s,!1),a.removeEventListener("error",c,!1),r&&r(t),n.manager.itemEnd(e),n.manager.itemError(e)}return a.addEventListener("load",s,!1),a.addEventListener("error",c,!1),"data:"!==e.substr(0,5)&&void 0!==this.crossOrigin&&(a.crossOrigin=this.crossOrigin),n.manager.itemStart(e),a.src=e,a},setCrossOrigin:function(t){return this.crossOrigin=t,this},setPath:function(t){return this.path=t,this}}),Object.assign(bc.prototype,{crossOrigin:"anonymous",load:function(t,i,e,r){var n=new zn,o=new yc(this.manager);o.setCrossOrigin(this.crossOrigin),o.setPath(this.path);var a=0;function s(e){o.load(t[e],function(t){n.images[e]=t,6===++a&&(n.needsUpdate=!0,i&&i(n))},void 0,r)}for(var c=0;c<t.length;++c)s(c);return n},setCrossOrigin:function(t){return this.crossOrigin=t,this},setPath:function(t){return this.path=t,this}}),Object.assign(xc.prototype,{crossOrigin:"anonymous",load:function(i,r,t,e){var n=new wi,o=new yc(this.manager);return o.setCrossOrigin(this.crossOrigin),o.setPath(this.path),o.load(i,function(t){n.image=t;var e=0<i.search(/\.(jpg|jpeg)$/)||0===i.search(/^data\:image\/jpeg/);n.format=e?ce:ue,n.needsUpdate=!0,void 0!==r&&r(n)},t,e),n},setCrossOrigin:function(t){return this.crossOrigin=t,this},setPath:function(t){return this.path=t,this}}),Object.assign(_c.prototype,{getPoint:function(){return console.warn("THREE.Curve: .getPoint() not implemented."),null},getPointAt:function(t,e){var i=this.getUtoTmapping(t);return this.getPoint(i,e)},getPoints:function(t){void 0===t&&(t=5);for(var e=[],i=0;i<=t;i++)e.push(this.getPoint(i/t));return e},getSpacedPoints:function(t){void 0===t&&(t=5);for(var e=[],i=0;i<=t;i++)e.push(this.getPointAt(i/t));return e},getLength:function(){var t=this.getLengths();return t[t.length-1]},getLengths:function(t){if(void 0===t&&(t=this.arcLengthDivisions),this.cacheArcLengths&&this.cacheArcLengths.length===t+1&&!this.needsUpdate)return this.cacheArcLengths;this.needsUpdate=!1;var e,i,r=[],n=this.getPoint(0),o=0;for(r.push(0),i=1;i<=t;i++)o+=(e=this.getPoint(i/t)).distanceTo(n),r.push(o),n=e;return this.cacheArcLengths=r},updateArcLengths:function(){this.needsUpdate=!0,this.getLengths()},getUtoTmapping:function(t,e){var i,r=this.getLengths(),n=0,o=r.length;i=e||t*r[o-1];for(var a,s=0,c=o-1;s<=c;)if((a=r[n=Math.floor(s+(c-s)/2)]-i)<0)s=n+1;else{if(!(0<a)){c=n;break}c=n-1}if(r[n=c]===i)return n/(o-1);var u=r[n];return(n+(i-u)/(r[n+1]-u))/(o-1)},getTangent:function(t){var e=t-1e-4,i=t+1e-4;e<0&&(e=0),1<i&&(i=1);var r=this.getPoint(e);return this.getPoint(i).clone().sub(r).normalize()},getTangentAt:function(t){var e=this.getUtoTmapping(t);return this.getTangent(e)},computeFrenetFrames:function(t,e){var i,r,n,o=new ri,a=[],s=[],c=[],u=new ri,h=new ei;for(i=0;i<=t;i++)r=i/t,a[i]=this.getTangentAt(r),a[i].normalize();s[0]=new ri,c[0]=new ri;var l=Number.MAX_VALUE,p=Math.abs(a[0].x),d=Math.abs(a[0].y),f=Math.abs(a[0].z);for(p<=l&&(l=p,o.set(1,0,0)),d<=l&&(l=d,o.set(0,1,0)),f<=l&&o.set(0,0,1),u.crossVectors(a[0],o).normalize(),s[0].crossVectors(a[0],u),c[0].crossVectors(a[0],s[0]),i=1;i<=t;i++)s[i]=s[i-1].clone(),c[i]=c[i-1].clone(),u.crossVectors(a[i-1],a[i]),u.length()>Number.EPSILON&&(u.normalize(),n=Math.acos(Qe.clamp(a[i-1].dot(a[i]),-1,1)),s[i].applyMatrix4(h.makeRotationAxis(u,n))),c[i].crossVectors(a[i],s[i]);if(!0===e)for(n=Math.acos(Qe.clamp(s[0].dot(s[t]),-1,1)),n/=t,0<a[0].dot(u.crossVectors(s[0],s[t]))&&(n=-n),i=1;i<=t;i++)s[i].applyMatrix4(h.makeRotationAxis(a[i],n*i)),c[i].crossVectors(a[i],s[i]);return{tangents:a,normals:s,binormals:c}},clone:function(){return(new this.constructor).copy(this)},copy:function(t){return this.arcLengthDivisions=t.arcLengthDivisions,this},toJSON:function(){var t={metadata:{version:4.5,type:"Curve",generator:"Curve.toJSON"}};return t.arcLengthDivisions=this.arcLengthDivisions,t.type=this.type,t},fromJSON:function(t){return this.arcLengthDivisions=t.arcLengthDivisions,this}}),((wc.prototype=Object.create(_c.prototype)).constructor=wc).prototype.isEllipseCurve=!0,wc.prototype.getPoint=function(t,e){for(var i=e||new ti,r=2*Math.PI,n=this.aEndAngle-this.aStartAngle,o=Math.abs(n)<Number.EPSILON;n<0;)n+=r;for(;r<n;)n-=r;n<Number.EPSILON&&(n=o?0:r),!0!==this.aClockwise||o||(n===r?n=-r:n-=r);var a=this.aStartAngle+t*n,s=this.aX+this.xRadius*Math.cos(a),c=this.aY+this.yRadius*Math.sin(a);if(0!==this.aRotation){var u=Math.cos(this.aRotation),h=Math.sin(this.aRotation),l=s-this.aX,p=c-this.aY;s=l*u-p*h+this.aX,c=l*h+p*u+this.aY}return i.set(s,c)},wc.prototype.copy=function(t){return _c.prototype.copy.call(this,t),this.aX=t.aX,this.aY=t.aY,this.xRadius=t.xRadius,this.yRadius=t.yRadius,this.aStartAngle=t.aStartAngle,this.aEndAngle=t.aEndAngle,this.aClockwise=t.aClockwise,this.aRotation=t.aRotation,this},wc.prototype.toJSON=function(){var t=_c.prototype.toJSON.call(this);return t.aX=this.aX,t.aY=this.aY,t.xRadius=this.xRadius,t.yRadius=this.yRadius,t.aStartAngle=this.aStartAngle,t.aEndAngle=this.aEndAngle,t.aClockwise=this.aClockwise,t.aRotation=this.aRotation,t},wc.prototype.fromJSON=function(t){return _c.prototype.fromJSON.call(this,t),this.aX=t.aX,this.aY=t.aY,this.xRadius=t.xRadius,this.yRadius=t.yRadius,this.aStartAngle=t.aStartAngle,this.aEndAngle=t.aEndAngle,this.aClockwise=t.aClockwise,this.aRotation=t.aRotation,this},((Sc.prototype=Object.create(wc.prototype)).constructor=Sc).prototype.isArcCurve=!0;var Mc=new ri,Ec=new Ac,Pc=new Ac,Tc=new Ac;function Cc(t,e,i,r){_c.call(this),this.type="CatmullRomCurve3",this.points=t||[],this.closed=e||!1,this.curveType=i||"centripetal",this.tension=r||.5}function Ic(t,e,i,r,n){var o=.5*(r-e),a=.5*(n-i),s=t*t;return(2*i-2*r+o+a)*(t*s)+(-3*i+3*r-2*o-a)*s+o*t+i}function Oc(t,e,i,r){return(a=1-t)*a*e+2*(1-(o=t))*o*i+(n=t)*n*r;var n,o,a}function Lc(t,e,i,r,n){return(u=1-t)*u*u*e+3*(c=1-(s=t))*c*s*i+3*(1-(a=t))*a*a*r+(o=t)*o*o*n;var o,a,s,c,u}function Rc(t,e,i,r){_c.call(this),this.type="CubicBezierCurve",this.v0=t||new ti,this.v1=e||new ti,this.v2=i||new ti,this.v3=r||new ti}function Dc(t,e,i,r){_c.call(this),this.type="CubicBezierCurve3",this.v0=t||new ri,this.v1=e||new ri,this.v2=i||new ri,this.v3=r||new ri}function kc(t,e){_c.call(this),this.type="LineCurve",this.v1=t||new ti,this.v2=e||new ti}function Bc(t,e){_c.call(this),this.type="LineCurve3",this.v1=t||new ri,this.v2=e||new ri}function Nc(t,e,i){_c.call(this),this.type="QuadraticBezierCurve",this.v0=t||new ti,this.v1=e||new ti,this.v2=i||new ti}function Fc(t,e,i){_c.call(this),this.type="QuadraticBezierCurve3",this.v0=t||new ri,this.v1=e||new ri,this.v2=i||new ri}function zc(t){_c.call(this),this.type="SplineCurve",this.points=t||[]}((Cc.prototype=Object.create(_c.prototype)).constructor=Cc).prototype.isCatmullRomCurve3=!0,Cc.prototype.getPoint=function(t,e){var i,r,n,o,a=e||new ri,s=this.points,c=s.length,u=(c-(this.closed?0:1))*t,h=Math.floor(u),l=u-h;if(this.closed?h+=0<h?0:(Math.floor(Math.abs(h)/c)+1)*c:0===l&&h===c-1&&(h=c-2,l=1),this.closed||0<h?i=s[(h-1)%c]:(Mc.subVectors(s[0],s[1]).add(s[0]),i=Mc),r=s[h%c],n=s[(h+1)%c],this.closed||h+2<c?o=s[(h+2)%c]:(Mc.subVectors(s[c-1],s[c-2]).add(s[c-1]),o=Mc),"centripetal"===this.curveType||"chordal"===this.curveType){var p="chordal"===this.curveType?.5:.25,d=Math.pow(i.distanceToSquared(r),p),f=Math.pow(r.distanceToSquared(n),p),m=Math.pow(n.distanceToSquared(o),p);f<1e-4&&(f=1),d<1e-4&&(d=f),m<1e-4&&(m=f),Ec.initNonuniformCatmullRom(i.x,r.x,n.x,o.x,d,f,m),Pc.initNonuniformCatmullRom(i.y,r.y,n.y,o.y,d,f,m),Tc.initNonuniformCatmullRom(i.z,r.z,n.z,o.z,d,f,m)}else"catmullrom"===this.curveType&&(Ec.initCatmullRom(i.x,r.x,n.x,o.x,this.tension),Pc.initCatmullRom(i.y,r.y,n.y,o.y,this.tension),Tc.initCatmullRom(i.z,r.z,n.z,o.z,this.tension));return a.set(Ec.calc(l),Pc.calc(l),Tc.calc(l)),a},Cc.prototype.copy=function(t){_c.prototype.copy.call(this,t),this.points=[];for(var e=0,i=t.points.length;e<i;e++){var r=t.points[e];this.points.push(r.clone())}return this.closed=t.closed,this.curveType=t.curveType,this.tension=t.tension,this},Cc.prototype.toJSON=function(){var t=_c.prototype.toJSON.call(this);t.points=[];for(var e=0,i=this.points.length;e<i;e++){var r=this.points[e];t.points.push(r.toArray())}return t.closed=this.closed,t.curveType=this.curveType,t.tension=this.tension,t},Cc.prototype.fromJSON=function(t){_c.prototype.fromJSON.call(this,t),this.points=[];for(var e=0,i=t.points.length;e<i;e++){var r=t.points[e];this.points.push((new ri).fromArray(r))}return this.closed=t.closed,this.curveType=t.curveType,this.tension=t.tension,this},((Rc.prototype=Object.create(_c.prototype)).constructor=Rc).prototype.isCubicBezierCurve=!0,Rc.prototype.getPoint=function(t,e){var i=e||new ti,r=this.v0,n=this.v1,o=this.v2,a=this.v3;return i.set(Lc(t,r.x,n.x,o.x,a.x),Lc(t,r.y,n.y,o.y,a.y)),i},Rc.prototype.copy=function(t){return _c.prototype.copy.call(this,t),this.v0.copy(t.v0),this.v1.copy(t.v1),this.v2.copy(t.v2),this.v3.copy(t.v3),this},Rc.prototype.toJSON=function(){var t=_c.prototype.toJSON.call(this);return t.v0=this.v0.toArray(),t.v1=this.v1.toArray(),t.v2=this.v2.toArray(),t.v3=this.v3.toArray(),t},Rc.prototype.fromJSON=function(t){return _c.prototype.fromJSON.call(this,t),this.v0.fromArray(t.v0),this.v1.fromArray(t.v1),this.v2.fromArray(t.v2),this.v3.fromArray(t.v3),this},((Dc.prototype=Object.create(_c.prototype)).constructor=Dc).prototype.isCubicBezierCurve3=!0,Dc.prototype.getPoint=function(t,e){var i=e||new ri,r=this.v0,n=this.v1,o=this.v2,a=this.v3;return i.set(Lc(t,r.x,n.x,o.x,a.x),Lc(t,r.y,n.y,o.y,a.y),Lc(t,r.z,n.z,o.z,a.z)),i},Dc.prototype.copy=function(t){return _c.prototype.copy.call(this,t),this.v0.copy(t.v0),this.v1.copy(t.v1),this.v2.copy(t.v2),this.v3.copy(t.v3),this},Dc.prototype.toJSON=function(){var t=_c.prototype.toJSON.call(this);return t.v0=this.v0.toArray(),t.v1=this.v1.toArray(),t.v2=this.v2.toArray(),t.v3=this.v3.toArray(),t},Dc.prototype.fromJSON=function(t){return _c.prototype.fromJSON.call(this,t),this.v0.fromArray(t.v0),this.v1.fromArray(t.v1),this.v2.fromArray(t.v2),this.v3.fromArray(t.v3),this},((kc.prototype=Object.create(_c.prototype)).constructor=kc).prototype.isLineCurve=!0,kc.prototype.getPoint=function(t,e){var i=e||new ti;return 1===t?i.copy(this.v2):(i.copy(this.v2).sub(this.v1),i.multiplyScalar(t).add(this.v1)),i},kc.prototype.getPointAt=function(t,e){return this.getPoint(t,e)},kc.prototype.getTangent=function(){return this.v2.clone().sub(this.v1).normalize()},kc.prototype.copy=function(t){return _c.prototype.copy.call(this,t),this.v1.copy(t.v1),this.v2.copy(t.v2),this},kc.prototype.toJSON=function(){var t=_c.prototype.toJSON.call(this);return t.v1=this.v1.toArray(),t.v2=this.v2.toArray(),t},kc.prototype.fromJSON=function(t){return _c.prototype.fromJSON.call(this,t),this.v1.fromArray(t.v1),this.v2.fromArray(t.v2),this},((Bc.prototype=Object.create(_c.prototype)).constructor=Bc).prototype.isLineCurve3=!0,Bc.prototype.getPoint=function(t,e){var i=e||new ri;return 1===t?i.copy(this.v2):(i.copy(this.v2).sub(this.v1),i.multiplyScalar(t).add(this.v1)),i},Bc.prototype.getPointAt=function(t,e){return this.getPoint(t,e)},Bc.prototype.copy=function(t){return _c.prototype.copy.call(this,t),this.v1.copy(t.v1),this.v2.copy(t.v2),this},Bc.prototype.toJSON=function(){var t=_c.prototype.toJSON.call(this);return t.v1=this.v1.toArray(),t.v2=this.v2.toArray(),t},Bc.prototype.fromJSON=function(t){return _c.prototype.fromJSON.call(this,t),this.v1.fromArray(t.v1),this.v2.fromArray(t.v2),this},((Nc.prototype=Object.create(_c.prototype)).constructor=Nc).prototype.isQuadraticBezierCurve=!0,Nc.prototype.getPoint=function(t,e){var i=e||new ti,r=this.v0,n=this.v1,o=this.v2;return i.set(Oc(t,r.x,n.x,o.x),Oc(t,r.y,n.y,o.y)),i},Nc.prototype.copy=function(t){return _c.prototype.copy.call(this,t),this.v0.copy(t.v0),this.v1.copy(t.v1),this.v2.copy(t.v2),this},Nc.prototype.toJSON=function(){var t=_c.prototype.toJSON.call(this);return t.v0=this.v0.toArray(),t.v1=this.v1.toArray(),t.v2=this.v2.toArray(),t},Nc.prototype.fromJSON=function(t){return _c.prototype.fromJSON.call(this,t),this.v0.fromArray(t.v0),this.v1.fromArray(t.v1),this.v2.fromArray(t.v2),this},((Fc.prototype=Object.create(_c.prototype)).constructor=Fc).prototype.isQuadraticBezierCurve3=!0,Fc.prototype.getPoint=function(t,e){var i=e||new ri,r=this.v0,n=this.v1,o=this.v2;return i.set(Oc(t,r.x,n.x,o.x),Oc(t,r.y,n.y,o.y),Oc(t,r.z,n.z,o.z)),i},Fc.prototype.copy=function(t){return _c.prototype.copy.call(this,t),this.v0.copy(t.v0),this.v1.copy(t.v1),this.v2.copy(t.v2),this},Fc.prototype.toJSON=function(){var t=_c.prototype.toJSON.call(this);return t.v0=this.v0.toArray(),t.v1=this.v1.toArray(),t.v2=this.v2.toArray(),t},Fc.prototype.fromJSON=function(t){return _c.prototype.fromJSON.call(this,t),this.v0.fromArray(t.v0),this.v1.fromArray(t.v1),this.v2.fromArray(t.v2),this},((zc.prototype=Object.create(_c.prototype)).constructor=zc).prototype.isSplineCurve=!0,zc.prototype.getPoint=function(t,e){var i=e||new ti,r=this.points,n=(r.length-1)*t,o=Math.floor(n),a=n-o,s=r[0===o?o:o-1],c=r[o],u=r[o>r.length-2?r.length-1:o+1],h=r[o>r.length-3?r.length-1:o+2];return i.set(Ic(a,s.x,c.x,u.x,h.x),Ic(a,s.y,c.y,u.y,h.y)),i},zc.prototype.copy=function(t){_c.prototype.copy.call(this,t),this.points=[];for(var e=0,i=t.points.length;e<i;e++){var r=t.points[e];this.points.push(r.clone())}return this},zc.prototype.toJSON=function(){var t=_c.prototype.toJSON.call(this);t.points=[];for(var e=0,i=this.points.length;e<i;e++){var r=this.points[e];t.points.push(r.toArray())}return t},zc.prototype.fromJSON=function(t){_c.prototype.fromJSON.call(this,t),this.points=[];for(var e=0,i=t.points.length;e<i;e++){var r=t.points[e];this.points.push((new ti).fromArray(r))}return this};var Uc=Object.freeze({ArcCurve:Sc,CatmullRomCurve3:Cc,CubicBezierCurve:Rc,CubicBezierCurve3:Dc,EllipseCurve:wc,LineCurve:kc,LineCurve3:Bc,QuadraticBezierCurve:Nc,QuadraticBezierCurve3:Fc,SplineCurve:zc});function jc(){_c.call(this),this.type="CurvePath",this.curves=[],this.autoClose=!1}function Gc(t){jc.call(this),this.type="Path",this.currentPoint=new ti,t&&this.setFromPoints(t)}function Vc(t){Gc.call(this,t),this.uuid=Qe.generateUUID(),this.type="Shape",this.holes=[]}function Hc(t,e){ur.call(this),this.type="Light",this.color=new ki(t),this.intensity=void 0!==e?e:1,this.receiveShadow=void 0}function $c(t,e,i){Hc.call(this,t,i),this.type="HemisphereLight",this.castShadow=void 0,this.position.copy(ur.DefaultUp),this.updateMatrix(),this.groundColor=new ki(e)}function Wc(t){this.camera=t,this.bias=0,this.radius=1,this.mapSize=new ti(512,512),this.map=null,this.matrix=new ei}function Xc(){Wc.call(this,new ba(50,1,.5,500))}function qc(t,e,i,r,n,o){Hc.call(this,t,e),this.type="SpotLight",this.position.copy(ur.DefaultUp),this.updateMatrix(),this.target=new ur,Object.defineProperty(this,"power",{get:function(){return this.intensity*Math.PI},set:function(t){this.intensity=t/Math.PI}}),this.distance=void 0!==i?i:0,this.angle=void 0!==r?r:Math.PI/3,this.penumbra=void 0!==n?n:0,this.decay=void 0!==o?o:1,this.shadow=new Xc}function Yc(t,e,i,r){Hc.call(this,t,e),this.type="PointLight",Object.defineProperty(this,"power",{get:function(){return 4*this.intensity*Math.PI},set:function(t){this.intensity=t/(4*Math.PI)}}),this.distance=void 0!==i?i:0,this.decay=void 0!==r?r:1,this.shadow=new Wc(new ba(90,1,.5,500))}function Zc(){Wc.call(this,new lr(-5,5,5,-5,.5,500))}function Kc(t,e){Hc.call(this,t,e),this.type="DirectionalLight",this.position.copy(ur.DefaultUp),this.updateMatrix(),this.target=new ur,this.shadow=new Zc}function Jc(t,e){Hc.call(this,t,e),this.type="AmbientLight",this.castShadow=void 0}function Qc(t,e,i,r){Hc.call(this,t,e),this.type="RectAreaLight",this.width=void 0!==i?i:10,this.height=void 0!==r?r:10}jc.prototype=Object.assign(Object.create(_c.prototype),{constructor:jc,add:function(t){this.curves.push(t)},closePath:function(){var t=this.curves[0].getPoint(0),e=this.curves[this.curves.length-1].getPoint(1);t.equals(e)||this.curves.push(new kc(e,t))},getPoint:function(t){for(var e=t*this.getLength(),i=this.getCurveLengths(),r=0;r<i.length;){if(i[r]>=e){var n=i[r]-e,o=this.curves[r],a=o.getLength(),s=0===a?0:1-n/a;return o.getPointAt(s)}r++}return null},getLength:function(){var t=this.getCurveLengths();return t[t.length-1]},updateArcLengths:function(){this.needsUpdate=!0,this.cacheLengths=null,this.getCurveLengths()},getCurveLengths:function(){if(this.cacheLengths&&this.cacheLengths.length===this.curves.length)return this.cacheLengths;for(var t=[],e=0,i=0,r=this.curves.length;i<r;i++)e+=this.curves[i].getLength(),t.push(e);return this.cacheLengths=t},getSpacedPoints:function(t){void 0===t&&(t=40);for(var e=[],i=0;i<=t;i++)e.push(this.getPoint(i/t));return this.autoClose&&e.push(e[0]),e},getPoints:function(t){t=t||12;for(var e,i=[],r=0,n=this.curves;r<n.length;r++)for(var o=n[r],a=o&&o.isEllipseCurve?2*t:o&&(o.isLineCurve||o.isLineCurve3)?1:o&&o.isSplineCurve?t*o.points.length:t,s=o.getPoints(a),c=0;c<s.length;c++){var u=s[c];e&&e.equals(u)||(i.push(u),e=u)}return this.autoClose&&1<i.length&&!i[i.length-1].equals(i[0])&&i.push(i[0]),i},copy:function(t){_c.prototype.copy.call(this,t),this.curves=[];for(var e=0,i=t.curves.length;e<i;e++){var r=t.curves[e];this.curves.push(r.clone())}return this.autoClose=t.autoClose,this},toJSON:function(){var t=_c.prototype.toJSON.call(this);t.autoClose=this.autoClose,t.curves=[];for(var e=0,i=this.curves.length;e<i;e++){var r=this.curves[e];t.curves.push(r.toJSON())}return t},fromJSON:function(t){_c.prototype.fromJSON.call(this,t),this.autoClose=t.autoClose,this.curves=[];for(var e=0,i=t.curves.length;e<i;e++){var r=t.curves[e];this.curves.push((new Uc[r.type]).fromJSON(r))}return this}}),Gc.prototype=Object.assign(Object.create(jc.prototype),{constructor:Gc,setFromPoints:function(t){this.moveTo(t[0].x,t[0].y);for(var e=1,i=t.length;e<i;e++)this.lineTo(t[e].x,t[e].y)},moveTo:function(t,e){this.currentPoint.set(t,e)},lineTo:function(t,e){var i=new kc(this.currentPoint.clone(),new ti(t,e));this.curves.push(i),this.currentPoint.set(t,e)},quadraticCurveTo:function(t,e,i,r){var n=new Nc(this.currentPoint.clone(),new ti(t,e),new ti(i,r));this.curves.push(n),this.currentPoint.set(i,r)},bezierCurveTo:function(t,e,i,r,n,o){var a=new Rc(this.currentPoint.clone(),new ti(t,e),new ti(i,r),new ti(n,o));this.curves.push(a),this.currentPoint.set(n,o)},splineThru:function(t){var e=new zc([this.currentPoint.clone()].concat(t));this.curves.push(e),this.currentPoint.copy(t[t.length-1])},arc:function(t,e,i,r,n,o){var a=this.currentPoint.x,s=this.currentPoint.y;this.absarc(t+a,e+s,i,r,n,o)},absarc:function(t,e,i,r,n,o){this.absellipse(t,e,i,i,r,n,o)},ellipse:function(t,e,i,r,n,o,a,s){var c=this.currentPoint.x,u=this.currentPoint.y;this.absellipse(t+c,e+u,i,r,n,o,a,s)},absellipse:function(t,e,i,r,n,o,a,s){var c=new wc(t,e,i,r,n,o,a,s);if(0<this.curves.length){var u=c.getPoint(0);u.equals(this.currentPoint)||this.lineTo(u.x,u.y)}this.curves.push(c);var h=c.getPoint(1);this.currentPoint.copy(h)},copy:function(t){return jc.prototype.copy.call(this,t),this.currentPoint.copy(t.currentPoint),this},toJSON:function(){var t=jc.prototype.toJSON.call(this);return t.currentPoint=this.currentPoint.toArray(),t},fromJSON:function(t){return jc.prototype.fromJSON.call(this,t),this.currentPoint.fromArray(t.currentPoint),this}}),Vc.prototype=Object.assign(Object.create(Gc.prototype),{constructor:Vc,getPointsHoles:function(t){for(var e=[],i=0,r=this.holes.length;i<r;i++)e[i]=this.holes[i].getPoints(t);return e},extractPoints:function(t){return{shape:this.getPoints(t),holes:this.getPointsHoles(t)}},copy:function(t){Gc.prototype.copy.call(this,t),this.holes=[];for(var e=0,i=t.holes.length;e<i;e++){var r=t.holes[e];this.holes.push(r.clone())}return this},toJSON:function(){var t=Gc.prototype.toJSON.call(this);t.uuid=this.uuid,t.holes=[];for(var e=0,i=this.holes.length;e<i;e++){var r=this.holes[e];t.holes.push(r.toJSON())}return t},fromJSON:function(t){Gc.prototype.fromJSON.call(this,t),this.uuid=t.uuid,this.holes=[];for(var e=0,i=t.holes.length;e<i;e++){var r=t.holes[e];this.holes.push((new Gc).fromJSON(r))}return this}}),Hc.prototype=Object.assign(Object.create(ur.prototype),{constructor:Hc,isLight:!0,copy:function(t){return ur.prototype.copy.call(this,t),this.color.copy(t.color),this.intensity=t.intensity,this},toJSON:function(t){var e=ur.prototype.toJSON.call(this,t);return e.object.color=this.color.getHex(),e.object.intensity=this.intensity,void 0!==this.groundColor&&(e.object.groundColor=this.groundColor.getHex()),void 0!==this.distance&&(e.object.distance=this.distance),void 0!==this.angle&&(e.object.angle=this.angle),void 0!==this.decay&&(e.object.decay=this.decay),void 0!==this.penumbra&&(e.object.penumbra=this.penumbra),void 0!==this.shadow&&(e.object.shadow=this.shadow.toJSON()),e}}),$c.prototype=Object.assign(Object.create(Hc.prototype),{constructor:$c,isHemisphereLight:!0,copy:function(t){return Hc.prototype.copy.call(this,t),this.groundColor.copy(t.groundColor),this}}),Object.assign(Wc.prototype,{copy:function(t){return this.camera=t.camera.clone(),this.bias=t.bias,this.radius=t.radius,this.mapSize.copy(t.mapSize),this},clone:function(){return(new this.constructor).copy(this)},toJSON:function(){var t={};return 0!==this.bias&&(t.bias=this.bias),1!==this.radius&&(t.radius=this.radius),512===this.mapSize.x&&512===this.mapSize.y||(t.mapSize=this.mapSize.toArray()),t.camera=this.camera.toJSON(!1).object,delete t.camera.matrix,t}}),Xc.prototype=Object.assign(Object.create(Wc.prototype),{constructor:Xc,isSpotLightShadow:!0,update:function(t){var e=this.camera,i=2*Qe.RAD2DEG*t.angle,r=this.mapSize.width/this.mapSize.height,n=t.distance||e.far;i===e.fov&&r===e.aspect&&n===e.far||(e.fov=i,e.aspect=r,e.far=n,e.updateProjectionMatrix())}}),qc.prototype=Object.assign(Object.create(Hc.prototype),{constructor:qc,isSpotLight:!0,copy:function(t){return Hc.prototype.copy.call(this,t),this.distance=t.distance,this.angle=t.angle,this.penumbra=t.penumbra,this.decay=t.decay,this.target=t.target.clone(),this.shadow=t.shadow.clone(),this}}),Yc.prototype=Object.assign(Object.create(Hc.prototype),{constructor:Yc,isPointLight:!0,copy:function(t){return Hc.prototype.copy.call(this,t),this.distance=t.distance,this.decay=t.decay,this.shadow=t.shadow.clone(),this}}),Zc.prototype=Object.assign(Object.create(Wc.prototype),{constructor:Zc}),Kc.prototype=Object.assign(Object.create(Hc.prototype),{constructor:Kc,isDirectionalLight:!0,copy:function(t){return Hc.prototype.copy.call(this,t),this.target=t.target.clone(),this.shadow=t.shadow.clone(),this}}),Jc.prototype=Object.assign(Object.create(Hc.prototype),{constructor:Jc,isAmbientLight:!0}),Qc.prototype=Object.assign(Object.create(Hc.prototype),{constructor:Qc,isRectAreaLight:!0,copy:function(t){return Hc.prototype.copy.call(this,t),this.width=t.width,this.height=t.height,this},toJSON:function(t){var e=Hc.prototype.toJSON.call(this,t);return e.object.width=this.width,e.object.height=this.height,e}});var tu={arraySlice:function(t,e,i){return tu.isTypedArray(t)?new t.constructor(t.subarray(e,void 0!==i?i:t.length)):t.slice(e,i)},convertArray:function(t,e,i){return!t||!i&&t.constructor===e?t:"number"==typeof e.BYTES_PER_ELEMENT?new e(t):Array.prototype.slice.call(t)},isTypedArray:function(t){return ArrayBuffer.isView(t)&&!(t instanceof DataView)},getKeyframeOrder:function(i){for(var t=i.length,e=new Array(t),r=0;r!==t;++r)e[r]=r;return e.sort(function(t,e){return i[t]-i[e]}),e},sortedArray:function(t,e,i){for(var r=t.length,n=new t.constructor(r),o=0,a=0;a!==r;++o)for(var s=i[o]*e,c=0;c!==e;++c)n[a++]=t[s+c];return n},flattenJSON:function(t,e,i,r){for(var n=1,o=t[0];void 0!==o&&void 0===o[r];)o=t[n++];if(void 0!==o){var a=o[r];if(void 0!==a)if(Array.isArray(a))for(;void 0!==(a=o[r])&&(e.push(o.time),i.push.apply(i,a)),void 0!==(o=t[n++]););else if(void 0!==a.toArray)for(;void 0!==(a=o[r])&&(e.push(o.time),a.toArray(i,i.length)),void 0!==(o=t[n++]););else for(;void 0!==(a=o[r])&&(e.push(o.time),i.push(a)),void 0!==(o=t[n++]););}}};function eu(t,e,i,r){this.parameterPositions=t,this._cachedIndex=0,this.resultBuffer=void 0!==r?r:new e.constructor(i),this.sampleValues=e,this.valueSize=i}function iu(t,e,i,r){eu.call(this,t,e,i,r),this._weightPrev=-0,this._offsetPrev=-0,this._weightNext=-0,this._offsetNext=-0}function ru(t,e,i,r){eu.call(this,t,e,i,r)}function nu(t,e,i,r){eu.call(this,t,e,i,r)}function ou(t,e,i,r){if(void 0===t)throw new Error("THREE.KeyframeTrack: track name is undefined");if(void 0===e||0===e.length)throw new Error("THREE.KeyframeTrack: no keyframes in track named "+t);this.name=t,this.times=tu.convertArray(e,this.TimeBufferType),this.values=tu.convertArray(i,this.ValueBufferType),this.setInterpolation(r||this.DefaultInterpolation)}function au(t,e,i){ou.call(this,t,e,i)}function su(t,e,i,r){ou.call(this,t,e,i,r)}function cu(t,e,i,r){ou.call(this,t,e,i,r)}function uu(t,e,i,r){eu.call(this,t,e,i,r)}function hu(t,e,i,r){ou.call(this,t,e,i,r)}function lu(t,e,i,r){ou.call(this,t,e,i,r)}function pu(t,e,i,r){ou.call(this,t,e,i,r)}function du(t,e,i){this.name=t,this.tracks=i,this.duration=void 0!==e?e:-1,this.uuid=Qe.generateUUID(),this.duration<0&&this.resetDuration()}function fu(t){if(void 0===t.type)throw new Error("THREE.KeyframeTrack: track type undefined, can not parse");var e=function(t){switch(t.toLowerCase()){case"scalar":case"double":case"float":case"number":case"integer":return cu;case"vector":case"vector2":case"vector3":case"vector4":return pu;case"color":return su;case"quaternion":return hu;case"bool":case"boolean":return au;case"string":return lu}throw new Error("THREE.KeyframeTrack: Unsupported typeName: "+t)}(t.type);if(void 0===t.times){var i=[],r=[];tu.flattenJSON(t.keys,i,r,"value"),t.times=i,t.values=r}return void 0!==e.parse?e.parse(t):new e(t.name,t.times,t.values,t.interpolation)}function mu(t){this.manager=void 0!==t?t:mc,this.textures={}}function gu(t){this.manager=void 0!==t?t:mc}Object.assign(eu.prototype,{evaluate:function(t){var e=this.parameterPositions,i=this._cachedIndex,r=e[i],n=e[i-1];t:{e:{var o;i:{r:if(!(t<r)){for(var a=i+2;;){if(void 0===r){if(t<n)break r;return i=e.length,this._cachedIndex=i,this.afterEnd_(i-1,t,n)}if(i===a)break;if(n=r,t<(r=e[++i]))break e}o=e.length;break i}if(n<=t)break t;var s=e[1];t<s&&(i=2,n=s);for(a=i-2;;){if(void 0===n)return this._cachedIndex=0,this.beforeStart_(0,t,r);if(i===a)break;if(r=n,(n=e[--i-1])<=t)break e}o=i,i=0}for(;i<o;){var c=i+o>>>1;t<e[c]?o=c:i=c+1}if(r=e[i],void 0===(n=e[i-1]))return this._cachedIndex=0,this.beforeStart_(0,t,r);if(void 0===r)return i=e.length,this._cachedIndex=i,this.afterEnd_(i-1,n,t)}this._cachedIndex=i,this.intervalChanged_(i,n,r)}return this.interpolate_(i,n,t,r)},settings:null,DefaultSettings_:{},getSettings_:function(){return this.settings||this.DefaultSettings_},copySampleValue_:function(t){for(var e=this.resultBuffer,i=this.sampleValues,r=this.valueSize,n=t*r,o=0;o!==r;++o)e[o]=i[n+o];return e},interpolate_:function(){throw new Error("call to abstract method")},intervalChanged_:function(){}}),Object.assign(eu.prototype,{beforeStart_:eu.prototype.copySampleValue_,afterEnd_:eu.prototype.copySampleValue_}),iu.prototype=Object.assign(Object.create(eu.prototype),{constructor:iu,DefaultSettings_:{endingStart:ze,endingEnd:ze},intervalChanged_:function(t,e,i){var r=this.parameterPositions,n=t-2,o=t+1,a=r[n],s=r[o];if(void 0===a)switch(this.getSettings_().endingStart){case Ue:n=t,a=2*e-i;break;case 2402:a=e+r[n=r.length-2]-r[n+1];break;default:n=t,a=i}if(void 0===s)switch(this.getSettings_().endingEnd){case Ue:o=t,s=2*i-e;break;case 2402:s=i+r[o=1]-r[0];break;default:o=t-1,s=e}var c=.5*(i-e),u=this.valueSize;this._weightPrev=c/(e-a),this._weightNext=c/(s-i),this._offsetPrev=n*u,this._offsetNext=o*u},interpolate_:function(t,e,i,r){for(var n=this.resultBuffer,o=this.sampleValues,a=this.valueSize,s=t*a,c=s-a,u=this._offsetPrev,h=this._offsetNext,l=this._weightPrev,p=this._weightNext,d=(i-e)/(r-e),f=d*d,m=f*d,g=-l*m+2*l*f-l*d,v=(1+l)*m+(-1.5-2*l)*f+(-.5+l)*d+1,y=(-1-p)*m+(1.5+p)*f+.5*d,b=p*m-p*f,x=0;x!==a;++x)n[x]=g*o[u+x]+v*o[c+x]+y*o[s+x]+b*o[h+x];return n}}),ru.prototype=Object.assign(Object.create(eu.prototype),{constructor:ru,interpolate_:function(t,e,i,r){for(var n=this.resultBuffer,o=this.sampleValues,a=this.valueSize,s=t*a,c=s-a,u=(i-e)/(r-e),h=1-u,l=0;l!==a;++l)n[l]=o[c+l]*h+o[s+l]*u;return n}}),nu.prototype=Object.assign(Object.create(eu.prototype),{constructor:nu,interpolate_:function(t){return this.copySampleValue_(t-1)}}),Object.assign(ou,{toJSON:function(t){var e,i=t.constructor;if(void 0!==i.toJSON)e=i.toJSON(t);else{e={name:t.name,times:tu.convertArray(t.times,Array),values:tu.convertArray(t.values,Array)};var r=t.getInterpolation();r!==t.DefaultInterpolation&&(e.interpolation=r)}return e.type=t.ValueTypeName,e}}),Object.assign(ou.prototype,{constructor:ou,TimeBufferType:Float32Array,ValueBufferType:Float32Array,DefaultInterpolation:2301,InterpolantFactoryMethodDiscrete:function(t){return new nu(this.times,this.values,this.getValueSize(),t)},InterpolantFactoryMethodLinear:function(t){return new ru(this.times,this.values,this.getValueSize(),t)},InterpolantFactoryMethodSmooth:function(t){return new iu(this.times,this.values,this.getValueSize(),t)},setInterpolation:function(t){var e;switch(t){case 2300:e=this.InterpolantFactoryMethodDiscrete;break;case 2301:e=this.InterpolantFactoryMethodLinear;break;case 2302:e=this.InterpolantFactoryMethodSmooth}if(void 0===e){var i="unsupported interpolation for "+this.ValueTypeName+" keyframe track named "+this.name;if(void 0===this.createInterpolant){if(t===this.DefaultInterpolation)throw new Error(i);this.setInterpolation(this.DefaultInterpolation)}return console.warn("THREE.KeyframeTrack:",i),this}return this.createInterpolant=e,this},getInterpolation:function(){switch(this.createInterpolant){case this.InterpolantFactoryMethodDiscrete:return 2300;case this.InterpolantFactoryMethodLinear:return 2301;case this.InterpolantFactoryMethodSmooth:return 2302}},getValueSize:function(){return this.values.length/this.times.length},shift:function(t){if(0!==t)for(var e=this.times,i=0,r=e.length;i!==r;++i)e[i]+=t;return this},scale:function(t){if(1!==t)for(var e=this.times,i=0,r=e.length;i!==r;++i)e[i]*=t;return this},trim:function(t,e){for(var i=this.times,r=i.length,n=0,o=r-1;n!==r&&i[n]<t;)++n;for(;-1!==o&&i[o]>e;)--o;if(++o,0!==n||o!==r){o<=n&&(n=(o=Math.max(o,1))-1);var a=this.getValueSize();this.times=tu.arraySlice(i,n,o),this.values=tu.arraySlice(this.values,n*a,o*a)}return this},validate:function(){var t=!0,e=this.getValueSize();e-Math.floor(e)!=0&&(console.error("THREE.KeyframeTrack: Invalid value size in track.",this),t=!1);var i=this.times,r=this.values,n=i.length;0===n&&(console.error("THREE.KeyframeTrack: Track is empty.",this),t=!1);for(var o=null,a=0;a!==n;a++){var s=i[a];if("number"==typeof s&&isNaN(s)){console.error("THREE.KeyframeTrack: Time is not a valid number.",this,a,s),t=!1;break}if(null!==o&&s<o){console.error("THREE.KeyframeTrack: Out of order keys.",this,a,s,o),t=!1;break}o=s}if(void 0!==r&&tu.isTypedArray(r)){a=0;for(var c=r.length;a!==c;++a){var u=r[a];if(isNaN(u)){console.error("THREE.KeyframeTrack: Value is not a valid number.",this,a,u),t=!1;break}}}return t},optimize:function(){for(var t=this.times,e=this.values,i=this.getValueSize(),r=2302===this.getInterpolation(),n=1,o=t.length-1,a=1;a<o;++a){var s=!1,c=t[a];if(c!==t[a+1]&&(1!==a||c!==c[0]))if(r)s=!0;else for(var u=a*i,h=u-i,l=u+i,p=0;p!==i;++p){var d=e[u+p];if(d!==e[h+p]||d!==e[l+p]){s=!0;break}}if(s){if(a!==n){t[n]=t[a];var f=a*i,m=n*i;for(p=0;p!==i;++p)e[m+p]=e[f+p]}++n}}if(0<o){t[n]=t[o];for(f=o*i,m=n*i,p=0;p!==i;++p)e[m+p]=e[f+p];++n}return n!==t.length&&(this.times=tu.arraySlice(t,0,n),this.values=tu.arraySlice(e,0,n*i)),this}}),au.prototype=Object.assign(Object.create(ou.prototype),{constructor:au,ValueTypeName:"bool",ValueBufferType:Array,DefaultInterpolation:2300,InterpolantFactoryMethodLinear:void 0,InterpolantFactoryMethodSmooth:void 0}),su.prototype=Object.assign(Object.create(ou.prototype),{constructor:su,ValueTypeName:"color"}),cu.prototype=Object.assign(Object.create(ou.prototype),{constructor:cu,ValueTypeName:"number"}),uu.prototype=Object.assign(Object.create(eu.prototype),{constructor:uu,interpolate_:function(t,e,i,r){for(var n=this.resultBuffer,o=this.sampleValues,a=this.valueSize,s=t*a,c=(i-e)/(r-e),u=s+a;s!==u;s+=4)ii.slerpFlat(n,0,o,s-a,o,s,c);return n}}),hu.prototype=Object.assign(Object.create(ou.prototype),{constructor:hu,ValueTypeName:"quaternion",DefaultInterpolation:2301,InterpolantFactoryMethodLinear:function(t){return new uu(this.times,this.values,this.getValueSize(),t)},InterpolantFactoryMethodSmooth:void 0}),lu.prototype=Object.assign(Object.create(ou.prototype),{constructor:lu,ValueTypeName:"string",ValueBufferType:Array,DefaultInterpolation:2300,InterpolantFactoryMethodLinear:void 0,InterpolantFactoryMethodSmooth:void 0}),pu.prototype=Object.assign(Object.create(ou.prototype),{constructor:pu,ValueTypeName:"vector"}),Object.assign(du,{parse:function(t){for(var e=[],i=t.tracks,r=1/(t.fps||1),n=0,o=i.length;n!==o;++n)e.push(fu(i[n]).scale(r));return new du(t.name,t.duration,e)},toJSON:function(t){for(var e=[],i=t.tracks,r={name:t.name,duration:t.duration,tracks:e,uuid:t.uuid},n=0,o=i.length;n!==o;++n)e.push(ou.toJSON(i[n]));return r},CreateFromMorphTargetSequence:function(t,e,i,r){for(var n=e.length,o=[],a=0;a<n;a++){var s=[],c=[];s.push((a+n-1)%n,a,(a+1)%n),c.push(0,1,0);var u=tu.getKeyframeOrder(s);s=tu.sortedArray(s,1,u),c=tu.sortedArray(c,1,u),r||0!==s[0]||(s.push(n),c.push(c[0])),o.push(new cu(".morphTargetInfluences["+e[a].name+"]",s,c).scale(1/i))}return new du(t,-1,o)},findByName:function(t,e){var i=t;if(!Array.isArray(t)){var r=t;i=r.geometry&&r.geometry.animations||r.animations}for(var n=0;n<i.length;n++)if(i[n].name===e)return i[n];return null},CreateClipsFromMorphTargetSequences:function(t,e,i){for(var r={},n=/^([\w-]*?)([\d]+)$/,o=0,a=t.length;o<a;o++){var s=t[o],c=s.name.match(n);if(c&&1<c.length){var u=r[l=c[1]];u||(r[l]=u=[]),u.push(s)}}var h=[];for(var l in r)h.push(du.CreateFromMorphTargetSequence(l,r[l],e,i));return h},parseAnimation:function(t,e){if(!t)return console.error("THREE.AnimationClip: No animation in JSONLoader data."),null;for(var i=function(t,e,i,r,n){if(0!==i.length){var o=[],a=[];tu.flattenJSON(i,o,a,r),0!==o.length&&n.push(new t(e,o,a))}},r=[],n=t.name||"default",o=t.length||-1,a=t.fps||30,s=t.hierarchy||[],c=0;c<s.length;c++){var u=s[c].keys;if(u&&0!==u.length)if(u[0].morphTargets){for(var h={},l=0;l<u.length;l++)if(u[l].morphTargets)for(var p=0;p<u[l].morphTargets.length;p++)h[u[l].morphTargets[p]]=-1;for(var d in h){var f=[],m=[];for(p=0;p!==u[l].morphTargets.length;++p){var g=u[l];f.push(g.time),m.push(g.morphTarget===d?1:0)}r.push(new cu(".morphTargetInfluence["+d+"]",f,m))}o=h.length*(a||1)}else{var v=".bones["+e[c].name+"]";i(pu,v+".position",u,"pos",r),i(hu,v+".quaternion",u,"rot",r),i(pu,v+".scale",u,"scl",r)}}return 0===r.length?null:new du(n,o,r)}}),Object.assign(du.prototype,{resetDuration:function(){for(var t=0,e=0,i=this.tracks.length;e!==i;++e){var r=this.tracks[e];t=Math.max(t,r.times[r.times.length-1])}return this.duration=t,this},trim:function(){for(var t=0;t<this.tracks.length;t++)this.tracks[t].trim(0,this.duration);return this},validate:function(){for(var t=!0,e=0;e<this.tracks.length;e++)t=t&&this.tracks[e].validate();return t},optimize:function(){for(var t=0;t<this.tracks.length;t++)this.tracks[t].optimize();return this}}),Object.assign(mu.prototype,{load:function(t,e,i,r){var n=this;new vc(n.manager).load(t,function(t){e(n.parse(JSON.parse(t)))},i,r)},setTextures:function(t){this.textures=t},parse:function(t){var e=this.textures;function i(t){return void 0===e[t]&&console.warn("THREE.MaterialLoader: Undefined texture",t),e[t]}var r=new pc[t.type];if(void 0!==t.uuid&&(r.uuid=t.uuid),void 0!==t.name&&(r.name=t.name),void 0!==t.color&&r.color.setHex(t.color),void 0!==t.roughness&&(r.roughness=t.roughness),void 0!==t.metalness&&(r.metalness=t.metalness),void 0!==t.emissive&&r.emissive.setHex(t.emissive),void 0!==t.specular&&r.specular.setHex(t.specular),void 0!==t.shininess&&(r.shininess=t.shininess),void 0!==t.clearCoat&&(r.clearCoat=t.clearCoat),void 0!==t.clearCoatRoughness&&(r.clearCoatRoughness=t.clearCoatRoughness),void 0!==t.uniforms&&(r.uniforms=t.uniforms),void 0!==t.vertexShader&&(r.vertexShader=t.vertexShader),void 0!==t.fragmentShader&&(r.fragmentShader=t.fragmentShader),void 0!==t.vertexColors&&(r.vertexColors=t.vertexColors),void 0!==t.fog&&(r.fog=t.fog),void 0!==t.flatShading&&(r.flatShading=t.flatShading),void 0!==t.blending&&(r.blending=t.blending),void 0!==t.side&&(r.side=t.side),void 0!==t.opacity&&(r.opacity=t.opacity),void 0!==t.transparent&&(r.transparent=t.transparent),void 0!==t.alphaTest&&(r.alphaTest=t.alphaTest),void 0!==t.depthTest&&(r.depthTest=t.depthTest),void 0!==t.depthWrite&&(r.depthWrite=t.depthWrite),void 0!==t.colorWrite&&(r.colorWrite=t.colorWrite),void 0!==t.wireframe&&(r.wireframe=t.wireframe),void 0!==t.wireframeLinewidth&&(r.wireframeLinewidth=t.wireframeLinewidth),void 0!==t.wireframeLinecap&&(r.wireframeLinecap=t.wireframeLinecap),void 0!==t.wireframeLinejoin&&(r.wireframeLinejoin=t.wireframeLinejoin),void 0!==t.rotation&&(r.rotation=t.rotation),1!==t.linewidth&&(r.linewidth=t.linewidth),void 0!==t.dashSize&&(r.dashSize=t.dashSize),void 0!==t.gapSize&&(r.gapSize=t.gapSize),void 0!==t.scale&&(r.scale=t.scale),void 0!==t.polygonOffset&&(r.polygonOffset=t.polygonOffset),void 0!==t.polygonOffsetFactor&&(r.polygonOffsetFactor=t.polygonOffsetFactor),void 0!==t.polygonOffsetUnits&&(r.polygonOffsetUnits=t.polygonOffsetUnits),void 0!==t.skinning&&(r.skinning=t.skinning),void 0!==t.morphTargets&&(r.morphTargets=t.morphTargets),void 0!==t.dithering&&(r.dithering=t.dithering),void 0!==t.visible&&(r.visible=t.visible),void 0!==t.userData&&(r.userData=t.userData),void 0!==t.shading&&(r.flatShading=1===t.shading),void 0!==t.size&&(r.size=t.size),void 0!==t.sizeAttenuation&&(r.sizeAttenuation=t.sizeAttenuation),void 0!==t.map&&(r.map=i(t.map)),void 0!==t.alphaMap&&(r.alphaMap=i(t.alphaMap),r.transparent=!0),void 0!==t.bumpMap&&(r.bumpMap=i(t.bumpMap)),void 0!==t.bumpScale&&(r.bumpScale=t.bumpScale),void 0!==t.normalMap&&(r.normalMap=i(t.normalMap)),void 0!==t.normalMapType&&(r.normalMapType=t.normalMapType),void 0!==t.normalScale){var n=t.normalScale;!1===Array.isArray(n)&&(n=[n,n]),r.normalScale=(new ti).fromArray(n)}return void 0!==t.displacementMap&&(r.displacementMap=i(t.displacementMap)),void 0!==t.displacementScale&&(r.displacementScale=t.displacementScale),void 0!==t.displacementBias&&(r.displacementBias=t.displacementBias),void 0!==t.roughnessMap&&(r.roughnessMap=i(t.roughnessMap)),void 0!==t.metalnessMap&&(r.metalnessMap=i(t.metalnessMap)),void 0!==t.emissiveMap&&(r.emissiveMap=i(t.emissiveMap)),void 0!==t.emissiveIntensity&&(r.emissiveIntensity=t.emissiveIntensity),void 0!==t.specularMap&&(r.specularMap=i(t.specularMap)),void 0!==t.envMap&&(r.envMap=i(t.envMap)),void 0!==t.reflectivity&&(r.reflectivity=t.reflectivity),void 0!==t.lightMap&&(r.lightMap=i(t.lightMap)),void 0!==t.lightMapIntensity&&(r.lightMapIntensity=t.lightMapIntensity),void 0!==t.aoMap&&(r.aoMap=i(t.aoMap)),void 0!==t.aoMapIntensity&&(r.aoMapIntensity=t.aoMapIntensity),void 0!==t.gradientMap&&(r.gradientMap=i(t.gradientMap)),r}}),Object.assign(gu.prototype,{load:function(t,e,i,r){var n=this;new vc(n.manager).load(t,function(t){e(n.parse(JSON.parse(t)))},i,r)},parse:function(t){var e=new $r,i=t.data.index;if(void 0!==i){var r=new _u[i.type](i.array);e.setIndex(new wr(r,1))}var n=t.data.attributes;for(var o in n){var a=n[o];r=new _u[a.type](a.array);e.addAttribute(o,new wr(r,a.itemSize,a.normalized))}var s=t.data.groups||t.data.drawcalls||t.data.offsets;if(void 0!==s)for(var c=0,u=s.length;c!==u;++c){var h=s[c];e.addGroup(h.start,h.count,h.materialIndex)}var l=t.data.boundingSphere;if(void 0!==l){var p=new ri;void 0!==l.center&&p.fromArray(l.center),e.boundingSphere=new Ti(p,l.radius)}return e}});var vu,yu,bu,xu,_u={Int8Array:Int8Array,Uint8Array:Uint8Array,Uint8ClampedArray:"undefined"!=typeof Uint8ClampedArray?Uint8ClampedArray:Uint8Array,Int16Array:Int16Array,Uint16Array:Uint16Array,Int32Array:Int32Array,Uint32Array:Uint32Array,Float32Array:Float32Array,Float64Array:Float64Array};function wu(){}wu.Handlers={handlers:[],add:function(t,e){this.handlers.push(t,e)},get:function(t){for(var e=this.handlers,i=0,r=e.length;i<r;i+=2){var n=e[i],o=e[i+1];if(n.test(t))return o}return null}},Object.assign(wu.prototype,{crossOrigin:"anonymous",onLoadStart:function(){},onLoadProgress:function(){},onLoadComplete:function(){},initMaterials:function(t,e,i){for(var r=[],n=0;n<t.length;++n)r[n]=this.createMaterial(t[n],e,i);return r},createMaterial:(vu={NoBlending:q,NormalBlending:Y,AdditiveBlending:Z,SubtractiveBlending:K,MultiplyBlending:J,CustomBlending:Q},yu=new ki,bu=new xc,xu=new mu,function(t,u,h){var l={};function e(t,e,i,r,n){var o,a=u+t,s=wu.Handlers.get(a);null!==s?o=s.load(a):(bu.setCrossOrigin(h),o=bu.load(a)),void 0!==e&&(o.repeat.fromArray(e),1!==e[0]&&(o.wrapS=Ut),1!==e[1]&&(o.wrapT=Ut)),void 0!==i&&o.offset.fromArray(i),void 0!==r&&("repeat"===r[0]&&(o.wrapS=Ut),"mirror"===r[0]&&(o.wrapS=Gt),"repeat"===r[1]&&(o.wrapT=Ut),"mirror"===r[1]&&(o.wrapT=Gt)),void 0!==n&&(o.anisotropy=n);var c=Qe.generateUUID();return l[c]=o,c}var i={uuid:Qe.generateUUID(),type:"MeshLambertMaterial"};for(var r in t){var n=t[r];switch(r){case"DbgColor":case"DbgIndex":case"opticalDensity":case"illumination":break;case"DbgName":i.name=n;break;case"blending":i.blending=vu[n];break;case"colorAmbient":case"mapAmbient":console.warn("THREE.Loader.createMaterial:",r,"is no longer supported.");break;case"colorDiffuse":i.color=yu.fromArray(n).getHex();break;case"colorSpecular":i.specular=yu.fromArray(n).getHex();break;case"colorEmissive":i.emissive=yu.fromArray(n).getHex();break;case"specularCoef":i.shininess=n;break;case"shading":"basic"===n.toLowerCase()&&(i.type="MeshBasicMaterial"),"phong"===n.toLowerCase()&&(i.type="MeshPhongMaterial"),"standard"===n.toLowerCase()&&(i.type="MeshStandardMaterial");break;case"mapDiffuse":i.map=e(n,t.mapDiffuseRepeat,t.mapDiffuseOffset,t.mapDiffuseWrap,t.mapDiffuseAnisotropy);break;case"mapDiffuseRepeat":case"mapDiffuseOffset":case"mapDiffuseWrap":case"mapDiffuseAnisotropy":break;case"mapEmissive":i.emissiveMap=e(n,t.mapEmissiveRepeat,t.mapEmissiveOffset,t.mapEmissiveWrap,t.mapEmissiveAnisotropy);break;case"mapEmissiveRepeat":case"mapEmissiveOffset":case"mapEmissiveWrap":case"mapEmissiveAnisotropy":break;case"mapLight":i.lightMap=e(n,t.mapLightRepeat,t.mapLightOffset,t.mapLightWrap,t.mapLightAnisotropy);break;case"mapLightRepeat":case"mapLightOffset":case"mapLightWrap":case"mapLightAnisotropy":break;case"mapAO":i.aoMap=e(n,t.mapAORepeat,t.mapAOOffset,t.mapAOWrap,t.mapAOAnisotropy);break;case"mapAORepeat":case"mapAOOffset":case"mapAOWrap":case"mapAOAnisotropy":break;case"mapBump":i.bumpMap=e(n,t.mapBumpRepeat,t.mapBumpOffset,t.mapBumpWrap,t.mapBumpAnisotropy);break;case"mapBumpScale":i.bumpScale=n;break;case"mapBumpRepeat":case"mapBumpOffset":case"mapBumpWrap":case"mapBumpAnisotropy":break;case"mapNormal":i.normalMap=e(n,t.mapNormalRepeat,t.mapNormalOffset,t.mapNormalWrap,t.mapNormalAnisotropy);break;case"mapNormalFactor":i.normalScale=n;break;case"mapNormalRepeat":case"mapNormalOffset":case"mapNormalWrap":case"mapNormalAnisotropy":break;case"mapSpecular":i.specularMap=e(n,t.mapSpecularRepeat,t.mapSpecularOffset,t.mapSpecularWrap,t.mapSpecularAnisotropy);break;case"mapSpecularRepeat":case"mapSpecularOffset":case"mapSpecularWrap":case"mapSpecularAnisotropy":break;case"mapMetalness":i.metalnessMap=e(n,t.mapMetalnessRepeat,t.mapMetalnessOffset,t.mapMetalnessWrap,t.mapMetalnessAnisotropy);break;case"mapMetalnessRepeat":case"mapMetalnessOffset":case"mapMetalnessWrap":case"mapMetalnessAnisotropy":break;case"mapRoughness":i.roughnessMap=e(n,t.mapRoughnessRepeat,t.mapRoughnessOffset,t.mapRoughnessWrap,t.mapRoughnessAnisotropy);break;case"mapRoughnessRepeat":case"mapRoughnessOffset":case"mapRoughnessWrap":case"mapRoughnessAnisotropy":break;case"mapAlpha":i.alphaMap=e(n,t.mapAlphaRepeat,t.mapAlphaOffset,t.mapAlphaWrap,t.mapAlphaAnisotropy);break;case"mapAlphaRepeat":case"mapAlphaOffset":case"mapAlphaWrap":case"mapAlphaAnisotropy":break;case"flipSided":i.side=wt;break;case"doubleSided":i.side=et;break;case"transparency":console.warn("THREE.Loader.createMaterial: transparency has been renamed to opacity"),i.opacity=n;break;case"depthTest":case"depthWrite":case"colorWrite":case"opacity":case"reflectivity":case"transparent":case"visible":case"wireframe":i[r]=n;break;case"vertexColors":!0===n&&(i.vertexColors=2),"face"===n&&(i.vertexColors=1);break;default:console.error("THREE.Loader.createMaterial: Unsupported",r,n)}}return"MeshBasicMaterial"===i.type&&delete i.emissive,"MeshPhongMaterial"!==i.type&&delete i.specular,i.opacity<1&&(i.transparent=!0),xu.setTextures(l),xu.parse(i)})});var Su=function(t){var e=t.lastIndexOf("/");return-1===e?"./":t.substr(0,e+1)};function Au(t){"boolean"==typeof t&&(console.warn("THREE.JSONLoader: showStatus parameter has been removed from constructor."),t=void 0),this.manager=void 0!==t?t:mc,this.withCredentials=!1}Object.assign(Au.prototype,{crossOrigin:"anonymous",load:function(o,a,t,e){var s=this,c=this.texturePath&&"string"==typeof this.texturePath?this.texturePath:Su(o),i=new vc(this.manager);i.setWithCredentials(this.withCredentials),i.load(o,function(t){var e=JSON.parse(t),i=e.metadata;if(void 0!==i){var r=i.type;if(void 0!==r&&"object"===r.toLowerCase())return void console.error("THREE.JSONLoader: "+o+" should be loaded with THREE.ObjectLoader instead.")}var n=s.parse(e,c);a(n.geometry,n.materials)},t,e)},setCrossOrigin:function(t){return this.crossOrigin=t,this},setTexturePath:function(t){return this.texturePath=t,this},parse:function(t,e){void 0!==t.data&&(t=t.data),void 0!==t.scale?t.scale=1/t.scale:t.scale=1;var i=new _r;return function(t,e){function i(t,e){return t&1<<e}var r,n,o,a,s,c,u,h,l,p,d,f,m,g,v,y,b,x,_,w,S,A,M,E,P,T=t.faces,C=t.vertices,I=t.normals,O=t.colors,L=t.scale,R=0;if(void 0!==t.uvs){for(r=0;r<t.uvs.length;r++)t.uvs[r].length&&R++;for(r=0;r<R;r++)e.faceVertexUvs[r]=[]}for(a=0,s=C.length;a<s;)(x=new ri).x=C[a++]*L,x.y=C[a++]*L,x.z=C[a++]*L,e.vertices.push(x);for(a=0,s=T.length;a<s;)if(d=i(p=T[a++],0),f=i(p,1),m=i(p,3),g=i(p,4),v=i(p,5),y=i(p,6),b=i(p,7),d){if((w=new pr).a=T[a],w.b=T[a+1],w.c=T[a+3],(S=new pr).a=T[a+1],S.b=T[a+2],S.c=T[a+3],a+=4,f&&(l=T[a++],w.materialIndex=l,S.materialIndex=l),o=e.faces.length,m)for(r=0;r<R;r++)for(E=t.uvs[r],e.faceVertexUvs[r][o]=[],e.faceVertexUvs[r][o+1]=[],n=0;n<4;n++)P=new ti(E[2*(h=T[a++])],E[2*h+1]),2!==n&&e.faceVertexUvs[r][o].push(P),0!==n&&e.faceVertexUvs[r][o+1].push(P);if(g&&(u=3*T[a++],w.normal.set(I[u++],I[u++],I[u]),S.normal.copy(w.normal)),v)for(r=0;r<4;r++)u=3*T[a++],M=new ri(I[u++],I[u++],I[u]),2!==r&&w.vertexNormals.push(M),0!==r&&S.vertexNormals.push(M);if(y&&(A=O[c=T[a++]],w.color.setHex(A),S.color.setHex(A)),b)for(r=0;r<4;r++)A=O[c=T[a++]],2!==r&&w.vertexColors.push(new ki(A)),0!==r&&S.vertexColors.push(new ki(A));e.faces.push(w),e.faces.push(S)}else{if((_=new pr).a=T[a++],_.b=T[a++],_.c=T[a++],f&&(l=T[a++],_.materialIndex=l),o=e.faces.length,m)for(r=0;r<R;r++)for(E=t.uvs[r],e.faceVertexUvs[r][o]=[],n=0;n<3;n++)P=new ti(E[2*(h=T[a++])],E[2*h+1]),e.faceVertexUvs[r][o].push(P);if(g&&(u=3*T[a++],_.normal.set(I[u++],I[u++],I[u])),v)for(r=0;r<3;r++)u=3*T[a++],M=new ri(I[u++],I[u++],I[u]),_.vertexNormals.push(M);if(y&&(c=T[a++],_.color.setHex(O[c])),b)for(r=0;r<3;r++)c=T[a++],_.vertexColors.push(new ki(O[c]));e.faces.push(_)}}(t,i),function(t,e){var i=void 0!==t.influencesPerVertex?t.influencesPerVertex:2;if(t.skinWeights)for(var r=0,n=t.skinWeights.length;r<n;r+=i){var o=t.skinWeights[r],a=1<i?t.skinWeights[r+1]:0,s=2<i?t.skinWeights[r+2]:0,c=3<i?t.skinWeights[r+3]:0;e.skinWeights.push(new Si(o,a,s,c))}if(t.skinIndices)for(r=0,n=t.skinIndices.length;r<n;r+=i){var u=t.skinIndices[r],h=1<i?t.skinIndices[r+1]:0,l=2<i?t.skinIndices[r+2]:0,p=3<i?t.skinIndices[r+3]:0;e.skinIndices.push(new Si(u,h,l,p))}e.bones=t.bones,e.bones&&0<e.bones.length&&(e.skinWeights.length!==e.skinIndices.length||e.skinIndices.length!==e.vertices.length)&&console.warn("When skinning, number of vertices ("+e.vertices.length+"), skinIndices ("+e.skinIndices.length+"), and skinWeights ("+e.skinWeights.length+") should match.")}(t,i),function(t,e){var i=t.scale;if(void 0!==t.morphTargets)for(var r=0,n=t.morphTargets.length;r<n;r++){e.morphTargets[r]={},e.morphTargets[r].name=t.morphTargets[r].name,e.morphTargets[r].vertices=[];for(var o=e.morphTargets[r].vertices,a=t.morphTargets[r].vertices,s=0,c=a.length;s<c;s+=3){var u=new ri;u.x=a[s]*i,u.y=a[s+1]*i,u.z=a[s+2]*i,o.push(u)}}if(void 0!==t.morphColors&&0<t.morphColors.length){console.warn('THREE.JSONLoader: "morphColors" no longer supported. Using them as face colors.');var h=e.faces,l=t.morphColors[0].colors;for(r=0,n=h.length;r<n;r++)h[r].color.fromArray(l,3*r)}}(t,i),function(t,e){var i=[],r=[];void 0!==t.animation&&r.push(t.animation),void 0!==t.animations&&(t.animations.length?r=r.concat(t.animations):r.push(t.animations));for(var n=0;n<r.length;n++){var o=du.parseAnimation(r[n],e.bones);o&&i.push(o)}if(e.morphTargets){var a=du.CreateClipsFromMorphTargetSequences(e.morphTargets,10);i=i.concat(a)}0<i.length&&(e.animations=i)}(t,i),i.computeFaceNormals(),i.computeBoundingSphere(),void 0===t.materials||0===t.materials.length?{geometry:i}:{geometry:i,materials:wu.prototype.initMaterials(t.materials,e,this.crossOrigin)}}}),Object.assign(function(t){this.manager=void 0!==t?t:mc,this.texturePath=""}.prototype,{crossOrigin:"anonymous",load:function(r,n,t,o){""===this.texturePath&&(this.texturePath=r.substring(0,r.lastIndexOf("/")+1));var a=this;new vc(a.manager).load(r,function(t){var e=null;try{e=JSON.parse(t)}catch(t){return void 0!==o&&o(t),void console.error("THREE:ObjectLoader: Can't parse "+r+".",t.message)}var i=e.metadata;void 0!==i&&void 0!==i.type&&"geometry"!==i.type.toLowerCase()?a.parse(e,n):console.error("THREE.ObjectLoader: Can't load "+r+". Use THREE.JSONLoader instead.")},t,o)},setTexturePath:function(t){return this.texturePath=t,this},setCrossOrigin:function(t){return this.crossOrigin=t,this},parse:function(t,e){var i=this.parseShape(t.shapes),r=this.parseGeometries(t.geometries,i),n=this.parseImages(t.images,function(){void 0!==e&&e(s)}),o=this.parseTextures(t.textures,n),a=this.parseMaterials(t.materials,o),s=this.parseObject(t.object,r,a);return t.animations&&(s.animations=this.parseAnimations(t.animations)),void 0!==t.images&&0!==t.images.length||void 0!==e&&e(s),s},parseShape:function(t){var e={};if(void 0!==t)for(var i=0,r=t.length;i<r;i++){var n=(new Vc).fromJSON(t[i]);e[n.uuid]=n}return e},parseGeometries:function(t,e){var i={};if(void 0!==t)for(var r=new Au,n=new gu,o=0,a=t.length;o<a;o++){var s,c=t[o];switch(c.type){case"PlaneGeometry":case"PlaneBufferGeometry":s=new ic[c.type](c.width,c.height,c.widthSegments,c.heightSegments);break;case"BoxGeometry":case"BoxBufferGeometry":case"CubeGeometry":s=new ic[c.type](c.width,c.height,c.depth,c.widthSegments,c.heightSegments,c.depthSegments);break;case"CircleGeometry":case"CircleBufferGeometry":s=new ic[c.type](c.radius,c.segments,c.thetaStart,c.thetaLength);break;case"CylinderGeometry":case"CylinderBufferGeometry":s=new ic[c.type](c.radiusTop,c.radiusBottom,c.height,c.radialSegments,c.heightSegments,c.openEnded,c.thetaStart,c.thetaLength);break;case"ConeGeometry":case"ConeBufferGeometry":s=new ic[c.type](c.radius,c.height,c.radialSegments,c.heightSegments,c.openEnded,c.thetaStart,c.thetaLength);break;case"SphereGeometry":case"SphereBufferGeometry":s=new ic[c.type](c.radius,c.widthSegments,c.heightSegments,c.phiStart,c.phiLength,c.thetaStart,c.thetaLength);break;case"DodecahedronGeometry":case"DodecahedronBufferGeometry":case"IcosahedronGeometry":case"IcosahedronBufferGeometry":case"OctahedronGeometry":case"OctahedronBufferGeometry":case"TetrahedronGeometry":case"TetrahedronBufferGeometry":s=new ic[c.type](c.radius,c.detail);break;case"RingGeometry":case"RingBufferGeometry":s=new ic[c.type](c.innerRadius,c.outerRadius,c.thetaSegments,c.phiSegments,c.thetaStart,c.thetaLength);break;case"TorusGeometry":case"TorusBufferGeometry":s=new ic[c.type](c.radius,c.tube,c.radialSegments,c.tubularSegments,c.arc);break;case"TorusKnotGeometry":case"TorusKnotBufferGeometry":s=new ic[c.type](c.radius,c.tube,c.tubularSegments,c.radialSegments,c.p,c.q);break;case"LatheGeometry":case"LatheBufferGeometry":s=new ic[c.type](c.points,c.segments,c.phiStart,c.phiLength);break;case"PolyhedronGeometry":case"PolyhedronBufferGeometry":s=new ic[c.type](c.vertices,c.indices,c.radius,c.details);break;case"ShapeGeometry":case"ShapeBufferGeometry":for(var u=[],h=0,l=c.shapes.length;h<l;h++){var p=e[c.shapes[h]];u.push(p)}s=new ic[c.type](u,c.curveSegments);break;case"ExtrudeGeometry":case"ExtrudeBufferGeometry":for(u=[],h=0,l=c.shapes.length;h<l;h++){p=e[c.shapes[h]];u.push(p)}var d=c.options.extrudePath;void 0!==d&&(c.options.extrudePath=(new Uc[d.type]).fromJSON(d)),s=new ic[c.type](u,c.options);break;case"BufferGeometry":s=n.parse(c);break;case"Geometry":s=r.parse(c,this.texturePath).geometry;break;default:console.warn('THREE.ObjectLoader: Unsupported geometry type "'+c.type+'"');continue}s.uuid=c.uuid,void 0!==c.name&&(s.name=c.name),!0===s.isBufferGeometry&&void 0!==c.userData&&(s.userData=c.userData),i[c.uuid]=s}return i},parseMaterials:function(t,e){var i={};if(void 0!==t){var r=new mu;r.setTextures(e);for(var n=0,o=t.length;n<o;n++){var a=t[n];if("MultiMaterial"===a.type){for(var s=[],c=0;c<a.materials.length;c++)s.push(r.parse(a.materials[c]));i[a.uuid]=s}else i[a.uuid]=r.parse(a)}}return i},parseAnimations:function(t){for(var e=[],i=0;i<t.length;i++){var r=t[i],n=du.parse(r);void 0!==r.uuid&&(n.uuid=r.uuid),e.push(n)}return e},parseImages:function(t,e){var i=this,r={};function n(t){return i.manager.itemStart(t),o.load(t,function(){i.manager.itemEnd(t)},void 0,function(){i.manager.itemEnd(t),i.manager.itemError(t)})}if(void 0!==t&&0<t.length){var o=new yc(new fc(e));o.setCrossOrigin(this.crossOrigin);for(var a=0,s=t.length;a<s;a++){var c=t[a],u=c.url;if(Array.isArray(u)){r[c.uuid]=[];for(var h=0,l=u.length;h<l;h++){var p=u[h],d=/^(\/\/)|([a-z]+:(\/\/)?)/i.test(p)?p:i.texturePath+p;r[c.uuid].push(n(d))}}else{d=/^(\/\/)|([a-z]+:(\/\/)?)/i.test(c.url)?c.url:i.texturePath+c.url;r[c.uuid]=n(d)}}}return r},parseTextures:function(t,e){function i(t,e){return"number"==typeof t?t:(console.warn("THREE.ObjectLoader.parseTexture: Constant should be in numeric form.",t),e[t])}var r={};if(void 0!==t)for(var n=0,o=t.length;n<o;n++){var a,s=t[n];void 0===s.image&&console.warn('THREE.ObjectLoader: No "image" specified for',s.uuid),void 0===e[s.image]&&console.warn("THREE.ObjectLoader: Undefined image",s.image),(a=Array.isArray(e[s.image])?new zn(e[s.image]):new wi(e[s.image])).needsUpdate=!0,a.uuid=s.uuid,void 0!==s.name&&(a.name=s.name),void 0!==s.mapping&&(a.mapping=i(s.mapping,Eu)),void 0!==s.offset&&a.offset.fromArray(s.offset),void 0!==s.repeat&&a.repeat.fromArray(s.repeat),void 0!==s.center&&a.center.fromArray(s.center),void 0!==s.rotation&&(a.rotation=s.rotation),void 0!==s.wrap&&(a.wrapS=i(s.wrap[0],Pu),a.wrapT=i(s.wrap[1],Pu)),void 0!==s.format&&(a.format=s.format),void 0!==s.minFilter&&(a.minFilter=i(s.minFilter,Tu)),void 0!==s.magFilter&&(a.magFilter=i(s.magFilter,Tu)),void 0!==s.anisotropy&&(a.anisotropy=s.anisotropy),void 0!==s.flipY&&(a.flipY=s.flipY),r[s.uuid]=a}return r},parseObject:function(t,e,o){var i;function r(t){return void 0===e[t]&&console.warn("THREE.ObjectLoader: Undefined geometry",t),e[t]}function n(t){if(void 0!==t){if(Array.isArray(t)){for(var e=[],i=0,r=t.length;i<r;i++){var n=t[i];void 0===o[n]&&console.warn("THREE.ObjectLoader: Undefined material",n),e.push(o[n])}return e}return void 0===o[t]&&console.warn("THREE.ObjectLoader: Undefined material",t),o[t]}}switch(t.type){case"Scene":i=new Ea,void 0!==t.background&&Number.isInteger(t.background)&&(i.background=new ki(t.background)),void 0!==t.fog&&("Fog"===t.fog.type?i.fog=new Ma(t.fog.color,t.fog.near,t.fog.far):"FogExp2"===t.fog.type&&(i.fog=new Aa(t.fog.color,t.fog.density)));break;case"PerspectiveCamera":i=new ba(t.fov,t.aspect,t.near,t.far),void 0!==t.focus&&(i.focus=t.focus),void 0!==t.zoom&&(i.zoom=t.zoom),void 0!==t.filmGauge&&(i.filmGauge=t.filmGauge),void 0!==t.filmOffset&&(i.filmOffset=t.filmOffset),void 0!==t.view&&(i.view=Object.assign({},t.view));break;case"OrthographicCamera":i=new lr(t.left,t.right,t.top,t.bottom,t.near,t.far),void 0!==t.zoom&&(i.zoom=t.zoom),void 0!==t.view&&(i.view=Object.assign({},t.view));break;case"AmbientLight":i=new Jc(t.color,t.intensity);break;case"DirectionalLight":i=new Kc(t.color,t.intensity);break;case"PointLight":i=new Yc(t.color,t.intensity,t.distance,t.decay);break;case"RectAreaLight":i=new Qc(t.color,t.intensity,t.width,t.height);break;case"SpotLight":i=new qc(t.color,t.intensity,t.distance,t.angle,t.penumbra,t.decay);break;case"HemisphereLight":i=new $c(t.color,t.groundColor,t.intensity);break;case"SkinnedMesh":console.warn("THREE.ObjectLoader.parseObject() does not support SkinnedMesh yet.");case"Mesh":var a=r(t.geometry),s=n(t.material);i=a.bones&&0<a.bones.length?new Da(a,s):new Pn(a,s);break;case"LOD":i=new Oa;break;case"Line":i=new Ba(r(t.geometry),n(t.material),t.mode);break;case"LineLoop":i=new Fa(r(t.geometry),n(t.material));break;case"LineSegments":i=new Na(r(t.geometry),n(t.material));break;case"PointCloud":case"Points":i=new Ua(r(t.geometry),n(t.material));break;case"Sprite":i=new Ia(n(t.material));break;case"Group":i=new ya;break;default:i=new ur}if(i.uuid=t.uuid,void 0!==t.name&&(i.name=t.name),void 0!==t.matrix?(i.matrix.fromArray(t.matrix),void 0!==t.matrixAutoUpdate&&(i.matrixAutoUpdate=t.matrixAutoUpdate),i.matrixAutoUpdate&&i.matrix.decompose(i.position,i.quaternion,i.scale)):(void 0!==t.position&&i.position.fromArray(t.position),void 0!==t.rotation&&i.rotation.fromArray(t.rotation),void 0!==t.quaternion&&i.quaternion.fromArray(t.quaternion),void 0!==t.scale&&i.scale.fromArray(t.scale)),void 0!==t.castShadow&&(i.castShadow=t.castShadow),void 0!==t.receiveShadow&&(i.receiveShadow=t.receiveShadow),t.shadow&&(void 0!==t.shadow.bias&&(i.shadow.bias=t.shadow.bias),void 0!==t.shadow.radius&&(i.shadow.radius=t.shadow.radius),void 0!==t.shadow.mapSize&&i.shadow.mapSize.fromArray(t.shadow.mapSize),void 0!==t.shadow.camera&&(i.shadow.camera=this.parseObject(t.shadow.camera))),void 0!==t.visible&&(i.visible=t.visible),void 0!==t.frustumCulled&&(i.frustumCulled=t.frustumCulled),void 0!==t.renderOrder&&(i.renderOrder=t.renderOrder),void 0!==t.userData&&(i.userData=t.userData),void 0!==t.layers&&(i.layers.mask=t.layers),void 0!==t.children)for(var c=t.children,u=0;u<c.length;u++)i.add(this.parseObject(c[u],e,o));if("LOD"===t.type)for(var h=t.levels,l=0;l<h.length;l++){var p=h[l],d=i.getObjectByProperty("uuid",p.object);void 0!==d&&i.addLevel(d,p.distance)}return i}});var Mu,Eu={UVMapping:300,CubeReflectionMapping:Rt,CubeRefractionMapping:Dt,EquirectangularReflectionMapping:kt,EquirectangularRefractionMapping:Bt,SphericalReflectionMapping:Nt,CubeUVReflectionMapping:Ft,CubeUVRefractionMapping:zt},Pu={RepeatWrapping:Ut,ClampToEdgeWrapping:jt,MirroredRepeatWrapping:Gt},Tu={NearestFilter:Vt,NearestMipMapNearestFilter:Ht,NearestMipMapLinearFilter:$t,LinearFilter:Wt,LinearMipMapNearestFilter:Xt,LinearMipMapLinearFilter:qt};function Cu(){this.type="ShapePath",this.color=new ki,this.subPaths=[],this.currentPath=null}function Iu(t){this.type="Font",this.data=t}function Ou(t,e,i,r,n){var o=n.glyphs[t]||n.glyphs["?"];if(o){var a,s,c,u,h,l,p,d,f=new Cu;if(o.o)for(var m=o._cachedOutline||(o._cachedOutline=o.o.split(" ")),g=0,v=m.length;g<v;){switch(m[g++]){case"m":a=m[g++]*e+i,s=m[g++]*e+r,f.moveTo(a,s);break;case"l":a=m[g++]*e+i,s=m[g++]*e+r,f.lineTo(a,s);break;case"q":c=m[g++]*e+i,u=m[g++]*e+r,h=m[g++]*e+i,l=m[g++]*e+r,f.quadraticCurveTo(h,l,c,u);break;case"b":c=m[g++]*e+i,u=m[g++]*e+r,h=m[g++]*e+i,l=m[g++]*e+r,p=m[g++]*e+i,d=m[g++]*e+r,f.bezierCurveTo(h,l,p,d,c,u)}}return{offsetX:o.ha*e,path:f}}}Object.assign(Cu.prototype,{moveTo:function(t,e){this.currentPath=new Gc,this.subPaths.push(this.currentPath),this.currentPath.moveTo(t,e)},lineTo:function(t,e){this.currentPath.lineTo(t,e)},quadraticCurveTo:function(t,e,i,r){this.currentPath.quadraticCurveTo(t,e,i,r)},bezierCurveTo:function(t,e,i,r,n,o){this.currentPath.bezierCurveTo(t,e,i,r,n,o)},splineThru:function(t){this.currentPath.splineThru(t)},toShapes:function(t,e){function i(t){for(var e=[],i=0,r=t.length;i<r;i++){var n=t[i],o=new Vc;o.curves=n.curves,e.push(o)}return e}function r(t,e){for(var i=e.length,r=!1,n=i-1,o=0;o<i;n=o++){var a=e[n],s=e[o],c=s.x-a.x,u=s.y-a.y;if(Math.abs(u)>Number.EPSILON){if(u<0&&(a=e[o],c=-c,s=e[n],u=-u),t.y<a.y||t.y>s.y)continue;if(t.y===a.y){if(t.x===a.x)return!0}else{var h=u*(t.x-a.x)-c*(t.y-a.y);if(0===h)return!0;if(h<0)continue;r=!r}}else{if(t.y!==a.y)continue;if(s.x<=t.x&&t.x<=a.x||a.x<=t.x&&t.x<=s.x)return!0}}return r}var n=Os.isClockWise,o=this.subPaths;if(0===o.length)return[];if(!0===e)return i(o);var a,s,c,u=[];if(1===o.length)return s=o[0],(c=new Vc).curves=s.curves,u.push(c),u;var h=!n(o[0].getPoints());h=t?!h:h;var l,p,d=[],f=[],m=[],g=0;f[g]=void 0,m[g]=[];for(var v=0,y=o.length;v<y;v++)a=n(l=(s=o[v]).getPoints()),(a=t?!a:a)?(!h&&f[g]&&g++,f[g]={s:new Vc,p:l},f[g].s.curves=s.curves,h&&g++,m[g]=[]):m[g].push({h:s,p:l[0]});if(!f[0])return i(o);if(1<f.length){for(var b=!1,x=[],_=0,w=f.length;_<w;_++)d[_]=[];for(_=0,w=f.length;_<w;_++)for(var S=m[_],A=0;A<S.length;A++){for(var M=S[A],E=!0,P=0;P<f.length;P++)r(M.p,f[P].p)&&(_!==P&&x.push({froms:_,tos:P,hole:A}),E?(E=!1,d[P].push(M)):b=!0);E&&d[_].push(M)}0<x.length&&(b||(m=d))}v=0;for(var T=f.length;v<T;v++){c=f[v].s,u.push(c);for(var C=0,I=(p=m[v]).length;C<I;C++)c.holes.push(p[C].h)}return u}}),Object.assign(Iu.prototype,{isFont:!0,generateShapes:function(t,e){void 0===e&&(e=100);for(var i=[],r=function(t,e,i){for(var r=Array.from?Array.from(t):String(t).split(""),n=e/i.resolution,o=(i.boundingBox.yMax-i.boundingBox.yMin+i.underlineThickness)*n,a=[],s=0,c=0,u=0;u<r.length;u++){var h=r[u];if("\n"===h)s=0,c-=o;else{var l=Ou(h,n,s,c,i);s+=l.offsetX,a.push(l.path)}}return a}(t,e,this.data),n=0,o=r.length;n<o;n++)Array.prototype.push.apply(i,r[n].toShapes());return i}}),Object.assign(function(t){this.manager=void 0!==t?t:mc}.prototype,{load:function(t,r,e,i){var n=this,o=new vc(this.manager);o.setPath(this.path),o.load(t,function(e){var i;try{i=JSON.parse(e)}catch(t){console.warn("THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead."),i=JSON.parse(e.substring(65,e.length-2))}var t=n.parse(i);r&&r(t)},e,i)},parse:function(t){return new Iu(t)},setPath:function(t){return this.path=t,this}});var Lu,Ru,Du,ku,Bu,Nu,Fu,zu,Uu,ju,Gu,Vu,Hu,$u,Wu,Xu,qu,Yu,Zu=function(){return void 0===Mu&&(Mu=new(window.AudioContext||window.webkitAudioContext)),Mu};function Ku(t){this.manager=void 0!==t?t:mc}function Ju(){this.type="StereoCamera",this.aspect=1,this.eyeSep=.064,this.cameraL=new ba,this.cameraL.layers.enable(1),this.cameraL.matrixAutoUpdate=!1,this.cameraR=new ba,this.cameraR.layers.enable(2),this.cameraR.matrixAutoUpdate=!1}function Qu(t,e,i){ur.call(this),this.type="CubeCamera";var n=new ba(90,1,t,e);n.up.set(0,-1,0),n.lookAt(new ri(1,0,0)),this.add(n);var o=new ba(90,1,t,e);o.up.set(0,-1,0),o.lookAt(new ri(-1,0,0)),this.add(o);var a=new ba(90,1,t,e);a.up.set(0,0,1),a.lookAt(new ri(0,1,0)),this.add(a);var s=new ba(90,1,t,e);s.up.set(0,0,-1),s.lookAt(new ri(0,-1,0)),this.add(s);var c=new ba(90,1,t,e);c.up.set(0,-1,0),c.lookAt(new ri(0,0,1)),this.add(c);var u=new ba(90,1,t,e);u.up.set(0,-1,0),u.lookAt(new ri(0,0,-1)),this.add(u);var r={format:ce,magFilter:Wt,minFilter:Wt};this.renderTarget=new Mi(i,i,r),this.renderTarget.texture.name="CubeCamera",this.update=function(t,e){null===this.parent&&this.updateMatrixWorld();var i=this.renderTarget,r=i.texture.generateMipmaps;i.texture.generateMipmaps=!1,i.activeCubeFace=0,t.render(e,n,i),i.activeCubeFace=1,t.render(e,o,i),i.activeCubeFace=2,t.render(e,a,i),i.activeCubeFace=3,t.render(e,s,i),i.activeCubeFace=4,t.render(e,c,i),i.texture.generateMipmaps=r,i.activeCubeFace=5,t.render(e,u,i),t.setRenderTarget(null)},this.clear=function(t,e,i,r){for(var n=this.renderTarget,o=0;o<6;o++)n.activeCubeFace=o,t.setRenderTarget(n),t.clear(e,i,r);t.setRenderTarget(null)}}function th(){ur.call(this),this.type="AudioListener",this.context=Zu(),this.gain=this.context.createGain(),this.gain.connect(this.context.destination),this.filter=null}function eh(t){ur.call(this),this.type="Audio",this.context=t.context,this.gain=this.context.createGain(),this.gain.connect(t.getInput()),this.autoplay=!1,this.buffer=null,this.loop=!1,this.startTime=0,this.offset=0,this.playbackRate=1,this.isPlaying=!1,this.hasPlaybackControl=!0,this.sourceType="empty",this.filters=[]}function ih(t){eh.call(this,t),this.panner=this.context.createPanner(),this.panner.connect(this.gain)}function rh(t,e){this.analyser=t.context.createAnalyser(),this.analyser.fftSize=void 0!==e?e:2048,this.data=new Uint8Array(this.analyser.frequencyBinCount),t.getOutput().connect(this.analyser)}function nh(t,e,i){this.binding=t,this.valueSize=i;var r,n=Float64Array;switch(e){case"quaternion":r=this._slerp;break;case"string":case"bool":n=Array,r=this._select;break;default:r=this._lerp}this.buffer=new n(4*i),this._mixBufferRegion=r,this.cumulativeWeight=0,this.useCount=0,this.referenceCount=0}Object.assign(Ku.prototype,{load:function(t,i,e,r){var n=new vc(this.manager);n.setResponseType("arraybuffer"),n.load(t,function(t){var e=t.slice(0);Zu().decodeAudioData(e,function(t){i(t)})},e,r)}}),Object.assign(Ju.prototype,{update:(Uu=new ei,ju=new ei,function(t){if(Lu!==this||Ru!==t.focus||Du!==t.fov||ku!==t.aspect*this.aspect||Bu!==t.near||Nu!==t.far||Fu!==t.zoom||zu!==this.eyeSep){Lu=this,Ru=t.focus,Du=t.fov,ku=t.aspect*this.aspect,Bu=t.near,Nu=t.far,Fu=t.zoom;var e,i,r=t.projectionMatrix.clone(),n=(zu=this.eyeSep/2)*Bu/Ru,o=Bu*Math.tan(Qe.DEG2RAD*Du*.5)/Fu;ju.elements[12]=-zu,Uu.elements[12]=zu,e=-o*ku+n,i=o*ku+n,r.elements[0]=2*Bu/(i-e),r.elements[8]=(i+e)/(i-e),this.cameraL.projectionMatrix.copy(r),e=-o*ku-n,i=o*ku-n,r.elements[0]=2*Bu/(i-e),r.elements[8]=(i+e)/(i-e),this.cameraR.projectionMatrix.copy(r)}this.cameraL.matrixWorld.copy(t.matrixWorld).multiply(ju),this.cameraR.matrixWorld.copy(t.matrixWorld).multiply(Uu)})}),(Qu.prototype=Object.create(ur.prototype)).constructor=Qu,th.prototype=Object.assign(Object.create(ur.prototype),{constructor:th,getInput:function(){return this.gain},removeFilter:function(){return null!==this.filter&&(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination),this.gain.connect(this.context.destination),this.filter=null),this},getFilter:function(){return this.filter},setFilter:function(t){return null!==this.filter?(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination)):this.gain.disconnect(this.context.destination),this.filter=t,this.gain.connect(this.filter),this.filter.connect(this.context.destination),this},getMasterVolume:function(){return this.gain.gain.value},setMasterVolume:function(t){return this.gain.gain.setTargetAtTime(t,this.context.currentTime,.01),this},updateMatrixWorld:(Gu=new ri,Vu=new ii,Hu=new ri,$u=new ri,function(t){ur.prototype.updateMatrixWorld.call(this,t);var e=this.context.listener,i=this.up;this.matrixWorld.decompose(Gu,Vu,Hu),$u.set(0,0,-1).applyQuaternion(Vu),e.positionX?(e.positionX.setValueAtTime(Gu.x,this.context.currentTime),e.positionY.setValueAtTime(Gu.y,this.context.currentTime),e.positionZ.setValueAtTime(Gu.z,this.context.currentTime),e.forwardX.setValueAtTime($u.x,this.context.currentTime),e.forwardY.setValueAtTime($u.y,this.context.currentTime),e.forwardZ.setValueAtTime($u.z,this.context.currentTime),e.upX.setValueAtTime(i.x,this.context.currentTime),e.upY.setValueAtTime(i.y,this.context.currentTime),e.upZ.setValueAtTime(i.z,this.context.currentTime)):(e.setPosition(Gu.x,Gu.y,Gu.z),e.setOrientation($u.x,$u.y,$u.z,i.x,i.y,i.z))})}),eh.prototype=Object.assign(Object.create(ur.prototype),{constructor:eh,getOutput:function(){return this.gain},setNodeSource:function(t){return this.hasPlaybackControl=!1,this.sourceType="audioNode",this.source=t,this.connect(),this},setMediaElementSource:function(t){return this.hasPlaybackControl=!1,this.sourceType="mediaNode",this.source=this.context.createMediaElementSource(t),this.connect(),this},setBuffer:function(t){return this.buffer=t,this.sourceType="buffer",this.autoplay&&this.play(),this},play:function(){if(!0!==this.isPlaying){if(!1!==this.hasPlaybackControl){var t=this.context.createBufferSource();return t.buffer=this.buffer,t.loop=this.loop,t.onended=this.onEnded.bind(this),t.playbackRate.setValueAtTime(this.playbackRate,this.startTime),this.startTime=this.context.currentTime,t.start(this.startTime,this.offset),this.isPlaying=!0,this.source=t,this.connect()}console.warn("THREE.Audio: this Audio has no playback control.")}else console.warn("THREE.Audio: Audio is already playing.")},pause:function(){if(!1!==this.hasPlaybackControl)return!0===this.isPlaying&&(this.source.stop(),this.source.onended=null,this.offset+=(this.context.currentTime-this.startTime)*this.playbackRate,this.isPlaying=!1),this;console.warn("THREE.Audio: this Audio has no playback control.")},stop:function(){if(!1!==this.hasPlaybackControl)return this.source.stop(),this.source.onended=null,this.offset=0,this.isPlaying=!1,this;console.warn("THREE.Audio: this Audio has no playback control.")},connect:function(){if(0<this.filters.length){this.source.connect(this.filters[0]);for(var t=1,e=this.filters.length;t<e;t++)this.filters[t-1].connect(this.filters[t]);this.filters[this.filters.length-1].connect(this.getOutput())}else this.source.connect(this.getOutput());return this},disconnect:function(){if(0<this.filters.length){this.source.disconnect(this.filters[0]);for(var t=1,e=this.filters.length;t<e;t++)this.filters[t-1].disconnect(this.filters[t]);this.filters[this.filters.length-1].disconnect(this.getOutput())}else this.source.disconnect(this.getOutput());return this},getFilters:function(){return this.filters},setFilters:function(t){return t||(t=[]),!0===this.isPlaying?(this.disconnect(),this.filters=t,this.connect()):this.filters=t,this},getFilter:function(){return this.getFilters()[0]},setFilter:function(t){return this.setFilters(t?[t]:[])},setPlaybackRate:function(t){if(!1!==this.hasPlaybackControl)return this.playbackRate=t,!0===this.isPlaying&&this.source.playbackRate.setValueAtTime(this.playbackRate,this.context.currentTime),this;console.warn("THREE.Audio: this Audio has no playback control.")},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(t){if(!1!==this.hasPlaybackControl)return this.loop=t,!0===this.isPlaying&&(this.source.loop=this.loop),this;console.warn("THREE.Audio: this Audio has no playback control.")},getVolume:function(){return this.gain.gain.value},setVolume:function(t){return this.gain.gain.setTargetAtTime(t,this.context.currentTime,.01),this}}),ih.prototype=Object.assign(Object.create(eh.prototype),{constructor:ih,getOutput:function(){return this.panner},getRefDistance:function(){return this.panner.refDistance},setRefDistance:function(t){return this.panner.refDistance=t,this},getRolloffFactor:function(){return this.panner.rolloffFactor},setRolloffFactor:function(t){return this.panner.rolloffFactor=t,this},getDistanceModel:function(){return this.panner.distanceModel},setDistanceModel:function(t){return this.panner.distanceModel=t,this},getMaxDistance:function(){return this.panner.maxDistance},setMaxDistance:function(t){return this.panner.maxDistance=t,this},setDirectionalCone:function(t,e,i){return this.panner.coneInnerAngle=t,this.panner.coneOuterAngle=e,this.panner.coneOuterGain=i,this},updateMatrixWorld:(Wu=new ri,Xu=new ii,qu=new ri,Yu=new ri,function(t){ur.prototype.updateMatrixWorld.call(this,t);var e=this.panner;this.matrixWorld.decompose(Wu,Xu,qu),Yu.set(0,0,1).applyQuaternion(Xu),e.setPosition(Wu.x,Wu.y,Wu.z),e.setOrientation(Yu.x,Yu.y,Yu.z)})}),Object.assign(rh.prototype,{getFrequencyData:function(){return this.analyser.getByteFrequencyData(this.data),this.data},getAverageFrequency:function(){for(var t=0,e=this.getFrequencyData(),i=0;i<e.length;i++)t+=e[i];return t/e.length}}),Object.assign(nh.prototype,{accumulate:function(t,e){var i=this.buffer,r=this.valueSize,n=t*r+r,o=this.cumulativeWeight;if(0===o){for(var a=0;a!==r;++a)i[n+a]=i[a];o=e}else{var s=e/(o+=e);this._mixBufferRegion(i,n,0,s,r)}this.cumulativeWeight=o},apply:function(t){var e=this.valueSize,i=this.buffer,r=t*e+e,n=this.cumulativeWeight,o=this.binding;if(this.cumulativeWeight=0,n<1){var a=3*e;this._mixBufferRegion(i,r,a,1-n,e)}for(var s=e,c=e+e;s!==c;++s)if(i[s]!==i[s+e]){o.setValue(i,r);break}},saveOriginalState:function(){var t=this.binding,e=this.buffer,i=this.valueSize,r=3*i;t.getValue(e,r);for(var n=i,o=r;n!==o;++n)e[n]=e[r+n%i];this.cumulativeWeight=0},restoreOriginalState:function(){var t=3*this.valueSize;this.binding.setValue(this.buffer,t)},_select:function(t,e,i,r,n){if(.5<=r)for(var o=0;o!==n;++o)t[e+o]=t[i+o]},_slerp:function(t,e,i,r){ii.slerpFlat(t,e,t,e,t,i,r)},_lerp:function(t,e,i,r,n){for(var o=1-r,a=0;a!==n;++a){var s=e+a;t[s]=t[s]*o+t[i+a]*r}}});var oh,ah,sh,ch,uh,hh,lh,ph,dh,fh,mh,gh,vh,yh,bh,xh,_h,wh,Sh,Ah,Mh,Eh,Ph,Th,Ch,Ih,Oh,Lh,Rh,Dh,kh,Bh,Nh,Fh,zh,Uh,jh="\\[\\]\\.:\\/";function Gh(t,e,i){var r=i||Vh.parseTrackName(e);this._targetGroup=t,this._bindings=t.subscribe_(e,r)}function Vh(t,e,i){this.path=e,this.parsedPath=i||Vh.parseTrackName(e),this.node=Vh.findNode(t,this.parsedPath.nodeName)||t,this.rootNode=t}function Hh(t,e,i){this._mixer=t,this._clip=e,this._localRoot=i||null;for(var r=e.tracks,n=r.length,o=new Array(n),a={endingStart:ze,endingEnd:ze},s=0;s!==n;++s){var c=r[s].createInterpolant(null);(o[s]=c).settings=a}this._interpolantSettings=a,this._interpolants=o,this._propertyBindings=new Array(n),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}function $h(t){this._root=t,this._initMemoryManager(),this._accuIndex=0,this.time=0,this.timeScale=1}function Wh(t){"string"==typeof t&&(console.warn("THREE.Uniform: Type parameter is no longer needed."),t=arguments[1]),this.value=t}function Xh(){$r.call(this),this.type="InstancedBufferGeometry",this.maxInstancedCount=void 0}function qh(t,e,i){Pa.call(this,t,e),this.meshPerAttribute=i||1}function Yh(t,e,i){wr.call(this,t,e),this.meshPerAttribute=i||1}function Zh(t,e){return t.distance-e.distance}function Kh(t,e,i,r){if(!1!==t.visible&&(t.raycast(e,i),!0===r))for(var n=t.children,o=0,a=n.length;o<a;o++)Kh(n[o],e,i,!0)}function Jh(t,e){this.min=void 0!==t?t:new ti(1/0,1/0),this.max=void 0!==e?e:new ti(-1/0,-1/0)}function Qh(t,e){this.start=void 0!==t?t:new ri,this.end=void 0!==e?e:new ri}function tl(t){ur.call(this),this.material=t,this.render=function(){}}function el(t,e,i,r){this.object=t,this.size=void 0!==e?e:1;var n=void 0!==i?i:16711680,o=void 0!==r?r:1,a=0,s=this.object.geometry;s&&s.isGeometry?a=3*s.faces.length:s&&s.isBufferGeometry&&(a=s.attributes.normal.count);var c=new $r,u=new Ir(2*a*3,3);c.addAttribute("position",u),Na.call(this,c,new ka({color:n,linewidth:o})),this.matrixAutoUpdate=!1,this.update()}function il(t,e){ur.call(this),this.light=t,this.light.updateMatrixWorld(),this.matrix=t.matrixWorld,this.matrixAutoUpdate=!1,this.color=e;for(var i=new $r,r=[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],n=0,o=1;n<32;n++,o++){var a=n/32*Math.PI*2,s=o/32*Math.PI*2;r.push(Math.cos(a),Math.sin(a),1,Math.cos(s),Math.sin(s),1)}i.addAttribute("position",new Ir(r,3));var c=new ka({fog:!1});this.cone=new Na(i,c),this.add(this.cone),this.update()}function rl(t){for(var e=function t(e){var i=[];e&&e.isBone&&i.push(e);for(var r=0;r<e.children.length;r++)i.push.apply(i,t(e.children[r]));return i}(t),i=new $r,r=[],n=[],o=new ki(0,0,1),a=new ki(0,1,0),s=0;s<e.length;s++){var c=e[s];c.parent&&c.parent.isBone&&(r.push(0,0,0),r.push(0,0,0),n.push(o.r,o.g,o.b),n.push(a.r,a.g,a.b))}i.addAttribute("position",new Ir(r,3)),i.addAttribute("color",new Ir(n,3));var u=new ka({vertexColors:2,depthTest:!1,depthWrite:!1,transparent:!0});Na.call(this,i,u),this.root=t,this.bones=e,this.matrix=t.matrixWorld,this.matrixAutoUpdate=!1}function nl(t,e,i){this.light=t,this.light.updateMatrixWorld(),this.color=i;var r=new js(e,4,2),n=new Sn({wireframe:!0,fog:!1});Pn.call(this,r,n),this.matrix=this.light.matrixWorld,this.matrixAutoUpdate=!1,this.update()}function ol(t,e){ur.call(this),this.light=t,this.light.updateMatrixWorld(),this.matrix=t.matrixWorld,this.matrixAutoUpdate=!1,this.color=e;var i=new ka({fog:!1}),r=new $r;r.addAttribute("position",new wr(new Float32Array(15),3)),this.line=new Ba(r,i),this.add(this.line),this.update()}function al(t,e,i){ur.call(this),this.light=t,this.light.updateMatrixWorld(),this.matrix=t.matrixWorld,this.matrixAutoUpdate=!1,this.color=i;var r=new Qa(e);r.rotateY(.5*Math.PI),this.material=new Sn({wireframe:!0,fog:!1}),void 0===this.color&&(this.material.vertexColors=2);var n=r.getAttribute("position"),o=new Float32Array(3*n.count);r.addAttribute("color",new wr(o,3)),this.add(new Pn(r,this.material)),this.update()}function sl(t,e,i,r){t=t||10,e=e||10,i=new ki(void 0!==i?i:4473924),r=new ki(void 0!==r?r:8947848);for(var n=e/2,o=t/e,a=t/2,s=[],c=[],u=0,h=0,l=-a;u<=e;u++,l+=o){s.push(-a,0,l,a,0,l),s.push(l,0,-a,l,0,a);var p=u===n?i:r;p.toArray(c,h),h+=3,p.toArray(c,h),h+=3,p.toArray(c,h),h+=3,p.toArray(c,h),h+=3}var d=new $r;d.addAttribute("position",new Ir(s,3)),d.addAttribute("color",new Ir(c,3));var f=new ka({vertexColors:2});Na.call(this,d,f)}function cl(t,e,i,r,n,o){t=t||10,e=e||16,i=i||8,r=r||64,n=new ki(void 0!==n?n:4473924),o=new ki(void 0!==o?o:8947848);var a,s,c,u,h,l,p,d=[],f=[];for(u=0;u<=e;u++)c=u/e*(2*Math.PI),a=Math.sin(c)*t,s=Math.cos(c)*t,d.push(0,0,0),d.push(a,0,s),p=1&u?n:o,f.push(p.r,p.g,p.b),f.push(p.r,p.g,p.b);for(u=0;u<=i;u++)for(p=1&u?n:o,l=t-t/i*u,h=0;h<r;h++)c=h/r*(2*Math.PI),a=Math.sin(c)*l,s=Math.cos(c)*l,d.push(a,0,s),f.push(p.r,p.g,p.b),c=(h+1)/r*(2*Math.PI),a=Math.sin(c)*l,s=Math.cos(c)*l,d.push(a,0,s),f.push(p.r,p.g,p.b);var m=new $r;m.addAttribute("position",new Ir(d,3)),m.addAttribute("color",new Ir(f,3));var g=new ka({vertexColors:2});Na.call(this,m,g)}function ul(t,e,i,r){this.object=t,this.size=void 0!==e?e:1;var n=void 0!==i?i:16776960,o=void 0!==r?r:1,a=0,s=this.object.geometry;s&&s.isGeometry?a=s.faces.length:console.warn("THREE.FaceNormalsHelper: only THREE.Geometry is supported. Use THREE.VertexNormalsHelper, instead.");var c=new $r,u=new Ir(2*a*3,3);c.addAttribute("position",u),Na.call(this,c,new ka({color:n,linewidth:o})),this.matrixAutoUpdate=!1,this.update()}function hl(t,e,i){ur.call(this),this.light=t,this.light.updateMatrixWorld(),this.matrix=t.matrixWorld,this.matrixAutoUpdate=!1,this.color=i,void 0===e&&(e=1);var r=new $r;r.addAttribute("position",new Ir([-e,e,0,e,e,0,e,-e,0,-e,-e,0,-e,e,0],3));var n=new ka({fog:!1});this.lightPlane=new Ba(r,n),this.add(this.lightPlane),(r=new $r).addAttribute("position",new Ir([0,0,0,0,0,1],3)),this.targetLine=new Ba(r,n),this.add(this.targetLine),this.update()}function ll(t){var e=new $r,i=new ka({color:16777215,vertexColors:1}),r=[],n=[],o={},a=new ki(16755200),s=new ki(16711680),c=new ki(43775),u=new ki(16777215),h=new ki(3355443);function l(t,e,i){p(t,i),p(e,i)}function p(t,e){r.push(0,0,0),n.push(e.r,e.g,e.b),void 0===o[t]&&(o[t]=[]),o[t].push(r.length/3-1)}l("n1","n2",a),l("n2","n4",a),l("n4","n3",a),l("n3","n1",a),l("f1","f2",a),l("f2","f4",a),l("f4","f3",a),l("f3","f1",a),l("n1","f1",a),l("n2","f2",a),l("n3","f3",a),l("n4","f4",a),l("p","n1",s),l("p","n2",s),l("p","n3",s),l("p","n4",s),l("u1","u2",c),l("u2","u3",c),l("u3","u1",c),l("c","t",u),l("p","c",h),l("cn1","cn2",h),l("cn3","cn4",h),l("cf1","cf2",h),l("cf3","cf4",h),e.addAttribute("position",new Ir(r,3)),e.addAttribute("color",new Ir(n,3)),Na.call(this,e,i),this.camera=t,this.camera.updateProjectionMatrix&&this.camera.updateProjectionMatrix(),this.matrix=t.matrixWorld,this.matrixAutoUpdate=!1,this.pointMap=o,this.update()}function pl(t,e){this.object=t,void 0===e&&(e=16776960);var i=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]),r=new Float32Array(24),n=new $r;n.setIndex(new wr(i,1)),n.addAttribute("position",new wr(r,3)),Na.call(this,n,new ka({color:e})),this.matrixAutoUpdate=!1,this.update()}function dl(t,e){this.type="Box3Helper",this.box=t;var i=void 0!==e?e:16776960,r=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]),n=new $r;n.setIndex(new wr(r,1)),n.addAttribute("position",new Ir([1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1],3)),Na.call(this,n,new ka({color:i})),this.geometry.computeBoundingSphere()}function fl(t,e,i){this.type="PlaneHelper",this.plane=t,this.size=void 0===e?1:e;var r=void 0!==i?i:16776960,n=new $r;n.addAttribute("position",new Ir([1,-1,1,-1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,1,0,0,1,0,0,0],3)),n.computeBoundingSphere(),Ba.call(this,n,new ka({color:r}));var o=new $r;o.addAttribute("position",new Ir([1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,1,1,-1,1],3)),o.computeBoundingSphere(),this.add(new Pn(o,new Sn({color:r,opacity:.2,transparent:!0,depthWrite:!1})))}function ml(t,e,i,r,n,o){ur.call(this),void 0===r&&(r=16776960),void 0===i&&(i=1),void 0===n&&(n=.2*i),void 0===o&&(o=.2*n),void 0===Bh&&((Bh=new $r).addAttribute("position",new Ir([0,0,0,0,1,0],3)),(Nh=new Ks(0,.5,1,5,1)).translate(0,-.5,0)),this.position.copy(e),this.line=new Ba(Bh,new ka({color:r})),this.line.matrixAutoUpdate=!1,this.add(this.line),this.cone=new Pn(Nh,new Sn({color:r})),this.cone.matrixAutoUpdate=!1,this.add(this.cone),this.setDirection(t),this.setLength(i,n,o)}function gl(t){var e=[0,0,0,t=t||1,0,0,0,0,0,0,t,0,0,0,0,0,0,t],i=new $r;i.addAttribute("position",new Ir(e,3)),i.addAttribute("color",new Ir([1,0,0,1,.6,0,0,1,0,.6,1,0,0,0,1,0,.6,1],3));var r=new ka({vertexColors:2});Na.call(this,i,r)}function vl(t){console.warn("THREE.Spline has been removed. Use THREE.CatmullRomCurve3 instead."),Cc.call(this,t),this.type="catmullrom"}function yl(t){if("undefined"!=typeof window){var e=new RegExp(t+"=([^&#=]*)").exec(window.location.search);return e?decodeURIComponent(e[1]):void 0}}function bl(t,e){return void 0!==t?t:e}function xl(t,e){var i=Object.assign({},t);for(var r in e){void 0===t[r]&&(i[r]=e[r])}return i}function _l(t,e){for(var i in e){var r=e[i];void 0!==r&&(t[i]=r)}return t}function wl(){var t=window.location.protocol;return null===t.match(/http(s)?:/gi)?"http:":t}function Sl(){if("undefined"==typeof window)return!1;var t=window.navigator.userAgent;return/Opera|OPR/.test(t)?"Opera":/Chrome/i.test(t)?"Chrome":/Firefox/i.test(t)?"Firefox":/Mobile(\/.*)? Safari/i.test(t)?"Mobile Safari":/MSIE/i.test(t)?"Internet Explorer":!!/Safari/i.test(t)&&"Safari"}function Al(t){window.open(t,"_blank")||(window.location.href=t)}function Ml(t,e){if(void 0===e&&(e="download"),t){var i="Safari"===Sl(),r=/CriOS\/[\d]+/.test(window.navigator.userAgent),n=document.createElement("a");if("undefined"!=typeof navigator&&navigator.msSaveOrOpenBlob)navigator.msSaveOrOpenBlob(t,e);else if((i||r)&&FileReader)if(t instanceof Blob){var o=new FileReader;o.onloadend=function(){s(o.result)},o.readAsDataURL(t)}else s(t);else{var a=!1;t instanceof Blob&&(t=URL.createObjectURL(t),a=!0),"download"in n?(n.style.display="hidden",document.body.appendChild(n),n.href=t,n.download=e,n.target="_blank",n.click(),document.body.removeChild(n)):Al(t),a&&window.URL.revokeObjectURL(t)}}function s(t){Al(r?t:t.replace(/^data:[^;]*;/,"data:attachment/file;"))}}function El(t,e){return t<e?-1:e<t?1:0}function Pl(t,e,i){void 0===i&&(i=El);for(var r=0,n=t.length-1;r<=n;){var o=r+n>>1,a=i(e,t[o]);if(0<a)r=o+1;else{if(!(a<0))return o;n=o-1}}return-r-1}function Tl(t,e,i){var r=function(t,e){var i=t.length-1;if(t[i]<e)return-1;for(var r=0;r<=i;){var n=r+i>>1;t[n]>=e?i=n-1:r=n+1}return i+1}(t,e),n=function(t,e){if(t[0]>e)return-1;for(var i=0,r=t.length-1;i<=r;){var n=i+r>>1;t[n]>e?r=n-1:i=n+1}return i-1}(t,i);return-1===r||-1===n||n<r?0:n-r+1}function Cl(t){return t.sort().filter(function(t,e,i){return 0===e||t!==i[e-1]})}function Il(t){if(28672<t.length){for(var e=[],i=0;i<t.length;i+=28672)e.push(String.fromCharCode.apply(null,t.subarray(i,i+28672)));return e.join("")}return String.fromCharCode.apply(null,t)}function Ol(t,e){switch(t){case"int8":return new Int8Array(e);case"int16":return new Int16Array(e);case"int32":return new Int32Array(e);case"uint8":return new Uint8Array(e);case"uint16":return new Uint16Array(e);case"uint32":return new Uint32Array(e);case"float32":return new Float32Array(e);default:throw new Error("arrayType unknown: "+t)}}function Ll(t,e){return new(65535<e?Uint32Array:Uint16Array)(t)}function Rl(t){return t.buffer&&t.buffer instanceof ArrayBuffer?t.buffer:t}function Dl(t,e){return void 0===t?t=new e:Array.isArray(t)&&(t=(new e).fromArray(t)),t}function kl(t){return Dl(t,ri)}function Bl(t){return Dl(t,ei)}function Nl(t){return Dl(t,ii)}function Fl(t){return e=t,i=Float32Array,e instanceof i?e:new i(e);var e,i}function zl(t){return bl(t,"").toString().toLowerCase()}Object.assign(Gh.prototype,{getValue:function(t,e){this.bind();var i=this._targetGroup.nCachedObjects_,r=this._bindings[i];void 0!==r&&r.getValue(t,e)},setValue:function(t,e){for(var i=this._bindings,r=this._targetGroup.nCachedObjects_,n=i.length;r!==n;++r)i[r].setValue(t,e)},bind:function(){for(var t=this._bindings,e=this._targetGroup.nCachedObjects_,i=t.length;e!==i;++e)t[e].bind()},unbind:function(){for(var t=this._bindings,e=this._targetGroup.nCachedObjects_,i=t.length;e!==i;++e)t[e].unbind()}}),Object.assign(Vh,{Composite:Gh,create:function(t,e,i){return t&&t.isAnimationObjectGroup?new Vh.Composite(t,e,i):new Vh(t,e,i)},sanitizeNodeName:(dh=new RegExp("["+jh+"]","g"),function(t){return t.replace(/\s/g,"_").replace(dh,"")}),parseTrackName:(oh="[^"+jh+"]",ah="[^"+jh.replace("\\.","")+"]",sh=/((?:WC+[\/:])*)/.source.replace("WC",oh),ch=/(WCOD+)?/.source.replace("WCOD",ah),uh=/(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace("WC",oh),hh=/\.(WC+)(?:\[(.+)\])?/.source.replace("WC",oh),lh=new RegExp("^"+sh+ch+uh+hh+"$"),ph=["material","materials","bones"],function(t){var e=lh.exec(t);if(!e)throw new Error("PropertyBinding: Cannot parse trackName: "+t);var i={nodeName:e[2],objectName:e[3],objectIndex:e[4],propertyName:e[5],propertyIndex:e[6]},r=i.nodeName&&i.nodeName.lastIndexOf(".");if(void 0!==r&&-1!==r){var n=i.nodeName.substring(r+1);-1!==ph.indexOf(n)&&(i.nodeName=i.nodeName.substring(0,r),i.objectName=n)}if(null===i.propertyName||0===i.propertyName.length)throw new Error("PropertyBinding: can not parse propertyName from trackName: "+t);return i}),findNode:function(t,n){if(!n||""===n||"root"===n||"."===n||-1===n||n===t.name||n===t.uuid)return t;if(t.skeleton){var e=t.skeleton.getBoneByName(n);if(void 0!==e)return e}if(t.children){var o=function(t){for(var e=0;e<t.length;e++){var i=t[e];if(i.name===n||i.uuid===n)return i;var r=o(i.children);if(r)return r}return null},i=o(t.children);if(i)return i}return null}}),Object.assign(Vh.prototype,{_getValue_unavailable:function(){},_setValue_unavailable:function(){},BindingType:{Direct:0,EntireArray:1,ArrayElement:2,HasFromToArray:3},Versioning:{None:0,NeedsUpdate:1,MatrixWorldNeedsUpdate:2},GetterByBindingType:[function(t,e){t[e]=this.node[this.propertyName]},function(t,e){for(var i=this.resolvedProperty,r=0,n=i.length;r!==n;++r)t[e++]=i[r]},function(t,e){t[e]=this.resolvedProperty[this.propertyIndex]},function(t,e){this.resolvedProperty.toArray(t,e)}],SetterByBindingTypeAndVersioning:[[function(t,e){this.targetObject[this.propertyName]=t[e]},function(t,e){this.targetObject[this.propertyName]=t[e],this.targetObject.needsUpdate=!0},function(t,e){this.targetObject[this.propertyName]=t[e],this.targetObject.matrixWorldNeedsUpdate=!0}],[function(t,e){for(var i=this.resolvedProperty,r=0,n=i.length;r!==n;++r)i[r]=t[e++]},function(t,e){for(var i=this.resolvedProperty,r=0,n=i.length;r!==n;++r)i[r]=t[e++];this.targetObject.needsUpdate=!0},function(t,e){for(var i=this.resolvedProperty,r=0,n=i.length;r!==n;++r)i[r]=t[e++];this.targetObject.matrixWorldNeedsUpdate=!0}],[function(t,e){this.resolvedProperty[this.propertyIndex]=t[e]},function(t,e){this.resolvedProperty[this.propertyIndex]=t[e],this.targetObject.needsUpdate=!0},function(t,e){this.resolvedProperty[this.propertyIndex]=t[e],this.targetObject.matrixWorldNeedsUpdate=!0}],[function(t,e){this.resolvedProperty.fromArray(t,e)},function(t,e){this.resolvedProperty.fromArray(t,e),this.targetObject.needsUpdate=!0},function(t,e){this.resolvedProperty.fromArray(t,e),this.targetObject.matrixWorldNeedsUpdate=!0}]],getValue:function(t,e){this.bind(),this.getValue(t,e)},setValue:function(t,e){this.bind(),this.setValue(t,e)},bind:function(){var t=this.node,e=this.parsedPath,i=e.objectName,r=e.propertyName,n=e.propertyIndex;if(t||(t=Vh.findNode(this.rootNode,e.nodeName)||this.rootNode,this.node=t),this.getValue=this._getValue_unavailable,this.setValue=this._setValue_unavailable,t){if(i){var o=e.objectIndex;switch(i){case"materials":if(!t.material)return void console.error("THREE.PropertyBinding: Can not bind to material as node does not have a material.",this);if(!t.material.materials)return void console.error("THREE.PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.",this);t=t.material.materials;break;case"bones":if(!t.skeleton)return void console.error("THREE.PropertyBinding: Can not bind to bones as node does not have a skeleton.",this);t=t.skeleton.bones;for(var a=0;a<t.length;a++)if(t[a].name===o){o=a;break}break;default:if(void 0===t[i])return void console.error("THREE.PropertyBinding: Can not bind to objectName of node undefined.",this);t=t[i]}if(void 0!==o){if(void 0===t[o])return void console.error("THREE.PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.",this,t);t=t[o]}}var s=t[r];if(void 0!==s){var c=this.Versioning.None;void 0!==t.needsUpdate?(c=this.Versioning.NeedsUpdate,this.targetObject=t):void 0!==t.matrixWorldNeedsUpdate&&(c=this.Versioning.MatrixWorldNeedsUpdate,this.targetObject=t);var u=this.BindingType.Direct;if(void 0!==n){if("morphTargetInfluences"===r){if(!t.geometry)return void console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.",this);if(t.geometry.isBufferGeometry){if(!t.geometry.morphAttributes)return void console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.",this);for(a=0;a<this.node.geometry.morphAttributes.position.length;a++)if(t.geometry.morphAttributes.position[a].name===n){n=a;break}}else{if(!t.geometry.morphTargets)return void console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphTargets.",this);for(a=0;a<this.node.geometry.morphTargets.length;a++)if(t.geometry.morphTargets[a].name===n){n=a;break}}}u=this.BindingType.ArrayElement,this.resolvedProperty=s,this.propertyIndex=n}else void 0!==s.fromArray&&void 0!==s.toArray?(u=this.BindingType.HasFromToArray,this.resolvedProperty=s):Array.isArray(s)?(u=this.BindingType.EntireArray,this.resolvedProperty=s):this.propertyName=r;this.getValue=this.GetterByBindingType[u],this.setValue=this.SetterByBindingTypeAndVersioning[u][c]}else{var h=e.nodeName;console.error("THREE.PropertyBinding: Trying to update property for track: "+h+"."+r+" but it wasn't found.",t)}}else console.error("THREE.PropertyBinding: Trying to update node for track: "+this.path+" but it wasn't found.")},unbind:function(){this.node=null,this.getValue=this._getValue_unbound,this.setValue=this._setValue_unbound}}),Object.assign(Vh.prototype,{_getValue_unbound:Vh.prototype.getValue,_setValue_unbound:Vh.prototype.setValue}),Object.assign(function(){var t=arguments;this.uuid=Qe.generateUUID(),this._objects=Array.prototype.slice.call(arguments),this.nCachedObjects_=0;var e={};this._indicesByUUID=e;for(var i=0,r=arguments.length;i!==r;++i)e[t[i].uuid]=i;this._paths=[],this._parsedPaths=[],this._bindings=[],this._bindingsIndicesByPath={};var n=this;this.stats={objects:{get total(){return n._objects.length},get inUse(){return this.total-n.nCachedObjects_}},get bindingsPerObject(){return n._bindings.length}}}.prototype,{isAnimationObjectGroup:!0,add:function(){for(var t=arguments,e=this._objects,i=e.length,r=this.nCachedObjects_,n=this._indicesByUUID,o=this._paths,a=this._parsedPaths,s=this._bindings,c=s.length,u=void 0,h=0,l=arguments.length;h!==l;++h){var p=t[h],d=p.uuid,f=n[d];if(void 0===f){f=i++,n[d]=f,e.push(p);for(var m=0,g=c;m!==g;++m)s[m].push(new Vh(p,o[m],a[m]))}else if(f<r){u=e[f];var v=--r,y=e[v];e[n[y.uuid]=f]=y,e[n[d]=v]=p;for(m=0,g=c;m!==g;++m){var b=s[m],x=b[v],_=b[f];b[f]=x,void 0===_&&(_=new Vh(p,o[m],a[m])),b[v]=_}}else e[f]!==u&&console.error("THREE.AnimationObjectGroup: Different objects with the same UUID detected. Clean the caches or recreate your infrastructure when reloading scenes.")}this.nCachedObjects_=r},remove:function(){for(var t=arguments,e=this._objects,i=this.nCachedObjects_,r=this._indicesByUUID,n=this._bindings,o=n.length,a=0,s=arguments.length;a!==s;++a){var c=t[a],u=c.uuid,h=r[u];if(void 0!==h&&i<=h){var l=i++,p=e[l];e[r[p.uuid]=h]=p,e[r[u]=l]=c;for(var d=0,f=o;d!==f;++d){var m=n[d],g=m[l],v=m[h];m[h]=g,m[l]=v}}}this.nCachedObjects_=i},uncache:function(){for(var t=arguments,e=this._objects,i=e.length,r=this.nCachedObjects_,n=this._indicesByUUID,o=this._bindings,a=o.length,s=0,c=arguments.length;s!==c;++s){var u=t[s].uuid,h=n[u];if(void 0!==h)if(delete n[u],h<r){var l=--r,p=e[l],d=e[y=--i];e[n[p.uuid]=h]=p,e[n[d.uuid]=l]=d,e.pop();for(var f=0,m=a;f!==m;++f){var g=(b=o[f])[l],v=b[y];b[h]=g,b[l]=v,b.pop()}}else{var y;e[n[(d=e[y=--i]).uuid]=h]=d,e.pop();for(f=0,m=a;f!==m;++f){var b;(b=o[f])[h]=b[y],b.pop()}}}this.nCachedObjects_=r},subscribe_:function(t,e){var i=this._bindingsIndicesByPath,r=i[t],n=this._bindings;if(void 0!==r)return n[r];var o=this._paths,a=this._parsedPaths,s=this._objects,c=s.length,u=this.nCachedObjects_,h=new Array(c);r=n.length,i[t]=r,o.push(t),a.push(e),n.push(h);for(var l=u,p=s.length;l!==p;++l){var d=s[l];h[l]=new Vh(d,t,e)}return h},unsubscribe_:function(t){var e=this._bindingsIndicesByPath,i=e[t];if(void 0!==i){var r=this._paths,n=this._parsedPaths,o=this._bindings,a=o.length-1,s=o[a];o[e[t[a]]=i]=s,o.pop(),n[i]=n[a],n.pop(),r[i]=r[a],r.pop()}}}),Object.assign(Hh.prototype,{play:function(){return this._mixer._activateAction(this),this},stop:function(){return this._mixer._deactivateAction(this),this.reset()},reset:function(){return this.paused=!1,this.enabled=!0,this.time=0,this._loopCount=-1,this._startTime=null,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(t){return this._startTime=t,this},setLoop:function(t,e){return this.loop=t,this.repetitions=e,this},setEffectiveWeight:function(t){return this.weight=t,this._effectiveWeight=this.enabled?t:0,this.stopFading()},getEffectiveWeight:function(){return this._effectiveWeight},fadeIn:function(t){return this._scheduleFading(t,0,1)},fadeOut:function(t){return this._scheduleFading(t,1,0)},crossFadeFrom:function(t,e,i){if(t.fadeOut(e),this.fadeIn(e),i){var r=this._clip.duration,n=t._clip.duration,o=n/r,a=r/n;t.warp(1,o,e),this.warp(a,1,e)}return this},crossFadeTo:function(t,e,i){return t.crossFadeFrom(this,e,i)},stopFading:function(){var t=this._weightInterpolant;return null!==t&&(this._weightInterpolant=null,this._mixer._takeBackControlInterpolant(t)),this},setEffectiveTimeScale:function(t){return this.timeScale=t,this._effectiveTimeScale=this.paused?0:t,this.stopWarping()},getEffectiveTimeScale:function(){return this._effectiveTimeScale},setDuration:function(t){return this.timeScale=this._clip.duration/t,this.stopWarping()},syncWith:function(t){return this.time=t.time,this.timeScale=t.timeScale,this.stopWarping()},halt:function(t){return this.warp(this._effectiveTimeScale,0,t)},warp:function(t,e,i){var r=this._mixer,n=r.time,o=this._timeScaleInterpolant,a=this.timeScale;null===o&&(o=r._lendControlInterpolant(),this._timeScaleInterpolant=o);var s=o.parameterPositions,c=o.sampleValues;return s[0]=n,s[1]=n+i,c[0]=t/a,c[1]=e/a,this},stopWarping:function(){var t=this._timeScaleInterpolant;return null!==t&&(this._timeScaleInterpolant=null,this._mixer._takeBackControlInterpolant(t)),this},getMixer:function(){return this._mixer},getClip:function(){return this._clip},getRoot:function(){return this._localRoot||this._mixer._root},_update:function(t,e,i,r){if(this.enabled){var n=this._startTime;if(null!==n){var o=(t-n)*i;if(o<0||0===i)return;this._startTime=null,e=i*o}e*=this._updateTimeScale(t);var a=this._updateTime(e),s=this._updateWeight(t);if(0<s)for(var c=this._interpolants,u=this._propertyBindings,h=0,l=c.length;h!==l;++h)c[h].evaluate(a),u[h].accumulate(r,s)}else this._updateWeight(t)},_updateWeight:function(t){var e=0;if(this.enabled){e=this.weight;var i=this._weightInterpolant;if(null!==i){var r=i.evaluate(t)[0];e*=r,t>i.parameterPositions[1]&&(this.stopFading(),0===r&&(this.enabled=!1))}}return this._effectiveWeight=e},_updateTimeScale:function(t){var e=0;if(!this.paused){e=this.timeScale;var i=this._timeScaleInterpolant;if(null!==i)e*=i.evaluate(t)[0],t>i.parameterPositions[1]&&(this.stopWarping(),0===e?this.paused=!0:this.timeScale=e)}return this._effectiveTimeScale=e},_updateTime:function(t){var e=this.time+t,i=this._clip.duration,r=this.loop,n=this._loopCount,o=2202===r;if(0===t)return-1===n?e:o&&1==(1&n)?i-e:e;if(2200===r){-1===n&&(this._loopCount=0,this._setEndings(!0,!0,!1));t:{if(i<=e)e=i;else{if(!(e<0))break t;e=0}this.clampWhenFinished?this.paused=!0:this.enabled=!1,this._mixer.dispatchEvent({type:"finished",action:this,direction:t<0?-1:1})}}else{if(-1===n&&(0<=t?(n=0,this._setEndings(!0,0===this.repetitions,o)):this._setEndings(0===this.repetitions,!0,o)),i<=e||e<0){var a=Math.floor(e/i);e-=i*a,n+=Math.abs(a);var s=this.repetitions-n;if(s<=0)this.clampWhenFinished?this.paused=!0:this.enabled=!1,e=0<t?i:0,this._mixer.dispatchEvent({type:"finished",action:this,direction:0<t?1:-1});else{if(1===s){var c=t<0;this._setEndings(c,!c,o)}else this._setEndings(!1,!1,o);this._loopCount=n,this._mixer.dispatchEvent({type:"loop",action:this,loopDelta:a})}}if(o&&1==(1&n))return i-(this.time=e)}return this.time=e},_setEndings:function(t,e,i){var r=this._interpolantSettings;i?(r.endingStart=Ue,r.endingEnd=Ue):(r.endingStart=t?this.zeroSlopeAtStart?Ue:ze:2402,r.endingEnd=e?this.zeroSlopeAtEnd?Ue:ze:2402)},_scheduleFading:function(t,e,i){var r=this._mixer,n=r.time,o=this._weightInterpolant;null===o&&(o=r._lendControlInterpolant(),this._weightInterpolant=o);var a=o.parameterPositions,s=o.sampleValues;return a[0]=n,s[0]=e,a[1]=n+t,s[1]=i,this}}),$h.prototype=Object.assign(Object.create(v.prototype),{constructor:$h,_bindAction:function(t,e){var i=t._localRoot||this._root,r=t._clip.tracks,n=r.length,o=t._propertyBindings,a=t._interpolants,s=i.uuid,c=this._bindingsByRootAndName,u=c[s];void 0===u&&(u={},c[s]=u);for(var h=0;h!==n;++h){var l=r[h],p=l.name,d=u[p];if(void 0!==d)o[h]=d;else{if(void 0!==(d=o[h])){null===d._cacheIndex&&(++d.referenceCount,this._addInactiveBinding(d,s,p));continue}var f=e&&e._propertyBindings[h].binding.parsedPath;++(d=new nh(Vh.create(i,p,f),l.ValueTypeName,l.getValueSize())).referenceCount,this._addInactiveBinding(d,s,p),o[h]=d}a[h].resultBuffer=d.buffer}},_activateAction:function(t){if(!this._isActiveAction(t)){if(null===t._cacheIndex){var e=(t._localRoot||this._root).uuid,i=t._clip.uuid,r=this._actionsByClip[i];this._bindAction(t,r&&r.knownActions[0]),this._addInactiveAction(t,i,e)}for(var n=t._propertyBindings,o=0,a=n.length;o!==a;++o){var s=n[o];0==s.useCount++&&(this._lendBinding(s),s.saveOriginalState())}this._lendAction(t)}},_deactivateAction:function(t){if(this._isActiveAction(t)){for(var e=t._propertyBindings,i=0,r=e.length;i!==r;++i){var n=e[i];0==--n.useCount&&(n.restoreOriginalState(),this._takeBackBinding(n))}this._takeBackAction(t)}},_initMemoryManager:function(){this._actions=[],this._nActiveActions=0,this._actionsByClip={},this._bindings=[],this._nActiveBindings=0,this._bindingsByRootAndName={},this._controlInterpolants=[],this._nActiveControlInterpolants=0;var t=this;this.stats={actions:{get total(){return t._actions.length},get inUse(){return t._nActiveActions}},bindings:{get total(){return t._bindings.length},get inUse(){return t._nActiveBindings}},controlInterpolants:{get total(){return t._controlInterpolants.length},get inUse(){return t._nActiveControlInterpolants}}}},_isActiveAction:function(t){var e=t._cacheIndex;return null!==e&&e<this._nActiveActions},_addInactiveAction:function(t,e,i){var r=this._actions,n=this._actionsByClip,o=n[e];if(void 0===o)o={knownActions:[t],actionByRoot:{}},t._byClipCacheIndex=0,n[e]=o;else{var a=o.knownActions;t._byClipCacheIndex=a.length,a.push(t)}t._cacheIndex=r.length,r.push(t),o.actionByRoot[i]=t},_removeInactiveAction:function(t){var e=this._actions,i=e[e.length-1],r=t._cacheIndex;e[i._cacheIndex=r]=i,e.pop(),t._cacheIndex=null;var n=t._clip.uuid,o=this._actionsByClip,a=o[n],s=a.knownActions,c=s[s.length-1],u=t._byClipCacheIndex;s[c._byClipCacheIndex=u]=c,s.pop(),t._byClipCacheIndex=null,delete a.actionByRoot[(t._localRoot||this._root).uuid],0===s.length&&delete o[n],this._removeInactiveBindingsForAction(t)},_removeInactiveBindingsForAction:function(t){for(var e=t._propertyBindings,i=0,r=e.length;i!==r;++i){var n=e[i];0==--n.referenceCount&&this._removeInactiveBinding(n)}},_lendAction:function(t){var e=this._actions,i=t._cacheIndex,r=this._nActiveActions++,n=e[r];e[t._cacheIndex=r]=t,e[n._cacheIndex=i]=n},_takeBackAction:function(t){var e=this._actions,i=t._cacheIndex,r=--this._nActiveActions,n=e[r];e[t._cacheIndex=r]=t,e[n._cacheIndex=i]=n},_addInactiveBinding:function(t,e,i){var r=this._bindingsByRootAndName,n=r[e],o=this._bindings;void 0===n&&(n={},r[e]=n),(n[i]=t)._cacheIndex=o.length,o.push(t)},_removeInactiveBinding:function(t){var e=this._bindings,i=t.binding,r=i.rootNode.uuid,n=i.path,o=this._bindingsByRootAndName,a=o[r],s=e[e.length-1],c=t._cacheIndex;e[s._cacheIndex=c]=s,e.pop(),delete a[n];t:{for(var u in a)break t;delete o[r]}},_lendBinding:function(t){var e=this._bindings,i=t._cacheIndex,r=this._nActiveBindings++,n=e[r];e[t._cacheIndex=r]=t,e[n._cacheIndex=i]=n},_takeBackBinding:function(t){var e=this._bindings,i=t._cacheIndex,r=--this._nActiveBindings,n=e[r];e[t._cacheIndex=r]=t,e[n._cacheIndex=i]=n},_lendControlInterpolant:function(){var t=this._controlInterpolants,e=this._nActiveControlInterpolants++,i=t[e];return void 0===i&&(t[(i=new ru(new Float32Array(2),new Float32Array(2),1,this._controlInterpolantsResultBuffer)).__cacheIndex=e]=i),i},_takeBackControlInterpolant:function(t){var e=this._controlInterpolants,i=t.__cacheIndex,r=--this._nActiveControlInterpolants,n=e[r];e[t.__cacheIndex=r]=t,e[n.__cacheIndex=i]=n},_controlInterpolantsResultBuffer:new Float32Array(1),clipAction:function(t,e){var i=e||this._root,r=i.uuid,n="string"==typeof t?du.findByName(i,t):t,o=null!==n?n.uuid:t,a=this._actionsByClip[o],s=null;if(void 0!==a){var c=a.actionByRoot[r];if(void 0!==c)return c;s=a.knownActions[0],null===n&&(n=s._clip)}if(null===n)return null;var u=new Hh(this,n,e);return this._bindAction(u,s),this._addInactiveAction(u,o,r),u},existingAction:function(t,e){var i=e||this._root,r=i.uuid,n="string"==typeof t?du.findByName(i,t):t,o=n?n.uuid:t,a=this._actionsByClip[o];return void 0!==a&&a.actionByRoot[r]||null},stopAllAction:function(){var t=this._actions,e=this._nActiveActions,i=this._bindings,r=this._nActiveBindings;this._nActiveActions=0;for(var n=this._nActiveBindings=0;n!==e;++n)t[n].reset();for(n=0;n!==r;++n)i[n].useCount=0;return this},update:function(t){t*=this.timeScale;for(var e=this._actions,i=this._nActiveActions,r=this.time+=t,n=Math.sign(t),o=this._accuIndex^=1,a=0;a!==i;++a){e[a]._update(r,t,n,o)}var s=this._bindings,c=this._nActiveBindings;for(a=0;a!==c;++a)s[a].apply(o);return this},getRoot:function(){return this._root},uncacheClip:function(t){var e=this._actions,i=t.uuid,r=this._actionsByClip,n=r[i];if(void 0!==n){for(var o=n.knownActions,a=0,s=o.length;a!==s;++a){var c=o[a];this._deactivateAction(c);var u=c._cacheIndex,h=e[e.length-1];c._cacheIndex=null,c._byClipCacheIndex=null,e[h._cacheIndex=u]=h,e.pop(),this._removeInactiveBindingsForAction(c)}delete r[i]}},uncacheRoot:function(t){var e=t.uuid,i=this._actionsByClip;for(var r in i){var n=i[r].actionByRoot[e];void 0!==n&&(this._deactivateAction(n),this._removeInactiveAction(n))}var o=this._bindingsByRootAndName[e];if(void 0!==o)for(var a in o){var s=o[a];s.restoreOriginalState(),this._removeInactiveBinding(s)}},uncacheAction:function(t,e){var i=this.existingAction(t,e);null!==i&&(this._deactivateAction(i),this._removeInactiveAction(i))}}),Wh.prototype.clone=function(){return new Wh(void 0===this.value.clone?this.value:this.value.clone())},Xh.prototype=Object.assign(Object.create($r.prototype),{constructor:Xh,isInstancedBufferGeometry:!0,copy:function(t){return $r.prototype.copy.call(this,t),this.maxInstancedCount=t.maxInstancedCount,this},clone:function(){return(new this.constructor).copy(this)}}),qh.prototype=Object.assign(Object.create(Pa.prototype),{constructor:qh,isInstancedInterleavedBuffer:!0,copy:function(t){return Pa.prototype.copy.call(this,t),this.meshPerAttribute=t.meshPerAttribute,this}}),Yh.prototype=Object.assign(Object.create(wr.prototype),{constructor:Yh,isInstancedBufferAttribute:!0,copy:function(t){return wr.prototype.copy.call(this,t),this.meshPerAttribute=t.meshPerAttribute,this}}),Object.assign(function(t,e,i,r){this.ray=new Mn(t,e),this.near=i||0,this.far=r||1/0,this.params={Mesh:{},Line:{},LOD:{},Points:{threshold:1},Sprite:{}},Object.defineProperties(this.params,{PointCloud:{get:function(){return console.warn("THREE.Raycaster: params.PointCloud has been renamed to params.Points."),this.Points}}})}.prototype,{linePrecision:1,set:function(t,e){this.ray.set(t,e)},setFromCamera:function(t,e){e&&e.isPerspectiveCamera?(this.ray.origin.setFromMatrixPosition(e.matrixWorld),this.ray.direction.set(t.x,t.y,.5).unproject(e).sub(this.ray.origin).normalize()):e&&e.isOrthographicCamera?(this.ray.origin.set(t.x,t.y,(e.near+e.far)/(e.near-e.far)).unproject(e),this.ray.direction.set(0,0,-1).transformDirection(e.matrixWorld)):console.error("THREE.Raycaster: Unsupported camera type.")},intersectObject:function(t,e,i){var r=i||[];return Kh(t,this,r,e),r.sort(Zh),r},intersectObjects:function(t,e,i){var r=i||[];if(!1===Array.isArray(t))return console.warn("THREE.Raycaster.intersectObjects: objects is not an Array."),r;for(var n=0,o=t.length;n<o;n++)Kh(t[n],this,r,e);return r.sort(Zh),r}}),Object.assign(function(t){this.autoStart=void 0===t||t,this.startTime=0,this.oldTime=0,this.elapsedTime=0,this.running=!1}.prototype,{start:function(){this.startTime=("undefined"==typeof performance?Date:performance).now(),this.oldTime=this.startTime,this.elapsedTime=0,this.running=!0},stop:function(){this.getElapsedTime(),this.running=!1,this.autoStart=!1},getElapsedTime:function(){return this.getDelta(),this.elapsedTime},getDelta:function(){var t=0;if(this.autoStart&&!this.running)return this.start(),0;if(this.running){var e=("undefined"==typeof performance?Date:performance).now();t=(e-this.oldTime)/1e3,this.oldTime=e,this.elapsedTime+=t}return t}}),Object.assign(function(t,e,i){return this.radius=void 0!==t?t:1,this.phi=void 0!==e?e:0,this.theta=void 0!==i?i:0,this}.prototype,{set:function(t,e,i){return this.radius=t,this.phi=e,this.theta=i,this},clone:function(){return(new this.constructor).copy(this)},copy:function(t){return this.radius=t.radius,this.phi=t.phi,this.theta=t.theta,this},makeSafe:function(){return this.phi=Math.max(1e-6,Math.min(Math.PI-1e-6,this.phi)),this},setFromVector3:function(t){return this.radius=t.length(),0===this.radius?(this.theta=0,this.phi=0):(this.theta=Math.atan2(t.x,t.z),this.phi=Math.acos(Qe.clamp(t.y/this.radius,-1,1))),this}}),Object.assign(function(t,e,i){return this.radius=void 0!==t?t:1,this.theta=void 0!==e?e:0,this.y=void 0!==i?i:0,this}.prototype,{set:function(t,e,i){return this.radius=t,this.theta=e,this.y=i,this},clone:function(){return(new this.constructor).copy(this)},copy:function(t){return this.radius=t.radius,this.theta=t.theta,this.y=t.y,this},setFromVector3:function(t){return this.radius=Math.sqrt(t.x*t.x+t.z*t.z),this.theta=Math.atan2(t.x,t.z),this.y=t.y,this}}),Object.assign(Jh.prototype,{set:function(t,e){return this.min.copy(t),this.max.copy(e),this},setFromPoints:function(t){this.makeEmpty();for(var e=0,i=t.length;e<i;e++)this.expandByPoint(t[e]);return this},setFromCenterAndSize:(mh=new ti,function(t,e){var i=mh.copy(e).multiplyScalar(.5);return this.min.copy(t).sub(i),this.max.copy(t).add(i),this}),clone:function(){return(new this.constructor).copy(this)},copy:function(t){return this.min.copy(t.min),this.max.copy(t.max),this},makeEmpty:function(){return this.min.x=this.min.y=1/0,this.max.x=this.max.y=-1/0,this},isEmpty:function(){return this.max.x<this.min.x||this.max.y<this.min.y},getCenter:function(t){return void 0===t&&(console.warn("THREE.Box2: .getCenter() target is now required"),t=new ti),this.isEmpty()?t.set(0,0):t.addVectors(this.min,this.max).multiplyScalar(.5)},getSize:function(t){return void 0===t&&(console.warn("THREE.Box2: .getSize() target is now required"),t=new ti),this.isEmpty()?t.set(0,0):t.subVectors(this.max,this.min)},expandByPoint:function(t){return this.min.min(t),this.max.max(t),this},expandByVector:function(t){return this.min.sub(t),this.max.add(t),this},expandByScalar:function(t){return this.min.addScalar(-t),this.max.addScalar(t),this},containsPoint:function(t){return!(t.x<this.min.x||t.x>this.max.x||t.y<this.min.y||t.y>this.max.y)},containsBox:function(t){return this.min.x<=t.min.x&&t.max.x<=this.max.x&&this.min.y<=t.min.y&&t.max.y<=this.max.y},getParameter:function(t,e){return void 0===e&&(console.warn("THREE.Box2: .getParameter() target is now required"),e=new ti),e.set((t.x-this.min.x)/(this.max.x-this.min.x),(t.y-this.min.y)/(this.max.y-this.min.y))},intersectsBox:function(t){return!(t.max.x<this.min.x||t.min.x>this.max.x||t.max.y<this.min.y||t.min.y>this.max.y)},clampPoint:function(t,e){return void 0===e&&(console.warn("THREE.Box2: .clampPoint() target is now required"),e=new ti),e.copy(t).clamp(this.min,this.max)},distanceToPoint:(fh=new ti,function(t){return fh.copy(t).clamp(this.min,this.max).sub(t).length()}),intersect:function(t){return this.min.max(t.min),this.max.min(t.max),this},union:function(t){return this.min.min(t.min),this.max.max(t.max),this},translate:function(t){return this.min.add(t),this.max.add(t),this},equals:function(t){return t.min.equals(this.min)&&t.max.equals(this.max)}}),Object.assign(Qh.prototype,{set:function(t,e){return this.start.copy(t),this.end.copy(e),this},clone:function(){return(new this.constructor).copy(this)},copy:function(t){return this.start.copy(t.start),this.end.copy(t.end),this},getCenter:function(t){return void 0===t&&(console.warn("THREE.Line3: .getCenter() target is now required"),t=new ri),t.addVectors(this.start,this.end).multiplyScalar(.5)},delta:function(t){return void 0===t&&(console.warn("THREE.Line3: .delta() target is now required"),t=new ri),t.subVectors(this.end,this.start)},distanceSq:function(){return this.start.distanceToSquared(this.end)},distance:function(){return this.start.distanceTo(this.end)},at:function(t,e){return void 0===e&&(console.warn("THREE.Line3: .at() target is now required"),e=new ri),this.delta(e).multiplyScalar(t).add(this.start)},closestPointToPointParameter:(gh=new ri,vh=new ri,function(t,e){gh.subVectors(t,this.start),vh.subVectors(this.end,this.start);var i=vh.dot(vh),r=vh.dot(gh)/i;return e&&(r=Qe.clamp(r,0,1)),r}),closestPointToPoint:function(t,e,i){var r=this.closestPointToPointParameter(t,e);return void 0===i&&(console.warn("THREE.Line3: .closestPointToPoint() target is now required"),i=new ri),this.delta(i).multiplyScalar(r).add(this.start)},applyMatrix4:function(t){return this.start.applyMatrix4(t),this.end.applyMatrix4(t),this},equals:function(t){return t.start.equals(this.start)&&t.end.equals(this.end)}}),((tl.prototype=Object.create(ur.prototype)).constructor=tl).prototype.isImmediateRenderObject=!0,((el.prototype=Object.create(Na.prototype)).constructor=el).prototype.update=(yh=new ri,bh=new ri,xh=new ni,function(){var t=["a","b","c"];this.object.updateMatrixWorld(!0),xh.getNormalMatrix(this.object.matrixWorld);var e=this.object.matrixWorld,i=this.geometry.attributes.position,r=this.object.geometry;if(r&&r.isGeometry)for(var n=r.vertices,o=r.faces,a=0,s=0,c=o.length;s<c;s++)for(var u=o[s],h=0,l=u.vertexNormals.length;h<l;h++){var p=n[u[t[h]]],d=u.vertexNormals[h];yh.copy(p).applyMatrix4(e),bh.copy(d).applyMatrix3(xh).normalize().multiplyScalar(this.size).add(yh),i.setXYZ(a,yh.x,yh.y,yh.z),a+=1,i.setXYZ(a,bh.x,bh.y,bh.z),a+=1}else if(r&&r.isBufferGeometry){var f=r.attributes.position,m=r.attributes.normal;for(h=a=0,l=f.count;h<l;h++)yh.set(f.getX(h),f.getY(h),f.getZ(h)).applyMatrix4(e),bh.set(m.getX(h),m.getY(h),m.getZ(h)),bh.applyMatrix3(xh).normalize().multiplyScalar(this.size).add(yh),i.setXYZ(a,yh.x,yh.y,yh.z),a+=1,i.setXYZ(a,bh.x,bh.y,bh.z),a+=1}i.needsUpdate=!0}),((il.prototype=Object.create(ur.prototype)).constructor=il).prototype.dispose=function(){this.cone.geometry.dispose(),this.cone.material.dispose()},il.prototype.update=(_h=new ri,wh=new ri,function(){this.light.updateMatrixWorld();var t=this.light.distance?this.light.distance:1e3,e=t*Math.tan(this.light.angle);this.cone.scale.set(e,e,t),_h.setFromMatrixPosition(this.light.matrixWorld),wh.setFromMatrixPosition(this.light.target.matrixWorld),this.cone.lookAt(wh.sub(_h)),void 0!==this.color?this.cone.material.color.set(this.color):this.cone.material.color.copy(this.light.color)}),((rl.prototype=Object.create(Na.prototype)).constructor=rl).prototype.updateMatrixWorld=(Sh=new ri,Ah=new ei,Mh=new ei,function(t){var e=this.bones,i=this.geometry,r=i.getAttribute("position");Mh.getInverse(this.root.matrixWorld);for(var n=0,o=0;n<e.length;n++){var a=e[n];a.parent&&a.parent.isBone&&(Ah.multiplyMatrices(Mh,a.matrixWorld),Sh.setFromMatrixPosition(Ah),r.setXYZ(o,Sh.x,Sh.y,Sh.z),Ah.multiplyMatrices(Mh,a.parent.matrixWorld),Sh.setFromMatrixPosition(Ah),r.setXYZ(o+1,Sh.x,Sh.y,Sh.z),o+=2)}i.getAttribute("position").needsUpdate=!0,ur.prototype.updateMatrixWorld.call(this,t)}),((nl.prototype=Object.create(Pn.prototype)).constructor=nl).prototype.dispose=function(){this.geometry.dispose(),this.material.dispose()},nl.prototype.update=function(){void 0!==this.color?this.material.color.set(this.color):this.material.color.copy(this.light.color)},((ol.prototype=Object.create(ur.prototype)).constructor=ol).prototype.dispose=function(){this.children[0].geometry.dispose(),this.children[0].material.dispose()},ol.prototype.update=function(){var t=.5*this.light.width,e=.5*this.light.height,i=this.line.geometry.attributes.position,r=i.array;r[0]=t,r[1]=-e,r[2]=0,r[3]=t,r[4]=e,r[5]=0,r[6]=-t,r[7]=e,r[8]=0,r[9]=-t,r[10]=-e,r[11]=0,r[12]=t,r[13]=-e,r[14]=0,i.needsUpdate=!0,void 0!==this.color?this.line.material.color.set(this.color):this.line.material.color.copy(this.light.color)},((al.prototype=Object.create(ur.prototype)).constructor=al).prototype.dispose=function(){this.children[0].geometry.dispose(),this.children[0].material.dispose()},al.prototype.update=(Eh=new ri,Ph=new ki,Th=new ki,function(){var t=this.children[0];if(void 0!==this.color)this.material.color.set(this.color);else{var e=t.geometry.getAttribute("color");Ph.copy(this.light.color),Th.copy(this.light.groundColor);for(var i=0,r=e.count;i<r;i++){var n=i<r/2?Ph:Th;e.setXYZ(i,n.r,n.g,n.b)}e.needsUpdate=!0}t.lookAt(Eh.setFromMatrixPosition(this.light.matrixWorld).negate())}),(sl.prototype=Object.create(Na.prototype)).constructor=sl,(cl.prototype=Object.create(Na.prototype)).constructor=cl,((ul.prototype=Object.create(Na.prototype)).constructor=ul).prototype.update=(Ch=new ri,Ih=new ri,Oh=new ni,function(){this.object.updateMatrixWorld(!0),Oh.getNormalMatrix(this.object.matrixWorld);for(var t=this.object.matrixWorld,e=this.geometry.attributes.position,i=this.object.geometry,r=i.vertices,n=i.faces,o=0,a=0,s=n.length;a<s;a++){var c=n[a],u=c.normal;Ch.copy(r[c.a]).add(r[c.b]).add(r[c.c]).divideScalar(3).applyMatrix4(t),Ih.copy(u).applyMatrix3(Oh).normalize().multiplyScalar(this.size).add(Ch),e.setXYZ(o,Ch.x,Ch.y,Ch.z),o+=1,e.setXYZ(o,Ih.x,Ih.y,Ih.z),o+=1}e.needsUpdate=!0}),((hl.prototype=Object.create(ur.prototype)).constructor=hl).prototype.dispose=function(){this.lightPlane.geometry.dispose(),this.lightPlane.material.dispose(),this.targetLine.geometry.dispose(),this.targetLine.material.dispose()},hl.prototype.update=(Lh=new ri,Rh=new ri,Dh=new ri,function(){Lh.setFromMatrixPosition(this.light.matrixWorld),Rh.setFromMatrixPosition(this.light.target.matrixWorld),Dh.subVectors(Rh,Lh),this.lightPlane.lookAt(Dh),void 0!==this.color?(this.lightPlane.material.color.set(this.color),this.targetLine.material.color.set(this.color)):(this.lightPlane.material.color.copy(this.light.color),this.targetLine.material.color.copy(this.light.color)),this.targetLine.lookAt(Dh),this.targetLine.scale.z=Dh.length()}),((ll.prototype=Object.create(Na.prototype)).constructor=ll).prototype.update=function(){var c,u,h=new ri,l=new hr;function t(t,e,i,r){h.set(e,i,r).unproject(l);var n=u[t];if(void 0!==n)for(var o=c.getAttribute("position"),a=0,s=n.length;a<s;a++)o.setXYZ(n[a],h.x,h.y,h.z)}return function(){c=this.geometry,u=this.pointMap;l.projectionMatrix.copy(this.camera.projectionMatrix),t("c",0,0,-1),t("t",0,0,1),t("n1",-1,-1,-1),t("n2",1,-1,-1),t("n3",-1,1,-1),t("n4",1,1,-1),t("f1",-1,-1,1),t("f2",1,-1,1),t("f3",-1,1,1),t("f4",1,1,1),t("u1",.7,1.1,-1),t("u2",-.7,1.1,-1),t("u3",0,2,-1),t("cf1",-1,0,1),t("cf2",1,0,1),t("cf3",0,-1,1),t("cf4",0,1,1),t("cn1",-1,0,-1),t("cn2",1,0,-1),t("cn3",0,-1,-1),t("cn4",0,1,-1),c.getAttribute("position").needsUpdate=!0}}(),((pl.prototype=Object.create(Na.prototype)).constructor=pl).prototype.update=(kh=new Pi,function(t){if(void 0!==t&&console.warn("THREE.BoxHelper: .update() has no longer arguments."),void 0!==this.object&&kh.setFromObject(this.object),!kh.isEmpty()){var e=kh.min,i=kh.max,r=this.geometry.attributes.position,n=r.array;n[0]=i.x,n[1]=i.y,n[2]=i.z,n[3]=e.x,n[4]=i.y,n[5]=i.z,n[6]=e.x,n[7]=e.y,n[8]=i.z,n[9]=i.x,n[10]=e.y,n[11]=i.z,n[12]=i.x,n[13]=i.y,n[14]=e.z,n[15]=e.x,n[16]=i.y,n[17]=e.z,n[18]=e.x,n[19]=e.y,n[20]=e.z,n[21]=i.x,n[22]=e.y,n[23]=e.z,r.needsUpdate=!0,this.geometry.computeBoundingSphere()}}),pl.prototype.setFromObject=function(t){return this.object=t,this.update(),this},((dl.prototype=Object.create(Na.prototype)).constructor=dl).prototype.updateMatrixWorld=function(t){var e=this.box;e.isEmpty()||(e.getCenter(this.position),e.getSize(this.scale),this.scale.multiplyScalar(.5),ur.prototype.updateMatrixWorld.call(this,t))},((fl.prototype=Object.create(Ba.prototype)).constructor=fl).prototype.updateMatrixWorld=function(t){var e=-this.plane.constant;Math.abs(e)<1e-8&&(e=1e-8),this.scale.set(.5*this.size,.5*this.size,e),this.children[0].material.side=e<0?wt:G,this.lookAt(this.plane.normal),ur.prototype.updateMatrixWorld.call(this,t)},((ml.prototype=Object.create(ur.prototype)).constructor=ml).prototype.setDirection=(zh=new ri,function(t){.99999<t.y?this.quaternion.set(0,0,0,1):t.y<-.99999?this.quaternion.set(1,0,0,0):(zh.set(t.z,0,-t.x).normalize(),Fh=Math.acos(t.y),this.quaternion.setFromAxisAngle(zh,Fh))}),ml.prototype.setLength=function(t,e,i){void 0===e&&(e=.2*t),void 0===i&&(i=.2*e),this.line.scale.set(1,Math.max(0,t-e),1),this.line.updateMatrix(),this.cone.scale.set(i,e,i),this.cone.position.y=t,this.cone.updateMatrix()},ml.prototype.setColor=function(t){this.line.material.color.copy(t),this.cone.material.color.copy(t)},(gl.prototype=Object.create(Na.prototype)).constructor=gl,_c.create=function(t,e){return console.log("THREE.Curve.create() has been deprecated"),t.prototype=Object.create(_c.prototype),(t.prototype.constructor=t).prototype.getPoint=e,t},Object.assign(jc.prototype,{createPointsGeometry:function(t){console.warn("THREE.CurvePath: .createPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.");var e=this.getPoints(t);return this.createGeometry(e)},createSpacedPointsGeometry:function(t){console.warn("THREE.CurvePath: .createSpacedPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.");var e=this.getSpacedPoints(t);return this.createGeometry(e)},createGeometry:function(t){console.warn("THREE.CurvePath: .createGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.");for(var e=new _r,i=0,r=t.length;i<r;i++){var n=t[i];e.vertices.push(new ri(n.x,n.y,n.z||0))}return e}}),Object.assign(Gc.prototype,{fromPoints:function(t){console.warn("THREE.Path: .fromPoints() has been renamed to .setFromPoints()."),this.setFromPoints(t)}}),vl.prototype=Object.create(Cc.prototype),Object.assign(vl.prototype,{initFromArray:function(){console.error("THREE.Spline: .initFromArray() has been removed.")},getControlPointsArray:function(){console.error("THREE.Spline: .getControlPointsArray() has been removed.")},reparametrizeByArcLength:function(){console.error("THREE.Spline: .reparametrizeByArcLength() has been removed.")}}),sl.prototype.setColors=function(){console.error("THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.")},rl.prototype.update=function(){console.error("THREE.SkeletonHelper: update() no longer needs to be called.")},Object.assign(wu.prototype,{extractUrlBase:function(t){return console.warn("THREE.Loader: .extractUrlBase() has been deprecated. Use THREE.LoaderUtils.extractUrlBase() instead."),Su(t)}}),Object.assign(Jh.prototype,{center:function(t){return console.warn("THREE.Box2: .center() has been renamed to .getCenter()."),this.getCenter(t)},empty:function(){return console.warn("THREE.Box2: .empty() has been renamed to .isEmpty()."),this.isEmpty()},isIntersectionBox:function(t){return console.warn("THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox()."),this.intersectsBox(t)},size:function(t){return console.warn("THREE.Box2: .size() has been renamed to .getSize()."),this.getSize(t)}}),Object.assign(Pi.prototype,{center:function(t){return console.warn("THREE.Box3: .center() has been renamed to .getCenter()."),this.getCenter(t)},empty:function(){return console.warn("THREE.Box3: .empty() has been renamed to .isEmpty()."),this.isEmpty()},isIntersectionBox:function(t){return console.warn("THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox()."),this.intersectsBox(t)},isIntersectionSphere:function(t){return console.warn("THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere()."),this.intersectsSphere(t)},size:function(t){return console.warn("THREE.Box3: .size() has been renamed to .getSize()."),this.getSize(t)}}),Qh.prototype.center=function(t){return console.warn("THREE.Line3: .center() has been renamed to .getCenter()."),this.getCenter(t)},Object.assign(Qe,{random16:function(){return console.warn("THREE.Math: .random16() has been deprecated. Use Math.random() instead."),Math.random()},nearestPowerOfTwo:function(t){return console.warn("THREE.Math: .nearestPowerOfTwo() has been renamed to .floorPowerOfTwo()."),Qe.floorPowerOfTwo(t)},nextPowerOfTwo:function(t){return console.warn("THREE.Math: .nextPowerOfTwo() has been renamed to .ceilPowerOfTwo()."),Qe.ceilPowerOfTwo(t)}}),Object.assign(ni.prototype,{flattenToArrayOffset:function(t,e){return console.warn("THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead."),this.toArray(t,e)},multiplyVector3:function(t){return console.warn("THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead."),t.applyMatrix3(this)},multiplyVector3Array:function(){console.error("THREE.Matrix3: .multiplyVector3Array() has been removed.")},applyToBuffer:function(t){return console.warn("THREE.Matrix3: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead."),this.applyToBufferAttribute(t)},applyToVector3Array:function(){console.error("THREE.Matrix3: .applyToVector3Array() has been removed.")}}),Object.assign(ei.prototype,{extractPosition:function(t){return console.warn("THREE.Matrix4: .extractPosition() has been renamed to .copyPosition()."),this.copyPosition(t)},flattenToArrayOffset:function(t,e){return console.warn("THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead."),this.toArray(t,e)},getPosition:function(){return void 0===Uh&&(Uh=new ri),console.warn("THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead."),Uh.setFromMatrixColumn(this,3)},setRotationFromQuaternion:function(t){return console.warn("THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion()."),this.makeRotationFromQuaternion(t)},multiplyToArray:function(){console.warn("THREE.Matrix4: .multiplyToArray() has been removed.")},multiplyVector3:function(t){return console.warn("THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead."),t.applyMatrix4(this)},multiplyVector4:function(t){return console.warn("THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead."),t.applyMatrix4(this)},multiplyVector3Array:function(){console.error("THREE.Matrix4: .multiplyVector3Array() has been removed.")},rotateAxis:function(t){console.warn("THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead."),t.transformDirection(this)},crossVector:function(t){return console.warn("THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead."),t.applyMatrix4(this)},translate:function(){console.error("THREE.Matrix4: .translate() has been removed.")},rotateX:function(){console.error("THREE.Matrix4: .rotateX() has been removed.")},rotateY:function(){console.error("THREE.Matrix4: .rotateY() has been removed.")},rotateZ:function(){console.error("THREE.Matrix4: .rotateZ() has been removed.")},rotateByAxis:function(){console.error("THREE.Matrix4: .rotateByAxis() has been removed.")},applyToBuffer:function(t){return console.warn("THREE.Matrix4: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead."),this.applyToBufferAttribute(t)},applyToVector3Array:function(){console.error("THREE.Matrix4: .applyToVector3Array() has been removed.")},makeFrustum:function(t,e,i,r,n,o){return console.warn("THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead."),this.makePerspective(t,e,r,i,n,o)}}),Ci.prototype.isIntersectionLine=function(t){return console.warn("THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine()."),this.intersectsLine(t)},ii.prototype.multiplyVector3=function(t){return console.warn("THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead."),t.applyQuaternion(this)},Object.assign(Mn.prototype,{isIntersectionBox:function(t){return console.warn("THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox()."),this.intersectsBox(t)},isIntersectionPlane:function(t){return console.warn("THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane()."),this.intersectsPlane(t)},isIntersectionSphere:function(t){return console.warn("THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere()."),this.intersectsSphere(t)}}),Object.assign(En.prototype,{area:function(){return console.warn("THREE.Triangle: .area() has been renamed to .getArea()."),this.getArea()},barycoordFromPoint:function(t,e){return console.warn("THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord()."),this.getBarycoord(t,e)},midpoint:function(t){return console.warn("THREE.Triangle: .midpoint() has been renamed to .getMidpoint()."),this.getMidpoint(t)},normal:function(t){return console.warn("THREE.Triangle: .normal() has been renamed to .getNormal()."),this.getNormal(t)},plane:function(t){return console.warn("THREE.Triangle: .plane() has been renamed to .getPlane()."),this.getPlane(t)}}),Object.assign(En,{barycoordFromPoint:function(t,e,i,r,n){return console.warn("THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord()."),En.getBarycoord(t,e,i,r,n)},normal:function(t,e,i,r){return console.warn("THREE.Triangle: .normal() has been renamed to .getNormal()."),En.getNormal(t,e,i,r)}}),Object.assign(Vc.prototype,{extractAllPoints:function(t){return console.warn("THREE.Shape: .extractAllPoints() has been removed. Use .extractPoints() instead."),this.extractPoints(t)},extrude:function(t){return console.warn("THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead."),new Ds(this,t)},makeGeometry:function(t){return console.warn("THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead."),new Ws(this,t)}}),Object.assign(ti.prototype,{fromAttribute:function(t,e,i){return console.warn("THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute()."),this.fromBufferAttribute(t,e,i)},distanceToManhattan:function(t){return console.warn("THREE.Vector2: .distanceToManhattan() has been renamed to .manhattanDistanceTo()."),this.manhattanDistanceTo(t)},lengthManhattan:function(){return console.warn("THREE.Vector2: .lengthManhattan() has been renamed to .manhattanLength()."),this.manhattanLength()}}),Object.assign(ri.prototype,{setEulerFromRotationMatrix:function(){console.error("THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.")},setEulerFromQuaternion:function(){console.error("THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.")},getPositionFromMatrix:function(t){return console.warn("THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition()."),this.setFromMatrixPosition(t)},getScaleFromMatrix:function(t){return console.warn("THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale()."),this.setFromMatrixScale(t)},getColumnFromMatrix:function(t,e){return console.warn("THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn()."),this.setFromMatrixColumn(e,t)},applyProjection:function(t){return console.warn("THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead."),this.applyMatrix4(t)},fromAttribute:function(t,e,i){return console.warn("THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute()."),this.fromBufferAttribute(t,e,i)},distanceToManhattan:function(t){return console.warn("THREE.Vector3: .distanceToManhattan() has been renamed to .manhattanDistanceTo()."),this.manhattanDistanceTo(t)},lengthManhattan:function(){return console.warn("THREE.Vector3: .lengthManhattan() has been renamed to .manhattanLength()."),this.manhattanLength()}}),Object.assign(Si.prototype,{fromAttribute:function(t,e,i){return console.warn("THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute()."),this.fromBufferAttribute(t,e,i)},lengthManhattan:function(){return console.warn("THREE.Vector4: .lengthManhattan() has been renamed to .manhattanLength()."),this.manhattanLength()}}),Object.assign(_r.prototype,{computeTangents:function(){console.error("THREE.Geometry: .computeTangents() has been removed.")},computeLineDistances:function(){console.error("THREE.Geometry: .computeLineDistances() has been removed. Use THREE.Line.computeLineDistances() instead.")}}),Object.assign(ur.prototype,{getChildByName:function(t){return console.warn("THREE.Object3D: .getChildByName() has been renamed to .getObjectByName()."),this.getObjectByName(t)},renderDepth:function(){console.warn("THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.")},translate:function(t,e){return console.warn("THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead."),this.translateOnAxis(e,t)},getWorldRotation:function(){console.error("THREE.Object3D: .getWorldRotation() has been removed. Use THREE.Object3D.getWorldQuaternion( target ) instead.")}}),Object.defineProperties(ur.prototype,{eulerOrder:{get:function(){return console.warn("THREE.Object3D: .eulerOrder is now .rotation.order."),this.rotation.order},set:function(t){console.warn("THREE.Object3D: .eulerOrder is now .rotation.order."),this.rotation.order=t}},useQuaternion:{get:function(){console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.")},set:function(){console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.")}}}),Object.defineProperties(Oa.prototype,{objects:{get:function(){return console.warn("THREE.LOD: .objects has been renamed to .levels."),this.levels}}}),Object.defineProperty(La.prototype,"useVertexTexture",{get:function(){console.warn("THREE.Skeleton: useVertexTexture has been removed.")},set:function(){console.warn("THREE.Skeleton: useVertexTexture has been removed.")}}),Object.defineProperty(_c.prototype,"__arcLengthDivisions",{get:function(){return console.warn("THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions."),this.arcLengthDivisions},set:function(t){console.warn("THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions."),this.arcLengthDivisions=t}}),ba.prototype.setLens=function(t,e){console.warn("THREE.PerspectiveCamera.setLens is deprecated. Use .setFocalLength and .filmGauge for a photographic setup."),void 0!==e&&(this.filmGauge=e),this.setFocalLength(t)},Object.defineProperties(Hc.prototype,{onlyShadow:{set:function(){console.warn("THREE.Light: .onlyShadow has been removed.")}},shadowCameraFov:{set:function(t){console.warn("THREE.Light: .shadowCameraFov is now .shadow.camera.fov."),this.shadow.camera.fov=t}},shadowCameraLeft:{set:function(t){console.warn("THREE.Light: .shadowCameraLeft is now .shadow.camera.left."),this.shadow.camera.left=t}},shadowCameraRight:{set:function(t){console.warn("THREE.Light: .shadowCameraRight is now .shadow.camera.right."),this.shadow.camera.right=t}},shadowCameraTop:{set:function(t){console.warn("THREE.Light: .shadowCameraTop is now .shadow.camera.top."),this.shadow.camera.top=t}},shadowCameraBottom:{set:function(t){console.warn("THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom."),this.shadow.camera.bottom=t}},shadowCameraNear:{set:function(t){console.warn("THREE.Light: .shadowCameraNear is now .shadow.camera.near."),this.shadow.camera.near=t}},shadowCameraFar:{set:function(t){console.warn("THREE.Light: .shadowCameraFar is now .shadow.camera.far."),this.shadow.camera.far=t}},shadowCameraVisible:{set:function(){console.warn("THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.")}},shadowBias:{set:function(t){console.warn("THREE.Light: .shadowBias is now .shadow.bias."),this.shadow.bias=t}},shadowDarkness:{set:function(){console.warn("THREE.Light: .shadowDarkness has been removed.")}},shadowMapWidth:{set:function(t){console.warn("THREE.Light: .shadowMapWidth is now .shadow.mapSize.width."),this.shadow.mapSize.width=t}},shadowMapHeight:{set:function(t){console.warn("THREE.Light: .shadowMapHeight is now .shadow.mapSize.height."),this.shadow.mapSize.height=t}}}),Object.defineProperties(wr.prototype,{length:{get:function(){return console.warn("THREE.BufferAttribute: .length has been deprecated. Use .count instead."),this.array.length}},copyIndicesArray:function(){console.error("THREE.BufferAttribute: .copyIndicesArray() has been removed.")}}),Object.assign($r.prototype,{addIndex:function(t){console.warn("THREE.BufferGeometry: .addIndex() has been renamed to .setIndex()."),this.setIndex(t)},addDrawCall:function(t,e,i){void 0!==i&&console.warn("THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset."),console.warn("THREE.BufferGeometry: .addDrawCall() is now .addGroup()."),this.addGroup(t,e)},clearDrawCalls:function(){console.warn("THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups()."),this.clearGroups()},computeTangents:function(){console.warn("THREE.BufferGeometry: .computeTangents() has been removed.")},computeOffsets:function(){console.warn("THREE.BufferGeometry: .computeOffsets() has been removed.")}}),Object.defineProperties($r.prototype,{drawcalls:{get:function(){return console.error("THREE.BufferGeometry: .drawcalls has been renamed to .groups."),this.groups}},offsets:{get:function(){return console.warn("THREE.BufferGeometry: .offsets has been renamed to .groups."),this.groups}}}),Object.assign(ks.prototype,{getArrays:function(){console.error("THREE.ExtrudeBufferGeometry: .getArrays() has been removed.")},addShapeList:function(){console.error("THREE.ExtrudeBufferGeometry: .addShapeList() has been removed.")},addShape:function(){console.error("THREE.ExtrudeBufferGeometry: .addShape() has been removed.")}}),Object.defineProperties(Wh.prototype,{dynamic:{set:function(){console.warn("THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.")}},onUpdate:{value:function(){return console.warn("THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead."),this}}}),Object.defineProperties(wn.prototype,{wrapAround:{get:function(){console.warn("THREE.Material: .wrapAround has been removed.")},set:function(){console.warn("THREE.Material: .wrapAround has been removed.")}},wrapRGB:{get:function(){return console.warn("THREE.Material: .wrapRGB has been removed."),new ki}},shading:{get:function(){console.error("THREE."+this.type+": .shading has been removed. Use the boolean .flatShading instead.")},set:function(t){console.warn("THREE."+this.type+": .shading has been removed. Use the boolean .flatShading instead."),this.flatShading=1===t}}}),Object.defineProperties(sc.prototype,{metal:{get:function(){return console.warn("THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead."),!1},set:function(){console.warn("THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead")}}}),Object.defineProperties(An.prototype,{derivatives:{get:function(){return console.warn("THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives."),this.extensions.derivatives},set:function(t){console.warn("THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives."),this.extensions.derivatives=t}}}),Object.assign(Sa.prototype,{animate:function(t){console.warn("THREE.WebGLRenderer: .animate() is now .setAnimationLoop()."),this.setAnimationLoop(t)},getCurrentRenderTarget:function(){return console.warn("THREE.WebGLRenderer: .getCurrentRenderTarget() is now .getRenderTarget()."),this.getRenderTarget()},getMaxAnisotropy:function(){return console.warn("THREE.WebGLRenderer: .getMaxAnisotropy() is now .capabilities.getMaxAnisotropy()."),this.capabilities.getMaxAnisotropy()},getPrecision:function(){return console.warn("THREE.WebGLRenderer: .getPrecision() is now .capabilities.precision."),this.capabilities.precision},resetGLState:function(){return console.warn("THREE.WebGLRenderer: .resetGLState() is now .state.reset()."),this.state.reset()},supportsFloatTextures:function(){return console.warn("THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( 'OES_texture_float' )."),this.extensions.get("OES_texture_float")},supportsHalfFloatTextures:function(){return console.warn("THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( 'OES_texture_half_float' )."),this.extensions.get("OES_texture_half_float")},supportsStandardDerivatives:function(){return console.warn("THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( 'OES_standard_derivatives' )."),this.extensions.get("OES_standard_derivatives")},supportsCompressedTextureS3TC:function(){return console.warn("THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( 'WEBGL_compressed_texture_s3tc' )."),this.extensions.get("WEBGL_compressed_texture_s3tc")},supportsCompressedTexturePVRTC:function(){return console.warn("THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( 'WEBGL_compressed_texture_pvrtc' )."),this.extensions.get("WEBGL_compressed_texture_pvrtc")},supportsBlendMinMax:function(){return console.warn("THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( 'EXT_blend_minmax' )."),this.extensions.get("EXT_blend_minmax")},supportsVertexTextures:function(){return console.warn("THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures."),this.capabilities.vertexTextures},supportsInstancedArrays:function(){return console.warn("THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( 'ANGLE_instanced_arrays' )."),this.extensions.get("ANGLE_instanced_arrays")},enableScissorTest:function(t){console.warn("THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest()."),this.setScissorTest(t)},initMaterial:function(){console.warn("THREE.WebGLRenderer: .initMaterial() has been removed.")},addPrePlugin:function(){console.warn("THREE.WebGLRenderer: .addPrePlugin() has been removed.")},addPostPlugin:function(){console.warn("THREE.WebGLRenderer: .addPostPlugin() has been removed.")},updateShadowMap:function(){console.warn("THREE.WebGLRenderer: .updateShadowMap() has been removed.")},setFaceCulling:function(){console.warn("THREE.WebGLRenderer: .setFaceCulling() has been removed.")}}),Object.defineProperties(Sa.prototype,{shadowMapEnabled:{get:function(){return this.shadowMap.enabled},set:function(t){console.warn("THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled."),this.shadowMap.enabled=t}},shadowMapType:{get:function(){return this.shadowMap.type},set:function(t){console.warn("THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type."),this.shadowMap.type=t}},shadowMapCullFace:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.")},set:function(){console.warn("THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.")}}}),Object.defineProperties(fa.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(Ai.prototype,{wrapS:{get:function(){return console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS."),this.texture.wrapS},set:function(t){console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS."),this.texture.wrapS=t}},wrapT:{get:function(){return console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT."),this.texture.wrapT},set:function(t){console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT."),this.texture.wrapT=t}},magFilter:{get:function(){return console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter."),this.texture.magFilter},set:function(t){console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter."),this.texture.magFilter=t}},minFilter:{get:function(){return console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter."),this.texture.minFilter},set:function(t){console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter."),this.texture.minFilter=t}},anisotropy:{get:function(){return console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy."),this.texture.anisotropy},set:function(t){console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy."),this.texture.anisotropy=t}},offset:{get:function(){return console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset."),this.texture.offset},set:function(t){console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset."),this.texture.offset=t}},repeat:{get:function(){return console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat."),this.texture.repeat},set:function(t){console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat."),this.texture.repeat=t}},format:{get:function(){return console.warn("THREE.WebGLRenderTarget: .format is now .texture.format."),this.texture.format},set:function(t){console.warn("THREE.WebGLRenderTarget: .format is now .texture.format."),this.texture.format=t}},type:{get:function(){return console.warn("THREE.WebGLRenderTarget: .type is now .texture.type."),this.texture.type},set:function(t){console.warn("THREE.WebGLRenderTarget: .type is now .texture.type."),this.texture.type=t}},generateMipmaps:{get:function(){return console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps."),this.texture.generateMipmaps},set:function(t){console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps."),this.texture.generateMipmaps=t}}}),Object.defineProperties(_a.prototype,{standing:{set:function(){console.warn("THREE.WebVRManager: .standing has been removed.")}}}),eh.prototype.load=function(t){console.warn("THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.");var e=this;return(new Ku).load(t,function(t){e.setBuffer(t)}),this},rh.prototype.getData=function(){return console.warn("THREE.AudioAnalyser: .getData() is now .getFrequencyData()."),this.getFrequencyData()},Qu.prototype.updateCubeMap=function(t,e){return console.warn("THREE.CubeCamera: .updateCubeMap() is now .update()."),this.update(t,e)},xi.crossOrigin=void 0,xi.loadTexture=function(t,e,i,r){console.warn("THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.");var n=new xc;n.setCrossOrigin(this.crossOrigin);var o=n.load(t,i,void 0,r);return e&&(o.mapping=e),o},xi.loadTextureCube=function(t,e,i,r){console.warn("THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.");var n=new bc;n.setCrossOrigin(this.crossOrigin);var o=n.load(t,i,void 0,r);return e&&(o.mapping=e),o},xi.loadCompressedTexture=function(){console.error("THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.")},xi.loadCompressedTextureCube=function(){console.error("THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.")};var Ul=function(t){this.name=t,this._dict={}},jl={names:{configurable:!0}};function Gl(t){return.01745*t}Ul.prototype.add=function(t,e){this._dict[zl(t)]=e},Ul.prototype.get=function(t){return this._dict[zl(t)]},jl.names.get=function(){return Object.keys(this._dict)},Object.defineProperties(Ul.prototype,jl);var Vl="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),Hl=new Array(36);function $l(){for(var t,e=0,i=0;i<36;i++)8===i||13===i||18===i||23===i?Hl[i]="-":14===i?Hl[i]="4":(e<=2&&(e=33554432+16777216*Math.random()|0),t=15&e,e>>=4,Hl[i]=Vl[19===i?3&t|8:t]);return Hl.join("")}function Wl(t,e,i){return Math.max(e,Math.min(i,t))}function Xl(t){return Wl(t,0,100)}function ql(t,e,i){return t+(e-t)*i}function Yl(t,e,i,r,n,o){var a=(i-t)*o,s=(r-e)*o,c=n*n;return(2*e-2*i+a+s)*(n*c)+(-3*e+3*i-2*a-s)*c+a*n+e}function Zl(t,e,i){var r;return(i=Wl((i-(r=t))/(e-r),0,1))*i*(3-2*i)}var Kl="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function Jl(t,e){return t(e={exports:{}},e.exports),e.exports}var Ql=Jl(function(Pt,Tt){(function(){var T,n,s,C,c,a,d,m,u,h,l,p,nt,I,f,r,t,i,e,ot,g,o,O,v,y,b,x,at,_,w,S,A,M,E,P,L,R,D,k,B,N,F,z,U,j,G,V,st,H,$,ct,W,X,q,ut,Y,Z,K,J,Q,tt,et,it,rt,ht,lt,pt,dt,ft,mt,gt,vt,yt,bt,xt,_t,wt,St,At,Mt,Et=[].slice;_t=function(){var i,t,e,r,n;for(i={},r=0,t=(n="Boolean Number String Function Array Date RegExp Undefined Null".split(" ")).length;r<t;r++)e=n[r],i["[object "+e+"]"]=e.toLowerCase();return function(t){var e;return e=Object.prototype.toString.call(t),i[e]||"object"}}(),V=function(t,e,i){return null==e&&(e=0),null==i&&(i=1),t<e&&(t=e),i<t&&(t=i),t},wt=function(t){return 3<=t.length?Array.prototype.slice.call(t):t[0]},g=function(t){var e,i;for(t._clipped=!1,t._unclipped=t.slice(0),e=i=0;i<3;e=++i)e<3?((t[e]<0||255<t[e])&&(t._clipped=!0),t[e]<0&&(t[e]=0),255<t[e]&&(t[e]=255)):3===e&&(t[e]<0&&(t[e]=0),1<t[e]&&(t[e]=1));return t._clipped||delete t._unclipped,t},C=Math.PI,gt=Math.round,O=Math.cos,at=Math.floor,ut=Math.pow,st=Math.log,yt=Math.sin,bt=Math.sqrt,I=Math.atan2,ct=Math.max,nt=Math.abs,d=2*C,c=C/3,n=C/180,a=180/C,(ot=function(){return arguments[0]instanceof T?arguments[0]:function(t,e,i){i.prototype=t.prototype;var r=new i,n=t.apply(r,e);return Object(n)===n?n:r}(T,arguments,function(){})}).default=ot,p=[],null!==Pt&&null!=Pt.exports&&(Pt.exports=ot),((null!==Tt?Tt:this).chroma=ot).version="1.3.7",l={},h=!(u=[]),T=function(){function t(){var t,e,i,r,n,o,a,s,c=arguments;for(this,e=[],a=0,r=arguments.length;a<r;a++)null!=(t=c[a])&&e.push(t);if(1<e.length&&(o=e[e.length-1]),null!=l[o])this._rgb=g(l[o](wt(e.slice(0,-1))));else{for(h||(u=u.sort(function(t,e){return e.p-t.p}),h=!0),s=0,n=u.length;s<n&&!(o=(i=u[s]).test.apply(i,e));s++);o&&(this._rgb=g(l[o].apply(l,e)))}null==this._rgb&&console.warn("unknown format: "+e),null==this._rgb&&(this._rgb=[0,0,0]),3===this._rgb.length&&this._rgb.push(1)}return t.prototype.toString=function(){return this.hex()},t.prototype.clone=function(){return ot(me._rgb)},t}(),ot._input=l,ot.brewer=i={OrRd:["#fff7ec","#fee8c8","#fdd49e","#fdbb84","#fc8d59","#ef6548","#d7301f","#b30000","#7f0000"],PuBu:["#fff7fb","#ece7f2","#d0d1e6","#a6bddb","#74a9cf","#3690c0","#0570b0","#045a8d","#023858"],BuPu:["#f7fcfd","#e0ecf4","#bfd3e6","#9ebcda","#8c96c6","#8c6bb1","#88419d","#810f7c","#4d004b"],Oranges:["#fff5eb","#fee6ce","#fdd0a2","#fdae6b","#fd8d3c","#f16913","#d94801","#a63603","#7f2704"],BuGn:["#f7fcfd","#e5f5f9","#ccece6","#99d8c9","#66c2a4","#41ae76","#238b45","#006d2c","#00441b"],YlOrBr:["#ffffe5","#fff7bc","#fee391","#fec44f","#fe9929","#ec7014","#cc4c02","#993404","#662506"],YlGn:["#ffffe5","#f7fcb9","#d9f0a3","#addd8e","#78c679","#41ab5d","#238443","#006837","#004529"],Reds:["#fff5f0","#fee0d2","#fcbba1","#fc9272","#fb6a4a","#ef3b2c","#cb181d","#a50f15","#67000d"],RdPu:["#fff7f3","#fde0dd","#fcc5c0","#fa9fb5","#f768a1","#dd3497","#ae017e","#7a0177","#49006a"],Greens:["#f7fcf5","#e5f5e0","#c7e9c0","#a1d99b","#74c476","#41ab5d","#238b45","#006d2c","#00441b"],YlGnBu:["#ffffd9","#edf8b1","#c7e9b4","#7fcdbb","#41b6c4","#1d91c0","#225ea8","#253494","#081d58"],Purples:["#fcfbfd","#efedf5","#dadaeb","#bcbddc","#9e9ac8","#807dba","#6a51a3","#54278f","#3f007d"],GnBu:["#f7fcf0","#e0f3db","#ccebc5","#a8ddb5","#7bccc4","#4eb3d3","#2b8cbe","#0868ac","#084081"],Greys:["#ffffff","#f0f0f0","#d9d9d9","#bdbdbd","#969696","#737373","#525252","#252525","#000000"],YlOrRd:["#ffffcc","#ffeda0","#fed976","#feb24c","#fd8d3c","#fc4e2a","#e31a1c","#bd0026","#800026"],PuRd:["#f7f4f9","#e7e1ef","#d4b9da","#c994c7","#df65b0","#e7298a","#ce1256","#980043","#67001f"],Blues:["#f7fbff","#deebf7","#c6dbef","#9ecae1","#6baed6","#4292c6","#2171b5","#08519c","#08306b"],PuBuGn:["#fff7fb","#ece2f0","#d0d1e6","#a6bddb","#67a9cf","#3690c0","#02818a","#016c59","#014636"],Viridis:["#440154","#482777","#3f4a8a","#31678e","#26838f","#1f9d8a","#6cce5a","#b6de2b","#fee825"],Spectral:["#9e0142","#d53e4f","#f46d43","#fdae61","#fee08b","#ffffbf","#e6f598","#abdda4","#66c2a5","#3288bd","#5e4fa2"],RdYlGn:["#a50026","#d73027","#f46d43","#fdae61","#fee08b","#ffffbf","#d9ef8b","#a6d96a","#66bd63","#1a9850","#006837"],RdBu:["#67001f","#b2182b","#d6604d","#f4a582","#fddbc7","#f7f7f7","#d1e5f0","#92c5de","#4393c3","#2166ac","#053061"],PiYG:["#8e0152","#c51b7d","#de77ae","#f1b6da","#fde0ef","#f7f7f7","#e6f5d0","#b8e186","#7fbc41","#4d9221","#276419"],PRGn:["#40004b","#762a83","#9970ab","#c2a5cf","#e7d4e8","#f7f7f7","#d9f0d3","#a6dba0","#5aae61","#1b7837","#00441b"],RdYlBu:["#a50026","#d73027","#f46d43","#fdae61","#fee090","#ffffbf","#e0f3f8","#abd9e9","#74add1","#4575b4","#313695"],BrBG:["#543005","#8c510a","#bf812d","#dfc27d","#f6e8c3","#f5f5f5","#c7eae5","#80cdc1","#35978f","#01665e","#003c30"],RdGy:["#67001f","#b2182b","#d6604d","#f4a582","#fddbc7","#ffffff","#e0e0e0","#bababa","#878787","#4d4d4d","#1a1a1a"],PuOr:["#7f3b08","#b35806","#e08214","#fdb863","#fee0b6","#f7f7f7","#d8daeb","#b2abd2","#8073ac","#542788","#2d004b"],Set2:["#66c2a5","#fc8d62","#8da0cb","#e78ac3","#a6d854","#ffd92f","#e5c494","#b3b3b3"],Accent:["#7fc97f","#beaed4","#fdc086","#ffff99","#386cb0","#f0027f","#bf5b17","#666666"],Set1:["#e41a1c","#377eb8","#4daf4a","#984ea3","#ff7f00","#ffff33","#a65628","#f781bf","#999999"],Set3:["#8dd3c7","#ffffb3","#bebada","#fb8072","#80b1d3","#fdb462","#b3de69","#fccde5","#d9d9d9","#bc80bd","#ccebc5","#ffed6f"],Dark2:["#1b9e77","#d95f02","#7570b3","#e7298a","#66a61e","#e6ab02","#a6761d","#666666"],Paired:["#a6cee3","#1f78b4","#b2df8a","#33a02c","#fb9a99","#e31a1c","#fdbf6f","#ff7f00","#cab2d6","#6a3d9a","#ffff99","#b15928"],Pastel2:["#b3e2cd","#fdcdac","#cbd5e8","#f4cae4","#e6f5c9","#fff2ae","#f1e2cc","#cccccc"],Pastel1:["#fbb4ae","#b3cde3","#ccebc5","#decbe4","#fed9a6","#ffffcc","#e5d8bd","#fddaec","#f2f2f2"]},function(){var t,e;for(t in e=[],i)e.push(i[t.toLowerCase()]=i[t])}(),ot.colors=St={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflower:"#6495ed",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkgrey:"#a9a9a9",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",grey:"#808080",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",laserlemon:"#ffff54",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrod:"#fafad2",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",maroon2:"#7f0000",maroon3:"#b03060",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",purple2:"#7f007f",purple3:"#a020f0",rebeccapurple:"#663399",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"},F=function(){var t,e,i,r,n,o,a;return r=(e=wt(arguments))[0],t=e[1],i=e[2],o=(r+16)/116,n=isNaN(t)?o:o+t/500,a=isNaN(i)?o:o-i/200,o=s.Yn*z(o),n=s.Xn*z(n),a=s.Zn*z(a),[Mt(3.2404542*n-1.5371385*o-.4985314*a),Mt(-.969266*n+1.8760108*o+.041556*a),i=Mt(.0556434*n-.2040259*o+1.0572252*a),3<e.length?e[3]:1]},Mt=function(t){return 255*(t<=.00304?12.92*t:1.055*ut(t,1/2.4)-.055)},z=function(t){return t>s.t1?t*t*t:s.t2*(t-s.t0)},s={Kn:18,Xn:.95047,Yn:1,Zn:1.08883,t0:.137931034,t1:.206896552,t2:.12841855,t3:.008856452},it=function(){var t,e,i,r,n,o,a;return i=(r=wt(arguments))[0],e=r[1],t=r[2],o=(n=dt(i,e,t))[0],[116*(a=n[1])-16,500*(o-a),200*(a-n[2])]},ft=function(t){return(t/=255)<=.04045?t/12.92:ut((t+.055)/1.055,2.4)},At=function(t){return t>s.t3?ut(t,1/3):t/s.t2+s.t0},dt=function(){var t,e,i,r;return i=(r=wt(arguments))[0],e=r[1],t=r[2],i=ft(i),e=ft(e),t=ft(t),[At((.4124564*i+.3575761*e+.1804375*t)/s.Xn),At((.2126729*i+.7151522*e+.072175*t)/s.Yn),At((.0193339*i+.119192*e+.9503041*t)/s.Zn)]},ot.lab=function(){return function(t,e,i){i.prototype=t.prototype;var r=new i,n=t.apply(r,e);return Object(n)===n?n:r}(T,Et.call(arguments).concat(["lab"]),function(){})},l.lab=F,T.prototype.lab=function(){return it(this._rgb)},f=function(r){var t,e,i,n,o,a,s,c,u,h,l;return 2===(r=function(){var t,e,i;for(i=[],e=0,t=r.length;e<t;e++)n=r[e],i.push(ot(n));return i}()).length?(u=function(){var t,e,i;for(i=[],e=0,t=r.length;e<t;e++)n=r[e],i.push(n.lab());return i}(),o=u[0],a=u[1],t=function(i){var r,t;return t=function(){var t,e;for(e=[],r=t=0;t<=2;r=++t)e.push(o[r]+i*(a[r]-o[r]));return e}(),ot.lab.apply(ot,t)}):3===r.length?(h=function(){var t,e,i;for(i=[],e=0,t=r.length;e<t;e++)n=r[e],i.push(n.lab());return i}(),o=h[0],a=h[1],s=h[2],t=function(i){var r,t;return t=function(){var t,e;for(e=[],r=t=0;t<=2;r=++t)e.push((1-i)*(1-i)*o[r]+2*(1-i)*i*a[r]+i*i*s[r]);return e}(),ot.lab.apply(ot,t)}):4===r.length?(l=function(){var t,e,i;for(i=[],e=0,t=r.length;e<t;e++)n=r[e],i.push(n.lab());return i}(),o=l[0],a=l[1],s=l[2],c=l[3],t=function(i){var r,t;return t=function(){var t,e;for(e=[],r=t=0;t<=2;r=++t)e.push((1-i)*(1-i)*(1-i)*o[r]+3*(1-i)*(1-i)*i*a[r]+3*(1-i)*i*i*s[r]+i*i*i*c[r]);return e}(),ot.lab.apply(ot,t)}):5===r.length&&(e=f(r.slice(0,3)),i=f(r.slice(2,5)),t=function(t){return t<.5?e(2*t):i(2*(t-.5))}),t},ot.bezier=function(t){var e;return(e=f(t)).scale=function(){return ot.scale(e)},e},ot.cubehelix=function(a,s,c,u,h){var l,p,e;return null==a&&(a=300),null==s&&(s=-1.5),null==c&&(c=1),null==u&&(u=1),null==h&&(h=[0,1]),l=0,"array"===_t(h)?p=h[1]-h[0]:(p=0,h=[h,h]),(e=function(t){var e,i,r,n,o;return e=d*((a+120)/360+s*t),n=ut(h[0]+p*t,u),i=(0!==l?c[0]+t*l:c)*n*(1-n)/2,r=O(e),o=yt(e),ot(g([255*(n+i*(-.14861*r+1.78277*o)),255*(n+i*(-.29227*r-.90649*o)),255*(n+i*(1.97294*r))]))}).start=function(t){return null==t?a:(a=t,e)},e.rotations=function(t){return null==t?s:(s=t,e)},e.gamma=function(t){return null==t?u:(u=t,e)},e.hue=function(t){return null==t?c:("array"===_t(c=t)?0===(l=c[1]-c[0])&&(c=c[1]):l=0,e)},e.lightness=function(t){return null==t?h:("array"===_t(t)?p=(h=t)[1]-t[0]:(h=[t,t],p=0),e)},e.scale=function(){return ot.scale(e)},e.hue(c),e},ot.random=function(){var t,e;for("0123456789abcdef",t="#",e=0;e<6;++e)t+="0123456789abcdef".charAt(at(16*Math.random()));return new T(t)},p=[],P=function(t,e,i,r){var n,o,a,s;for(null==i&&(i=.5),null==r&&(r="rgb"),"object"!==_t(t)&&(t=ot(t)),"object"!==_t(e)&&(e=ot(e)),a=0,o=p.length;a<o;a++)if(r===(n=p[a])[0]){s=n[1](t,e,i,r);break}if(null==s)throw"color mode "+r+" is not supported";return s.alpha(t.alpha()+i*(e.alpha()-t.alpha()))},ot.interpolate=P,T.prototype.interpolate=function(t,e,i){return P(this,t,e,i)},ot.mix=P,T.prototype.mix=T.prototype.interpolate,l.rgb=function(){var t,e,i,r;for(t in i=[],e=wt(arguments))r=e[t],i.push(r);return i},ot.rgb=function(){return function(t,e,i){i.prototype=t.prototype;var r=new i,n=t.apply(r,e);return Object(n)===n?n:r}(T,Et.call(arguments).concat(["rgb"]),function(){})},T.prototype.rgb=function(t){return null==t&&(t=!0),t?this._rgb.map(Math.round).slice(0,3):this._rgb.slice(0,3)},T.prototype.rgba=function(t){return null==t&&(t=!0),t?[Math.round(this._rgb[0]),Math.round(this._rgb[1]),Math.round(this._rgb[2]),this._rgb[3]]:this._rgb.slice(0)},u.push({p:3,test:function(t){var e;return e=wt(arguments),"array"===_t(e)&&3===e.length?"rgb":4===e.length&&"number"===_t(e[3])&&0<=e[3]&&e[3]<=1?"rgb":void 0}}),l.lrgb=l.rgb,D=function(t,e,i,r){var n,o;return n=t._rgb,o=e._rgb,new T(bt(ut(n[0],2)*(1-i)+ut(o[0],2)*i),bt(ut(n[1],2)*(1-i)+ut(o[1],2)*i),bt(ut(n[2],2)*(1-i)+ut(o[2],2)*i),r)},m=function(t){var e,i,r,n,o;for(e=1/t.length,o=[0,0,0,0],r=0,i=t.length;r<i;r++)n=t[r]._rgb,o[0]+=ut(n[0],2)*e,o[1]+=ut(n[1],2)*e,o[2]+=ut(n[2],2)*e,o[3]+=n[3]*e;return o[0]=bt(o[0]),o[1]=bt(o[1]),o[2]=bt(o[2]),new T(o)},p.push(["lrgb",D]),ot.average=function(t,e){var i,r,n,o,a,s,c,u,h,l,p,d,f;if(null==e&&(e="rgb"),h=t.length,c=(t=t.map(function(t){return ot(t)})).splice(0,1)[0],"lrgb"===e)return m(t);for(u in o=[],s=a=0,d=c.get(e))d[u]=d[u]||0,o.push(isNaN(d[u])?0:1),"h"!==e.charAt(u)||isNaN(d[u])||(i=d[u]/180*C,a+=O(i),s+=yt(i));for(r=c.alpha(),p=0,l=t.length;p<l;p++)for(u in f=(n=t[p]).get(e),r+=n.alpha(),d)isNaN(f[u])||(o[u]+=1,"h"===e.charAt(u)?(i=f[u]/180*C,a+=O(i),s+=yt(i)):d[u]+=f[u]);for(u in d)if("h"===e.charAt(u)){for(i=I(s/o[u],a/o[u])/C*180;i<0;)i+=360;for(;360<=i;)i-=360;d[u]=i}else d[u]=d[u]/o[u];return ot(d,e).alpha(r/h)},w=function(t){var e,i;if(t.match(/^#?([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/))return 4!==t.length&&7!==t.length||(t=t.substr(1)),3===t.length&&(t=(t=t.split(""))[0]+t[0]+t[1]+t[1]+t[2]+t[2]),[(i=parseInt(t,16))>>16,i>>8&255,255&i,1];if(t.match(/^#?([A-Fa-f0-9]{8})$/))return 9===t.length&&(t=t.substr(1)),[(i=parseInt(t,16))>>24&255,i>>16&255,i>>8&255,gt((255&i)/255*100)/100];if(null!=l.css&&(e=l.css(t)))return e;throw"unknown color: "+t},J=function(t,e){var i,r,n,o,a,s;return null==e&&(e="rgb"),a=t[0],n=t[1],r=t[2],i=t[3],a=Math.round(a),n=Math.round(n),r=Math.round(r),s=(s="000000"+(a<<16|n<<8|r).toString(16)).substr(s.length-6),o=(o="0"+gt(255*i).toString(16)).substr(o.length-2),"#"+function(){switch(e.toLowerCase()){case"rgba":return s+o;case"argb":return o+s;default:return s}}()},l.hex=function(t){return w(t)},ot.hex=function(){return function(t,e,i){i.prototype=t.prototype;var r=new i,n=t.apply(r,e);return Object(n)===n?n:r}(T,Et.call(arguments).concat(["hex"]),function(){})},T.prototype.hex=function(t){return null==t&&(t="rgb"),J(this._rgb,t)},u.push({p:4,test:function(t){if(1===arguments.length&&"string"===_t(t))return"hex"}}),M=function(){var t,e,i,r,n,o,a,s,c,u,h,l,p,d;if(n=(t=wt(arguments))[0],h=t[1],a=t[2],0===h)c=r=e=255*a;else{for(i=[0,0,0],l=2*a-(p=a<.5?a*(1+h):a+h-a*h),(d=[0,0,0])[0]=(n/=360)+1/3,d[1]=n,d[2]=n-1/3,o=s=0;s<=2;o=++s)d[o]<0&&(d[o]+=1),1<d[o]&&(d[o]-=1),6*d[o]<1?i[o]=l+6*(p-l)*d[o]:2*d[o]<1?i[o]=p:3*d[o]<2?i[o]=l+(p-l)*(2/3-d[o])*6:i[o]=l;c=(u=[gt(255*i[0]),gt(255*i[1]),gt(255*i[2])])[0],r=u[1],e=u[2]}return 3<t.length?[c,r,e,t[3]]:[c,r,e]},tt=function(t,e,i){var r,n,o,a,s;return void 0!==t&&3<=t.length&&(t=(a=t)[0],e=a[1],i=a[2]),t/=255,e/=255,i/=255,o=Math.min(t,e,i),n=((ct=Math.max(t,e,i))+o)/2,ct===o?(s=0,r=Number.NaN):s=n<.5?(ct-o)/(ct+o):(ct-o)/(2-ct-o),t===ct?r=(e-i)/(ct-o):e===ct?r=2+(i-t)/(ct-o):i===ct&&(r=4+(t-e)/(ct-o)),(r*=60)<0&&(r+=360),[r,s,n]},ot.hsl=function(){return function(t,e,i){i.prototype=t.prototype;var r=new i,n=t.apply(r,e);return Object(n)===n?n:r}(T,Et.call(arguments).concat(["hsl"]),function(){})},l.hsl=M,T.prototype.hsl=function(){return tt(this._rgb)},E=function(){var t,e,i,r,n,o,a,s,c,u,h,l,p,d,f,m,g,v;if(n=(t=wt(arguments))[0],m=t[1],v=t[2],v*=255,0===m)c=r=e=v;else switch(360===n&&(n=0),360<n&&(n-=360),n<0&&(n+=360),a=v*(1-m),s=v*(1-m*(i=(n/=60)-(o=at(n)))),g=v*(1-m*(1-i)),o){case 0:c=(u=[v,g,a])[0],r=u[1],e=u[2];break;case 1:c=(h=[s,v,a])[0],r=h[1],e=h[2];break;case 2:c=(l=[a,v,g])[0],r=l[1],e=l[2];break;case 3:c=(p=[a,s,v])[0],r=p[1],e=p[2];break;case 4:c=(d=[g,a,v])[0],r=d[1],e=d[2];break;case 5:c=(f=[v,a,s])[0],r=f[1],e=f[2]}return[c,r,e,3<t.length?t[3]:1]},et=function(){var t,e,i,r,n,o,a,s,c;return o=(a=wt(arguments))[0],i=a[1],t=a[2],n=Math.min(o,i,t),e=(ct=Math.max(o,i,t))-n,c=ct/255,0===ct?(r=Number.NaN,s=0):(s=e/ct,o===ct&&(r=(i-t)/e),i===ct&&(r=2+(t-o)/e),t===ct&&(r=4+(o-i)/e),(r*=60)<0&&(r+=360)),[r,s,c]},ot.hsv=function(){return function(t,e,i){i.prototype=t.prototype;var r=new i,n=t.apply(r,e);return Object(n)===n?n:r}(T,Et.call(arguments).concat(["hsv"]),function(){})},l.hsv=E,T.prototype.hsv=function(){return et(this._rgb)},X=function(t){return"number"===_t(t)&&0<=t&&t<=16777215?[t>>16,t>>8&255,255&t,1]:(console.warn("unknown num color: "+t),[0,0,0,1])},lt=function(){var t;return((t=wt(arguments))[0]<<16)+(t[1]<<8)+t[2]},ot.num=function(t){return new T(t,"num")},T.prototype.num=function(t){return null==t&&(t="rgb"),lt(this._rgb,t)},l.num=X,u.push({p:1,test:function(t){if(1===arguments.length&&"number"===_t(t)&&0<=t&&t<=16777215)return"num"}}),_=function(){var t,e,i,r,n,o,a,s,c,u,h,l,p,d,f,m,g,v,y,b;if(s=(i=wt(arguments))[0],n=i[1],e=i[2],a=a/100*255,t=255*(n/=100),0===n)l=a=r=e;else switch(360===s&&(s=0),360<s&&(s-=360),s<0&&(s+=360),h=(u=e*(1-n))+t*(1-(o=(s/=60)-(c=at(s)))),y=u+t*o,b=u+t,c){case 0:l=(p=[b,y,u])[0],a=p[1],r=p[2];break;case 1:l=(d=[h,b,u])[0],a=d[1],r=d[2];break;case 2:l=(f=[u,b,y])[0],a=f[1],r=f[2];break;case 3:l=(m=[u,h,b])[0],a=m[1],r=m[2];break;case 4:l=(g=[y,u,b])[0],a=g[1],r=g[2];break;case 5:l=(v=[b,u,h])[0],a=v[1],r=v[2]}return[l,a,r,3<i.length?i[3]:1]},K=function(){var t,e,i,r,n,o,a,s,c;return s=(c=wt(arguments))[0],n=c[1],e=c[2],a=Math.min(s,n,e),i=100*(r=(ct=Math.max(s,n,e))-a)/255,t=a/(255-r)*100,0===r?o=Number.NaN:(s===ct&&(o=(n-e)/r),n===ct&&(o=2+(e-s)/r),e===ct&&(o=4+(s-n)/r),(o*=60)<0&&(o+=360)),[o,i,t]},ot.hcg=function(){return function(t,e,i){i.prototype=t.prototype;var r=new i,n=t.apply(r,e);return Object(n)===n?n:r}(T,Et.call(arguments).concat(["hcg"]),function(){})},l.hcg=_,T.prototype.hcg=function(){return K(this._rgb)},v=function(t){var e,i,r,n,o,a,s,c;if(t=t.toLowerCase(),null!=ot.colors&&ot.colors[t])return w(ot.colors[t]);if(o=t.match(/rgb\(\s*(\-?\d+),\s*(\-?\d+)\s*,\s*(\-?\d+)\s*\)/)){for(s=o.slice(1,4),n=a=0;a<=2;n=++a)s[n]=+s[n];s[3]=1}else if(o=t.match(/rgba\(\s*(\-?\d+),\s*(\-?\d+)\s*,\s*(\-?\d+)\s*,\s*([01]|[01]?\.\d+)\)/))for(s=o.slice(1,5),n=c=0;c<=3;n=++c)s[n]=+s[n];else if(o=t.match(/rgb\(\s*(\-?\d+(?:\.\d+)?)%,\s*(\-?\d+(?:\.\d+)?)%\s*,\s*(\-?\d+(?:\.\d+)?)%\s*\)/)){for(s=o.slice(1,4),n=e=0;e<=2;n=++e)s[n]=gt(2.55*s[n]);s[3]=1}else if(o=t.match(/rgba\(\s*(\-?\d+(?:\.\d+)?)%,\s*(\-?\d+(?:\.\d+)?)%\s*,\s*(\-?\d+(?:\.\d+)?)%\s*,\s*([01]|[01]?\.\d+)\)/)){for(s=o.slice(1,5),n=i=0;i<=2;n=++i)s[n]=gt(2.55*s[n]);s[3]=+s[3]}else(o=t.match(/hsl\(\s*(\-?\d+(?:\.\d+)?),\s*(\-?\d+(?:\.\d+)?)%\s*,\s*(\-?\d+(?:\.\d+)?)%\s*\)/))?((r=o.slice(1,4))[1]*=.01,r[2]*=.01,(s=M(r))[3]=1):(o=t.match(/hsla\(\s*(\-?\d+(?:\.\d+)?),\s*(\-?\d+(?:\.\d+)?)%\s*,\s*(\-?\d+(?:\.\d+)?)%\s*,\s*([01]|[01]?\.\d+)\)/))&&((r=o.slice(1,4))[1]*=.01,r[2]*=.01,(s=M(r))[3]=+o[4]);return s},Z=function(t){var e;return"rgb"===(e=t[3]<1?"rgba":"rgb")?e+"("+t.slice(0,3).map(gt).join(",")+")":"rgba"===e?e+"("+t.slice(0,3).map(gt).join(",")+","+t[3]+")":void 0},mt=function(t){return gt(100*t)/100},A=function(t,e){var i;return i=e<1?"hsla":"hsl",t[0]=mt(t[0]||0),t[1]=mt(100*t[1])+"%",t[2]=mt(100*t[2])+"%","hsla"===i&&(t[3]=e),i+"("+t.join(",")+")"},l.css=function(t){return v(t)},ot.css=function(){return function(t,e,i){i.prototype=t.prototype;var r=new i,n=t.apply(r,e);return Object(n)===n?n:r}(T,Et.call(arguments).concat(["css"]),function(){})},T.prototype.css=function(t){return null==t&&(t="rgb"),"rgb"===t.slice(0,3)?Z(this._rgb):"hsl"===t.slice(0,3)?A(this.hsl(),this.alpha()):void 0},l.named=function(t){return w(St[t])},u.push({p:5,test:function(t){if(1===arguments.length&&null!=St[t])return"named"}}),T.prototype.name=function(t){var e,i;for(i in arguments.length&&(St[t]&&(this._rgb=w(St[t])),this._rgb[3]=1),e=this.hex(),St)if(e===St[i])return i;return e},U=function(){var t,e,i,r;return i=(r=wt(arguments))[0],t=r[1],e=r[2],[i,O(e*=n)*t,yt(e)*t]},j=function(){var t,e,i,r,n,o,a,s,c;return a=(i=wt(arguments))[0],n=i[1],o=i[2],t=(s=U(a,n,o))[0],e=s[1],r=s[2],[(c=F(t,e,r))[0],c[1],r=c[2],3<i.length?i[3]:1]},N=function(){var t,e,i,r,n,o;return n=(o=wt(arguments))[0],t=o[1],e=o[2],i=bt(t*t+e*e),r=(I(e,t)*a+360)%360,0===gt(1e4*i)&&(r=Number.NaN),[n,i,r]},rt=function(){var t,e,i,r,n,o,a;return n=(o=wt(arguments))[0],i=o[1],e=o[2],r=(a=it(n,i,e))[0],t=a[1],e=a[2],N(r,t,e)},ot.lch=function(){var t;return t=wt(arguments),new T(t,"lch")},ot.hcl=function(){var t;return t=wt(arguments),new T(t,"hcl")},l.lch=j,l.hcl=function(){var t,e,i,r;return e=(r=wt(arguments))[0],t=r[1],i=r[2],j([i,t,e])},T.prototype.lch=function(){return rt(this._rgb)},T.prototype.hcl=function(){return rt(this._rgb).reverse()},Y=function(t){var e,i,r,n,o,a;return null==t&&(t="rgb"),o=(a=wt(arguments))[0],r=a[1],e=a[2],r/=255,e/=255,[(1-(o/=255)-(n=1-Math.max(o,Math.max(r,e))))*(i=n<1?1/(1-n):0),(1-r-n)*i,(1-e-n)*i,n]},o=function(){var t,e,i,r,n,o;return i=(e=wt(arguments))[0],n=e[1],o=e[2],r=e[3],t=4<e.length?e[4]:1,1===r?[0,0,0,t]:[1<=i?0:255*(1-i)*(1-r),1<=n?0:255*(1-n)*(1-r),1<=o?0:255*(1-o)*(1-r),t]},l.cmyk=function(){return o(wt(arguments))},ot.cmyk=function(){return function(t,e,i){i.prototype=t.prototype;var r=new i,n=t.apply(r,e);return Object(n)===n?n:r}(T,Et.call(arguments).concat(["cmyk"]),function(){})},T.prototype.cmyk=function(){return Y(this._rgb)},l.gl=function(){var t,i,e,r,n;for(r=function(){var t,e;for(i in e=[],t=wt(arguments))n=t[i],e.push(n);return e}.apply(this,arguments),t=e=0;e<=2;t=++e)r[t]*=255;return r},ot.gl=function(){return function(t,e,i){i.prototype=t.prototype;var r=new i,n=t.apply(r,e);return Object(n)===n?n:r}(T,Et.call(arguments).concat(["gl"]),function(){})},T.prototype.gl=function(){var t;return[(t=this._rgb)[0]/255,t[1]/255,t[2]/255,t[3]]},ht=function(t,e,i){var r;return t=(r=wt(arguments))[0],e=r[1],i=r[2],.2126*(t=H(t))+.7152*(e=H(e))+.0722*(i=H(i))},H=function(t){return(t/=255)<=.03928?t/12.92:ut((t+.055)/1.055,2.4)},B=function(t,e,i,r){var n,o;return n=t._rgb,o=e._rgb,new T(n[0]+i*(o[0]-n[0]),n[1]+i*(o[1]-n[1]),n[2]+i*(o[2]-n[2]),r)},p.push(["rgb",B]),T.prototype.luminance=function(n,o){var t,a,e,s;return null==o&&(o="rgb"),arguments.length?(e=this._rgb,0===n?e=[0,0,0,this._rgb[3]]:1===n?e=[255,255,255,this[3]]:(t=ht(this._rgb),1e-7,a=20,s=function(t,e){var i,r;return i=(r=t.interpolate(e,.5,o)).luminance(),Math.abs(n-i)<1e-7||!a--?r:n<i?s(t,r):s(r,e)},e=n<t?s(ot("black"),this).rgba():s(this,ot("white")).rgba()),ot(e).alpha(this.alpha())):ht(this._rgb)},xt=function(t){var e,i,r,n;return(n=t/100)<66?(r=255,i=-155.25485562709179-.44596950469579133*(i=n-2)+104.49216199393888*st(i),e=n<20?0:.8274096064007395*(e=n-10)-254.76935184120902+115.67994401066147*st(e)):(r=351.97690566805693+.114206453784165*(r=n-55)-40.25366309332127*st(r),i=325.4494125711974+.07943456536662342*(i=n-50)-28.0852963507957*st(i),e=255),[r,i,e]},pt=function(){var t,e,i,r,n,o,a;for(r=(n=wt(arguments))[0],n[1],t=n[2],i=1e3,e=4e4,.4;.4<e-i;)(o=xt(a=.5*(e+i)))[2]/o[0]>=t/r?e=a:i=a;return gt(a)},ot.temperature=ot.kelvin=function(){return function(t,e,i){i.prototype=t.prototype;var r=new i,n=t.apply(r,e);return Object(n)===n?n:r}(T,Et.call(arguments).concat(["temperature"]),function(){})},l.temperature=l.kelvin=l.K=xt,T.prototype.temperature=function(){return pt(this._rgb)},T.prototype.kelvin=T.prototype.temperature,ot.contrast=function(t,e){var i,r,n,o;return"string"!==(n=_t(t))&&"number"!==n||(t=new T(t)),"string"!==(o=_t(e))&&"number"!==o||(e=new T(e)),i=t.luminance(),(r=e.luminance())<i?(i+.05)/(r+.05):(r+.05)/(i+.05)},ot.distance=function(t,e,i){var r,n,o,a,s,c,u;for(n in null==i&&(i="lab"),"string"!==(s=_t(t))&&"number"!==s||(t=new T(t)),"string"!==(c=_t(e))&&"number"!==c||(e=new T(e)),o=t.get(i),a=e.get(i),u=0,o)u+=(r=(o[n]||0)-(a[n]||0))*r;return Math.sqrt(u)},ot.deltaE=function(t,e,i,r){var n,o,a,s,c,u,h,l,p,d,f,m,g,v,y,b,x,_,w,S,A,M,E,P;for(null==i&&(i=1),null==r&&(r=1),"string"!==(y=_t(t))&&"number"!==y||(t=new T(t)),"string"!==(b=_t(e))&&"number"!==b||(e=new T(e)),n=(x=t.lab())[0],a=x[1],c=x[2],o=(_=e.lab())[0],s=_[1],u=_[2],h=bt(a*a+c*c),l=bt(s*s+u*u),S=n<16?.511:.040975*n/(1+.01765*n),w=.0638*h/(1+.0131*h)+.638,v=h<1e-6?0:180*I(c,a)/C;v<0;)v+=360;for(;360<=v;)v-=360;return A=164<=v&&v<=345?.56+nt(.2*O(C*(v+168)/180)):.36+nt(.4*O(C*(v+35)/180)),g=bt((p=h*h*h*h)/(p+1900)),bt((M=(n-o)/(i*S))*M+(E=(m=h-l)/(r*w))*E+((d=a-s)*d+(f=c-u)*f-m*m)/((P=w*(g*A+1-g))*P))},T.prototype.get=function(t){var e,i,r,n,o;return this,r=(n=t.split("."))[0],e=n[1],o=this[r](),e?-1<(i=r.indexOf(e))?o[i]:console.warn("unknown channel "+e+" in mode "+r):o},T.prototype.set=function(t,e){var i,r,n,o,a;if(this,n=(o=t.split("."))[0],i=o[1])if(a=this[n](),-1<(r=n.indexOf(i)))if("string"===_t(e))switch(e.charAt(0)){case"+":case"-":a[r]+=+e;break;case"*":a[r]*=+e.substr(1);break;case"/":a[r]/=+e.substr(1);break;default:a[r]=+e}else a[r]=e;else console.warn("unknown channel "+i+" in mode "+n);else a=e;return ot(a,n).alpha(this.alpha())},T.prototype.clipped=function(){return this._rgb._clipped||!1},T.prototype.alpha=function(t){return arguments.length?ot.rgb([this._rgb[0],this._rgb[1],this._rgb[2],t]):this._rgb[3]},T.prototype.darken=function(t){var e;return null==t&&(t=1),(e=this.lab())[0]-=s.Kn*t,ot.lab(e).alpha(this.alpha())},T.prototype.brighten=function(t){return null==t&&(t=1),this.darken(-t)},T.prototype.darker=T.prototype.darken,T.prototype.brighter=T.prototype.brighten,T.prototype.saturate=function(t){var e;return null==t&&(t=1),(e=this.lch())[1]+=t*s.Kn,e[1]<0&&(e[1]=0),ot.lch(e).alpha(this.alpha())},T.prototype.desaturate=function(t){return null==t&&(t=1),this.saturate(-t)},T.prototype.premultiply=function(){var t,e;return e=this.rgb(),t=this.alpha(),ot(e[0]*t,e[1]*t,e[2]*t,t)},W=function(t,e){return t*e/255},y=function(t,e){return e<t?e:t},G=function(t,e){return e<t?t:e},vt=function(t,e){return 255*(1-(1-t/255)*(1-e/255))},q=function(t,e){return e<128?2*t*e/255:255*(1-2*(1-t/255)*(1-e/255))},e=function(t,e){return 255*(1-(1-e/255)/(t/255))},b=function(t,e){return 255===t?255:255<(t=e/255*255/(1-t/255))?255:t},(r=function(t,e,i){if(!r[i])throw"unknown blend mode "+i;return r[i](t,e)}).normal=(t=function(n){return function(t,e){var i,r;return i=ot(e).rgb(),r=ot(t).rgb(),ot(n(i,r),"rgb")}})((x=function(o){return function(t,e){var i,r,n;for(n=[],i=r=0;r<=3;i=++r)n[i]=o(t[i],e[i]);return n}})(function(t,e){return t})),r.multiply=t(x(W)),r.screen=t(x(vt)),r.overlay=t(x(q)),r.darken=t(x(y)),r.lighten=t(x(G)),r.dodge=t(x(b)),r.burn=t(x(e)),ot.blend=r,ot.analyze=function(t){var e,i,r,n;for(r={min:Number.MAX_VALUE,max:-1*Number.MAX_VALUE,sum:0,values:[],count:0},i=0,e=t.length;i<e;i++)null==(n=t[i])||isNaN(n)||(r.values.push(n),r.sum+=n,n<r.min&&(r.min=n),n>r.max&&(r.max=n),r.count+=1);return r.domain=[r.min,r.max],r.limits=function(t,e){return ot.limits(r,t,e)},r},ot.scale=function(h,t){var l,u,p,e,d,f,m,g,v,y,i,b,x,r,_,w,S,A,s,n,M;return v="rgb",y=ot("#ccc"),d=[r=0,1],x=[],l=!(b=[0,0]),i=!(p=[]),g=0,u={},_=!(e=!(m=1)),f=1,n=function(t){var e,i,r,n,o,a;if(null==t&&(t=["#fff","#000"]),null!=t&&"string"===_t(t)&&null!=ot.brewer&&(t=ot.brewer[t]||ot.brewer[t.toLowerCase()]||t),"array"===_t(t)){for(e=r=0,n=(t=t.slice(0)).length-1;0<=n?r<=n:n<=r;e=0<=n?++r:--r)i=t[e],"string"===_t(i)&&(t[e]=ot(i));for(e=a=x.length=0,o=t.length-1;0<=o?a<=o:o<=a;e=0<=o?++a:--a)x.push(e/(t.length-1))}return s(),p=t},S=function(t){var e,i;if(null!=l){for(i=l.length-1,e=0;e<i&&t>=l[e];)e++;return e-1}return 0},M=function(t){return t},A=function(t,e){var i,r,n,o,a,s,c;if(null==e&&(e=!1),isNaN(t))return y;if(c=e?t:l&&2<l.length?S(t)/(l.length-2):m!==g?(t-g)/(m-g):1,e||(c=M(c)),1!==f&&(c=ut(c,f)),c=b[0]+c*(1-b[0]-b[1]),c=Math.min(1,Math.max(0,c)),n=Math.floor(1e4*c),_&&u[n])i=u[n];else{if("array"===_t(p))for(r=o=0,s=x.length-1;0<=s?o<=s:s<=o;r=0<=s?++o:--o){if(c<=(a=x[r])){i=p[r];break}if(a<=c&&r===x.length-1){i=p[r];break}if(a<c&&c<x[r+1]){c=(c-a)/(x[r+1]-a),i=ot.interpolate(p[r],p[r+1],c,v);break}}else"function"===_t(p)&&(i=p(c));_&&(u[n]=i)}return i},s=function(){return u={}},n(h),(w=function(t){var e;return e=ot(A(t)),i&&e[i]?e[i]():e}).classes=function(t){var e;return null!=t?("array"===_t(t)?d=[(l=t)[0],t[t.length-1]]:(e=ot.analyze(d),l=0===t?[e.min,e.max]:ot.limits(e,"e",t)),w):l},w.domain=function(t){var e,i,r,n,o,a,s;if(!arguments.length)return d;if(g=t[0],m=t[t.length-1],x=[],r=p.length,t.length===r&&g!==m)for(o=0,n=t.length;o<n;o++)i=t[o],x.push((i-g)/(m-g));else for(e=s=0,a=r-1;0<=a?s<=a:a<=s;e=0<=a?++s:--s)x.push(e/(r-1));return d=[g,m],w},w.mode=function(t){return arguments.length?(v=t,s(),w):v},w.range=function(t,e){return n(t),w},w.out=function(t){return i=t,w},w.spread=function(t){return arguments.length?(r=t,w):r},w.correctLightness=function(t){return null==t&&(t=!0),e=t,s(),M=e?function(t){var e,i,r,n,o,a,s,c,u;for(e=A(0,!0).lab()[0],i=A(1,!0).lab()[0],s=i<e,r=A(t,!0).lab()[0],n=r-(o=e+(i-e)*t),c=0,u=1,a=20;.01<Math.abs(n)&&0<a--;)s&&(n*=-1),t+=n<0?.5*(u-(c=t)):.5*(c-(u=t)),r=A(t,!0).lab()[0],n=r-o;return t}:function(t){return t},w},w.padding=function(t){return null!=t?("number"===_t(t)&&(t=[t,t]),b=t,w):b},w.colors=function(e,i){var r,n,t,o,a,s,c,u;if(arguments.length<2&&(i="hex"),a=[],0===arguments.length)a=p.slice(0);else if(1===e)a=[w(.5)];else if(1<e)n=d[0],r=d[1]-n,a=function(){s=[];for(var t=0;0<=e?t<e:e<t;0<=e?t++:t--)s.push(t);return s}.apply(this).map(function(t){return w(n+t/(e-1)*r)});else{if(h=[],c=[],l&&2<l.length)for(t=u=1,o=l.length;1<=o?u<o:o<u;t=1<=o?++u:--u)c.push(.5*(l[t-1]+l[t]));else c=d;a=c.map(function(t){return w(t)})}return ot[i]&&(a=a.map(function(t){return t[i]()})),a},w.cache=function(t){return null!=t?(_=t,w):_},w.gamma=function(t){return null!=t?(f=t,w):f},w},null==ot.scales&&(ot.scales={}),ot.scales.cool=function(){return ot.scale([ot.hsl(180,1,.9),ot.hsl(250,.7,.4)])},ot.scales.hot=function(){return ot.scale(["#000","#f00","#ff0","#fff"],[0,.25,.75,1]).mode("rgb")},ot.analyze=function(t,i,r){var n,e,o,a,s,c;if(s={min:Number.MAX_VALUE,max:-1*Number.MAX_VALUE,sum:0,values:[],count:0},null==r&&(r=function(){return!0}),n=function(t){null==t||isNaN(t)||(s.values.push(t),s.sum+=t,t<s.min&&(s.min=t),t>s.max&&(s.max=t),s.count+=1)},c=function(t,e){if(r(t,e))return null!=i&&"function"===_t(i)?n(i(t)):null!=i&&"string"===_t(i)||"number"===_t(i)?n(t[i]):n(t)},"array"===_t(t))for(a=0,o=t.length;a<o;a++)c(t[a]);else for(e in t)c(t[e],e);return s.domain=[s.min,s.max],s.limits=function(t,e){return ot.limits(s,t,e)},s},ot.limits=function(t,e,i){var r,n,o,a,s,c,u,h,l,p,d,f,m,g,v,y,b,x,_,w,S,A,M,E,P,T,C,I,O,L,R,D,k,B,N,F,z,U,j,G,V,H,$,W,X,q,Y,Z,K,J,Q,tt,et,it,rt;if(null==e&&(e="equal"),null==i&&(i=7),"array"===_t(t)&&(t=ot.analyze(t)),P=t.min,ct=t.max,t.sum,it=t.values.sort(function(t,e){return t-e}),1===i)return[P,ct];if(M=[],"c"===e.substr(0,1)&&(M.push(P),M.push(ct)),"e"===e.substr(0,1)){for(M.push(P),w=R=1,N=i-1;1<=N?R<=N:N<=R;w=1<=N?++R:--R)M.push(P+w/i*(ct-P));M.push(ct)}else if("l"===e.substr(0,1)){if(P<=0)throw"Logarithmic scales are only possible for values > 0";for(T=Math.LOG10E*st(P),E=Math.LOG10E*st(ct),M.push(P),w=rt=1,F=i-1;1<=F?rt<=F:F<=rt;w=1<=F?++rt:--rt)M.push(ut(10,T+w/i*(E-T)));M.push(ct)}else if("q"===e.substr(0,1)){for(M.push(P),w=r=1,H=i-1;1<=H?r<=H:H<=r;w=1<=H?++r:--r)D=(it.length-1)*w/i,(k=at(D))===D?M.push(it[k]):(B=D-k,M.push(it[k]*(1-B)+it[k+1]*B));M.push(ct)}else if("k"===e.substr(0,1)){for(I=it.length,g=new Array(I),x=new Array(i),J=!0,O=0,y=null,(y=[]).push(P),w=n=1,$=i-1;1<=$?n<=$:$<=n;w=1<=$?++n:--n)y.push(P+w/i*(ct-P));for(y.push(ct);J;){for(S=o=0,W=i-1;0<=W?o<=W:W<=o;S=0<=W?++o:--o)x[S]=0;for(w=a=0,X=I-1;0<=X?a<=X:X<=a;w=0<=X?++a:--a){for(et=it[w],C=Number.MAX_VALUE,S=s=0,q=i-1;0<=q?s<=q:q<=s;S=0<=q?++s:--s)(_=nt(y[S]-et))<C&&(C=_,v=S);x[v]++,g[w]=v}for(L=new Array(i),S=c=0,Y=i-1;0<=Y?c<=Y:Y<=c;S=0<=Y?++c:--c)L[S]=null;for(w=u=0,Z=I-1;0<=Z?u<=Z:Z<=u;w=0<=Z?++u:--u)null===L[b=g[w]]?L[b]=it[w]:L[b]+=it[w];for(S=h=0,K=i-1;0<=K?h<=K:K<=h;S=0<=K?++h:--h)L[S]*=1/x[S];for(J=!1,S=l=0,z=i-1;0<=z?l<=z:z<=l;S=0<=z?++l:--l)if(L[S]!==y[w]){J=!0;break}y=L,200<++O&&(J=!1)}for(A={},S=p=0,U=i-1;0<=U?p<=U:U<=p;S=0<=U?++p:--p)A[S]=[];for(w=d=0,j=I-1;0<=j?d<=j:j<=d;w=0<=j?++d:--d)A[b=g[w]].push(it[w]);for(Q=[],S=f=0,G=i-1;0<=G?f<=G:G<=f;S=0<=G?++f:--f)Q.push(A[S][0]),Q.push(A[S][A[S].length-1]);for(Q=Q.sort(function(t,e){return t-e}),M.push(Q[0]),w=m=1,V=Q.length-1;m<=V;w=m+=2)tt=Q[w],isNaN(tt)||-1!==M.indexOf(tt)||M.push(tt)}return M},S=function(t,e,i){var r,n,o,a;return t=(r=wt(arguments))[0],e=r[1],i=r[2],isNaN(t)&&(t=0),(t/=360)<1/3?o=1-((n=(1-e)/3)+(a=(1+e*O(d*t)/O(c-d*t))/3)):t<2/3?n=1-((a=(1-e)/3)+(o=(1+e*O(d*(t-=1/3))/O(c-d*t))/3)):a=1-((o=(1-e)/3)+(n=(1+e*O(d*(t-=2/3))/O(c-d*t))/3)),[255*(a=V(i*a*3)),255*(o=V(i*o*3)),255*(n=V(i*n*3)),3<r.length?r[3]:1]},Q=function(){var t,e,i,r,n,o,a;return n=(o=wt(arguments))[0],e=o[1],t=o[2],d=2*Math.PI,n/=255,e/=255,t/=255,0===(a=1-Math.min(n,e,t)/(r=(n+e+t)/3))?i=0:(i=(n-e+(n-t))/2,i/=Math.sqrt((n-e)*(n-e)+(n-t)*(e-t)),i=Math.acos(i),e<t&&(i=d-i),i/=d),[360*i,a,r]},ot.hsi=function(){return function(t,e,i){i.prototype=t.prototype;var r=new i,n=t.apply(r,e);return Object(n)===n?n:r}(T,Et.call(arguments).concat(["hsi"]),function(){})},l.hsi=S,T.prototype.hsi=function(){return Q(this._rgb)},L=function(t,e,i,r){var n,o,a,s,c,u,h,l,p,d;return"hsl"===r?(p=t.hsl(),d=e.hsl()):"hsv"===r?(p=t.hsv(),d=e.hsv()):"hcg"===r?(p=t.hcg(),d=e.hcg()):"hsi"===r?(p=t.hsi(),d=e.hsi()):"lch"!==r&&"hcl"!==r||(r="hcl",p=t.hcl(),d=e.hcl()),"h"===r.substr(0,1)&&(o=p[0],h=p[1],s=p[2],a=d[0],l=d[1],c=d[2]),isNaN(o)||isNaN(a)?isNaN(o)?isNaN(a)?n=Number.NaN:(n=a,1!==s&&0!==s||"hsv"===r||(u=l)):(n=o,1!==c&&0!==c||"hsv"===r||(u=h)):n=o+i*(o<a&&180<a-o?a-(o+360):a<o&&180<o-a?a+360-o:a-o),null==u&&(u=h+i*(l-h)),ot[r](n,u,s+i*(c-s))},k=function(t,e,i,r){var n,o;return n=t.num(),o=e.num(),ot.num(n+(o-n)*i,"num")},(p=p.concat(function(){var t,e,i,r;for(r=[],e=0,t=(i=["hsv","hsl","hsi","hcl","lch","hcg"]).length;e<t;e++)$=i[e],r.push([$,L]);return r}())).push(["num",k]),R=function(t,e,i,r){var n,o;return n=t.lab(),o=e.lab(),new T(n[0]+i*(o[0]-n[0]),n[1]+i*(o[1]-n[1]),n[2]+i*(o[2]-n[2]),r)},p.push(["lab",R])}).call(Kl)}).scale,tp={scale:"uniform",mode:"hcl",domain:[0,1],value:16777215,reverse:!1},ep=new ki,ip=function(t){void 0===t&&(t={}),this.parameters=xl(t,tp),"string"==typeof this.parameters.value&&(this.parameters.value=ep.set(this.parameters.value).getHex()),this.parameters.structure&&(this.atomProxy=this.parameters.structure.getAtomProxy())};ip.prototype.getScale=function(t){void 0===t&&(t={});var e=xl(t,this.parameters);return"rainbow"===e.scale?e.scale=["red","orange","yellow","green","blue"]:"rwb"===e.scale&&(e.scale=["red","white","blue"]),e.reverse&&e.domain.reverse(),Ql(e.scale).mode(e.mode).domain(e.domain).out("num")},ip.prototype.colorToArray=function(t,e,i){return void 0===e&&(e=[]),void 0===i&&(i=0),e[i]=(t>>16&255)/255,e[i+1]=(t>>8&255)/255,e[i+2]=(255&t)/255,e},ip.prototype.atomColorToArray=function(t,e,i){return this.colorToArray(this.atomColor?this.atomColor(t):0,e,i)},ip.prototype.bondColor=function(t,e){return this.atomProxy&&this.atomColor?(this.atomProxy.index=e?t.atomIndex1:t.atomIndex2,this.atomColor(this.atomProxy)):0},ip.prototype.bondColorToArray=function(t,e,i,r){return this.colorToArray(this.bondColor(t,e),i,r)},ip.prototype.volumeColorToArray=function(t,e,i){return this.colorToArray(this.volumeColor?this.volumeColor(t):0,e,i)},ip.prototype.positionColorToArray=function(t,e,i){return this.colorToArray(this.positionColor?this.positionColor(t):0,e,i)};var rp,np,op=Jl(function(n){!function(t){function a(t,e,i,r,n){this._listener=e,this._isOnce=i,this.context=r,this._signal=t,this._priority=n||0}function r(t,e){if("function"!=typeof t)throw new Error("listener is a required param of {fn}() and should be a Function.".replace("{fn}",e))}function e(){this._bindings=[],this._prevParams=null;var t=this;this.dispatch=function(){e.prototype.dispatch.apply(t,arguments)}}e.prototype={VERSION:"1.0.0",memorize:!(a.prototype={active:!0,params:null,execute:function(t){var e,i;return this.active&&this._listener&&(i=this.params?this.params.concat(t):t,e=this._listener.apply(this.context,i),this._isOnce&&this.detach()),e},detach:function(){return this.isBound()?this._signal.remove(this._listener,this.context):null},isBound:function(){return!!this._signal&&!!this._listener},isOnce:function(){return this._isOnce},getListener:function(){return this._listener},getSignal:function(){return this._signal},_destroy:function(){delete this._signal,delete this._listener,delete this.context},toString:function(){return"[SignalBinding isOnce:"+this._isOnce+", isBound:"+this.isBound()+", active:"+this.active+"]"}}),_shouldPropagate:!0,active:!0,_registerListener:function(t,e,i,r){var n,o=this._indexOfListener(t,i);if(-1!==o){if((n=this._bindings[o]).isOnce()!==e)throw new Error("You cannot add"+(e?"":"Once")+"() then add"+(e?"Once":"")+"() the same listener without removing the relationship first.")}else n=new a(this,t,e,i,r),this._addBinding(n);return this.memorize&&this._prevParams&&n.execute(this._prevParams),n},_addBinding:function(t){for(var e=this._bindings.length;--e,this._bindings[e]&&t._priority<=this._bindings[e]._priority;);this._bindings.splice(e+1,0,t)},_indexOfListener:function(t,e){for(var i,r=this._bindings.length;r--;)if((i=this._bindings[r])._listener===t&&i.context===e)return r;return-1},has:function(t,e){return-1!==this._indexOfListener(t,e)},add:function(t,e,i){return r(t,"add"),this._registerListener(t,!1,e,i)},addOnce:function(t,e,i){return r(t,"addOnce"),this._registerListener(t,!0,e,i)},remove:function(t,e){r(t,"remove");var i=this._indexOfListener(t,e);return-1!==i&&(this._bindings[i]._destroy(),this._bindings.splice(i,1)),t},removeAll:function(){for(var t=this._bindings.length;t--;)this._bindings[t]._destroy();this._bindings.length=0},getNumListeners:function(){return this._bindings.length},halt:function(){this._shouldPropagate=!1},dispatch:function(t){if(this.active){var e,i=Array.prototype.slice.call(arguments),r=this._bindings.length;if(this.memorize&&(this._prevParams=i),r)for(e=this._bindings.slice(),this._shouldPropagate=!0;e[--r]&&this._shouldPropagate&&!1!==e[r].execute(i););}},forget:function(){this._prevParams=null},dispose:function(){this.removeAll(),delete this._bindings,delete this._prevParams},toString:function(){return"[Signal active:"+this.active+" numListeners:"+this.getNumListeners()+"]"}};var i=e;i.Signal=e,n.exports?n.exports=i:t.signals=i}(Kl)}).Signal;(np=rp||(rp={}))[np.PROTEIN=1]="PROTEIN",np[np.NUCLEIC=2]="NUCLEIC",np[np.RNA=3]="RNA",np[np.DNA=4]="DNA",np[np.POLYMER=5]="POLYMER",np[np.WATER=6]="WATER",np[np.HELIX=7]="HELIX",np[np.SHEET=8]="SHEET",np[np.TURN=9]="TURN",np[np.BACKBONE=10]="BACKBONE",np[np.SIDECHAIN=11]="SIDECHAIN",np[np.ALL=12]="ALL",np[np.HETERO=13]="HETERO",np[np.ION=14]="ION",np[np.SACCHARIDE=15]="SACCHARIDE",np[np.SUGAR=15]="SUGAR",np[np.BONDED=16]="BONDED",np[np.RING=17]="RING",np[np.AROMATICRING=18]="AROMATICRING",np[np.METAL=19]="METAL",np[np.NONE=20]="NONE";var ap=["*","","ALL"],sp=["NONE"],cp=[rp.BACKBONE,rp.SIDECHAIN,rp.BONDED,rp.RING,rp.AROMATICRING,rp.METAL],up=[rp.POLYMER,rp.WATER],hp=["ALA","GLY","SER"],lp=["CYS","SER","THR"],pp=["ALA","ILE","LEU","MET","PHE","PRO","TRP","VAL"],dp=["PHE","TRP","TYR","HIS"],fp=["ASN","GLN"],mp=["ASP","GLU"],gp=["ARG","HIS","LYS"],vp=["ARG","ASP","GLU","HIS","LYS"],yp=["ASN","ARG","ASP","CYS","GLY","GLN","GLU","HIS","LYS","SER","THR","TYR"],bp=["ALA","ILE","LEU","MET","PHE","PRO","TRP","VAL"],xp=["HIS","PHE","PRO","TRP","TYR"],_p=["ALA","GLY","ILE","LEU","VAL"];function wp(t,e){if(void 0===e.atomname&&void 0===e.element&&void 0===e.altloc&&void 0===e.atomindex&&void 0===e.keyword&&void 0===e.inscode&&void 0===e.resname&&void 0===e.sstruc&&void 0===e.resno&&void 0===e.chainname&&void 0===e.model)return-1;if(void 0!==e.keyword){if(e.keyword===rp.BACKBONE&&!t.isBackbone())return!1;if(e.keyword===rp.SIDECHAIN&&!t.isSidechain())return!1;if(e.keyword===rp.BONDED&&!t.isBonded())return!1;if(e.keyword===rp.RING&&!t.isRing())return!1;if(e.keyword===rp.AROMATICRING&&!t.isAromatic())return!1;if(e.keyword===rp.HETERO&&!t.isHetero())return!1;if(e.keyword===rp.PROTEIN&&!t.isProtein())return!1;if(e.keyword===rp.NUCLEIC&&!t.isNucleic())return!1;if(e.keyword===rp.RNA&&!t.isRna())return!1;if(e.keyword===rp.DNA&&!t.isDna())return!1;if(e.keyword===rp.POLYMER&&!t.isPolymer())return!1;if(e.keyword===rp.WATER&&!t.isWater())return!1;if(e.keyword===rp.HELIX&&!t.isHelix())return!1;if(e.keyword===rp.SHEET&&!t.isSheet())return!1;if(e.keyword===rp.TURN&&!t.isTurn())return!1;if(e.keyword===rp.ION&&!t.isIon())return!1;if(e.keyword===rp.SACCHARIDE&&!t.isSaccharide())return!1;if(e.keyword===rp.METAL&&!t.isMetal())return!1}if(void 0!==e.atomname&&e.atomname!==t.atomname)return!1;if(void 0!==e.element&&e.element!==t.element)return!1;if(void 0!==e.altloc&&e.altloc!==t.altloc)return!1;if(void 0!==e.atomindex&&Pl(e.atomindex,t.index)<0)return!1;if(void 0!==e.resname)if(Array.isArray(e.resname)){if(!e.resname.includes(t.resname))return!1}else if(e.resname!==t.resname)return!1;if(void 0!==e.sstruc&&e.sstruc!==t.sstruc)return!1;if(void 0!==e.resno)if(Array.isArray(e.resno)&&2===e.resno.length){if(e.resno[0]>t.resno||e.resno[1]<t.resno)return!1}else if(e.resno!==t.resno)return!1;return(void 0===e.inscode||e.inscode===t.inscode)&&((void 0===e.chainname||e.chainname===t.chainname)&&(void 0===e.model||e.model===t.modelIndex))}function Sp(t,e){if(void 0===e.resname&&void 0===e.resno&&void 0===e.inscode&&void 0===e.sstruc&&void 0===e.model&&void 0===e.chainname&&void 0===e.atomindex&&(void 0===e.keyword||cp.includes(e.keyword)))return-1;if(void 0!==e.keyword){if(e.keyword===rp.HETERO&&!t.isHetero())return!1;if(e.keyword===rp.PROTEIN&&!t.isProtein())return!1;if(e.keyword===rp.NUCLEIC&&!t.isNucleic())return!1;if(e.keyword===rp.RNA&&!t.isRna())return!1;if(e.keyword===rp.DNA&&!t.isDna())return!1;if(e.keyword===rp.POLYMER&&!t.isPolymer())return!1;if(e.keyword===rp.WATER&&!t.isWater())return!1;if(e.keyword===rp.HELIX&&!t.isHelix())return!1;if(e.keyword===rp.SHEET&&!t.isSheet())return!1;if(e.keyword===rp.TURN&&!t.isTurn())return!1;if(e.keyword===rp.ION&&!t.isIon())return!1;if(e.keyword===rp.SACCHARIDE&&!t.isSaccharide())return!1}if(void 0!==e.atomindex&&0===Tl(e.atomindex,t.atomOffset,t.atomEnd))return!1;if(void 0!==e.resname)if(Array.isArray(e.resname)){if(!e.resname.includes(t.resname))return!1}else if(e.resname!==t.resname)return!1;if(void 0!==e.sstruc&&e.sstruc!==t.sstruc)return!1;if(void 0!==e.resno)if(Array.isArray(e.resno)&&2===e.resno.length){if(e.resno[0]>t.resno||e.resno[1]<t.resno)return!1}else if(e.resno!==t.resno)return!1;return(void 0===e.inscode||e.inscode===t.inscode)&&((void 0===e.chainname||e.chainname===t.chainname)&&(void 0===e.model||e.model===t.modelIndex))}function Ap(t,e){if(!(void 0!==e.chainname||void 0!==e.model||void 0!==e.atomindex||void 0!==e.keyword&&up.includes(e.keyword)&&t.entity))return-1;if(void 0!==e.keyword){if(e.keyword===rp.POLYMER&&!t.entity.isPolymer())return!1;if(e.keyword===rp.WATER&&!t.entity.isWater())return!1}return(void 0===e.atomindex||0!==Tl(e.atomindex,t.atomOffset,t.atomEnd))&&((void 0===e.chainname||e.chainname===t.chainname)&&(void 0===e.model||e.model===t.modelIndex))}function Mp(t,e){return void 0===e.model&&void 0===e.atomindex?-1:(void 0===e.atomindex||0!==Tl(e.atomindex,t.atomOffset,t.atomEnd))&&(void 0===e.model||e.model===t.index)}function Ep(s,c){if(null===s)return!1;if(s.error)return!1;if(!s.rules||0===s.rules.length)return!1;for(var u=s.rules.length,h=!s.negate,l=!!s.negate,p=[],t=0;t<u;++t){var e=s.rules[t];e.hasOwnProperty("operator")&&(p[t]=Ep(e,c))}return function(t){for(var e="AND"===s.operator,i=!1,r=0;r<u;++r){var n=s.rules[r],o=void 0;if(n.hasOwnProperty("operator")){var a=p[r];if(-1===(o=!1!==a?a(t):-1)){i=!0;continue}if(!0===o){if(e)continue;return h}if(e)return l}else{if(n.keyword===rp.ALL){if(e)continue;return h}if(n.keyword===rp.NONE){if(e)continue;return l}if(-1!==(o=c(t,n))){if(!0===o){if(e)continue;return h}if(e)return l}else i=!0}}return i?-1:e?h:l}}function Pp(t,e){if(t.error)return t;if(!t.rules||0===t.rules.length)return t;var i=t.rules.length,r={operator:t.operator,rules:[]};t.hasOwnProperty("negate")&&(r.negate=t.negate);for(var n=0;n<i;++n){var o=t.rules[n];if(o.hasOwnProperty("operator")){var a=Pp(o,e);null!==a&&r.rules.push(a)}else e(o)||r.rules.push(o)}return 0<r.rules.length?t:null}function Tp(t,e){void 0===e&&(e=!1);var i=t;return e&&(i=Pp(t,function(t){return void 0!==t.keyword&&!cp.includes(t.keyword)||(void 0!==t.model||(void 0!==t.chainname||(void 0!==t.resname||(void 0!==t.resno||void 0!==t.sstruc))))})),Ep(i,wp)}function Cp(t,e){void 0===e&&(e=!1);var i=t;return e&&(i=Pp(t,function(t){return!(void 0===t.keyword||!cp.includes(t.keyword))||(void 0!==t.model||(void 0!==t.chainname||(void 0!==t.atomname||(void 0!==t.element||void 0!==t.altloc))))})),Ep(i,Sp)}function Ip(t,e){void 0===e&&(e=!1);var i=t;return e&&(i=Pp(t,function(t){return void 0!==t.keyword&&!up.includes(t.keyword)||(void 0!==t.resname||(void 0!==t.resno||(void 0!==t.atomname||(void 0!==t.element||(void 0!==t.altloc||(void 0!==t.sstruc||void 0!==t.inscode))))))})),Ep(i,Ap)}function Op(t,e){void 0===e&&(e=!1);var i=t;return e&&(i=Pp(t,function(t){return void 0!==t.keyword||(void 0!==t.chainname||(void 0!==t.resname||(void 0!==t.resno||(void 0!==t.atomname||(void 0!==t.element||(void 0!==t.altloc||(void 0!==t.sstruc||void 0!==t.inscode)))))))})),Ep(i,Mp)}var Lp=function(t){this.signals={stringChanged:new op},this.setString(t)},Rp={type:{configurable:!0}};Rp.type.get=function(){return"selection"},Lp.prototype.setString=function(t,e){if(void 0===t&&(t=this.string||""),t!==this.string){try{this.selection=function(t){var e={operator:void 0,rules:[]};if(!t)return e;var i,r,n=e,o=[];"("===(t=t.replace(/\(/g," ( ").replace(/\)/g," ) ").trim()).charAt(0)&&")"===t.substr(-1)&&(t=t.slice(1,-1).trim());for(var a=t.split(/\s+/),s=function(t){i={operator:t,rules:[]},void 0===n?e=n=i:(n.rules.push(i),o.push(n),n=i)},c=function(t){r=n,void 0===(n=o.pop())&&(s(t),u(r))},u=function(t){n.rules.push(t)},h=!1,l=0;l<a.length;++l){var p=a[l],d=p.toUpperCase();if("("!==p)if(")"!==p){if(0<h)if("NOT"===d)h=1;else if(1===h)h=2;else{if(2!==h)throw new Error("something went wrong with 'not'");h=!1,c()}if("AND"!==d)if("OR"!==d)if("NOT"!==p.toUpperCase()){if(+d!=+d){var f=rp[d];if(void 0!==f){u({keyword:f});continue}}if("HYDROGEN"!==d)if("SMALL"!==d)if("NUCLEOPHILIC"!==d)if("HYDROPHOBIC"!==d)if("AROMATIC"!==d)if("AMIDE"!==d)if("ACIDIC"!==d)if("BASIC"!==d)if("CHARGED"!==d)if("POLAR"!==d)if("NONPOLAR"!==d)if("CYCLIC"!==d)if("ALIPHATIC"!==d)if("SIDECHAINATTACHED"!==d)if("LIGAND"!==d)if(-1===ap.indexOf(d))if("@"!==p.charAt(0))if("#"!==p.charAt(0))if("_"!==p.charAt(0))if("["!==p[0]||"]"!==p[p.length-1])if(1<=p.length&&p.length<=4&&"^"!==p[0]&&":"!==p[0]&&"."!==p[0]&&"%"!==p[0]&&"/"!==p[0]&&isNaN(parseInt(p)))u({resname:d});else{var m={operator:"AND",rules:[]},g=p.split("/");if(1<g.length&&g[1]){if(isNaN(parseInt(g[1])))throw new Error("model must be an integer");m.rules.push({model:parseInt(g[1])})}var v=g[0].split("%");1<v.length&&m.rules.push({altloc:v[1]});var y=v[0].split(".");if(1<y.length&&y[1]){if(4<y[1].length)throw new Error("atomname must be one to four characters");m.rules.push({atomname:y[1].substring(0,4).toUpperCase()})}var b=y[0].split(":");1<b.length&&b[1]&&m.rules.push({chainname:b[1]});var x=b[0].split("^");if(1<x.length&&m.rules.push({inscode:x[1]}),x[0]){var _=void 0,w=void 0;"-"===x[0][0]&&(x[0]=x[0].substr(1),_=!0),x[0].includes("--")&&(x[0]=x[0].replace("--","-"),w=!0);var S=x[0].split("-");if(1===S.length){var A=parseInt(S[0]);if(isNaN(A))throw new Error("resi must be an integer");_&&(A*=-1),m.rules.push({resno:A})}else{if(2!==S.length)throw new Error("resi range must contain one '-'");var M=S.map(function(t){return parseInt(t)});_&&(M[0]*=-1),w&&(M[1]*=-1),m.rules.push({resno:[M[0],M[1]]})}}if(1===m.rules.length)u(m.rules[0]);else{if(!(1<m.rules.length))throw new Error("empty selection chunk");u(m)}}else{var E=d.substr(1,p.length-2).split(","),P=1<E.length?E:E[0];u({resname:P})}else u({element:d.substr(1)});else console.error("# for element selection deprecated, use _"),u({element:d.substr(1)});else{var T=p.substr(1).split(",").map(function(t){return parseInt(t)});T.sort(function(t,e){return t-e}),u({atomindex:T})}else u({keyword:rp.ALL});else u({operator:"AND",rules:[{operator:"OR",rules:[{operator:"AND",rules:[{keyword:rp.HETERO},{negate:!0,operator:void 0,rules:[{keyword:rp.POLYMER}]}]},{negate:!0,operator:void 0,rules:[{keyword:rp.POLYMER}]}]},{negate:!0,operator:void 0,rules:[{operator:"OR",rules:[{keyword:rp.WATER},{keyword:rp.ION}]}]}]});else u({operator:"OR",rules:[{keyword:rp.SIDECHAIN},{operator:"AND",negate:!1,rules:[{keyword:rp.PROTEIN},{operator:"OR",negate:!1,rules:[{atomname:"CA"},{atomname:"BB"}]}]},{operator:"AND",negate:!1,rules:[{resname:"PRO"},{atomname:"N"}]},{operator:"AND",negate:!1,rules:[{keyword:rp.NUCLEIC},{operator:"OR",negate:!0,rules:[{atomname:"P"},{atomname:"OP1"},{atomname:"OP2"},{atomname:"O3'"},{atomname:"O3*"},{atomname:"O5'"},{atomname:"O5*"},{atomname:"C5'"},{atomname:"C5*"}]}]}]});else u({resname:_p});else u({resname:xp});else u({resname:bp});else u({resname:yp});else u({resname:vp});else u({resname:gp});else u({resname:mp});else u({resname:fp});else u({resname:dp});else u({resname:pp});else u({resname:lp});else u({resname:hp});else u({operator:"OR",rules:[{element:"H"},{element:"D"}]})}else h=1,s(),n.negate=!0;else"AND"===n.operator?c("OR"):n.operator="OR";else if("OR"===n.operator){var C=n.rules.pop();s("AND"),u(C)}else n.operator="AND"}else c(),n.negate&&c();else h=!1,s()}return void 0===e.operator&&1===e.rules.length&&e.rules[0].hasOwnProperty("operator")&&(e=e.rules[0]),e}(t)}catch(t){this.selection={error:t.message}}var i=this.selection;this.string=t,this.test=Tp(i),this.residueTest=Cp(i),this.chainTest=Ip(i),this.modelTest=Op(i),this.atomOnlyTest=Tp(i,!0),this.residueOnlyTest=Cp(i,!0),this.chainOnlyTest=Ip(i,!0),this.modelOnlyTest=Op(i,!0),e||this.signals.stringChanged.dispatch(this.string)}},Lp.prototype.isAllSelection=function(){return ap.includes(this.string.toUpperCase())},Lp.prototype.isNoneSelection=function(){return sp.includes(this.string.toUpperCase())},Object.defineProperties(Lp.prototype,Rp);var Dp=function(e){function t(t){var n=this;e.call(this,t),this.colormakerList=[],this.selectionList=[],(t.dataList||[]).forEach(function(t){var e=t[0],i=t[1],r=t[2];void 0===r&&(r={}),Qp.hasScheme(e)?Object.assign(r,{scheme:e,structure:n.parameters.structure}):Object.assign(r,{scheme:"uniform",value:new ki(e).getHex()}),n.colormakerList.push(Qp.getScheme(r)),n.selectionList.push(new Lp(i))})}return e&&(t.__proto__=e),((t.prototype=Object.create(e&&e.prototype)).constructor=t).prototype.atomColor=function(t){for(var e=0,i=this.selectionList.length;e<i;++e){var r=this.selectionList[e].test;if(r&&r(t))return this.colormakerList[e].atomColor(t)}return 16777215},t}(ip),kp={"":"",OrRd:"[S] Orange-Red",PuBu:"[S] Purple-Blue",BuPu:"[S] Blue-Purple",Oranges:"[S] Oranges",BuGn:"[S] Blue-Green",YlOrBr:"[S] Yellow-Orange-Brown",YlGn:"[S] Yellow-Green",Reds:"[S] Reds",RdPu:"[S] Red-Purple",Greens:"[S] Greens",YlGnBu:"[S] Yellow-Green-Blue",Purples:"[S] Purples",GnBu:"[S] Green-Blue",Greys:"[S] Greys",YlOrRd:"[S] Yellow-Orange-Red",PuRd:"[S] Purple-Red",Blues:"[S] Blues",PuBuGn:"[S] Purple-Blue-Green",Viridis:"[D] Viridis",Spectral:"[D] Spectral",RdYlGn:"[D] Red-Yellow-Green",RdBu:"[D] Red-Blue",PiYG:"[D] Pink-Yellowgreen",PRGn:"[D] Purplered-Green",RdYlBu:"[D] Red-Yellow-Blue",BrBG:"[D] Brown-Bluegreen",RdGy:"[D] Red-Grey",PuOr:"[D] Purple-Orange",Set1:"[Q] Set1",Set2:"[Q] Set2",Set3:"[Q] Set3",Dark2:"[Q] Dark2",Paired:"[Q] Paired",Pastel1:"[Q] Pastel1",Pastel2:"[Q] Pastel2",Accent:"[Q] Accent",rainbow:"[?] Rainbow",rwb:"[?] Red-White-Blue"},Bp={"":"",rgb:"Red Green Blue",hsv:"Hue Saturation Value",hsl:"Hue Saturation Lightness",hsi:"Hue Saturation Intensity",lab:"CIE L*a*b*",hcl:"Hue Chroma Lightness"},Np=function(){this.schemes={},this.userSchemes={}};Np.prototype.getScheme=function(t){var e=((t||{}).scheme||"").toLowerCase();return new(e in this.schemes?this.schemes[e]:e in this.userSchemes?this.userSchemes[e]:ip)(t)},Np.prototype.getSchemes=function(){var e={};return Object.keys(this.schemes).forEach(function(t){e[t]=t}),Object.keys(this.userSchemes).forEach(function(t){e[t]=t.split("|")[1]}),e},Np.prototype.getScales=function(){return kp},Np.prototype.getModes=function(){return Bp},Np.prototype.add=function(t,e){t=t.toLowerCase(),this.schemes[t]=e},Np.prototype.addScheme=function(t,e){return t instanceof ip||(t=this._createScheme(t)),this._addUserScheme(t,e)},Np.prototype._addUserScheme=function(t,e){e=e||"";var i=($l()+"|"+e).toLowerCase();return this.userSchemes[i]=t,i},Np.prototype.removeScheme=function(t){t=t.toLowerCase(),delete this.userSchemes[t]},Np.prototype._createScheme=function(e){var t=function(t){ip.call(this,t),e.call(this,t)};return(t.prototype=ip.prototype).constructor=ip,t},Np.prototype.addSelectionScheme=function(i,t){var e=function(e){function t(t){e.call(this,Object.assign({dataList:i},t))}return e&&(t.__proto__=e),(t.prototype=Object.create(e&&e.prototype)).constructor=t}(Dp);return this._addUserScheme(e,t)},Np.prototype.hasScheme=function(t){return(t=t.toLowerCase())in this.schemes||t in this.userSchemes};var Fp=function(t){function e(){t.call(this,"parser")}return t&&(e.__proto__=t),((e.prototype=Object.create(t&&t.prototype)).constructor=e).prototype.__hasObjName=function(t,e){var i=this.get(t);return i&&i.prototype.__objName===e},e.prototype.isTrajectory=function(t){return this.__hasObjName(t,"frames")},e.prototype.isStructure=function(t){return this.__hasObjName(t,"structure")},e.prototype.isVolume=function(t){return this.__hasObjName(t,"volume")},e.prototype.isSurface=function(t){return this.__hasObjName(t,"surface")},e.prototype.isBinary=function(t){var e=this.get(t);return e&&e.prototype.isBinary},e.prototype.isXml=function(t){var e=this.get(t);return e&&e.prototype.isXml},e.prototype.isJson=function(t){var e=this.get(t);return e&&e.prototype.isJson},e.prototype.getTrajectoryExtensions=function(){var e=this;return this.names.filter(function(t){return e.isTrajectory(t)})},e.prototype.getStructureExtensions=function(){var e=this;return this.names.filter(function(t){return e.isStructure(t)})},e.prototype.getVolumeExtensions=function(){var e=this;return this.names.filter(function(t){return e.isVolume(t)})},e.prototype.getSurfaceExtensions=function(){var e=this;return this.names.filter(function(t){return e.isSurface(t)})},e}(Ul);function zp(t){return Cl(function e(t){var i=t;return t.forEach(function(t){t.__deps&&Array.prototype.push.apply(i,e(t.__deps))}),i}(t)).map(function(t){return t.toString()}).join("\n\n\n")}function Up(t,e){var i="'use strict';\n\n"+zp(e);return i+="\n\n\nself.func = "+t.toString()+";",i+="\n\n\nself.onmessage = "+function(t){var e=t.data.__name,i=t.data.__postId;void 0===e?console.error("message __name undefined"):void 0===self.func?console.error("worker func undefined",e):self.func(t,function(e,t){e=e||{},void 0!==i&&(e.__postId=i);try{self.postMessage(e,t)}catch(t){console.error("self.postMessage:",t),self.postMessage(e)}})}.toString()+";",new Blob([i],{type:"application/javascript"})}var jp=function(){this.activeWorkerCount=0,this._funcDict={},this._depsDict={},this._blobDict={}};jp.prototype.add=function(t,e,i){this._funcDict[t]=e,this._depsDict[t]=i},jp.prototype.get=function(t){return this._blobDict[t]||(this._blobDict[t]=Up(this._funcDict[t],this._depsDict[t])),this._blobDict[t]};var Gp=Sl(),Vp=!1;try{var Hp=Object.defineProperty({},"passive",{get:function(){Vp=!0}});window.addEventListener("test",function(t){},Hp)}catch(t){}var $p="undefined"!=typeof window&&void 0!==window.orientation,Wp=!1;var Xp=!1;var qp,Yp={log:Function.prototype.bind.call(console.log,console),info:Function.prototype.bind.call(console.info,console),warn:Function.prototype.bind.call(console.warn,console),error:Function.prototype.bind.call(console.error,console),time:Function.prototype.bind.call(console.time,console),timeEnd:Function.prototype.bind.call(console.timeEnd,console)},Zp={color:"green",labelColor:"grey",labelAttachment:"bottom-center",labelSize:.7,labelZOffset:.5,labelYOffset:.1,labelBorder:!0,labelBorderColor:"lightgrey",labelBorderWidth:.25,lineOpacity:.8,linewidth:5,opacity:.6,labelUnit:"angstrom",arcVisible:!0,planeVisible:!1};de.Debug=!!(qp=yl("debug"))&&("string"!=typeof qp||/^1|true|t|yes|y$/i.test(qp));var Kp=["ngl","js"],Jp=new jp,Qp=new Np,td=new Ul("datasource"),ed=new Ul("representatation"),id=new Fp,rd=new Ul("shader"),nd=new Ul("decompressor"),od=new Ul("component"),ad=new Ul("buffer"),sd=new Ul("picker");var cd=function(t,e){void 0===e&&(e={}),this.chunkSize=10485760,this.newline="\n",this.__pointer=0,this.__partialLine="",this.compressed=bl(e.compressed,!1),this.binary=bl(e.binary,!1),this.json=bl(e.json,!1),this.xml=bl(e.xml,!1),this.src=t};cd.prototype.isBinary=function(){return this.binary||this.compressed},cd.prototype.read=function(){var i=this;return this._read().then(function(t){var e=i.compressed?nd.get(i.compressed):void 0;return i.compressed&&e?i.data=e(t):((i.binary||i.compressed)&&t instanceof ArrayBuffer&&(t=new Uint8Array(t)),i.data=t),i.data})},cd.prototype._chunk=function(t,e){return e=Math.min(this.data.length,e),0===t&&this.data.length===e?this.data:this.isBinary()?this.data.subarray(t,e):this.data.substring(t,e)},cd.prototype.chunk=function(t){var e=t+this.chunkSize;return this._chunk(t,e)},cd.prototype.peekLines=function(t){var e,i=this.data,r=i.length,n=this.isBinary()?this.newline.charCodeAt(0):this.newline,o=0;for(e=0;e<r&&(i[e]===n&&++o,o!==t);++e);var a=this._chunk(0,e+1);return this.chunkToLines(a,"",r<e).lines},cd.prototype.chunkCount=function(){return Math.floor(this.data.length/this.chunkSize)+1},cd.prototype.asText=function(){return this.isBinary()?Il(this.data):this.data},cd.prototype.chunkToLines=function(t,e,i){var r=this.newline;if(!this.isBinary()&&t.length===this.data.length)return{lines:t.split(r),partialLine:""};var n=[],o=this.isBinary()?Il(t):t,a=o.lastIndexOf(r);if(-1===a)e+=o;else{var s=e+o.substr(0,a);n=n.concat(s.split(r)),e=a===o.length-r.length?"":o.substr(a+r.length)}return i&&""!==e&&n.push(e),{lines:n,partialLine:e}},cd.prototype.nextChunk=function(){var t=this.__pointer;if(!(t>this.data.length))return this.__pointer+=this.chunkSize,this.chunk(t)},cd.prototype.nextChunkOfLines=function(){var t=this.nextChunk();if(void 0!==t){var e=this.__pointer>this.data.length,i=this.chunkToLines(t,this.__partialLine,e);return this.__partialLine=i.partialLine,i.lines}},cd.prototype.eachChunk=function(t){for(var e=this.chunkSize,i=this.data.length,r=this.chunkCount(),n=0;n<i;n+=e){t(this.chunk(n),Math.round(n/e),r)}},cd.prototype.eachChunkOfLines=function(o){var a=this;this.eachChunk(function(t,e,i){var r=e===i+1,n=a.chunkToLines(t,a.__partialLine,r);a.__partialLine=n.partialLine,o(n.lines,e,i)})},cd.prototype.dispose=function(){delete this.src};var ud=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),((e.prototype=Object.create(t&&t.prototype)).constructor=e).prototype._read=function(){var n=this;return new Promise(function(e,i){var t=n.src,r=new FileReader;r.onload=function(t){t.target&&e(t.target.result)},r.onerror=function(t){return i(t)},n.binary||n.compressed?r.readAsArrayBuffer(t):r.readAsText(t)})},e}(cd),hd=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),((e.prototype=Object.create(t&&t.prototype)).constructor=e).prototype._read=function(){var n=this;return new Promise(function(t,e){var i=n.src,r=new XMLHttpRequest;r.open("GET",i,!0),r.addEventListener("load",function(){if(200===r.status||304===r.status||0===r.status)try{t(r.response)}catch(t){e(t)}else e(r.statusText)},!1),r.addEventListener("error",function(t){return e("network error")},!1),n.isBinary()?r.responseType="arraybuffer":n.json?r.responseType="json":n.xml?r.responseType="document":r.responseType="text",r.send()})},e}(cd),ld=function(t,e){void 0===e&&(e={}),this.parameters=xl(e,{ext:"",compressed:!1,binary:id.isBinary(e.ext||""),name:"",dir:"",path:"",protocol:""});var i={compressed:this.parameters.compressed,binary:this.parameters.binary,json:id.isJson(this.parameters.ext),xml:id.isXml(this.parameters.ext)};"undefined"!=typeof File&&t instanceof File||"undefined"!=typeof Blob&&t instanceof Blob?this.streamer=new ud(t,i):this.streamer=new hd(t,i)},pd=function(i){function t(t,e){void 0===e&&(e={}),i.call(this,t,e),this.parserParams={voxelSize:e.voxelSize,firstModelOnly:e.firstModelOnly,asTrajectory:e.asTrajectory,cAlphaOnly:e.cAlphaOnly,name:this.parameters.name,path:this.parameters.path}}return i&&(t.__proto__=i),((t.prototype=Object.create(i&&i.prototype)).constructor=t).prototype.load=function(){return new(id.get(this.parameters.ext))(this.streamer,this.parserParams).parse()},t}(ld),dd=function(t,e,i){this.name=e,this.path=i,this.signals={elementAdded:new op,elementRemoved:new op,nameChanged:new op},this.type="Script",this.dir=i.substring(0,i.lastIndexOf("/")+1);try{this.fn=new Function("stage","__name","__path","__dir",t)}catch(t){Yp.error("Script compilation failed",t),this.fn=function(){}}};dd.prototype.run=function(i){var r=this;return new Promise(function(t,e){try{r.fn.apply(null,[i,r.name,r.path,r.dir]),t()}catch(t){Yp.error("Script.fn",t),e(t)}})};var fd=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),((e.prototype=Object.create(t&&t.prototype)).constructor=e).prototype.load=function(){var t=this;return this.streamer.read().then(function(){return new dd(t.streamer.asText(),t.parameters.name,t.parameters.path)})},e}(ld);function md(t){var e,i,r=nd.names,n="",o=(e=t instanceof File?t.name:t instanceof Blob?"":t).lastIndexOf("?"),a=-1!==o?e.substring(o):"",s=(e=e.substring(0,-1===o?e.length:o)).replace(/^.*[\\/]/,""),c=s.substring(0,s.lastIndexOf(".")),u=s.split("."),h=1<u.length?(u.pop()||"").toLowerCase():"",l=e.match(/^(.+):\/\/(.+)$/);l&&(n=l[1].toLowerCase(),e=l[2]||"");var p=e.substring(0,e.lastIndexOf("/")+1);if(r.includes(h)){i=h;var d=e.length-h.length-1;h=(e.substr(0,d).split(".").pop()||"").toLowerCase();var f=c.length-h.length-1;c=c.substr(0,f)}else i=!1;return{path:e,name:s,ext:h,base:c,dir:p,compressed:i,protocol:n,query:a,src:t}}function gd(t){var e=md(t),i=td.get(e.protocol);return i&&!(e=md(i.getUrl(e.src))).ext&&i.getExt&&(e.ext=i.getExt(t)),e}function vd(t,e){void 0===e&&(e={});var i,r=Object.assign(gd(t),e);return id.names.includes(r.ext)?i=new pd(r.src,r):Kp.includes(r.ext)&&(i=new fd(r.src,r)),i?i.load():Promise.reject(new Error("autoLoad: ext '"+r.ext+"' unknown"))}var yd=Jl(function(t,e){!function(){var f={not_string:/[^s]/,not_bool:/[^t]/,not_type:/[^T]/,not_primitive:/[^v]/,number:/[diefg]/,numeric_arg:/[bcdiefguxX]/,json:/[j]/,not_json:/[^j]/,text:/^[^\x25]+/,modulo:/^\x25{2}/,placeholder:/^\x25(?:([1-9]\d*)\$|\(([^\)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-gijostTuvxX])/,key:/^([a-z_][a-z_\d]*)/i,key_access:/^\.([a-z_][a-z_\d]*)/i,index_access:/^\[(\d+)\]/,sign:/^[\+\-]/};function m(t){return function(t,e){var i,r,n,o,a,s,c,u,h,l=1,p=t.length,d="";for(r=0;r<p;r++)if("string"==typeof t[r])d+=t[r];else if("object"==typeof t[r]){if((o=t[r]).keys)for(i=e[l],n=0;n<o.keys.length;n++){if(null==i)throw new Error(m('[sprintf] Cannot access property "%s" of undefined value "%s"',o.keys[n],o.keys[n-1]));i=i[o.keys[n]]}else i=o.param_no?e[o.param_no]:e[l++];if(f.not_type.test(o.type)&&f.not_primitive.test(o.type)&&i instanceof Function&&(i=i()),f.numeric_arg.test(o.type)&&"number"!=typeof i&&isNaN(i))throw new TypeError(m("[sprintf] expecting number but found %T",i));switch(f.number.test(o.type)&&(u=0<=i),o.type){case"b":i=parseInt(i,10).toString(2);break;case"c":i=String.fromCharCode(parseInt(i,10));break;case"d":case"i":i=parseInt(i,10);break;case"j":i=JSON.stringify(i,null,o.width?parseInt(o.width):0);break;case"e":i=o.precision?parseFloat(i).toExponential(o.precision):parseFloat(i).toExponential();break;case"f":i=o.precision?parseFloat(i).toFixed(o.precision):parseFloat(i);break;case"g":i=o.precision?String(Number(i.toPrecision(o.precision))):parseFloat(i);break;case"o":i=(parseInt(i,10)>>>0).toString(8);break;case"s":i=String(i),i=o.precision?i.substring(0,o.precision):i;break;case"t":i=String(!!i),i=o.precision?i.substring(0,o.precision):i;break;case"T":i=Object.prototype.toString.call(i).slice(8,-1).toLowerCase(),i=o.precision?i.substring(0,o.precision):i;break;case"u":i=parseInt(i,10)>>>0;break;case"v":i=i.valueOf(),i=o.precision?i.substring(0,o.precision):i;break;case"x":i=(parseInt(i,10)>>>0).toString(16);break;case"X":i=(parseInt(i,10)>>>0).toString(16).toUpperCase()}f.json.test(o.type)?d+=i:(!f.number.test(o.type)||u&&!o.sign?h="":(h=u?"+":"-",i=i.toString().replace(f.sign,"")),s=o.pad_char?"0"===o.pad_char?"0":o.pad_char.charAt(1):" ",c=o.width-(h+i).length,a=o.width&&0<c?s.repeat(c):"",d+=o.align?h+i+a:"0"===s?h+a+i:a+h+i)}return d}(function(t){if(c[t])return c[t];var e,i=t,r=[],n=0;for(;i;){if(null!==(e=f.text.exec(i)))r.push(e[0]);else if(null!==(e=f.modulo.exec(i)))r.push("%");else{if(null===(e=f.placeholder.exec(i)))throw new SyntaxError("[sprintf] unexpected placeholder");if(e[2]){n|=1;var o=[],a=e[2],s=[];if(null===(s=f.key.exec(a)))throw new SyntaxError("[sprintf] failed to parse named argument key");for(o.push(s[1]);""!==(a=a.substring(s[0].length));)if(null!==(s=f.key_access.exec(a)))o.push(s[1]);else{if(null===(s=f.index_access.exec(a)))throw new SyntaxError("[sprintf] failed to parse named argument key");o.push(s[1])}e[2]=o}else n|=2;if(3===n)throw new Error("[sprintf] mixing positional and named placeholders is not (yet) supported");r.push({placeholder:e[0],param_no:e[1],keys:e[2],sign:e[3],pad_char:e[4],align:e[5],width:e[6],precision:e[7],type:e[8]})}i=i.substring(e[0].length)}return c[t]=r}(t),arguments)}function t(t,e){return m.apply(null,[t].concat(e||[]))}var c=Object.create(null);e.sprintf=m,e.vsprintf=t,"undefined"!=typeof window&&(window.sprintf=m,window.vsprintf=t)}()}).sprintf,bd=function(){};bd.prototype.getBlob=function(){return new Blob([this.getData()],{type:this.mimeType})},bd.prototype.download=function(t,e){t=bl(t,this.defaultName),e=bl(e,this.defaultExt),Ml(this.getBlob(),t+"."+e)};var xd=function(n){function t(t,e){n.call(this),this.mimeType="text/plain",this.defaultName="structure",this.defaultExt="pdb";var i,r=Object.assign({},e);this.renumberSerial=bl(r.renumberSerial,!0),this.remarks=(i=bl(r.remarks,[]),Array.isArray(i)?i:[i]),this.structure=t,this._records=[]}return n&&(t.__proto__=n),((t.prototype=Object.create(n&&n.prototype)).constructor=t).prototype._writeRecords=function(){this._records.length=0,this._writeTitle(),this._writeRemarks(),this._writeAtoms()},t.prototype._writeTitle=function(){this._records.push(yd("TITLE %-74s",this.structure.name))},t.prototype._writeRemarks=function(){var e=this;this.remarks.forEach(function(t){e._records.push(yd("REMARK %-73s",t))}),this.structure.trajectory&&(this._records.push(yd("REMARK %-73s","Trajectory '"+this.structure.trajectory.name+"'")),this._records.push(yd("REMARK %-73s","Frame "+this.structure.trajectory.frame)))},t.prototype._writeAtoms=function(){var n=this,o=1,e=1;this.structure.eachModel(function(t){n._records.push(yd("MODEL %-74d",e++)),t.eachAtom(function(t){var e=t.hetero?"HETATM%5d %-4s %3s %1s%4d    %8.3f%8.3f%8.3f%6.2f%6.2f      %4s%2s":"ATOM  %5d %-4s %3s %1s%4d    %8.3f%8.3f%8.3f%6.2f%6.2f      %4s%2s",i=n.renumberSerial?o:t.serial,r=t.atomname;1===r.length&&(r=" "+r),n._records.push(yd(e,i,r,t.resname,bl(t.chainname," "),t.resno,t.x,t.y,t.z,bl(t.occupancy,1),bl(t.bfactor,0),"",bl(t.element,""))),o+=1}),n._records.push(yd("%-80s","ENDMDL")),e+=1}),this._records.push(yd("%-80s","END"))},t.prototype.getString=function(){return console.warn("PdbWriter.getString() is deprecated, use .getData instead"),this.getData()},t.prototype.getData=function(){return this._writeRecords(),this._records.join("\n")},t}(bd),_d=function(e){function t(t){e.call(this),this.mimeType="text/plain",this.defaultName="structure",this.defaultExt="sdf",this.structure=t,this._records=[]}e&&(t.__proto__=e),(t.prototype=Object.create(e&&e.prototype)).constructor=t;var i={idString:{configurable:!0},titleString:{configurable:!0},countsString:{configurable:!0},chargeLines:{configurable:!0}};return i.idString.get=function(){return this.structure.id},i.titleString.get=function(){return"  "+this.structure.title},i.countsString.get=function(){return yd("%3i%3i  0  0  0  0  0  0  0  0999 V2000",this.structure.atomCount,this.structure.bondCount)},i.chargeLines.get=function(){var e=[];this.structure.eachAtom(function(t){null!=t.formalCharge&&0!==t.formalCharge&&e.push([t.index,t.formalCharge])});for(var t=[],i=0;i<e.length;i+=8){for(var r=Math.min(8,e.length-i),n=yd("M  CHG%3i",r),o=i;o<i+r;o++)n+=yd(" %3i %3i",e[o][0]+1,e[o][1]);t.push(n)}return t},t.prototype.formatAtom=function(t){var e=0;null!=t.formalCharge&&0!==t.formalCharge&&(e=4-t.formalCharge);var i=yd("%10.4f%10.4f%10.4f %-3s 0%3i  0  0  0",t.x,t.y,t.z,t.element,e);if(48!==i.length)throw new Error("Incompatible atom for sdf format");return i},t.prototype.formatBond=function(t){return yd("%3i%3i%3i  0  0  0",t.atomIndex1+1,t.atomIndex2+1,t.bondOrder)},t.prototype._writeRecords=function(){this._records.length=0,this._writeHeader(),this._writeCTab(),this._writeFooter()},t.prototype._writeHeader=function(){this._records.push(this.idString,this.titleString,"")},t.prototype._writeCTab=function(){var e=this;this._records.push(this.countsString),this.structure.eachAtom(function(t){e._records.push(e.formatAtom(t))}),this.structure.eachBond(function(t){e._records.push(e.formatBond(t))}),this.chargeLines.forEach(function(t){e._records.push(t)}),this._records.push("M  END")},t.prototype._writeFooter=function(){this._records.push("$$$$")},t.prototype.getData=function(){return this._writeRecords(),this._records.join("\n")},Object.defineProperties(t.prototype,i),t}(bd),wd=[],Sd=function(t,e){void 0===e&&(e={}),this._mark=0,this._marks=[],this.offset=0;var i=!(this.littleEndian=!0);void 0===t&&(t=8192),"number"==typeof t?t=new ArrayBuffer(t):i=!0;var r=e.offset?e.offset>>>0:0,n=t.byteLength-r,o=r;t instanceof ArrayBuffer||(t.byteLength!==t.buffer.byteLength&&(o=t.byteOffset+r),t=t.buffer),this._lastWrittenByte=i?n:0,this.buffer=t,this.length=n,this.byteLength=n,this.byteOffset=o,this._data=new DataView(this.buffer,o,n)};Sd.prototype.available=function(t){return void 0===t&&(t=1),this.offset+t<=this.length},Sd.prototype.isLittleEndian=function(){return this.littleEndian},Sd.prototype.setLittleEndian=function(){return this.littleEndian=!0,this},Sd.prototype.isBigEndian=function(){return!this.littleEndian},Sd.prototype.setBigEndian=function(){return this.littleEndian=!1,this},Sd.prototype.skip=function(t){return void 0===t&&(t=1),this.offset+=t,this},Sd.prototype.seek=function(t){return this.offset=t,this},Sd.prototype.mark=function(){return this._mark=this.offset,this},Sd.prototype.reset=function(){return this.offset=this._mark,this},Sd.prototype.pushMark=function(){return this._marks.push(this.offset),this},Sd.prototype.popMark=function(){var t=this._marks.pop();if(void 0===t)throw new Error("Mark stack empty");return this.seek(t),this},Sd.prototype.rewind=function(){return this.offset=0,this},Sd.prototype.ensureAvailable=function(t){if(void 0===t&&(t=1),!this.available(t)){var e=2*(this.offset+t),i=new Uint8Array(e);i.set(new Uint8Array(this.buffer)),this.buffer=i.buffer,this.length=this.byteLength=e,this._data=new DataView(this.buffer)}return this},Sd.prototype.readBoolean=function(){return 0!==this.readUint8()},Sd.prototype.readInt8=function(){return this._data.getInt8(this.offset++)},Sd.prototype.readUint8=function(){return this._data.getUint8(this.offset++)},Sd.prototype.readByte=function(){return this.readUint8()},Sd.prototype.readBytes=function(t){void 0===t&&(t=1);for(var e=new Uint8Array(t),i=0;i<t;i++)e[i]=this.readByte();return e},Sd.prototype.readInt16=function(){var t=this._data.getInt16(this.offset,this.littleEndian);return this.offset+=2,t},Sd.prototype.readUint16=function(){var t=this._data.getUint16(this.offset,this.littleEndian);return this.offset+=2,t},Sd.prototype.readInt32=function(){var t=this._data.getInt32(this.offset,this.littleEndian);return this.offset+=4,t},Sd.prototype.readUint32=function(){var t=this._data.getUint32(this.offset,this.littleEndian);return this.offset+=4,t},Sd.prototype.readFloat32=function(){var t=this._data.getFloat32(this.offset,this.littleEndian);return this.offset+=4,t},Sd.prototype.readFloat64=function(){var t=this._data.getFloat64(this.offset,this.littleEndian);return this.offset+=8,t},Sd.prototype.readChar=function(){return String.fromCharCode(this.readInt8())},Sd.prototype.readChars=function(t){void 0===t&&(t=1),wd.length=t;for(var e=0;e<t;e++)wd[e]=this.readChar();return wd.join("")},Sd.prototype.writeBoolean=function(t){return void 0===t&&(t=!1),this.writeUint8(t?255:0),this},Sd.prototype.writeInt8=function(t){return this.ensureAvailable(1),this._data.setInt8(this.offset++,t),this._updateLastWrittenByte(),this},Sd.prototype.writeUint8=function(t){return this.ensureAvailable(1),this._data.setUint8(this.offset++,t),this._updateLastWrittenByte(),this},Sd.prototype.writeByte=function(t){return this.writeUint8(t)},Sd.prototype.writeBytes=function(t){this.ensureAvailable(t.length);for(var e=0;e<t.length;e++)this._data.setUint8(this.offset++,t[e]);return this._updateLastWrittenByte(),this},Sd.prototype.writeInt16=function(t){return this.ensureAvailable(2),this._data.setInt16(this.offset,t,this.littleEndian),this.offset+=2,this._updateLastWrittenByte(),this},Sd.prototype.writeUint16=function(t){return this.ensureAvailable(2),this._data.setUint16(this.offset,t,this.littleEndian),this.offset+=2,this._updateLastWrittenByte(),this},Sd.prototype.writeInt32=function(t){return this.ensureAvailable(4),this._data.setInt32(this.offset,t,this.littleEndian),this.offset+=4,this._updateLastWrittenByte(),this},Sd.prototype.writeUint32=function(t){return this.ensureAvailable(4),this._data.setUint32(this.offset,t,this.littleEndian),this.offset+=4,this._updateLastWrittenByte(),this},Sd.prototype.writeFloat32=function(t){return this.ensureAvailable(4),this._data.setFloat32(this.offset,t,this.littleEndian),this.offset+=4,this._updateLastWrittenByte(),this},Sd.prototype.writeFloat64=function(t){return this.ensureAvailable(8),this._data.setFloat64(this.offset,t,this.littleEndian),this.offset+=8,this._updateLastWrittenByte(),this},Sd.prototype.writeChar=function(t){return this.writeUint8(t.charCodeAt(0))},Sd.prototype.writeChars=function(t){for(var e=0;e<t.length;e++)this.writeUint8(t.charCodeAt(e));return this},Sd.prototype.toArray=function(){return new Uint8Array(this.buffer,this.byteOffset,this._lastWrittenByte)},Sd.prototype._updateLastWrittenByte=function(){this.offset>this._lastWrittenByte&&(this._lastWrittenByte=this.offset)};var Ad=function(e){function t(t){e.call(this),this.mimeType="application/vnd.ms-pki.stl",this.defaultName="surface",this.defaultExt="stl",this.surface=t}return e&&(t.__proto__=e),((t.prototype=Object.create(e&&e.prototype)).constructor=t).prototype.getData=function(){var t=this.surface.index.length/3,e=new Sd(2*t+3*t*4*4+80+4);e.skip(80),e.writeUint32(t);for(var i=new ri,r=new ri,n=new ri,o=new ri,a=0;a<t;a++){var s=[this.surface.index[3*a],this.surface.index[3*a+1],this.surface.index[3*a+2]];r.fromArray(this.surface.normal,3*s[0]),n.fromArray(this.surface.normal,3*s[1]),o.fromArray(this.surface.normal,3*s[2]),i.addVectors(r,n).add(o).normalize(),e.writeFloat32(i.x),e.writeFloat32(i.y),e.writeFloat32(i.z);for(var c=0;c<3;c++)i.fromArray(this.surface.position,3*s[c]),e.writeFloat32(i.x),e.writeFloat32(i.y),e.writeFloat32(i.z);e.writeUint16(0)}return new DataView(e.buffer)},t}(bd),Md=function(){this.count=0,this.signals={countChanged:new op}};Md.prototype.clear=function(){this.change(-this.count)},Md.prototype.change=function(t){this.count+=t,this.signals.countChanged.dispatch(t,this.count),this.count<0&&Yp.warn("Counter.count below zero",this.count)},Md.prototype.increment=function(){this.change(1)},Md.prototype.decrement=function(){this.change(-1)},Md.prototype.listen=function(t){this.change(t.count),t.signals.countChanged.add(this.change,this)},Md.prototype.unlisten=function(t){var e=t.signals.countChanged;e.has(this.change,this)&&e.remove(this.change,this)},Md.prototype.onZeroOnce=function(t,e){var i=this;if(0===this.count)t.call(e);else{var r=function(){0===i.count&&(i.signals.countChanged.remove(r,i),t.call(e))};this.signals.countChanged.add(r,this)}},Md.prototype.dispose=function(){this.clear(),this.signals.countChanged.dispose()},rd.add("shader/BasicLine.vert","void main(){\n#include begin_vertex\n#include project_vertex\n}"),rd.add("shader/BasicLine.frag","uniform vec3 uColor;\n#include common\n#include fog_pars_fragment\nvoid main(){\ngl_FragColor = vec4( uColor, 1.0 );\n#include premultiplied_alpha_fragment\n#include tonemapping_fragment\n#include encodings_fragment\n#include fog_fragment\n}"),rd.add("shader/Quad.vert","varying vec2 vUv;\nvoid main() {\nvUv = uv;\ngl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}"),rd.add("shader/Quad.frag","varying vec2 vUv;\nuniform sampler2D tForeground;\nuniform float scale;\nvoid main() {\nvec4 foreground = texture2D( tForeground, vUv );\ngl_FragColor = foreground * scale;\n}");var Ed=function(){this.signals={updated:new op},this.maxDuration=-1/0,this.minDuration=1/0,this.avgDuration=14,this.lastDuration=1/0,this.prevFpsTime=0,this.lastFps=1/0,this.lastFrames=1,this.frames=0,this.count=0,this.begin()};Ed.prototype.update=function(){this.startTime=this.end(),this.currentTime=this.startTime,this.signals.updated.dispatch()},Ed.prototype.begin=function(){this.startTime=window.performance.now(),this.lastFrames=this.frames},Ed.prototype.end=function(){var t=window.performance.now();return this.count+=1,this.frames+=1,this.lastDuration=t-this.startTime,this.minDuration=Math.min(this.minDuration,this.lastDuration),this.maxDuration=Math.max(this.maxDuration,this.lastDuration),this.avgDuration-=this.avgDuration/30,this.avgDuration+=this.lastDuration/30,t>this.prevFpsTime+1e3&&(this.lastFps=this.frames,this.prevFpsTime=t,this.frames=0),t},rd.add("shader/chunk/fog_fragment.glsl","#ifdef USE_FOG\nfloat depth = length( vViewPosition );\n#ifdef FOG_EXP2\nfloat fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * depth * depth * LOG2 ) );\n#else\nfloat fogFactor = smoothstep( fogNear, fogFar, depth );\n#endif\ngl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif"),rd.add("shader/chunk/interior_fragment.glsl","if( gl_FrontFacing == false ){\n#ifdef USE_INTERIOR_COLOR\noutgoingLight.xyz = interiorColor;\n#else\n#ifdef DIFFUSE_INTERIOR\noutgoingLight.xyz = vColor;\n#endif\n#endif\noutgoingLight.xyz *= 1.0 - interiorDarkening;\n}"),rd.add("shader/chunk/matrix_scale.glsl","float matrixScale( in mat4 m ){\nvec4 r = m[ 0 ];\nreturn sqrt( r[ 0 ] * r[ 0 ] + r[ 1 ] * r[ 1 ] + r[ 2 ] * r[ 2 ] );\n}"),rd.add("shader/chunk/nearclip_vertex.glsl","#ifdef NEAR_CLIP\nif( vViewPosition.z < clipNear - 5.0 )\ngl_Position.z = 2.0 * gl_Position.w;\n#endif"),rd.add("shader/chunk/nearclip_fragment.glsl","#ifdef NEAR_CLIP\nif( vViewPosition.z < clipNear )\ndiscard;\n#endif"),rd.add("shader/chunk/opaque_back_fragment.glsl","#ifdef OPAQUE_BACK\n#ifdef FLIP_SIDED\nif( gl_FrontFacing == true ){\ngl_FragColor.a = 1.0;\n}\n#else\nif( gl_FrontFacing == false ){\ngl_FragColor.a = 1.0;\n}\n#endif\n#endif"),rd.add("shader/chunk/radiusclip_vertex.glsl","#ifdef RADIUS_CLIP\nif( distance( vViewPosition, vClipCenter ) > clipRadius + 5.0 )\ngl_Position.z = 2.0 * gl_Position.w;\n#endif"),rd.add("shader/chunk/radiusclip_fragment.glsl","#ifdef RADIUS_CLIP\nif( distance( vViewPosition, vClipCenter ) > clipRadius )\ndiscard;\n#endif"),rd.add("shader/chunk/unpack_color.glsl","vec3 unpackColor(float f) {\nvec3 color;\ncolor.r = floor(f / 256.0 / 256.0);\ncolor.g = floor((f - color.r * 256.0 * 256.0) / 256.0);\ncolor.b = floor(f - color.r * 256.0 * 256.0 - color.g * 256.0);\nreturn color / 255.0;\n}");var Pd=/^(?!\/\/)\s*#include\s+(\S+)/gim,Td={};function Cd(t,e){void 0===e&&(e={});var i=t+"|";for(var r in e)i+=r+":"+e[r];if(!Td[i]){var n=function(t){if(void 0===t)return"";var e=[];for(var i in t){var r=t[i];r&&e.push("#define "+i+" "+r)}return e.join("\n")+"\n"}(e),o=rd.get("shader/"+t);if(!o)throw new Error("empty shader, '"+t+"'");o=o.replace(Pd,function(t,e){var i="shader/chunk/"+e+".glsl",r=rd.get(i)||Li[e];if(!r)throw new Error("empty chunk, '"+e+"'");return r}),Td[i]=n+o}return Td[i]}if("undefined"!=typeof WebGLRenderingContext){var Id=WebGLRenderingContext.prototype,Od=Id.getShaderParameter;Id.getShaderParameter=function(){return!de.Debug||Od.apply(this,arguments)};var Ld=Id.getShaderInfoLog;Id.getShaderInfoLog=function(){return de.Debug?Ld.apply(this,arguments):""};var Rd=Id.getProgramParameter;Id.getProgramParameter=function(t,e){return!de.Debug&&e===Id.LINK_STATUS||Rd.apply(this,arguments)};var Dd=Id.getProgramInfoLog;Id.getProgramInfoLog=function(){return de.Debug?Dd.apply(this,arguments):""}}var kd=[[[0,0]],[[4,4],[-4,-4]],[[-2,-6],[6,-2],[-6,2],[2,6]],[[1,-3],[-1,3],[5,1],[-3,-5],[-5,5],[-7,-1],[3,7],[7,-7]],[[1,1],[-1,-3],[-3,2],[4,-1],[-5,-2],[2,5],[5,3],[3,-5],[-2,6],[0,-7],[-4,-6],[-6,4],[-8,0],[7,-4],[6,7],[-7,-8]],[[-4,-7],[-7,-5],[-3,-5],[-5,-4],[-1,-4],[-2,-2],[-6,-1],[-4,0],[-7,1],[-1,2],[-6,3],[-3,3],[-7,6],[-3,6],[-5,7],[-1,7],[5,-7],[1,-6],[6,-5],[4,-4],[2,-3],[7,-2],[1,-1],[4,-1],[2,1],[6,2],[0,4],[4,4],[2,5],[7,5],[5,6],[3,7]]];kd.forEach(function(t){t.forEach(function(t){t[0]*=.0625,t[1]*=.0625})});var Bd=function(t,e,i,r){this.canvas=document.createElement("canvas"),this._viewer=i,this._factor=bl(r.factor,2),this._antialias=bl(r.antialias,!1),this._onProgress=r.onProgress,this._onFinish=r.onFinish,this._antialias&&(this._factor*=2),this._n=this._factor*this._factor,this._width=this._viewer.width,this._height=this._viewer.height,this._antialias?(this.canvas.width=this._width*this._factor/2,this.canvas.height=this._height*this._factor/2):(this.canvas.width=this._width*this._factor,this.canvas.height=this._height*this._factor),this._ctx=this.canvas.getContext("2d"),this._viewerSampleLevel=i.sampleLevel,this._viewer.setSampling(-1)};Bd.prototype._renderTile=function(t){var e=this._viewer,i=this._width,r=this._height,n=this._factor,o=t%n*i,a=Math.floor(t/n)*r;if(e.camera.setViewOffset(i*n,r*n,o,a,i,r),e.render(),this._antialias){var s=Math.round((o+i)/2)-Math.round(o/2),c=Math.round((a+r)/2)-Math.round(a/2);this._ctx.drawImage(e.renderer.domElement,Math.round(o/2),Math.round(a/2),s,c)}else this._ctx.drawImage(e.renderer.domElement,Math.floor(o),Math.floor(a),Math.ceil(i),Math.ceil(r));"function"==typeof this._onProgress&&this._onProgress(t+1,this._n,!1)},Bd.prototype._finalize=function(){this._viewer.setSampling(this._viewerSampleLevel),this._viewer.camera.view=null,"function"==typeof this._onFinish&&this._onFinish(this._n+1,this._n,!1)},Bd.prototype.render=function(){for(var t=0;t<=this._n;++t)t===this._n?this._finalize():this._renderTile(t)},Bd.prototype.renderAsync=function(){for(var t=this,e=0,i=this._n,r=function(){e===i?t._finalize():t._renderTile(e),e+=1},n=0;n<=i;++n)setTimeout(r,0)};var Nd=2*Math.PI,Fd=(Math.PI,180/Math.PI);function zd(t,e,i,r,n){void 0===i&&(i=1),void 0===r&&(r=0);var o=n?n.length:t.length/i,a=0,s=0;if(n)for(var c=0;c<o;++c){var u=(t[n[c]*i+r]+e)%e/e*Nd-Math.PI;a+=Math.cos(u),s+=Math.sin(u)}else for(var h=r;h<o;h+=i){var l=(t[h]+e)%e/e*Nd-Math.PI;a+=Math.cos(l),s+=Math.sin(l)}return a/=o,s/=o,(Math.atan2(s,a)+Math.PI)/Nd*e}function Ud(t,e,i,r){void 0===r&&(r=0);for(var n=t.length,o=i||new Float32Array(n),a=0;a<n;a+=3)o[r+a+0]=(t[a+0]+e[a+0])/2,o[r+a+1]=(t[a+1]+e[a+1])/2,o[r+a+2]=(t[a+2]+e[a+2])/2;return o}function jd(t,e){for(var i=t.length,r=new Float32Array(i),n=0;n<i;n+=3)r[n+0]=e[n+0]-t[n+0],r[n+1]=e[n+1]-t[n+1],r[n+2]=e[n+2]-t[n+2];return r}function Gd(t,e,i){for(var r=i||new Float32Array(t),n=0;n<t;++n)r[n]=e;return r}function Vd(t,e,i,r,n){for(var o=n||new Float32Array(3*t),a=0;a<t;++a){var s=3*a;o[s+0]=e,o[s+1]=i,o[s+2]=r}return o}function Hd(t){for(var e=new Float32Array(t),i=0;i<t;++i)e[i]=i;return e}function $d(t,e,i,r){void 0===i&&(i=0);for(var n=r||new Float32Array(t*e),o=0;o<t;++o)for(var a=i+o*e,s=0;s<e;++s)n[a+s]=o;return n}function Wd(t,e){for(var i=t.length,r=new Float32Array(i*e),n=0;n<i;++n)for(var o=n*e,a=t[n],s=0;s<e;++s)r[o+s]=a;return r}function Xd(t,e,i,r,n){for(var o=0;o<n;++o)e[r+o]=t[i+o]}function qd(t,e,i,r){Xd(t,t,e,i,r)}function Yd(t){for(var e=-1/0,i=0,r=t.length;i<r;++i)t[i]>e&&(e=t[i]);return e}function Zd(t){for(var e=1/0,i=0,r=t.length;i<r;++i)t[i]<e&&(e=t[i]);return e}function Kd(t,e,i){void 0===e&&(e=1),void 0===i&&(i=0);for(var r=t.length,n=0,o=i;o<r;o+=e)n+=t[o];return n}function Jd(t,e,i){return void 0===e&&(e=1),void 0===i&&(i=0),Kd(t,e,i)/(t.length/e)}var Qd={trim:!1,factor:1,antialias:!1,transparent:!1,onProgress:void 0};function tf(o,r){void 0===r&&(r={});var t=xl(r,Qd),i=t.trim,e=t.factor,a=t.antialias,s=t.transparent,c=o.renderer,u=o.camera,h=c.getClearAlpha(),n=c.getClearColor();function l(t){void 0===t&&(t=!1);var i=e;a&&(i*=2),t&&(i=1/i),o.scene.traverse(function(t){var e=t.material;e&&e.linewidth&&(e.linewidth*=i),e&&e.uniforms&&e.uniforms.size&&void 0===e.uniforms.size.__seen&&(e.uniforms.size.value*=i,e.uniforms.size.__seen=!0),e&&e.uniforms&&e.uniforms.linewidth&&void 0===e.uniforms.linewidth.__seen&&(e.uniforms.linewidth.value*=i,e.uniforms.linewidth.__seen=!0)}),o.scene.traverse(function(t){var e=t.material;e&&e.uniforms&&e.uniforms.size&&delete e.uniforms.size.__seen,e&&e.uniforms&&e.uniforms.linewidth&&delete e.uniforms.linewidth.__seen})}function p(t){if(i){var e=n;return function(t,e,i,r,n){var o,a,s,c,u=t.height,h=t.width,l=t.getContext("2d").getImageData(0,0,h,u).data;for(s=!1,a=0;a<u;a++){for(o=0;o<h;o++)if(l[c=4*(a*h+o)]!==e||l[c+1]!==i||l[c+2]!==r||l[c+3]!==n){s=!0;break}if(s)break}var p=a;for(s=!1,o=0;o<h;o++){for(a=0;a<u;a++)if(l[c=4*(a*h+o)]!==e||l[c+1]!==i||l[c+2]!==r||l[c+3]!==n){s=!0;break}if(s)break}var d=o;for(s=!1,a=u-1;0<=a;a--){for(o=h-1;0<=o;o--)if(l[c=4*(a*h+o)]!==e||l[c+1]!==i||l[c+2]!==r||l[c+3]!==n){s=!0;break}if(s)break}var f=a;for(s=!1,o=h-1;0<=o;o--){for(a=u-1;0<=a;a--)if(l[c=4*(a*h+o)]!==e||l[c+1]!==i||l[c+2]!==r||l[c+3]!==n){s=!0;break}if(s)break}var m=o,g=document.createElement("canvas");return g.width=m-d,g.height=f-p,g.getContext("2d").drawImage(t,d,p,g.width,g.height,0,0,g.width,g.height),g}(t,s?0:255*e.r,s?0:255*e.g,s?0:255*e.b,s?0:255)}return t}function d(t,e,i){"function"==typeof r.onProgress&&r.onProgress(t,e,i)}return new Promise(function(i,r){var n=new Bd(c,u,o,{factor:e,antialias:a,onProgress:d,onFinish:function(t,e){p(n.canvas).toBlob(function(t){c.setClearAlpha(h),l(!0),o.requestRender(),d(e,e,!0),t?i(t):r("error creating image")},"image/png")}});c.setClearAlpha(s?0:1),l(),n.renderAsync()})}var ef=new ri,rf=new ei,nf=new ei;var of=new ti,af=new ei,sf=new ei;function cf(t,e){af.getInverse(e.projectionMatrix),sf.copy(e.projectionMatrix).transpose(),t.traverse(function(t){var e=t.material;if(e){var i=e.uniforms;i&&(i.projectionMatrixInverse&&i.projectionMatrixInverse.value.copy(af),i.projectionMatrixTranspose&&i.projectionMatrixTranspose.value.copy(sf))}})}function uf(t,e,i){var r=t.createShader(i);return t.shaderSource(r,e),t.compileShader(r),t.getShaderParameter(r,t.COMPILE_STATUS)?r:(console.log("error compiling shader "+r+": "+t.getShaderInfoLog(r)),t.deleteShader(r),null)}function hf(t,e){var i=t.getExtension(e);return i||console.log("extension '"+e+"' not available"),i}var lf=new Float32Array([-1,-1,1,-1,-1,1,-1,1,1,-1,1,1]);function pf(t){var e=document.createElement("canvas");e.width=16,e.height=16,e.style.width="16px",e.style.height="16px";var i=e.getContext("webgl")||e.getContext("experimental-webgl");if(!i)return console.log("error creating webgl context for "+t),!1;hf(i,"OES_texture_float"),hf(i,"OES_texture_half_float"),hf(i,"WEBGL_color_buffer_float");var r=uf(i,"\nattribute vec4 a_position;\n\nvoid main() {\n  gl_Position = a_position;\n}",i.VERTEX_SHADER),n=uf(i,"\nprecision mediump float;\nuniform vec4 u_color;\nuniform sampler2D u_texture;\n\nvoid main() {\n  gl_FragColor = texture2D(u_texture, vec2(0.5, 0.5)) * u_color;\n}",i.FRAGMENT_SHADER);if(!r||!n)return!1;var o,a,s,c,u,h=(a=[r,n],u=(o=i).createProgram(),a.forEach(function(t){return o.attachShader(u,t)}),s&&s.forEach(function(t,e){o.bindAttribLocation(u,c?c[e]:e,t)}),o.linkProgram(u),o.getProgramParameter(u,o.LINK_STATUS)?u:(console.log("error linking program: "+o.getProgramInfoLog(u)),o.deleteProgram(u),null));i.useProgram(h);var l=i.getAttribLocation(h,"a_position"),p=i.getUniformLocation(h,"u_color");if(!p)return console.log("error getting 'u_color' uniform location"),!1;var d=i.createBuffer();i.bindBuffer(i.ARRAY_BUFFER,d),i.bufferData(i.ARRAY_BUFFER,lf,i.STATIC_DRAW),i.enableVertexAttribArray(l),i.vertexAttribPointer(l,2,i.FLOAT,!1,0,0);var f=i.createTexture(),m=new Uint8Array([255,255,255,255]);i.bindTexture(i.TEXTURE_2D,f),i.texImage2D(i.TEXTURE_2D,0,i.RGBA,1,1,0,i.RGBA,i.UNSIGNED_BYTE,m);var g=i.createTexture();i.bindTexture(i.TEXTURE_2D,g),i.texImage2D(i.TEXTURE_2D,0,i.RGBA,1,1,0,i.RGBA,t,null),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MIN_FILTER,i.NEAREST),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MAG_FILTER,i.NEAREST);var v=i.createFramebuffer();if(i.bindFramebuffer(i.FRAMEBUFFER,v),i.framebufferTexture2D(i.FRAMEBUFFER,i.COLOR_ATTACHMENT0,i.TEXTURE_2D,g,0),i.checkFramebufferStatus(i.FRAMEBUFFER)!==i.FRAMEBUFFER_COMPLETE)return console.log("error creating framebuffer for "+t),!1;i.bindTexture(i.TEXTURE_2D,f),i.uniform4fv(p,[0,10,20,1]),i.drawArrays(i.TRIANGLES,0,6),i.bindTexture(i.TEXTURE_2D,g),i.bindFramebuffer(i.FRAMEBUFFER,null),i.clearColor(1,0,0,1),i.clear(i.COLOR_BUFFER_BIT),i.uniform4fv(p,[0,.1,.05,1]),i.drawArrays(i.TRIANGLES,0,6);var y=new Uint8Array(4);if(i.readPixels(0,0,1,1,i.RGBA,i.UNSIGNED_BYTE,y),0!==y[0]||y[1]<248||y[2]<248||y[3]<254)return console.log("not able to actually render to "+t+" texture"),!1;if(t===i.FLOAT){i.bindFramebuffer(i.FRAMEBUFFER,v);var b=new Float32Array(4);i.readPixels(0,0,1,1,i.RGBA,i.FLOAT,b);var x=i.getError();if(x)return console.log("error reading pixels as float: '"+function(t,e){switch(e){case t.NO_ERROR:return"no error";case t.INVALID_ENUM:return"invalid enum";case t.INVALID_VALUE:return"invalid value";case t.INVALID_OPERATION:return"invalid operation";case t.INVALID_FRAMEBUFFER_OPERATION:return"invalid framebuffer operation";case t.OUT_OF_MEMORY:return"out of memory";case t.CONTEXT_LOST_WEBGL:return"context lost"}return"unknown error"}(i,x)+"'"),!1}return!0}var df=new Float32Array(100),ff=new Uint8Array(100),mf=[12,7,13,17,11,6,8,18,16,2,14,22,10,1,3,9,19,23,21,15,5,0,4,24,20],gf=new ei;function vf(t,e,i,r,n){var o=n.uniforms,a=[];if(o.objectId&&(o.objectId.value=Wp?this.id:this.id/255,a.push("objectId")),(o.modelViewMatrixInverse||o.modelViewMatrixInverseTranspose||o.modelViewProjectionMatrix||o.modelViewProjectionMatrixInverse)&&this.modelViewMatrix.multiplyMatrices(i.matrixWorldInverse,this.matrixWorld),o.modelViewMatrixInverse&&(o.modelViewMatrixInverse.value.getInverse(this.modelViewMatrix),a.push("modelViewMatrixInverse")),o.modelViewMatrixInverseTranspose&&(o.modelViewMatrixInverse?o.modelViewMatrixInverseTranspose.value.copy(o.modelViewMatrixInverse.value).transpose():o.modelViewMatrixInverseTranspose.value.getInverse(this.modelViewMatrix).transpose(),a.push("modelViewMatrixInverseTranspose")),o.modelViewProjectionMatrix&&(o.modelViewProjectionMatrix.value.multiplyMatrices(i.projectionMatrix,this.modelViewMatrix),a.push("modelViewProjectionMatrix")),o.modelViewProjectionMatrixInverse&&(o.modelViewProjectionMatrix?gf.copy(o.modelViewProjectionMatrix.value):gf.multiplyMatrices(i.projectionMatrix,this.modelViewMatrix),o.modelViewProjectionMatrixInverse.value.getInverse(gf),a.push("modelViewProjectionMatrixInverse")),a.length){var s=t.properties.get(n);if(s.program){var c=t.getContext(),u=s.program;c.useProgram(u.program);var h=u.getUniforms();a.forEach(function(t){h.setValue(c,t,o[t].value)})}}}var yf=function(t){if(this.boundingBox=new Pi,this.boundingBoxSize=new ri,this.boundingBoxLength=0,this.info={memory:{programs:0,geometries:0,textures:0},render:{calls:0,vertices:0,faces:0,points:0}},this.distVector=new ri,this.signals={ticked:new op,rendered:new op},"string"==typeof t){var e=document.getElementById(t);this.container=null===e?document.createElement("div"):e}else t instanceof HTMLElement?this.container=t:this.container=document.createElement("div");if(this.container===document.body)this.width=window.innerWidth||1,this.height=window.innerHeight||1;else{var i=this.container.getBoundingClientRect();this.width=i.width||1,this.height=i.height||1,this.container.style.overflow="hidden"}this.wrapper=document.createElement("div"),this.wrapper.style.position="relative",this.container.appendChild(this.wrapper),this._initParams(),this._initStats(),this._initCamera(),this._initScene(),!1!==this._initRenderer()?(this._initHelper(),this.setBackground(),this.setFog(),this.animate=this.animate.bind(this)):Yp.error("Viewer: could not initialize renderer")};yf.prototype._initParams=function(){this.parameters={fogColor:new ki(0),fogNear:50,fogFar:100,backgroundColor:new ki(0),cameraType:"perspective",cameraFov:40,cameraEyeSep:.3,cameraZ:-80,clipNear:0,clipFar:100,clipDist:10,lightColor:new ki(14540253),lightIntensity:1,ambientColor:new ki(14540253),ambientIntensity:.2,sampleLevel:0}},yf.prototype._initCamera=function(){var t=new ri(0,0,0),e=this.width,i=this.height;this.perspectiveCamera=new ba(this.parameters.cameraFov,e/i),this.perspectiveCamera.position.z=this.parameters.cameraZ,this.perspectiveCamera.lookAt(t),this.orthographicCamera=new lr(e/-2,e/2,i/2,i/-2),this.orthographicCamera.position.z=this.parameters.cameraZ,this.orthographicCamera.lookAt(t),this.stereoCamera=new Ju,this.stereoCamera.aspect=.5,this.stereoCamera.eyeSep=this.parameters.cameraEyeSep;var r=this.parameters.cameraType;if("orthographic"===r)this.camera=this.orthographicCamera;else{if("perspective"!==r&&"stereo"!==r)throw new Error("Unknown cameraType '"+r+"'");this.camera=this.perspectiveCamera}this.camera.updateProjectionMatrix()},yf.prototype._initStats=function(){this.stats=new Ed},yf.prototype._initScene=function(){this.scene||(this.scene=new Ea,this.scene.name="scene"),this.rotationGroup=new ya,this.rotationGroup.name="rotationGroup",this.scene.add(this.rotationGroup),this.translationGroup=new ya,this.translationGroup.name="translationGroup",this.rotationGroup.add(this.translationGroup),this.modelGroup=new ya,this.modelGroup.name="modelGroup",this.translationGroup.add(this.modelGroup),this.pickingGroup=new ya,this.pickingGroup.name="pickingGroup",this.translationGroup.add(this.pickingGroup),this.backgroundGroup=new ya,this.backgroundGroup.name="backgroundGroup",this.translationGroup.add(this.backgroundGroup),this.helperGroup=new ya,this.helperGroup.name="helperGroup",this.translationGroup.add(this.helperGroup),this.scene.fog=new Ma(this.parameters.fogColor.getHex()),this.spotLight=new qc(this.parameters.lightColor.getHex(),this.parameters.lightIntensity),this.scene.add(this.spotLight),this.ambientLight=new Jc(this.parameters.ambientColor.getHex(),this.parameters.ambientIntensity),this.scene.add(this.ambientLight)},yf.prototype._initRenderer=function(){var t=window.devicePixelRatio,e=this.width,i=this.height;try{this.renderer=new Sa({preserveDrawingBuffer:!0,alpha:!0,antialias:!0})}catch(t){return!(this.wrapper.innerHTML='<div style="display:flex;align-items:center;justify-content:center;height:100%;"><p style="padding:15px;text-align:center;">Your browser/graphics card does not seem to support <a target="_blank" href="https://en.wikipedia.org/wiki/WebGL">WebGL</a>.<br/><br/>Find out how to get it <a target="_blank" href="http://get.webgl.org/">here</a>.</p></div>')}this.renderer.setPixelRatio(t),this.renderer.setSize(e,i),this.renderer.autoClear=!1,this.renderer.sortObjects=!0;var r,n,o=this.renderer.getContext();r=this.renderer.extensions.get("EXT_frag_depth"),Xp=r,this.renderer.extensions.get("OES_element_index_uint"),n=this.renderer.extensions.get("OES_texture_float")&&this.renderer.extensions.get("WEBGL_color_buffer_float")||this.renderer.extensions.get("OES_texture_float")&&pf(o.FLOAT),Wp=n,this.wrapper.appendChild(this.renderer.domElement);var a=e*t,s=i*t;this.renderer.extensions.get("OES_texture_float"),this.supportsHalfFloat=this.renderer.extensions.get("OES_texture_half_float")&&pf(36193),this.renderer.extensions.get("WEBGL_color_buffer_float"),de.Debug&&console.log(JSON.stringify({Browser:Gp,OES_texture_float:!!this.renderer.extensions.get("OES_texture_float"),OES_texture_half_float:!!this.renderer.extensions.get("OES_texture_half_float"),WEBGL_color_buffer_float:!!this.renderer.extensions.get("WEBGL_color_buffer_float"),"testTextureSupport Float":pf(o.FLOAT),"testTextureSupport HalfFloat":pf(36193),"this.supportsHalfFloat":this.supportsHalfFloat,SupportsReadPixelsFloat:Wp},null,2)),this.pickingTarget=new Ai(a,s,{minFilter:Vt,magFilter:Vt,stencilBuffer:!1,format:ue,type:Wp?ee:Yt}),this.pickingTarget.texture.generateMipmaps=!1,this.renderer.clearTarget(this.pickingTarget,!0,!0,!0),this.renderer.setRenderTarget(null),this.sampleTarget=new Ai(a,s,{minFilter:Wt,magFilter:Wt,format:ue}),this.holdTarget=new Ai(a,s,{minFilter:Vt,magFilter:Vt,format:ue,type:Yt}),this.compositeUniforms={tForeground:new Wh(this.sampleTarget.texture),scale:new Wh(1)},this.compositeMaterial=new An({uniforms:this.compositeUniforms,vertexShader:Cd("Quad.vert"),fragmentShader:Cd("Quad.frag"),premultipliedAlpha:!0,transparent:!0,blending:Z,depthTest:!1,depthWrite:!1}),this.compositeCamera=new lr(-1,1,1,-1,0,1),this.compositeScene=new Ea,this.compositeScene.name="compositeScene",this.compositeScene.add(new Pn(new qr(2,2),this.compositeMaterial))},yf.prototype._initHelper=function(){var t=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]),e=new Float32Array(24),i=new $r;i.setIndex(new wr(t,1)),i.addAttribute("position",new wr(e,3));var r=new An({uniforms:{uColor:{value:new ki("skyblue")}},vertexShader:Cd("BasicLine.vert"),fragmentShader:Cd("BasicLine.frag")});this.boundingBoxMesh=new Na(i,r),this.helperGroup.add(this.boundingBoxMesh)},yf.prototype.updateHelper=function(){var t=this.boundingBoxMesh.geometry.attributes.position,e=t.array,i=this.boundingBox,r=i.min,n=i.max;e[0]=n.x,e[1]=n.y,e[2]=n.z,e[3]=r.x,e[4]=n.y,e[5]=n.z,e[6]=r.x,e[7]=r.y,e[8]=n.z,e[9]=n.x,e[10]=r.y,e[11]=n.z,e[12]=n.x,e[13]=n.y,e[14]=r.z,e[15]=r.x,e[16]=n.y,e[17]=r.z,e[18]=r.x,e[19]=r.y,e[20]=r.z,e[21]=n.x,e[22]=r.y,e[23]=r.z,t.needsUpdate=!0,this.boundingBox.isEmpty()||this.boundingBoxMesh.geometry.computeBoundingSphere()},yf.prototype.add=function(e,t){var i=this;t?t.forEach(function(t){return i.addBuffer(e,t)}):this.addBuffer(e),e.parameters.background?(this.backgroundGroup.add(e.group),this.backgroundGroup.add(e.wireframeGroup)):(this.modelGroup.add(e.group),this.modelGroup.add(e.wireframeGroup)),e.pickable&&this.pickingGroup.add(e.pickingGroup),de.Debug&&this.updateHelper()},yf.prototype.addBuffer=function(e,i){function r(t){t instanceof ya?t.children.forEach(r):(t.userData.buffer=e,t.userData.instance=i,t.onBeforeRender=vf)}var t=e.getMesh();i&&t.applyMatrix(i.matrix),r(t),e.group.add(t);var n=e.getWireframeMesh();if(i&&(n.matrix.copy(t.matrix),n.position.copy(t.position),n.quaternion.copy(t.quaternion),n.scale.copy(t.scale)),r(n),e.wireframeGroup.add(n),e.pickable){var o=e.getPickingMesh();i&&(o.matrix.copy(t.matrix),o.position.copy(t.position),o.quaternion.copy(t.quaternion),o.scale.copy(t.scale)),r(o),e.pickingGroup.add(o)}i?this._updateBoundingBox(e.geometry,e.matrix,i.matrix):this._updateBoundingBox(e.geometry,e.matrix)},yf.prototype.remove=function(e){this.translationGroup.children.forEach(function(t){t.remove(e.group),t.remove(e.wireframeGroup)}),e.pickable&&this.pickingGroup.remove(e.pickingGroup),this.updateBoundingBox(),de.Debug&&this.updateHelper()},yf.prototype._updateBoundingBox=function(t,e,i){var n=this.boundingBox;function r(t,e,i){t.boundingBox||t.computeBoundingBox();var r=t.boundingBox.clone();e&&r.applyMatrix4(e),i&&r.applyMatrix4(i),r.min.equals(r.max)&&r.expandByScalar(5),n.union(r)}function o(t){var e,i;void 0!==t.geometry&&(t.userData.buffer&&(e=t.userData.buffer.matrix),t.userData.instance&&(i=t.userData.instance.matrix),r(t.geometry,e,i))}t?r(t,e,i):(n.makeEmpty(),this.modelGroup.traverse(o),this.backgroundGroup.traverse(o)),n.getSize(this.boundingBoxSize),this.boundingBoxLength=this.boundingBoxSize.length()},yf.prototype.updateBoundingBox=function(){this._updateBoundingBox(),de.Debug&&this.updateHelper()},yf.prototype.getPickingPixels=function(){var t=this.width,e=this.height,i=t*e*4,r=Wp?new Float32Array(i):new Uint8Array(i);return this.render(!0),this.renderer.readRenderTargetPixels(this.pickingTarget,0,0,t,e,r),r},yf.prototype.getImage=function(l){var p=this;return new Promise(function(t){if(l){var e=p,i=e.width,r=e.height,n=i*r*4,o=p.getPickingPixels();if(Wp){for(var a=new Uint8Array(n),s=0;s<n;++s)a[s]=Math.round(255*o[s]);o=a}var c=document.createElement("canvas");c.width=i,c.height=r;var u=c.getContext("2d"),h=u.getImageData(0,0,i,r);h.data.set(o),u.putImageData(h,0,0),c.toBlob(t,"image/png")}else p.renderer.domElement.toBlob(t,"image/png")})},yf.prototype.makeImage=function(t){return void 0===t&&(t={}),tf(this,t)},yf.prototype.setLight=function(t,e,i,r){var n=this.parameters;void 0!==t&&n.lightColor.set(t),void 0!==e&&(n.lightIntensity=e),void 0!==i&&n.ambientColor.set(i),void 0!==r&&(n.ambientIntensity=r),this.requestRender()},yf.prototype.setFog=function(t,e,i){var r=this.parameters;void 0!==t&&r.fogColor.set(t),void 0!==e&&(r.fogNear=e),void 0!==i&&(r.fogFar=i),this.requestRender()},yf.prototype.setBackground=function(t){var e=this.parameters;t&&e.backgroundColor.set(t),this.setFog(e.backgroundColor),this.renderer.setClearColor(e.backgroundColor,0),this.renderer.domElement.style.backgroundColor=e.backgroundColor.getStyle(),this.requestRender()},yf.prototype.setSampling=function(t){void 0!==t&&(this.parameters.sampleLevel=t,this.sampleLevel=t),this.requestRender()},yf.prototype.setCamera=function(t,e,i){var r=this.parameters;if(t&&(r.cameraType=t),e&&(r.cameraFov=e),i&&(r.cameraEyeSep=i),"orthographic"===r.cameraType)this.camera!==this.orthographicCamera&&(this.camera=this.orthographicCamera,this.camera.position.copy(this.perspectiveCamera.position),this.camera.up.copy(this.perspectiveCamera.up),this.updateZoom());else{if("perspective"!==r.cameraType&&"stereo"!==r.cameraType)throw new Error("Unknown cameraType '"+r.cameraType+"'");this.camera!==this.perspectiveCamera&&(this.camera=this.perspectiveCamera,this.camera.position.copy(this.orthographicCamera.position),this.camera.up.copy(this.orthographicCamera.up))}this.perspectiveCamera.fov=r.cameraFov,this.stereoCamera.eyeSep=r.cameraEyeSep,this.camera.updateProjectionMatrix(),this.requestRender()},yf.prototype.setClip=function(t,e,i){var r=this.parameters;void 0!==t&&(r.clipNear=t),void 0!==e&&(r.clipFar=e),void 0!==i&&(r.clipDist=i),this.requestRender()},yf.prototype.setSize=function(t,e){this.width=t||1,this.height=e||1,this.perspectiveCamera.aspect=this.width/this.height,this.orthographicCamera.left=-this.width/2,this.orthographicCamera.right=this.width/2,this.orthographicCamera.top=this.height/2,this.orthographicCamera.bottom=-this.height/2,this.camera.updateProjectionMatrix();var i=window.devicePixelRatio;this.renderer.setPixelRatio(i),this.renderer.setSize(t,e);var r=this.width*i,n=this.height*i;this.pickingTarget.setSize(r,n),this.sampleTarget.setSize(r,n),this.holdTarget.setSize(r,n),this.requestRender()},yf.prototype.handleResize=function(){if(this.container===document.body)this.setSize(window.innerWidth,window.innerHeight);else{var t=this.container.getBoundingClientRect();this.setSize(t.width,t.height)}},yf.prototype.updateInfo=function(t){var e=this.info,i=e.memory,r=e.render;if(t)i.programs=0,i.geometries=0,i.textures=0,r.calls=0,r.vertices=0,r.points=0;else{var n=this.renderer.info,o=n.memory,a=n.render;i.geometries=o.geometries,i.textures=o.textures,r.calls+=a.calls,r.faces+=a.triangles,r.points+=a.points}},yf.prototype.animate=function(){if(this.signals.ticked.dispatch(this.stats),500<window.performance.now()-this.stats.startTime&&!this.isStill&&this.sampleLevel<3&&-1!==this.sampleLevel){var t=this.sampleLevel;this.sampleLevel=3,this.renderPending=!0,this.render(),this.isStill=!0,this.sampleLevel=t,de.Debug&&Yp.log("rendered still frame")}window.requestAnimationFrame(this.animate)},yf.prototype.pick=function(t,e){if("stereo"===this.parameters.cameraType)return{pid:0,instance:void 0,picker:void 0};t*=window.devicePixelRatio,e*=window.devicePixelRatio,t=Math.max(t-2,0),e=Math.max(e-2,0);var i,r,n=0,o=Wp?df:ff;this.render(!0),this.renderer.readRenderTargetPixels(this.pickingTarget,t,e,5,5,o);for(var a=0;a<mf.length;a++){var s=4*mf[a],c=Math.round(o[s+3]),u=this.pickingGroup.getObjectById(c);u&&(i=u.userData.instance,r=u.userData.buffer.picking,n=Wp?Math.round(255*o[s])<<16&16711680|Math.round(255*o[s+1])<<8&65280|255&Math.round(255*o[s+2]):o[s]<<16|o[s+1]<<8|o[s+2])}return{pid:n,instance:i,picker:r}},yf.prototype.requestRender=function(){var t=this;this.renderPending||(22<window.performance.now()-this.stats.startTime&&(this.stats.begin(),this.isStill=!1),this.renderPending=!0,window.requestAnimationFrame(function(){t.render(),t.stats.update()}))},yf.prototype.updateZoom=function(){var t=Gl(this.perspectiveCamera.fov),e=2*Math.tan(t/2)*-this.camera.position.z;this.orthographicCamera.zoom=this.height/e},yf.prototype.__updateClipping=function(){var t=this.parameters;this.cDist=this.distVector.copy(this.camera.position).length(),this.cDist||(this.camera.position.set(0,0,t.cameraZ),this.cDist=Math.abs(t.cameraZ)),this.bRadius=Math.max(10,.5*this.boundingBoxLength),this.bRadius+=this.boundingBox.getCenter(this.distVector).length(),(this.bRadius===1/0||this.bRadius===-1/0||isNaN(this.bRadius))&&(this.bRadius=50);var e=(50-t.clipNear)/50,i=-(50-t.clipFar)/50;this.camera.near=this.cDist-this.bRadius*e,this.camera.far=this.cDist+this.bRadius*i;var r=(50-t.fogNear)/50,n=-(50-t.fogFar)/50,o=this.scene.fog;o.color.set(t.fogColor),o.near=this.cDist-this.bRadius*r,o.far=this.cDist+this.bRadius*n,"PerspectiveCamera"===this.camera.type?(this.camera.near=Math.max(.1,t.clipDist,this.camera.near),this.camera.far=Math.max(1,this.camera.far),o.near=Math.max(.1,o.near),o.far=Math.max(1,o.far)):"OrthographicCamera"===this.camera.type&&0<t.clipDist&&(this.camera.near=Math.max(t.clipDist,this.camera.near))},yf.prototype.__updateCamera=function(){var t,e,i,o,a,r,n,s,c,u,h,l,v,p=this.camera;p.updateMatrix(),p.updateMatrixWorld(!0),p.updateProjectionMatrix(),t=this.scene,e=p,i=this.renderer,o=this.cDist,a=this.bRadius,r=i.getSize(),n=r.width,s=r.height,c=s,u=i.getPixelRatio(),h="OrthographicCamera"===e.type,of.set(n,s),af.getInverse(e.projectionMatrix),sf.copy(e.projectionMatrix).transpose(),t.traverse(function(t){var e=t.material;if(e){var i=e.uniforms;if(i){if(e.clipNear){var r=(50-e.clipNear)/50,n=o-a*r;i.clipNear.value=n}i.canvasHeight&&(i.canvasHeight.value=c),i.resolution&&i.resolution.value.copy(of),i.pixelRatio&&(i.pixelRatio.value=u),i.projectionMatrixInverse&&i.projectionMatrixInverse.value.copy(af),i.projectionMatrixTranspose&&i.projectionMatrixTranspose.value.copy(sf),i.ortho&&(i.ortho.value=h)}}}),l=this.scene,v=p,l.traverseVisible(function(t){if(t instanceof Ua&&t.userData.buffer.parameters.sortParticles){var e=t.geometry.attributes,i=e.position.count;if(0!==i){var r,n,o,a,s,c,u;rf.multiplyMatrices(v.matrixWorldInverse,t.matrixWorld),nf.multiplyMatrices(v.projectionMatrix,rf),t.userData.sortData?(r=t.userData.sortData,o=r.__zArray,n=r.__sortArray,a=r.__cmpFn):(o=new Float32Array(i),n=new Uint32Array(i),r={__zArray:o,__sortArray:n,__cmpFn:a=function(t,e){var i=o[t],r=o[e];return r<i?1:i<r?-1:0}},t.userData.sortData=r);for(var h=0;h<i;++h)ef.fromArray(e.position.array,3*h),ef.applyMatrix4(nf),o[h]=-ef.z,n[h]=h;for(var l in function(r,t,e,i){void 0===e&&(e=0),t=t||function(t,e){return e<t?1:t<e?-1:0};var n,o,a,s=[],c=-1,u=e,h=i=(i||r.length)-1;function l(t,e){var i=r[t];r[t]=r[e],r[e]=i}for(;;)if(h-u<=25){for(var p=u+1;p<=h;++p){for(n=r[p],o=p-1;u<=o&&0<t(r[o],n);)r[o+1]=r[o],--o;r[o+1]=n}if(-1===c)break;h=s[c--],u=s[c--]}else{for(l(u+(a=h)>>1,o=u+1),0<t(r[u],r[h])&&l(u,h),0<t(r[o],r[h])&&l(o,h),0<t(r[u],r[o])&&l(u,o),n=r[o];;){for(;t(r[++o],n)<0;);for(;0<t(r[--a],n););if(a<o)break;l(o,a)}r[u+1]=r[a],r[a]=n,a-u<=h-o+1?(s[++c]=o,s[++c]=h,h=a-1):(s[++c]=u,s[++c]=a-1,u=o)}}(n,a),e){var p=e[l],d=p.array,f=p.itemSize;r[l]||(r[l]=new Float32Array(f*i)),u=r[l],r[l]=d;for(var m=0;m<i;++m){s=n[m];for(var g=0;g<f;++g)c=s*f+g,u[m*f+g]=d[c]}e[l].array=u,e[l].needsUpdate=!0}}}})},yf.prototype.__setVisibility=function(t,e,i,r){this.modelGroup.visible=t,this.pickingGroup.visible=e,this.backgroundGroup.visible=i,this.helperGroup.visible=r},yf.prototype.__updateLights=function(){this.spotLight.color.set(this.parameters.lightColor),this.spotLight.intensity=this.parameters.lightIntensity,this.distVector.copy(this.camera.position).setLength(100*this.boundingBoxLength),this.spotLight.position.copy(this.camera.position).add(this.distVector),this.ambientLight.color.set(this.parameters.ambientColor),this.ambientLight.intensity=this.parameters.ambientIntensity},yf.prototype.__renderPickingGroup=function(t){this.renderer.clearTarget(this.pickingTarget,!0,!0,!0),this.__setVisibility(!1,!0,!1,!1),this.renderer.render(this.scene,t,this.pickingTarget),this.updateInfo(),this.renderer.setRenderTarget(null)},yf.prototype.__renderModelGroup=function(t,e){e?this.renderer.clearTarget(e,!0,!0,!0):this.renderer.clear(),this.__setVisibility(!1,!1,!0,!1),this.renderer.render(this.scene,t,e),e?this.renderer.clearTarget(e,!1,!0,!1):this.renderer.clearDepth(),this.updateInfo(),this.__setVisibility(!0,!1,!1,de.Debug),this.renderer.render(this.scene,t,e),this.updateInfo()},yf.prototype.__renderSuperSample=function(t){var e=kd[Math.max(0,Math.min(this.sampleLevel,5))],i=1/e.length;this.compositeUniforms.tForeground.value=this.sampleTarget.texture;var r=this.sampleTarget.width,n=this.sampleTarget.height;"stereo"===this.parameters.cameraType&&(r/=2);for(var o=0;o<e.length;++o){var a=e[o];t.setViewOffset(r,n,a[0],a[1],r,n),t.updateProjectionMatrix(),cf(this.scene,t);var s=i;s+=1/32*((o+.5)/e.length-.5),this.compositeUniforms.scale.value=s,this.__renderModelGroup(t,this.sampleTarget),this.renderer.render(this.compositeScene,this.compositeCamera,this.holdTarget,0===o)}this.compositeUniforms.scale.value=1,this.compositeUniforms.tForeground.value=this.holdTarget.texture,t.clearViewOffset(),this.renderer.render(this.compositeScene,this.compositeCamera,null,!0)},yf.prototype.__renderStereo=function(t){void 0===t&&(t=!1);var e=this.stereoCamera;e.update(this.perspectiveCamera);var i=this.renderer,r=i.getSize();i.setScissorTest(!0),i.setScissor(0,0,r.width/2,r.height),i.setViewport(0,0,r.width/2,r.height),cf(this.scene,e.cameraL),this.__render(t,e.cameraL),i.setScissor(r.width/2,0,r.width/2,r.height),i.setViewport(r.width/2,0,r.width/2,r.height),cf(this.scene,e.cameraR),this.__render(t,e.cameraR),i.setScissorTest(!1),i.setViewport(0,0,r.width,r.height)},yf.prototype.__render=function(t,e){void 0===t&&(t=!1),t?this.lastRenderedPicking||this.__renderPickingGroup(e):0<this.sampleLevel&&"stereo"!==this.parameters.cameraType?this.__renderSuperSample(e):this.__renderModelGroup(e)},yf.prototype.render=function(t){void 0===t&&(t=!1),this.rendering?Yp.warn("'tried to call 'render' from within 'render'"):(this.rendering=!0,this.__updateClipping(),this.__updateCamera(),this.__updateLights(),this.updateInfo(!0),"stereo"===this.parameters.cameraType?this.__renderStereo(t):this.__render(t,this.camera),this.lastRenderedPicking=t,this.rendering=!1,this.renderPending=!1,this.signals.rendered.dispatch())},yf.prototype.clear=function(){Yp.log("scene cleared"),this.scene.remove(this.rotationGroup),this._initScene(),this.renderer.clear()},yf.prototype.dispose=function(){this.renderer.dispose()};function bf(t){var e=t.touches[0].pageX-t.touches[1].pageX,i=t.touches[0].pageY-t.touches[1].pageY;return Math.sqrt(e*e+i*i)}var xf=function(t,e){void 0===e&&(e={}),this.domElement=t,this.signals={moved:new op,scrolled:new op,dragged:new op,dropped:new op,clicked:new op,hovered:new op,doubleClicked:new op},this.position=new ti,this.prevPosition=new ti,this.down=new ti,this.canvasPosition=new ti,this.prevClickCP=new ti,this.moving=!1,this.hovering=!0,this.scrolled=!1,this.lastMoved=1/0,this.which=0,this.buttons=0,this.pressed=!1,this.altKey=!1,this.ctrlKey=!1,this.metaKey=!1,this.shiftKey=!1,this.domElement.style.touchAction="none",this.hoverTimeout=bl(e.hoverTimeout,50),this.handleScroll=bl(e.handleScroll,!0),this.doubleClickSpeed=bl(e.doubleClickSpeed,500),this._listen=this._listen.bind(this),this._onMousewheel=this._onMousewheel.bind(this),this._onMousemove=this._onMousemove.bind(this),this._onMousedown=this._onMousedown.bind(this),this._onMouseup=this._onMouseup.bind(this),this._onContextmenu=this._onContextmenu.bind(this),this._onTouchstart=this._onTouchstart.bind(this),this._onTouchend=this._onTouchend.bind(this),this._onTouchmove=this._onTouchmove.bind(this),this._listen();var i={passive:!1};document.addEventListener("mousewheel",this._onMousewheel,i),document.addEventListener("wheel",this._onMousewheel,i),document.addEventListener("MozMousePixelScroll",this._onMousewheel,i),document.addEventListener("mousemove",this._onMousemove,i),document.addEventListener("mousedown",this._onMousedown,i),document.addEventListener("mouseup",this._onMouseup,i),document.addEventListener("contextmenu",this._onContextmenu,i),document.addEventListener("touchstart",this._onTouchstart,i),document.addEventListener("touchend",this._onTouchend,i),document.addEventListener("touchmove",this._onTouchmove,i)},_f={key:{configurable:!0}};_f.key.get=function(){var t=0;return this.altKey&&(t+=1),this.ctrlKey&&(t+=2),this.metaKey&&(t+=4),this.shiftKey&&(t+=8),t},xf.prototype.setParameters=function(t){void 0===t&&(t={}),this.hoverTimeout=bl(t.hoverTimeout,this.hoverTimeout)},xf.prototype._listen=function(){var t=window.performance.now(),e=this.canvasPosition;this.doubleClickPending&&t-this.lastClicked>this.doubleClickSpeed&&(this.doubleClickPending=!1),t-this.lastMoved>this.hoverTimeout&&(this.moving=!1),(this.scrolled||!this.moving&&!this.hovering)&&(this.scrolled=!1,-1!==this.hoverTimeout&&this.overElement&&(this.hovering=!0,this.signals.hovered.dispatch(e.x,e.y))),window.requestAnimationFrame(this._listen)},xf.prototype._onMousewheel=function(t){var e=this;if(t.target===this.domElement&&this.handleScroll){t.preventDefault(),this._setKeys(t);var i=0;i=t.wheelDelta?t.wheelDelta/40:t.detail?-t.detail/3:-t.deltaY/(t.deltaMode?.33:30),this.signals.scrolled.dispatch(i),setTimeout(function(){e.scrolled=!0},this.hoverTimeout)}},xf.prototype._onMousemove=function(t){t.target===this.domElement?(t.preventDefault(),this.overElement=!0):this.overElement=!1,this._setKeys(t),this.moving=!0,this.hovering=!1,this.lastMoved=window.performance.now(),this.prevPosition.copy(this.position),this.position.set(t.clientX,t.clientY),this._setCanvasPosition(t);var e=this.prevPosition.x-this.position.x,i=this.prevPosition.y-this.position.y;this.signals.moved.dispatch(e,i),this.pressed&&this.signals.dragged.dispatch(e,i)},xf.prototype._onMousedown=function(t){t.target===this.domElement&&(t.preventDefault(),this._setKeys(t),this.moving=!1,this.hovering=!1,this.down.set(t.clientX,t.clientY),this.position.set(t.clientX,t.clientY),this.which=t.which,this.buttons=function(t){if("object"==typeof t){if("buttons"in t)return t.buttons;if("which"in t){var e=t.which;if(2===e)return 4;if(3===e)return 2;if(0<e)return 1<<e-1}else if("button"in t){var i=t.button;if(1===i)return 4;if(2===i)return 2;if(0<=i)return 1<<i}}return 0}(t),this.pressed=!0,this._setCanvasPosition(t))},xf.prototype._onMouseup=function(t){t.target===this.domElement&&t.preventDefault(),this._setKeys(t);var e=this.canvasPosition;this._distance()<4&&(this.lastClicked=window.performance.now(),this.doubleClickPending&&this.prevClickCP.distanceTo(e)<4&&(this.signals.doubleClicked.dispatch(e.x,e.y),this.doubleClickPending=!1),this.signals.clicked.dispatch(e.x,e.y),this.doubleClickPending=!0,this.prevClickCP.copy(e)),this.which=void 0,this.buttons=void 0,this.pressed=void 0},xf.prototype._onContextmenu=function(t){t.target===this.domElement&&t.preventDefault()},xf.prototype._onTouchstart=function(t){if(t.target===this.domElement)switch(t.preventDefault(),this.pressed=!0,t.touches.length){case 1:this.moving=!1,this.hovering=!1,this.down.set(t.touches[0].pageX,t.touches[0].pageY),this.position.set(t.touches[0].pageX,t.touches[0].pageY),this._setCanvasPosition(t.touches[0]);break;case 2:this.down.set((t.touches[0].pageX+t.touches[1].pageX)/2,(t.touches[0].pageY+t.touches[1].pageY)/2),this.position.set((t.touches[0].pageX+t.touches[1].pageX)/2,(t.touches[0].pageY+t.touches[1].pageY)/2),this.lastTouchDistance=bf(t)}},xf.prototype._onTouchend=function(t){t.target===this.domElement&&t.preventDefault(),this.which=void 0,this.buttons=void 0,this.pressed=void 0},xf.prototype._onTouchmove=function(t){switch(t.target===this.domElement?(t.preventDefault(),this.overElement=!0):this.overElement=!1,t.touches.length){case 1:this._setKeys(t),this.which=1,this.buttons=1,this.moving=!0,this.hovering=!1,this.lastMoved=window.performance.now(),this.prevPosition.copy(this.position),this.position.set(t.touches[0].pageX,t.touches[0].pageY),this._setCanvasPosition(t.touches[0]);var e=this.prevPosition.x-this.position.x,i=this.prevPosition.y-this.position.y;this.signals.moved.dispatch(e,i),this.pressed&&this.signals.dragged.dispatch(e,i);break;case 2:var r=bf(t),n=r-this.lastTouchDistance;if(this.lastTouchDistance=r,this.prevPosition.copy(this.position),this.position.set((t.touches[0].pageX+t.touches[1].pageX)/2,(t.touches[0].pageY+t.touches[1].pageY)/2),2<Math.abs(n)&&this.handleScroll&&this.position.distanceTo(this.prevPosition)<2)this.which=0,this.buttons=0,this.signals.scrolled.dispatch(n/2);else{this.which=3,this.buttons=2;var o=this.prevPosition.x-this.position.x,a=this.prevPosition.y-this.position.y;this.signals.moved.dispatch(o,a),this.pressed&&this.signals.dragged.dispatch(o,a)}}},xf.prototype._distance=function(){return this.position.distanceTo(this.down)},xf.prototype._setCanvasPosition=function(t){var e,i,r=this.domElement.getBoundingClientRect();"offsetX"in t&&"offsetY"in t?(e=t.offsetX,i=t.offsetY):(e=t.clientX-r.left,i=t.clientY-r.top),this.canvasPosition.set(e,r.height-i)},xf.prototype._setKeys=function(t){this.altKey=t.altKey,this.ctrlKey=t.ctrlKey,this.metaKey=t.metaKey,this.shiftKey=t.shiftKey},xf.prototype.dispose=function(){document.removeEventListener("mousewheel",this._onMousewheel),document.removeEventListener("wheel",this._onMousewheel),document.removeEventListener("MozMousePixelScroll",this._onMousewheel),document.removeEventListener("mousemove",this._onMousemove),document.removeEventListener("mousedown",this._onMousedown),document.removeEventListener("mouseup",this._onMouseup),document.removeEventListener("contextmenu",this._onContextmenu),document.removeEventListener("touchstart",this._onTouchstart),document.removeEventListener("touchend",this._onTouchend),document.removeEventListener("touchmove",this._onTouchmove)},Object.defineProperties(xf.prototype,_f);var wf=new ei,Sf=new ei,Af=new ei,Mf=new ei,Ef=new ri,Pf=new ii,Tf=new ei,Cf=new ri,If=new ri,Of=function(t,e){void 0===e&&(e={}),this.stage=t,this.rotateSpeed=bl(e.rotateSpeed,2),this.zoomSpeed=bl(e.zoomSpeed,1.2),this.panSpeed=bl(e.panSpeed,1),this.viewer=t.viewer,this.mouse=t.mouseObserver,this.controls=t.viewerControls},Lf={component:{configurable:!0},atom:{configurable:!0}};Lf.component.get=function(){return this.stage.transformComponent},Lf.atom.get=function(){return this.stage.transformAtom},Of.prototype._setPanVector=function(t,e,i){void 0===i&&(i=0);var r=this.controls.getCanvasScaleFactor(i);Cf.set(t,e,0),Cf.multiplyScalar(this.panSpeed*r)},Of.prototype._getRotateXY=function(t,e){return[this.rotateSpeed*-t*.01,this.rotateSpeed*e*.01]},Of.prototype._transformPanVector=function(){this.component&&(Tf.extractRotation(this.component.transform),Tf.premultiply(this.viewer.rotationGroup.matrix),Tf.getInverse(Tf),Cf.applyMatrix4(Tf))},Of.prototype.zoom=function(t){this.controls.zoom(this.zoomSpeed*t*.02)},Of.prototype.pan=function(t,e){this._setPanVector(t,e),Tf.getInverse(this.viewer.rotationGroup.matrix),Cf.applyMatrix4(Tf),this.controls.translate(Cf)},Of.prototype.panComponent=function(t,e){this.component&&(this._setPanVector(t,e),this._transformPanVector(),this.component.position.add(Cf),this.component.updateMatrix())},Of.prototype.panAtom=function(t,e){this.atom&&this.component&&(this.atom.positionToVector3(If),If.add(this.viewer.translationGroup.position),If.applyMatrix4(this.viewer.rotationGroup.matrix),this._setPanVector(t,e,If.z),this._transformPanVector(),this.atom.positionAdd(Cf),this.component.updateRepresentations({position:!0}))},Of.prototype.rotate=function(t,e){var i=this._getRotateXY(t,e),r=i[0],n=i[1];wf.makeRotationX(n),Sf.makeRotationY(r),wf.multiply(Sf),this.controls.applyMatrix(wf)},Of.prototype.zRotate=function(t,e){var i=this.rotateSpeed*((-t+e)/-2)*.01;Af.makeRotationZ(i),this.controls.applyMatrix(Af)},Of.prototype.rotateComponent=function(t,e){if(this.component){var i=this._getRotateXY(t,e),r=i[0],n=i[1];Mf.extractRotation(this.component.transform),Mf.premultiply(this.viewer.rotationGroup.matrix),Mf.getInverse(Mf),Ef.set(1,0,0),Ef.applyMatrix4(Mf),wf.makeRotationAxis(Ef,n),Ef.set(0,1,0),Ef.applyMatrix4(Mf),Sf.makeRotationAxis(Ef,r),wf.multiply(Sf),Pf.setFromRotationMatrix(wf),this.component.quaternion.premultiply(Pf),this.component.updateMatrix()}},Object.defineProperties(Of.prototype,Lf);var Rf=new ri;var Df=function(t,e){this.stage=e,this.pid=t.pid,this.picker=t.picker,this.instance=t.instance,this.stage=e,this.controls=e.viewerControls,this.mouse=e.mouseObserver},kf={type:{configurable:!0},altKey:{configurable:!0},ctrlKey:{configurable:!0},metaKey:{configurable:!0},shiftKey:{configurable:!0},canvasPosition:{configurable:!0},component:{configurable:!0},object:{configurable:!0},position:{configurable:!0},closestBondAtom:{configurable:!0},closeAtom:{configurable:!0},arrow:{configurable:!0},atom:{configurable:!0},axes:{configurable:!0},bond:{configurable:!0},box:{configurable:!0},cone:{configurable:!0},clash:{configurable:!0},contact:{configurable:!0},cylinder:{configurable:!0},distance:{configurable:!0},ellipsoid:{configurable:!0},octahedron:{configurable:!0},point:{configurable:!0},mesh:{configurable:!0},slice:{configurable:!0},sphere:{configurable:!0},tetrahedron:{configurable:!0},torus:{configurable:!0},surface:{configurable:!0},unitcell:{configurable:!0},unknown:{configurable:!0},volume:{configurable:!0},wideline:{configurable:!0}};kf.type.get=function(){return this.picker.type},kf.altKey.get=function(){return this.mouse.altKey},kf.ctrlKey.get=function(){return this.mouse.ctrlKey},kf.metaKey.get=function(){return this.mouse.metaKey},kf.shiftKey.get=function(){return this.mouse.shiftKey},kf.canvasPosition.get=function(){return this.mouse.canvasPosition},kf.component.get=function(){return this.stage.getComponentsByObject(this.picker.data).list[0]},kf.object.get=function(){return this.picker.getObject(this.pid)},kf.position.get=function(){return this.picker.getPosition(this.pid,this.instance,this.component)},kf.closestBondAtom.get=function(){if("bond"===this.type&&this.bond){var t,e,i,r=this.bond,n=this.controls,o=this.canvasPosition,a=n.getPositionOnCanvas(r.atom1),s=n.getPositionOnCanvas(r.atom2);return e=a,i=s,(t=o).distanceTo(e)<t.distanceTo(i)?r.atom1:r.atom2}},kf.closeAtom.get=function(){var t=this.canvasPosition,e=this.closestBondAtom;if(e){var i=this.controls.getPositionOnCanvas(e);e.positionToVector3(Rf),this.instance&&Rf.applyMatrix4(this.instance.matrix),Rf.applyMatrix4(this.component.matrix);var r=this.controls.viewer;Rf.add(r.translationGroup.position),Rf.applyMatrix4(r.rotationGroup.matrix);var n=this.controls.getCanvasScaleFactor(Rf.z),o=this.component.getMaxRepresentationRadius(e.index);return t.distanceTo(i)<=o/n?e:void 0}},kf.arrow.get=function(){return this._objectIfType("arrow")},kf.atom.get=function(){return this._objectIfType("atom")},kf.axes.get=function(){return this._objectIfType("axes")},kf.bond.get=function(){return this._objectIfType("bond")},kf.box.get=function(){return this._objectIfType("box")},kf.cone.get=function(){return this._objectIfType("cone")},kf.clash.get=function(){return this._objectIfType("clash")},kf.contact.get=function(){return this._objectIfType("contact")},kf.cylinder.get=function(){return this._objectIfType("cylinder")},kf.distance.get=function(){return this._objectIfType("distance")},kf.ellipsoid.get=function(){return this._objectIfType("ellipsoid")},kf.octahedron.get=function(){return this._objectIfType("octahedron")},kf.point.get=function(){return this._objectIfType("point")},kf.mesh.get=function(){return this._objectIfType("mesh")},kf.slice.get=function(){return this._objectIfType("slice")},kf.sphere.get=function(){return this._objectIfType("sphere")},kf.tetrahedron.get=function(){return this._objectIfType("tetrahedron")},kf.torus.get=function(){return this._objectIfType("torus")},kf.surface.get=function(){return this._objectIfType("surface")},kf.unitcell.get=function(){return this._objectIfType("unitcell")},kf.unknown.get=function(){return this._objectIfType("unknown")},kf.volume.get=function(){return this._objectIfType("volume")},kf.wideline.get=function(){return this._objectIfType("wideline")},Df.prototype._objectIfType=function(t){return this.type===t?this.object:void 0},Df.prototype.getLabel=function(){var t=this.atom||this.closeAtom,e="nothing";return this.arrow?e=this.arrow.name:t?e="atom: "+t.qualifiedName()+" ("+t.structure.name+")":this.axes?e="axes":this.bond?e="bond: "+this.bond.atom1.qualifiedName()+" - "+this.bond.atom2.qualifiedName()+" ("+this.bond.structure.name+")":this.box?e=this.box.name:this.cone?e=this.cone.name:this.clash?e="clash: "+this.clash.clash.sele1+" - "+this.clash.clash.sele2:this.contact?e=this.contact.type+": "+this.contact.atom1.qualifiedName()+" - "+this.contact.atom2.qualifiedName()+" ("+this.contact.atom1.structure.name+")":this.cylinder?e=this.cylinder.name:this.distance?e="distance: "+this.distance.atom1.qualifiedName()+" - "+this.distance.atom2.qualifiedName()+" ("+this.distance.structure.name+")":this.ellipsoid?e=this.ellipsoid.name:this.octahedron?e=this.octahedron.name:this.point?e=this.point.name:this.mesh?e="mesh: "+(this.mesh.name||this.mesh.serial)+" ("+this.mesh.shape.name+")":this.slice?e="slice: "+this.slice.value.toPrecision(3)+" ("+this.slice.volume.name+")":this.sphere?e=this.sphere.name:this.surface?e="surface: "+this.surface.surface.name:this.tetrahedron?e=this.tetrahedron.name:this.torus?e=this.torus.name:this.unitcell?e="unitcell: "+this.unitcell.unitcell.spacegroup+" ("+this.unitcell.structure.name+")":this.unknown?e="unknown":this.volume?e="volume: "+this.volume.value.toPrecision(3)+" ("+this.volume.volume.name+")":this.wideline&&(e=this.wideline.name),e},Object.defineProperties(Df.prototype,kf);var Bf=function(t){this.stage=t,this.viewer=t.viewer};Bf.prototype.pick=function(t,e){var i=this.viewer.pick(t,e);if(i.picker&&"ignore"!==i.picker.type&&void 0!==i.pid){var r=i.picker.array;if(!(r&&i.pid>=r.length))return new Df(i,this.stage);console.error("pid >= picker.array.length")}};var Nf=new ii,Ff=new ri,zf=new ri,Uf=new ri,jf=new ri,Gf=new ei,Vf=new ri,Hf=new ei,$f=function(t){this.stage=t,this.signals={changed:new op},this.viewer=t.viewer},Wf={position:{configurable:!0},rotation:{configurable:!0}};Wf.position.get=function(){return this.viewer.translationGroup.position},Wf.rotation.get=function(){return this.viewer.rotationGroup.quaternion},$f.prototype.changed=function(){this.viewer.requestRender(),this.signals.changed.dispatch()},$f.prototype.getPositionOnCanvas=function(t,e){var i=Dl(e,ti),r=this.viewer;return Uf.copy(t).add(r.translationGroup.position).applyMatrix4(r.rotationGroup.matrix).project(r.camera),i.set((Uf.x+1)*r.width/2,(Uf.y+1)*r.height/2)},$f.prototype.getCanvasScaleFactor=function(t){void 0===t&&(t=0);var e=this.viewer.camera;if(e instanceof lr)return 1/e.zoom;t=-t,t+=e.position.z;var i=Gl(e.fov);return-2*t*Math.tan(i/2)/this.viewer.height},$f.prototype.getOrientation=function(t){var e=Bl(t);e.copy(this.viewer.rotationGroup.matrix);var i=-this.viewer.camera.position.z;return e.scale(jf.set(i,i,i)),e.setPosition(this.viewer.translationGroup.position),e},$f.prototype.orient=function(t){Bl(t).decompose(Ff,Nf,zf);var e=this.viewer;e.rotationGroup.setRotationFromQuaternion(Nf),e.translationGroup.position.copy(Ff),e.camera.position.z=-zf.z,e.updateZoom(),this.changed()},$f.prototype.translate=function(t){this.viewer.translationGroup.position.add(kl(t)),this.changed()},$f.prototype.center=function(t){this.viewer.translationGroup.position.copy(kl(t)).negate(),this.changed()},$f.prototype.zoom=function(t){this.distance(this.viewer.camera.position.z*(1-t))},$f.prototype.distance=function(t){this.viewer.camera.position.z=Math.min(-1,t),this.viewer.updateZoom(),this.changed()},$f.prototype.spin=function(t,e){Gf.getInverse(this.viewer.rotationGroup.matrix),Vf.copy(kl(t)).applyMatrix4(Gf),this.viewer.rotationGroup.rotateOnAxis(Vf,e),this.changed()},$f.prototype.rotate=function(t){this.viewer.rotationGroup.setRotationFromQuaternion(Nl(t)),this.changed()},$f.prototype.align=function(t){Hf.getInverse(Bl(t)),this.viewer.rotationGroup.setRotationFromMatrix(Hf),this.changed()},$f.prototype.applyMatrix=function(t){this.viewer.rotationGroup.applyMatrix(Bl(t)),this.changed()},Object.defineProperties($f.prototype,Wf);var Xf=function(t,e){for(var i,r=[],n=arguments.length-2;0<n--;)r[n]=arguments[n+2];this.pausedTime=-1,this.elapsedDuration=0,this.pausedDuration=0,this.ignoreGlobalToggle=!1,this._paused=!1,this._resolveList=[],this.duration=bl(t,1e3),this.controls=e,this.startTime=window.performance.now(),(i=this)._init.apply(i,r)},qf={done:{configurable:!0},paused:{configurable:!0}};qf.done.get=function(){return 1===this.alpha},qf.paused.get=function(){return this._paused},Xf.prototype.tick=function(t){if(!this._paused)return this.elapsedDuration=t.currentTime-this.startTime-this.pausedDuration,0===this.duration?this.alpha=1:this.alpha=Zl(0,1,this.elapsedDuration/this.duration),this._tick(t),this.done&&this._resolveList.forEach(function(t){return t()}),this.done},Xf.prototype.pause=function(t){t&&(this._hold=!0),-1===this.pausedTime&&(this.pausedTime=window.performance.now()),this._paused=!0},Xf.prototype.resume=function(t){!t&&this._hold||(this.pausedDuration+=window.performance.now()-this.pausedTime,this._paused=!1,this._hold=!1,this.pausedTime=-1)},Xf.prototype.toggle=function(){this._paused?this.resume():this.pause()},Xf.prototype.then=function(t){var e=this;return(this.done?Promise.resolve():new Promise(function(t){return e._resolveList.push(t)})).then(t)},Object.defineProperties(Xf.prototype,qf);var Yf=function(n){function t(t,e){for(var i=[],r=arguments.length-2;0<r--;)i[r]=arguments[r+2];n.apply(this,[bl(t,1/0),e].concat(i))}return n&&(t.__proto__=n),((t.prototype=Object.create(n&&n.prototype)).constructor=t).prototype._init=function(t,e){Array.isArray(t)?this.axis=(new ri).fromArray(t):this.axis=bl(t,new ri(0,1,0)),this.angle=bl(e,.01)},t.prototype._tick=function(t){this.axis&&this.angle&&this.controls.spin(this.axis,this.angle*t.lastDuration/16)},t}(Xf),Zf=function(n){function t(t,e){for(var i=[],r=arguments.length-2;0<r--;)i[r]=arguments[r+2];n.apply(this,[bl(t,1/0),e].concat(i)),this.angleSum=0,this.direction=1}return n&&(t.__proto__=n),((t.prototype=Object.create(n&&n.prototype)).constructor=t).prototype._init=function(t,e,i){Array.isArray(t)?this.axis=(new ri).fromArray(t):this.axis=bl(t,new ri(0,1,0)),this.angleStep=bl(e,.01),this.angleEnd=bl(i,.2)},t.prototype._tick=function(t){if(this.axis&&this.angleStep&&this.angleEnd){var e=Zl(0,1,Math.abs(this.angleSum)/this.angleEnd),i=this.angleStep*this.direction*(1.1-e);this.controls.spin(this.axis,i*t.lastDuration/16),this.angleSum+=this.angleStep,this.angleSum>=this.angleEnd&&(this.direction*=-1,this.angleSum=-this.angleEnd)}},t}(Xf),Kf=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),((e.prototype=Object.create(t&&t.prototype)).constructor=e).prototype._init=function(t,e){this.moveFrom=kl(bl(t,new ri)),this.moveTo=kl(bl(e,new ri))},e.prototype._tick=function(){this.controls.position.lerpVectors(this.moveFrom,this.moveTo,this.alpha).negate(),this.controls.changed()},e}(Xf),Jf=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),((e.prototype=Object.create(t&&t.prototype)).constructor=e).prototype._init=function(t,e){this.zoomFrom=t,this.zoomTo=e},e.prototype._tick=function(){this.controls.distance(ql(this.zoomFrom,this.zoomTo,this.alpha))},e}(Xf),Qf=function(t){function e(){t.apply(this,arguments),this._currentRotation=new ii}return t&&(e.__proto__=t),((e.prototype=Object.create(t&&t.prototype)).constructor=e).prototype._init=function(t,e){this.rotateFrom=Nl(t),this.rotateTo=Nl(e),this._currentRotation=new ii},e.prototype._tick=function(){this._currentRotation.copy(this.rotateFrom).slerp(this.rotateTo,this.alpha),this.controls.rotate(this._currentRotation)},e}(Xf),tm=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),((e.prototype=Object.create(t&&t.prototype)).constructor=e).prototype._init=function(t,e,i){this.valueFrom=t,this.valueTo=e,this.callback=i},e.prototype._tick=function(){this.callback(ql(this.valueFrom,this.valueTo,this.alpha))},e}(Xf),em=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),((e.prototype=Object.create(t&&t.prototype)).constructor=e).prototype._init=function(t){this.callback=t},e.prototype._tick=function(){1===this.alpha&&this.callback()},e}(Xf),im=function(t){void 0===t&&(t=[]),this._resolveList=[],this._list=t},rm={done:{configurable:!0}};rm.done.get=function(){return this._list.every(function(t){return t.done})},im.prototype.then=function(t){var e=this;return(this.done?Promise.resolve():new Promise(function(t){e._resolveList.push(t),e._list.forEach(function(t){t.then(function(){e._resolveList.forEach(function(t){t()}),e._resolveList.length=0})})})).then(t)},Object.defineProperties(im.prototype,rm);var nm=function(t){this.stage=t,this.animationList=[],this.finishedList=[],this.viewer=t.viewer,this.controls=t.viewerControls},om={paused:{configurable:!0}};om.paused.get=function(){return this.animationList.every(function(t){return t.paused})},nm.prototype.add=function(t){return 0===t.duration?t.tick(this.viewer.stats):this.animationList.push(t),t},nm.prototype.remove=function(t){var e=this.animationList,i=e.indexOf(t);-1<i&&e.splice(i,1)},nm.prototype.run=function(t){for(var e=this.finishedList,i=this.animationList,r=i.length,n=0;n<r;++n){var o=i[n];o.tick(t)&&e.push(o)}var a=e.length;if(a){for(var s=0;s<a;++s)this.remove(e[s]);e.length=0}},nm.prototype.spin=function(t,e,i){return this.add(new Yf(i,this.controls,t,e))},nm.prototype.rock=function(t,e,i,r){return this.add(new Zf(r,this.controls,t,e,i))},nm.prototype.rotate=function(t,e){var i=this.viewer.rotationGroup.quaternion.clone();return this.add(new Qf(e,this.controls,i,t))},nm.prototype.move=function(t,e){var i=this.controls.position.clone().negate();return this.add(new Kf(e,this.controls,i,t))},nm.prototype.zoom=function(t,e){var i=this.viewer.camera.position.z;return this.add(new Jf(e,this.controls,i,t))},nm.prototype.zoomMove=function(t,e,i){return new im([this.move(t,i),this.zoom(e,i)])},nm.prototype.orient=function(t,e){var i=new ri,r=new ii,n=new ri;return Bl(t).decompose(i,r,n),new im([this.move(i.negate(),e),this.rotate(r,e),this.zoom(-n.x,e)])},nm.prototype.value=function(t,e,i,r){return this.add(new tm(r,this.controls,t,e,i))},nm.prototype.timeout=function(t,e){return this.add(new em(e,this.controls,t))},nm.prototype.spinComponent=function(t,e,i,r){return this.add(new Yf(r,t.controls,e,i))},nm.prototype.rockComponent=function(t,e,i,r,n){return this.add(new Zf(n,t.controls,e,i,r))},nm.prototype.moveComponent=function(t,e,i){var r=t.controls.position.clone().negate();return this.add(new Kf(i,t.controls,r,e))},nm.prototype.pause=function(){this.animationList.forEach(function(t){return t.pause()})},nm.prototype.resume=function(){this.animationList.forEach(function(t){return t.resume()})},nm.prototype.toggle=function(){this.paused?this.resume():this.pause()},nm.prototype.clear=function(){this.animationList.length=0},nm.prototype.dispose=function(){this.clear()},Object.defineProperties(nm.prototype,om);var am=function(t,e){if(this.fn=t,this.queue=[],this.pending=!1,this.next=this.next.bind(this),e){for(var i=0,r=e.length;i<r;++i)this.queue.push(e[i]);this.next()}};am.prototype.run=function(t){this.fn(t,this.next)},am.prototype.next=function(){var t=this,e=this.queue.shift();void 0!==e?(this.pending=!0,setTimeout(function(){return t.run(e)})):this.pending=!1},am.prototype.push=function(t){this.queue.push(t),this.pending||this.next()},am.prototype.kill=function(){this.queue.length=0},am.prototype.length=function(){return this.queue.length};var sm=function(t,e,i){this.type="",this.parameters={lazy:{type:"boolean"},clipNear:{type:"range",step:1,max:100,min:0,buffer:!0},clipRadius:{type:"number",precision:1,max:1e3,min:0,buffer:!0},clipCenter:{type:"vector3",precision:1,buffer:!0},flatShaded:{type:"boolean",buffer:!0},opacity:{type:"range",step:.01,max:1,min:0,buffer:!0},depthWrite:{type:"boolean",buffer:!0},side:{type:"select",buffer:!0,options:{front:"front",back:"back",double:"double"}},wireframe:{type:"boolean",buffer:!0},colorScheme:{type:"select",update:"color",options:{}},colorScale:{type:"select",update:"color",options:Qp.getScales()},colorReverse:{type:"boolean",update:"color"},colorValue:{type:"color",update:"color"},colorDomain:{type:"hidden",update:"color"},colorMode:{type:"select",update:"color",options:Qp.getModes()},roughness:{type:"range",step:.01,max:1,min:0,buffer:!0},metalness:{type:"range",step:.01,max:1,min:0,buffer:!0},diffuse:{type:"color",buffer:!0},diffuseInterior:{type:"boolean",buffer:!0},useInteriorColor:{type:"boolean",buffer:!0},interiorColor:{type:"color",buffer:!0},interiorDarkening:{type:"range",step:.01,max:1,min:0,buffer:!0},matrix:{type:"hidden",buffer:!0},disablePicking:{type:"boolean",rebuild:!0}},this.viewer=e,this.tasks=new Md,this.queue=new am(this.make.bind(this)),this.bufferList=[],this.parameters.colorScheme&&(this.parameters.colorScheme.options=Qp.getSchemes()),this.toBePrepared=!1};sm.prototype.init=function(t){var e=t||{};this.clipNear=bl(e.clipNear,0),this.clipRadius=bl(e.clipRadius,0),this.clipCenter=bl(e.clipCenter,new ri),this.flatShaded=bl(e.flatShaded,!1),this.side=bl(e.side,"double"),this.opacity=bl(e.opacity,1),this.depthWrite=bl(e.depthWrite,!0),this.wireframe=bl(e.wireframe,!1),this.setColor(e.color,e),this.colorScheme=bl(e.colorScheme,"uniform"),this.colorScale=bl(e.colorScale,""),this.colorReverse=bl(e.colorReverse,!1),this.colorValue=bl(e.colorValue,9474192),this.colorDomain=bl(e.colorDomain,void 0),this.colorMode=bl(e.colorMode,"hcl"),this.visible=bl(e.visible,!0),this.quality=bl(e.quality,void 0),this.roughness=bl(e.roughness,.4),this.metalness=bl(e.metalness,0),this.diffuse=bl(e.diffuse,16777215),this.diffuseInterior=bl(e.diffuseInterior,!1),this.useInteriorColor=bl(e.useInteriorColor,!1),this.interiorColor=bl(e.interiorColor,2236962),this.interiorDarkening=bl(e.interiorDarkening,0),this.lazy=bl(e.lazy,!1),this.lazyProps={build:!1,bufferParams:{},what:{}},this.matrix=bl(e.matrix,new ei),this.disablePicking=bl(e.disablePicking,!1);var i=this.parameters;!0===i.sphereDetail&&(i.sphereDetail={type:"integer",max:3,min:0,rebuild:"impostor"}),!0===i.radialSegments&&(i.radialSegments={type:"integer",max:25,min:5,rebuild:"impostor"}),!0===i.openEnded&&(i.openEnded={type:"boolean",rebuild:"impostor",buffer:!0}),!0===i.disableImpostor&&(i.disableImpostor={type:"boolean",rebuild:!0}),"low"===e.quality?(i.sphereDetail&&(this.sphereDetail=0),i.radialSegments&&(this.radialSegments=5)):"medium"===e.quality?(i.sphereDetail&&(this.sphereDetail=1),i.radialSegments&&(this.radialSegments=10)):"high"===e.quality?(i.sphereDetail&&(this.sphereDetail=2),i.radialSegments&&(this.radialSegments=20)):(i.sphereDetail&&(this.sphereDetail=bl(e.sphereDetail,1)),i.radialSegments&&(this.radialSegments=bl(e.radialSegments,10))),i.openEnded&&(this.openEnded=bl(e.openEnded,!0)),i.disableImpostor&&(this.disableImpostor=bl(e.disableImpostor,!1))},sm.prototype.getColorParams=function(t){return Object.assign({scheme:this.colorScheme,scale:this.colorScale,reverse:this.colorReverse,value:this.colorValue,domain:this.colorDomain,mode:this.colorMode},t)},sm.prototype.getBufferParams=function(t){return void 0===t&&(t={}),Object.assign({clipNear:this.clipNear,clipRadius:this.clipRadius,clipCenter:this.clipCenter,flatShaded:this.flatShaded,opacity:this.opacity,depthWrite:this.depthWrite,side:this.side,wireframe:this.wireframe,roughness:this.roughness,metalness:this.metalness,diffuse:this.diffuse,diffuseInterior:this.diffuseInterior,useInteriorColor:this.useInteriorColor,interiorColor:this.interiorColor,interiorDarkening:this.interiorDarkening,matrix:this.matrix,disablePicking:this.disablePicking},t)},sm.prototype.setColor=function(t,e){var i=Object.keys(Qp.getSchemes());if("string"==typeof t&&i.includes(t.toLowerCase()))e?e.colorScheme=t:this.setParameters({colorScheme:t});else if(void 0!==t){var r=new ki(t).getHex();e?(e.colorScheme="uniform",e.colorValue=r):this.setParameters({colorScheme:"uniform",colorValue:r})}return this},sm.prototype.prepare=function(t){},sm.prototype.create=function(){},sm.prototype.update=function(t){this.build()},sm.prototype.build=function(t){if(!this.lazy||this.visible&&this.opacity){if(!this.toBePrepared)return this.tasks.increment(),void this.make();0<this.queue.length()?(this.tasks.change(1-this.queue.length()),this.queue.kill()):this.tasks.increment(),this.queue.push(t||!1)}else this.lazyProps.build=!0},sm.prototype.make=function(t,e){var i=this;de.Debug&&Yp.time("Representation.make "+this.type);var r=function(){t?(i.update(t),i.viewer.requestRender(),i.tasks.decrement(),e&&e()):(i.clear(),i.create(),i.manualAttach||i.disposed||(de.Debug&&Yp.time("Representation.attach "+i.type),i.attach(function(){de.Debug&&Yp.timeEnd("Representation.attach "+i.type),i.tasks.decrement(),e&&e()}))),de.Debug&&Yp.timeEnd("Representation.make "+i.type)};this.toBePrepared?this.prepare(r):r()},sm.prototype.attach=function(t){this.setVisibility(this.visible),t()},sm.prototype.setVisibility=function(e,t){if(this.visible=e,this.visible&&this.opacity){var i=this.lazyProps,r=i.bufferParams,n=i.what;if(i.build)return i.build=!1,this.build(),this;(Object.keys(r).length||Object.keys(n).length)&&(i.bufferParams={},i.what={},this.updateParameters(r,n))}return this.bufferList.forEach(function(t){t.setVisibility(e)}),t||this.viewer.requestRender(),this},sm.prototype.setParameters=function(t,e,i){var r=this;void 0===e&&(e={}),void 0===i&&(i=!1);var n=t||{},o=this.parameters,a={};for(var s in this.opacity||void 0===n.opacity||(this.lazyProps.build?i=!(this.lazyProps.build=!1):(Object.assign(a,this.lazyProps.bufferParams),Object.assign(e,this.lazyProps.what),this.lazyProps.bufferParams={},this.lazyProps.what={})),this.setColor(n.color,n),n)if(void 0!==n[s]&&void 0!==o[s]&&(o[s].int&&(n[s]=parseInt(n[s])),o[s].float&&(n[s]=parseFloat(n[s])),n[s]!==r[s]||n[s].equals&&!n[s].equals(r[s]))){if(r[s]&&r[s].copy&&n[s].copy?r[s].copy(n[s]):r[s]&&r[s].set?r[s].set(n[s]):r[s]=n[s],o[s].buffer)if(!0===o[s].buffer)a[s]=n[s];else a[o[s].buffer]=n[s];o[s].update&&(e[o[s].update]=!0),!o[s].rebuild||"impostor"===o[s].rebuild&&Xp&&!r.disableImpostor||(i=!0)}return i?this.build():this.updateParameters(a,e),this},sm.prototype.updateParameters=function(e,t){if(void 0===e&&(e={}),this.lazy&&(!this.visible||!this.opacity)&&!1===e.hasOwnProperty("opacity"))return Object.assign(this.lazyProps.bufferParams,e),void Object.assign(this.lazyProps.what,t);this.bufferList.forEach(function(t){t.setParameters(e)}),Object.keys(t).length&&this.update(t),this.viewer.requestRender()},sm.prototype.getParameters=function(){var e=this,i={lazy:this.lazy,visible:this.visible,quality:this.quality};return Object.keys(this.parameters).forEach(function(t){null!==e.parameters[t]&&(i[t]=e[t])}),i},sm.prototype.clear=function(){var e=this;this.bufferList.forEach(function(t){e.viewer.remove(t),t.dispose()}),this.bufferList.length=0,this.viewer.requestRender()},sm.prototype.dispose=function(){this.disposed=!0,this.queue.kill(),this.tasks.dispose(),this.clear()};var cm=function(r){var n=this;this.pending=0,this.postCount=0,this.onmessageDict={},this.onerrorDict={},this.name=r,this.blobUrl=window.URL.createObjectURL(Jp.get(r)),this.worker=new Worker(this.blobUrl),Jp.activeWorkerCount+=1,this.worker.onmessage=function(t){n.pending-=1;var e=t.data.__postId;de.Debug&&Yp.timeEnd("Worker.postMessage "+r+" #"+e);var i=n.onmessageDict[e];i&&i.call(n.worker,t),delete n.onmessageDict[e],delete n.onerrorDict[e]},this.worker.onerror=function(t){if(n.pending-=1,t.data){var e=t.data.__postId,i=n.onerrorDict[e];i?i.call(n.worker,t):Yp.error("Worker.onerror",e,r,t),delete n.onmessageDict[e],delete n.onerrorDict[e]}else Yp.error("Worker.onerror",r,t)}};cm.prototype.post=function(e,t,i,r){void 0===e&&(e={}),this.onmessageDict[this.postCount]=i,this.onerrorDict[this.postCount]=r,e.__name=this.name,e.__postId=this.postCount,e.__debug=de.Debug,de.Debug&&Yp.time("Worker.postMessage "+this.name+" #"+this.postCount);try{this.worker.postMessage(e,t)}catch(t){Yp.error("worker.post:",t),this.worker.postMessage(e)}return this.pending+=1,this.postCount+=1,this},cm.prototype.terminate=function(){this.worker?(this.worker.terminate(),window.URL.revokeObjectURL(this.blobUrl),Jp.activeWorkerCount-=1):Yp.log("no worker to terminate")};var um=function(t,e){void 0===e&&(e=2),this.pool=[],this.count=0,this.maxCount=Math.min(8,e),this.name=t};function hm(t){for(var e=t.length,i=e/3,r=0,n=0,o=0,a=0;a<e;a+=3)r+=t[a+0],n+=t[a+1],o+=t[a+2];return new ri(r/i,n/i,o/i)}function lm(t,e,i){return i?t.sub(i).projectOnVector(e).add(i):t.projectOnVector(e),t}function pm(t){for(var e=1/0,i=1/0,r=1/0,n=-1/0,o=-1/0,a=-1/0,s=0,c=t.length;s<c;s+=3){var u=t[s],h=t[s+1],l=t[s+2];u<e&&(e=u),h<i&&(i=h),l<r&&(r=l),n<u&&(n=u),o<h&&(o=h),a<l&&(a=l)}return[gm([e,i,r]),gm([n,o,a])]}function dm(t,e){for(var i=0,r=e.length;i<r;i+=3){var n=e[i],o=e[i+1],a=e[i+2];e[i]=t[0]*n+t[4]*o+t[8]*a+t[12],e[i+1]=t[1]*n+t[5]*o+t[9]*a+t[13],e[i+2]=t[2]*n+t[6]*o+t[10]*a+t[14]}}function fm(t,e){for(var i=0,r=e.length;i<r;i+=3){var n=e[i],o=e[i+1],a=e[i+2];e[i]=t[0]*n+t[3]*o+t[6]*a,e[i+1]=t[1]*n+t[4]*o+t[7]*a,e[i+2]=t[2]*n+t[5]*o+t[8]*a}}function mm(t){for(var e=0,i=t.length;e<i;e+=3){var r=t[e],n=t[e+1],o=t[e+2],a=1/Math.sqrt(r*r+n*n+o*o);t[e]=r*a,t[e+1]=n*a,t[e+2]=o*a}}function gm(t){return new Float32Array(t||3)}function vm(t,e,i){var r=e[0],n=e[1],o=e[2],a=i[0],s=i[1],c=i[2];t[0]=n*c-o*s,t[1]=o*a-r*c,t[2]=r*s-n*a}function ym(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]}function bm(t,e,i){t[0]=e[0]-i[0],t[1]=e[1]-i[1],t[2]=e[2]-i[2]}function xm(t,e,i){t[0]=e[0]+i[0],t[1]=e[1]+i[1],t[2]=e[2]+i[2]}function _m(t,e,i){void 0===i&&(i=0),t[0]=e[i],t[1]=e[i+1],t[2]=e[i+2]}function wm(t,e,i){void 0===i&&(i=0),e[i]=t[0],e[i+1]=t[1],e[i+2]=t[2]}function Sm(t){return Math.sqrt(t[0]*t[0]+t[1]*t[1]+t[2]*t[2])}function Am(t,e,i){Mm(t,e,1/i)}function Mm(t,e,i){t[0]=e[0]*i,t[1]=e[1]*i,t[2]=e[2]*i}function Em(t,e){Mm(t,e,1/Sm(e))}function Pm(t,e,i){t[0]=e[0]-i,t[1]=e[1]-i,t[2]=e[2]-i}function Tm(t,e,i){t[0]=e[0]+i,t[1]=e[1]+i,t[2]=e[2]+i}function Cm(t,e){t[0]=Math.floor(e[0]),t[1]=Math.floor(e[1]),t[2]=Math.floor(e[2])}function Im(t,e){t[0]=Math.ceil(e[0]),t[1]=Math.ceil(e[1]),t[2]=Math.ceil(e[2])}function Om(t,e){t[0]=-e[0],t[1]=-e[1],t[2]=-e[2]}function Lm(t,e){void 0===e&&(e=9);for(var i=Math.floor(e/2),r=t.position1.length/3,n=3*(i*r),o=1/e,a=jd(t.position1,t.position2),s=new Float32Array(n),c=new Float32Array(n),u=new ri,h=0;h<r;++h){var l=3*h;u.set(a[l],a[l+1],a[l+2]);for(var p=t.position1[l],d=t.position1[l+1],f=t.position1[l+2],m=0;m<i;++m){var g=i*l+3*m,v=o*(2*m+1),y=o*(2*m+2);s[g]=p+u.x*v,s[g+1]=d+u.y*v,s[g+2]=f+u.z*v,c[g]=p+u.x*y,c[g+1]=d+u.y*y,c[g+2]=f+u.z*y}}var b=Ud(s,c),x=function(t,e){for(var i=t.length/3,r=new Float32Array(i*e*3),n=0;n<i;++n)for(var o=3*n,a=n*e*3,s=t[o+0],c=t[o+1],u=t[o+2],h=0;h<e;++h){var l=a+3*h;r[l+0]=s,r[l+1]=c,r[l+2]=u}return r}(t.color,i),_={position:b,position1:s,position2:c,color:x,color2:x};return t.radius&&(_.radius=Wd(t.radius,i)),t.picking&&t.picking.array&&(t.picking.array=Wd(t.picking.array,i),_.picking=t.picking),t.primitiveId&&(_.primitiveId=Wd(t.primitiveId,i)),_}function Rm(t,e){void 0===e&&(e=.1);for(var i=jd(t.position1,t.position2),r=[],n=[],o=[],a=t.radius?[]:void 0,s=t.picking?[]:void 0,c=t.primitiveId?[]:void 0,u=new ri,h=t.position1.length/3,l=0,p=0;p<h;++p){var d=3*p;u.set(i[d],i[d+1],i[d+2]);for(var f=u.length()/e,m=Math.floor(f/2),g=1/f,v=t.position1[d],y=t.position1[d+1],b=t.position1[d+2],x=0;x<m;++x){var _=3*l+3*x,w=g*(2*x+1),S=g*(2*x+2);r[_]=v+u.x*w,r[_+1]=y+u.y*w,r[_+2]=b+u.z*w,n[_]=v+u.x*S,n[_+1]=y+u.y*S,n[_+2]=b+u.z*S,t.color&&(o[_]=t.color[d],o[_+1]=t.color[d+1],o[_+2]=t.color[d+2]),a&&(a[l+x]=t.radius[p]),s&&(t.picking.array?s[l+x]=t.picking.array[p]:s[l+x]=p),c&&(c[l+x]=t.primitiveId[p])}l+=m}var A=new Float32Array(r),M=new Float32Array(n),E=Ud(A,M),P=new Float32Array(o),T={position:E,position1:A,position2:M,color:P,color2:P};return a&&(T.radius=new Float32Array(a)),s&&t.picking&&(t.picking.array=new Float32Array(s),T.picking=t.picking),c&&(T.primitiveId=new Float32Array(c)),T}function Dm(t,e){void 0===e&&(e=.1);for(var i=jd(t.position1,t.position2),r=[],n=[],o=[],a=t.radius?[]:void 0,s=t.picking?[]:void 0,c=t.primitiveId?[]:void 0,u=new ri,h=t.position1.length/3,l=e,p=!0,d=0,f=0,m=0,g=0;g<h;++g){var v=3*g,y=t.position1[v],b=t.position1[v+1],x=t.position1[v+2];u.set(i[v],i[v+1],i[v+2]);var _=u.length();p&&(r[f]=y,r[f+1]=b,r[f+2]=x);for(var w=l,S=1/_;w<_;){var A=p?n:r;A[f]=y+u.x*w*S,A[f+1]=b+u.y*w*S,A[f+2]=x+u.z*w*S,p&&(f=3*++d),p=!p,w+=l=e}p&&(n[f]=t.position2[v],n[f+1]=t.position2[v+1],n[f+2]=t.position2[v+2],f=3*++d),l=w-_;for(var M=m;M<d;M++){if(t.color){var E=3*M;o[E]=t.color[v],o[E+1]=t.color[v+1],o[E+2]=t.color[v+2]}a&&(a[M]=t.radius[g]),s&&(t.picking.array?s[M]=t.picking.array[g]:s[M]=g),c&&(c[M]=t.primitiveId[g])}m=d}if(!p&&0<h){var P=3*d;n[P]=t.position2[3*h-3],n[P+1]=t.position2[3*h-2],n[P+1]=t.position2[3*h-1]}var T=new Float32Array(r),C=new Float32Array(n),I=Ud(T,C),O=new Float32Array(o),L={position:I,position1:T,position2:C,color:O,color2:O};return a&&(L.radius=new Float32Array(a)),s&&t.picking&&(t.picking.array=new Float32Array(s),L.picking=t.picking),c&&(L.primitiveId=new Float32Array(c)),L}um.prototype.post=function(t,e,i,r){void 0===t&&(t={});var n=this.getNextWorker();return n?n.post(t,e,i,r):console.error("unable to get worker from pool"),this},um.prototype.terminate=function(){this.pool.forEach(function(t){t.terminate()})},um.prototype.getNextWorker=function(){for(var t,e=1/0,i=0;i<this.maxCount;++i){if(i>=this.count){t=new cm(this.name),this.pool.push(t),this.count+=1;break}var r=this.pool[i];if(0===r.pending){t=r;break}r.pending<e&&(e=r.pending,t=r)}return t},um.prototype.constructor=um,pm.__deps=[gm],Am.__deps=[Mm],Em.__deps=[Mm,Sm];var km=new ri,Bm=function(){},Nm={Picker:{configurable:!0},Buffer:{configurable:!0}};Nm.Picker.get=function(){return sd.get(this.type)},Nm.Buffer.get=function(){return ad.get(this.type)},Bm.getShapeKey=function(t){return this.type+t[0].toUpperCase()+t.substr(1)},Bm.expandBoundingBox=function(t,e){},Bm.valueToShape=function(t,e,i){var r,n,o=t._primitiveData[this.getShapeKey(e)];switch(this.fields[e]){case"v3":case"c":n=o,void 0!==(r=i).toArray?r=r.toArray():void 0!==r.x?r=[r.x,r.y,r.z]:void 0!==r.r&&(r=[r.r,r.g,r.b]),n.push.apply(n,r);break;default:o.push(i)}},Bm.objectToShape=function(e,i){var r=this;Object.keys(this.fields).forEach(function(t){r.valueToShape(e,t,i[t])}),this.valueToShape(e,"name",i.name),this.expandBoundingBox(e.boundingBox,i)},Bm.valueFromShape=function(t,e,i){var r=t._primitiveData[this.getShapeKey(i)];switch(this.fields[i]){case"v3":return(new ri).fromArray(r,3*e);case"c":return(new ki).fromArray(r,3*e);default:return r[e]}},Bm.objectFromShape=function(e,i){var r=this,t=this.valueFromShape(e,i,"name");void 0===t&&(t=this.type+": "+i+" ("+e.name+")");var n={shape:e,name:t};return Object.keys(this.fields).forEach(function(t){n[t]=r.valueFromShape(e,i,t)}),n},Bm.arrayFromShape=function(t,e){var i=t._primitiveData[this.getShapeKey(e)];switch(this.fields[e]){case"s":return i;default:return new Float32Array(i)}},Bm.dataFromShape=function(e){var i=this,r={};return this.Picker&&(r.picking=new this.Picker(e)),Object.keys(this.fields).forEach(function(t){r[t]=i.arrayFromShape(e,t)}),r},Bm.bufferFromShape=function(t,e){return new this.Buffer(this.dataFromShape(t),e)},Object.defineProperties(Bm,Nm),Bm.type="",Bm.fields={};var Fm=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),((e.prototype=Object.create(t&&t.prototype)).constructor=e).positionFromShape=function(t,e){return this.valueFromShape(t,e,"position")},e.expandBoundingBox=function(t,e){t.expandByPoint(km.fromArray(e.position))},e}(Bm);Fm.type="sphere",Fm.fields={position:"v3",color:"c",radius:"f"};var zm=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),((e.prototype=Object.create(t&&t.prototype)).constructor=e).positionFromShape=function(t,e){return this.valueFromShape(t,e,"position")},e.expandBoundingBox=function(t,e){t.expandByPoint(km.fromArray(e.position))},e}(Bm);zm.type="box",zm.fields={position:"v3",color:"c",size:"f",heightAxis:"v3",depthAxis:"v3"};var Um=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),(e.prototype=Object.create(t&&t.prototype)).constructor=e}(zm);Um.type="octahedron";var jm=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),(e.prototype=Object.create(t&&t.prototype)).constructor=e}(zm);jm.type="tetrahedron";var Gm=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),((e.prototype=Object.create(t&&t.prototype)).constructor=e).positionFromShape=function(t,e){var i=this.valueFromShape(t,e,"position1"),r=this.valueFromShape(t,e,"position2");return i.add(r).multiplyScalar(.5)},e.expandBoundingBox=function(t,e){t.expandByPoint(km.fromArray(e.position1)),t.expandByPoint(km.fromArray(e.position2))},e.bufferFromShape=function(t,e){void 0===e&&(e={});var i=this.dataFromShape(t);return"cylinder"===this.type&&e.dashedCylinder&&(i=Rm(i)),new this.Buffer(i,e)},e}(Bm);Gm.type="cylinder",Gm.fields={position1:"v3",position2:"v3",color:"c",radius:"f"};var Vm=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),(e.prototype=Object.create(t&&t.prototype)).constructor=e}(Gm);Vm.type="arrow";var Hm=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),(e.prototype=Object.create(t&&t.prototype)).constructor=e}(Gm);Hm.type="cone";var $m=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),(e.prototype=Object.create(t&&t.prototype)).constructor=e}(Fm);$m.type="ellipsoid",$m.fields={position:"v3",color:"c",radius:"f",majorAxis:"v3",minorAxis:"v3"};var Wm=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),(e.prototype=Object.create(t&&t.prototype)).constructor=e}($m);Wm.type="torus";var Xm=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),((e.prototype=Object.create(t&&t.prototype)).constructor=e).positionFromShape=function(t,e){return this.valueFromShape(t,e,"position")},e.expandBoundingBox=function(t,e){t.expandByPoint(km.fromArray(e.position))},e}(Bm);Xm.type="text",Xm.fields={position:"v3",color:"c",size:"f",text:"s"};var qm=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),((e.prototype=Object.create(t&&t.prototype)).constructor=e).positionFromShape=function(t,e){return this.valueFromShape(t,e,"position")},e.expandBoundingBox=function(t,e){t.expandByPoint(km.fromArray(e.position))},e}(Bm);qm.type="point",qm.fields={position:"v3",color:"c"};var Ym=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),((e.prototype=Object.create(t&&t.prototype)).constructor=e).positionFromShape=function(t,e){var i=this.valueFromShape(t,e,"position1"),r=this.valueFromShape(t,e,"position2");return i.add(r).multiplyScalar(.5)},e.expandBoundingBox=function(t,e){t.expandByPoint(km.fromArray(e.position1)),t.expandByPoint(km.fromArray(e.position2))},e}(Bm);Ym.type="wideline",Ym.fields={position1:"v3",position2:"v3",color:"c"};var Zm=function(t,e){this.exp=3;var i=e||function(t){for(var e=t.x,i=t.y,r=t.z,n=new Pi,o=e.length,a=n.min,s=n.max,c=0;c<o;c++)a.x=Math.min(e[c],a.x),a.y=Math.min(i[c],a.y),a.z=Math.min(r[c],a.z),s.x=Math.max(e[c],s.x),s.y=Math.max(i[c],s.y),s.z=Math.max(r[c],s.z);return n}(t);this.minX=i.min.x,this.minY=i.min.y,this.minZ=i.min.z,this.boundX=1+(i.max.x-this.minX>>this.exp),this.boundY=1+(i.max.y-this.minY>>this.exp),this.boundZ=1+(i.max.z-this.minZ>>this.exp);for(var r=this.boundX*this.boundY*this.boundZ,n=void 0!==t.count?t.count:t.x.length,o=t.x,a=t.y,s=t.z,c=0,u=new Uint32Array(r),h=new Int32Array(n),l=0;l<n;++l){var p=o[l]-this.minX>>this.exp,d=a[l]-this.minY>>this.exp,f=s[l]-this.minZ>>this.exp,m=(p*this.boundY+d)*this.boundZ+f;1===(u[m]+=1)&&(c+=1),h[l]=m}for(var g=new Uint16Array(c),v=0,y=0;v<r;++v){var b=u[v];0<b&&(u[v]=y+1,g[y]=b,y+=1)}for(var x=new Uint32Array(c),_=1;_<c;++_)x[_]+=x[_-1]+g[_-1];for(var w=new Uint16Array(c),S=new Int32Array(n),A=0;A<n;++A){var M=u[h[A]];if(0<M){var E=M-1;S[x[E]+w[E]]=A,w[E]+=1}}this.grid=u,this.bucketCount=g,this.bucketOffset=x,this.bucketArray=S,this.xArray=o,this.yArray=a,this.zArray=s};Zm.prototype.within=function(t,e,i,r){var n=[];return this.eachWithin(t,e,i,r,function(t){return n.push(t)}),n},Zm.prototype.eachWithin=function(t,e,i,r,n){for(var o=r*r,a=Math.max(0,t-r-this.minX>>this.exp),s=Math.max(0,e-r-this.minY>>this.exp),c=Math.max(0,i-r-this.minZ>>this.exp),u=Math.min(this.boundX,1+(t+r-this.minX>>this.exp)),h=Math.min(this.boundY,1+(e+r-this.minY>>this.exp)),l=Math.min(this.boundZ,1+(i+r-this.minZ>>this.exp)),p=a;p<u;++p)for(var d=s;d<h;++d)for(var f=c;f<l;++f){var m=(p*this.boundY+d)*this.boundZ+f,g=this.grid[m];if(0<g)for(var v=g-1,y=this.bucketOffset[v],b=y+this.bucketCount[v],x=y;x<b;++x){var _=this.bucketArray[x],w=this.xArray[_]-t,S=this.yArray[_]-e,A=this.zArray[_]-i,M=w*w+S*S+A*A;M<=o&&n(_,M)}}};var Km=function(t){void 0===t&&(t=0),this._fields=this._defaultFields,this._init(0)};Km.prototype._init=function(t){this.length=t;for(var e=this.count=0,i=this._fields.length;e<i;++e){var r=this._fields[e],n=r[0],o=r[1],a=r[2];this._initField(n,o,a)}},Km.prototype._initField=function(t,e,i){this[t]=Ol(i,this.length*e)},Km.prototype.addField=function(t,e,i){this._fields.push([t,e,i]),this._initField(t,e,i)},Km.prototype.resize=function(t){this.length=Math.round(t||0),this.count=Math.min(this.count,this.length);for(var e=0,i=this._fields.length;e<i;++e){var r=this._fields[e][0],n=this._fields[e][1],o=this.length*n,a=new this[r].constructor(o);this[r].length>o?a.set(this[r].subarray(0,o)):a.set(this[r]),this[r]=a}},Km.prototype.growIfFull=function(){if(this.count>=this.length){var t=Math.round(1.5*this.length);this.resize(Math.max(256,t))}},Km.prototype.copyFrom=function(t,e,i,r){for(var n=0,o=this._fields.length;n<o;++n)for(var a=this._fields[n][0],s=this._fields[n][1],c=this[a],u=t[a],h=0;h<r;++h)for(var l=s*(e+h),p=s*(i+h),d=0;d<s;++d)c[l+d]=u[p+d]},Km.prototype.copyWithin=function(t,e,i){for(var r=0,n=this._fields.length;r<n;++r)for(var o=this._fields[r][0],a=this._fields[r][1],s=this[o],c=0;c<i;++c)for(var u=a*(t+c),h=a*(e+c),l=0;l<a;++l)s[u+l]=s[h+l]},Km.prototype.sort=function(c){Yp.time("Store.sort");var u=this,h=new this.constructor(1);!function t(e,i){if(e<i){var r=Math.floor((e+i)/2),n=e,o=i;do{for(;c(n,r)<0;)n+=1;for(;0<c(o,r);)o-=1;n<=o&&(n===r?r=o:o===r&&(r=n),(a=n)!==(s=o)&&(h.copyFrom(u,0,a,1),u.copyWithin(a,s,1),u.copyFrom(h,s,0,1)),n+=1,o-=1)}while(n<=o);t(e,o),t(n,i)}var a,s}(0,this.count-1),Yp.timeEnd("Store.sort")},Km.prototype.clear=function(){this.count=0},Km.prototype.dispose=function(){delete this.length,delete this.count;for(var t=0,e=this._fields.length;t<e;++t){delete this[this._fields[t][0]]}};var Jm=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),(e.prototype=Object.create(t&&t.prototype)).constructor=e;var i={_defaultFields:{configurable:!0}};return i._defaultFields.get=function(){return[["index1",1,"int32"],["index2",1,"int32"],["type",1,"int8"]]},e.prototype.addContact=function(t,e,i){this.growIfFull();var r=this.count;t<e?(this.index1[r]=t,this.index2[r]=e):(this.index2[r]=t,this.index1[r]=e),i&&(this.type[r]=i),this.count+=1},Object.defineProperties(e.prototype,i),e}(Km);function Qm(t){return 16843009*((t=(858993459&(t-=t>>>1&1431655765))+(t>>>2&858993459))+(t>>>4)&252645135)>>>24}var tg=function(t,e){this.length=t,this._words=new Uint32Array(t+32>>>5),!0===e&&this.setAll()};function eg(t){for(var e=t.edgeCount,i=t.nodeCount,r=t.nodeArray1,n=t.nodeArray2,o=new Uint8Array(i),a=new Int32Array(i),s=0;s<e;++s)o[r[s]]+=1,o[n[s]]+=1;for(var c=1;c<i;++c)a[c]+=a[c-1]+o[c-1];for(var u=2*e,h=new Int32Array(u),l=0;l<u;++l)h[l]=-1;for(var p=0;p<e;++p){for(var d=r[p],f=n[p],m=a[d];-1!==h[m]&&m<u;)m+=1;h[m]=p;for(var g=a[f];-1!==h[g]&&g<u;)g+=1;h[g]=p}return{countArray:o,offsetArray:a,indexArray:h}}function ig(t,e){return void 0===t&&(t=0),void 0===e&&(e=0),{type:t,group:e,x:0,y:0,z:0,atomSet:[]}}function rg(t,e){t.x+=e.x,t.y+=e.y,t.z+=e.z,t.atomSet.push(e.index)}function ng(t,e){var i=e.atomSet.length;if(0<i){var r=t.types,n=t.groups,o=t.centers,a=t.atomSets;r.push(e.type),n.push(e.group),o.x.push(e.x/i),o.y.push(e.y/i),o.z.push(e.z/i),a.push(e.atomSet)}}tg.prototype.get=function(t){return 0!=(this._words[t>>>5]&1<<t)},tg.prototype.set=function(t){this._words[t>>>5]|=1<<t},tg.prototype.clear=function(t){this._words[t>>>5]&=~(1<<t)},tg.prototype.flip=function(t){this._words[t>>>5]^=1<<t},tg.prototype._assignRange=function(t,e,i){if(!(e<t)){for(var r=this._words,n=!0===i?4294967295:0,o=t>>>5,a=e>>>5,s=o;s<a;++s)r[s]=n;var c=o<<5,u=a<<5;if(!0===i)if(e-t<32)for(var h=t,l=e+1;h<l;++h)r[h>>>5]|=1<<h;else{for(var p=t,d=c;p<d;++p)r[p>>>5]|=1<<p;for(var f=u,m=e+1;f<m;++f)r[f>>>5]|=1<<f}else if(e-t<32)for(var g=t,v=e+1;g<v;++g)r[g>>>5]&=~(1<<g);else{for(var y=t,b=c;y<b;++y)r[y>>>5]&=~(1<<y);for(var x=u,_=e+1;x<_;++x)r[x>>>5]&=~(1<<x)}return this}},tg.prototype.setRange=function(t,e){return this._assignRange(t,e,!0)},tg.prototype.clearRange=function(t,e){return this._assignRange(t,e,!1)},tg.prototype.setBits=function(){for(var t=[],e=arguments.length;e--;)t[e]=arguments[e];for(var i=this._words,r=t.length,n=0;n<r;++n){var o=t[n];i[o>>>5]|=1<<o}return this},tg.prototype.clearBits=function(){for(var t=[],e=arguments.length;e--;)t[e]=arguments[e];for(var i=this._words,r=t.length,n=0;n<r;++n){var o=t[n];i[o>>>5]&=~(1<<o)}return this},tg.prototype.setAll=function(){return this._assignRange(0,this.length-1,!0)},tg.prototype.clearAll=function(){return this._assignRange(0,this.length-1,!1)},tg.prototype.flipAll=function(){for(var t=this._words.length,e=this._words,i=32-this.length%32,r=0;r<t-1;++r)e[r]=~e[r];return e[t-1]=~(e[t-1]<<i)>>>i,this},tg.prototype._isRangeValue=function(t,e,i){if(!(e<t)){for(var r=this._words,n=!0===i?4294967295:0,o=t>>>5,a=e>>>5,s=o;s<a;++s)if(r[s]!==n)return!1;if(e-t<32){for(var c=t,u=e+1;c<u;++c)if(!!(r[c>>>5]&1<<c)!==i)return!1}else{for(var h=a<<5,l=t,p=o<<5<<5;l<p;++l)if(!!(r[l>>>5]&1<<l)!==i)return!1;for(var d=h,f=e+1;d<f;++d)if(!!(r[d>>>5]&1<<d)!==i)return!1}return!0}},tg.prototype.isRangeSet=function(t,e){return this._isRangeValue(t,e,!0)},tg.prototype.isRangeClear=function(t,e){return this._isRangeValue(t,e,!1)},tg.prototype.isAllSet=function(){return this._isRangeValue(0,this.length-1,!0)},tg.prototype.isAllClear=function(){return this._isRangeValue(0,this.length-1,!1)},tg.prototype.isSet=function(){for(var t=[],e=arguments.length;e--;)t[e]=arguments[e];for(var i=this._words,r=t.length,n=0;n<r;++n){var o=t[n];if(0==(i[o>>>5]&1<<o))return!1}return!0},tg.prototype.isClear=function(){for(var t=[],e=arguments.length;e--;)t[e]=arguments[e];for(var i=this._words,r=t.length,n=0;n<r;++n){var o=t[n];if(0!=(i[o>>>5]&1<<o))return!1}return!0},tg.prototype.isEqualTo=function(t){for(var e=this._words,i=t._words,r=Math.min(e.length,i.length),n=0;n<r;++n)if(e[n]!==i[n])return!1;return!0},tg.prototype.getSize=function(){for(var t=this._words.length,e=this._words,i=0,r=0;r<t;++r)i+=Qm(e[r]);return i},tg.prototype.difference=function(t){for(var e=this._words,i=t._words,r=Math.min(e.length,i.length),n=0;n<r;++n)e[n]=e[n]&~i[n];for(var o=e.length;o<r;++o)e[o]=0;return this},tg.prototype.union=function(t){for(var e=this._words,i=t._words,r=Math.min(e.length,i.length),n=0;n<r;++n)e[n]|=i[n];for(var o=e.length;o<r;++o)e[o]=0;return this},tg.prototype.intersection=function(t){for(var e=this._words,i=t._words,r=Math.min(e.length,i.length),n=0;n<r;++n)e[n]&=i[n];for(var o=e.length;o<r;++o)e[o]=0;return this},tg.prototype.intersects=function(t){for(var e=this._words,i=t._words,r=Math.min(e.length,i.length),n=0;n<r;++n)if(0!=(e[n]&i[n]))return!0;return!1},tg.prototype.getIntersectionSize=function(t){for(var e=this._words,i=t._words,r=Math.min(e.length,i.length),n=0,o=0;o<r;++o)n+=Qm(e[o]&i[o]);return n},tg.prototype.makeIntersection=function(t){var e=this._words,i=t._words,r=Math.min(e.length,i.length),n=new Uint32Array(r),o=Object.create(tg.prototype);o._words=n,o.length=Math.min(this.length,t.length);for(var a=0;a<r;++a)n[a]=e[a]&i[a];return o},tg.prototype.forEach=function(t){for(var e=this._words.length,i=this._words,r=0,n=0;n<e;++n)for(var o=i[n];0!==o;){var a=o&-o;t((n<<5)+Qm(a-1),r),o^=a,++r}},tg.prototype.toArray=function(){for(var t=this._words,e=new Array(this.getSize()),i=this._words.length,r=0,n=0;n<i;++n)for(var o=t[n];0!==o;){var a=o&-o;e[r++]=(n<<5)+Qm(a-1),o^=a}return e},tg.prototype.toString=function(){return"{"+this.toArray().join(",")+"}"},tg.prototype.toSeleString=function(){var t=this.toArray().join(",");return t?"@"+t:"NONE"},tg.prototype.clone=function(){var t=Object.create(tg.prototype);return t.length=this.length,t._words=new Uint32Array(this._words),t};var og=0,ag=["D-BETA-PEPTIDE, C-GAMMA LINKING","D-GAMMA-PEPTIDE, C-DELTA LINKING","D-PEPTIDE COOH CARBOXY TERMINUS","D-PEPTIDE NH3 AMINO TERMINUS","D-PEPTIDE LINKING","L-BETA-PEPTIDE, C-GAMMA LINKING","L-GAMMA-PEPTIDE, C-DELTA LINKING","L-PEPTIDE COOH CARBOXY TERMINUS","L-PEPTIDE NH3 AMINO TERMINUS","L-PEPTIDE LINKING","PEPTIDE LINKING","PEPTIDE-LIKE"],sg=["RNA OH 3 PRIME TERMINUS","RNA OH 5 PRIME TERMINUS","RNA LINKING"],cg=["DNA OH 3 PRIME TERMINUS","DNA OH 5 PRIME TERMINUS","DNA LINKING","L-DNA LINKING","L-RNA LINKING"],ug=["D-SACCHARIDE","D-SACCHARIDE 1,4 AND 1,4 LINKING","D-SACCHARIDE 1,4 AND 1,6 LINKING","L-SACCHARIDE","L-SACCHARIDE 1,4 AND 1,4 LINKING","L-SACCHARIDE 1,4 AND 1,6 LINKING","SACCHARIDE"],hg=["NON-POLYMER"].concat(["OTHER"],ug),lg=["h","g","i"],pg=["e","b"],dg=["s","t","l",""],fg={H:1,D:1,T:1,HE:2,LI:3,BE:4,B:5,C:6,N:7,O:8,F:9,NE:10,NA:11,MG:12,AL:13,SI:14,P:15,S:16,CL:17,AR:18,K:19,CA:20,SC:21,TI:22,V:23,CR:24,MN:25,FE:26,CO:27,NI:28,CU:29,ZN:30,GA:31,GE:32,AS:33,SE:34,BR:35,KR:36,RB:37,SR:38,Y:39,ZR:40,NB:41,MO:42,TC:43,RU:44,RH:45,PD:46,AG:47,CD:48,IN:49,SN:50,SB:51,TE:52,I:53,XE:54,CS:55,BA:56,LA:57,CE:58,PR:59,ND:60,PM:61,SM:62,EU:63,GD:64,TB:65,DY:66,HO:67,ER:68,TM:69,YB:70,LU:71,HF:72,TA:73,W:74,RE:75,OS:76,IR:77,PT:78,AU:79,HG:80,TL:81,PB:82,BI:83,PO:84,AT:85,RN:86,FR:87,RA:88,AC:89,TH:90,PA:91,U:92,NP:93,PU:94,AM:95,CM:96,BK:97,CF:98,ES:99,FM:100,MD:101,NO:102,LR:103,RF:104,DB:105,SG:106,BH:107,HS:108,MT:109,DS:110,RG:111,CN:112,NH:113,FL:114,MC:115,LV:116,TS:117,OG:118},mg={1:1.1,2:1.4,3:1.81,4:1.53,5:1.92,6:1.7,7:1.55,8:1.52,9:1.47,10:1.54,11:2.27,12:1.73,13:1.84,14:2.1,15:1.8,16:1.8,17:1.75,18:1.88,19:2.75,20:2.31,21:2.3,22:2.15,23:2.05,24:2.05,25:2.05,26:2.05,27:2,28:2,29:2,30:2.1,31:1.87,32:2.11,33:1.85,34:1.9,35:1.83,36:2.02,37:3.03,38:2.49,39:2.4,40:2.3,41:2.15,42:2.1,43:2.05,44:2.05,45:2,46:2.05,47:2.1,48:2.2,49:2.2,50:1.93,51:2.17,52:2.06,53:1.98,54:2.16,55:3.43,56:2.68,57:2.5,58:2.48,59:2.47,60:2.45,61:2.43,62:2.42,63:2.4,64:2.38,65:2.37,66:2.35,67:2.33,68:2.32,69:2.3,70:2.28,71:2.27,72:2.25,73:2.2,74:2.1,75:2.05,76:2,77:2,78:2.05,79:2.1,80:2.05,81:1.96,82:2.02,83:2.07,84:1.97,85:2.02,86:2.2,87:3.48,88:2.83,89:2,90:2.4,91:2,92:2.3,93:2,94:2,95:2,96:2,97:2,98:2,99:2,100:2,101:2,102:2,103:2,104:2,105:2,106:2,107:2,108:2,109:2,110:2,111:2,112:2,113:2,114:2,115:2,116:2,117:2,118:2},gg={1:.31,2:.28,3:1.28,4:.96,5:.84,6:.76,7:.71,8:.66,9:.57,10:.58,11:1.66,12:1.41,13:1.21,14:1.11,15:1.07,16:1.05,17:1.02,18:1.06,19:2.03,20:1.76,21:1.7,22:1.6,23:1.53,24:1.39,25:1.39,26:1.32,27:1.26,28:1.24,29:1.32,30:1.22,31:1.22,32:1.2,33:1.19,34:1.2,35:1.2,36:1.16,37:2.2,38:1.95,39:1.9,40:1.75,41:1.64,42:1.54,43:1.47,44:1.46,45:1.42,46:1.39,47:1.45,48:1.44,49:1.42,50:1.39,51:1.39,52:1.38,53:1.39,54:1.4,55:2.44,56:2.15,57:2.07,58:2.04,59:2.03,60:2.01,61:1.99,62:1.98,63:1.98,64:1.96,65:1.94,66:1.92,67:1.92,68:1.89,69:1.9,70:1.87,71:1.87,72:1.75,73:1.7,74:1.62,75:1.51,76:1.44,77:1.41,78:1.36,79:1.36,80:1.32,81:1.45,82:1.46,83:1.48,84:1.4,85:1.5,86:1.5,87:2.6,88:2.21,89:2.15,90:2.06,91:2,92:1.96,93:1.9,94:1.87,95:1.8,96:1.69,97:1.6,98:1.6,99:1.6,100:1.6,101:1.6,102:1.6,103:1.6,104:1.6,105:1.6,106:1.6,107:1.6,108:1.6,109:1.6,110:1.6,111:1.6,112:1.6,113:1.6,114:1.6,115:1.6,116:1.6,117:1.6,118:1.6},vg={1:[1],2:[0],3:[1],4:[2],5:[3],6:[4],7:[3],8:[2],9:[1],10:[0],11:[1],12:[2],13:[6],14:[6],15:[3,5,7],16:[2,4,6],17:[1],18:[0],19:[1],20:[2],31:[3],32:[4],33:[3,5],34:[2,4,6],35:[1],36:[0],37:[1],38:[2],49:[3],50:[4],51:[3,5],52:[2],53:[1,2,5],54:[0,2],55:[1],56:[2],81:[3],82:[4],83:[3],84:[2],85:[1],86:[0],87:[1],88:[2]},yg={1:1,2:2,3:1,4:2,5:3,6:4,7:5,8:6,9:7,10:8,11:1,12:2,13:3,14:4,15:5,16:6,17:7,18:8,19:1,20:2,21:3,22:4,23:5,24:6,25:7,26:8,27:9,28:10,29:11,30:2,31:3,32:4,33:5,34:6,35:7,36:8,37:1,38:2,39:3,40:4,41:5,42:6,43:7,44:8,45:9,46:10,47:11,48:2,49:3,50:4,51:5,52:6,53:7,54:8,55:1,56:2,57:3,58:4,59:3,60:4,61:5,62:6,63:7,64:8,65:9,66:10,67:11,68:12,69:13,70:14,71:15,72:4,73:5,74:6,75:7,76:8,77:9,78:10,79:11,80:2,81:3,82:4,83:5,84:6,85:7,86:8,87:1,88:2,89:3,90:4,91:3,92:4,93:5,94:6,95:7,96:8,97:9,98:10,99:11,100:12,101:13,102:14,103:15,104:2,105:2,106:2,107:2,108:2,109:2,110:2,111:2,112:2,113:3,114:4,115:5,116:6,117:7,118:8},bg={ALA:[.17,.5,.33],ARG:[.81,1.81,1],ASN:[.42,.85,.43],ASP:[1.23,3.64,2.41],ASH:[-.07,.43,.5],CYS:[-.24,-.02,.22],GLN:[.58,.77,.19],GLU:[2.02,3.63,1.61],GLH:[-.01,.11,.12],GLY:[.01,1.15,1.14],HIS:[.17,.11,-.06],ILE:[-.31,-1.12,-.81],LEU:[-.56,-1.25,-.69],LYS:[.99,2.8,1.81],MET:[-.23,-.67,-.44],PHE:[-1.13,-1.71,-.58],PRO:[.45,.14,-.31],SER:[.13,.46,.33],THR:[.14,.25,.11],TRP:[-1.85,-2.09,-.24],TYR:[-.94,-.71,.23],VAL:[.07,-.46,-.53]},xg=[0,0,0],_g={HIS:"H",ARG:"R",LYS:"K",ILE:"I",PHE:"F",LEU:"L",TRP:"W",ALA:"A",MET:"M",PRO:"P",CYS:"C",ASN:"N",VAL:"V",GLY:"G",SER:"S",GLN:"Q",TYR:"Y",ASP:"D",GLU:"E",THR:"T",SEC:"U",PYL:"O"},wg=Object.keys(_g),Sg=["A","C","T","G","U"],Ag=["DA","DC","DT","DG","DU"],Mg=["A","G","DA","DG"],Eg=Sg.concat(Ag),Pg=["SOL","WAT","HOH","H2O","W","DOD","D3O","TIP3","TIP4","SPC"],Tg=["118","119","1AL","1CU","2FK","2HP","2OF","3CO","3MT","3NI","3OF","3P8","4MO","4PU","543","6MO","ACT","AG","AL","ALF","AM","ATH","AU","AU3","AUC","AZI","BA","BCT","BEF","BF4","BO4","BR","BS3","BSY","CA","CAC","CD","CD1","CD3","CD5","CE","CHT","CL","CO","CO3","CO5","CON","CR","CS","CSB","CU","CU1","CU3","CUA","CUZ","CYN","DME","DMI","DSC","DTI","DY","E4N","EDR","EMC","ER3","EU","EU3","F","FE","FE2","FPO","GA","GD3","GEP","HAI","HG","HGC","IN","IOD","IR","IR3","IRI","IUM","K","KO4","LA","LCO","LCP","LI","LU","MAC","MG","MH2","MH3","MLI","MLT","MMC","MN","MN3","MN5","MN6","MO1","MO2","MO3","MO4","MO5","MO6","MOO","MOS","MOW","MW1","MW2","MW3","NA","NA2","NA5","NA6","NAO","NAW","NCO","NET","NH4","NI","NI1","NI2","NI3","NO2","NO3","NRU","O4M","OAA","OC1","OC2","OC3","OC4","OC5","OC6","OC7","OC8","OCL","OCM","OCN","OCO","OF1","OF2","OF3","OH","OS","OS4","OXL","PB","PBM","PD","PDV","PER","PI","PO3","PO4","PR","PT","PT4","PTN","RB","RH3","RHD","RU","SB","SCN","SE4","SEK","SM","SMO","SO3","SO4","SR","T1A","TB","TBA","TCN","TEA","TH","THE","TL","TMA","TRA","UNX","V","VN3","VO4","W","WO5","Y1","YB","YB2","YH","YT3","ZCM","ZN","ZN2","ZN3","ZNO","ZO3","OHX"],Cg=["045","0AT","0BD","0MK","0NZ","0TS","0V4","0XY","0YT","10M","147","149","14T","15L","16G","18T","18Y","1AR","1BW","1GL","1GN","1JB","1LL","1NA","1S3","26M","26Q","26R","26V","26W","26Y","27C","289","291","293","2DG","2F8","2FG","2FL","2FP","2GL","2M4","2M5","32O","34V","3CM","3DO","3DY","3FM","3LR","3MF","3MG","3SA","3ZW","46D","46M","46Z","48Z","4CQ","4GC","4NN","50A","5DI","5GF","5MM","5RP","5SA","5SP","64K","6PG","6SA","7JZ","7SA","A1Q","A2G","AAB","AAL","AAO","ABC","ABD","ABE","ABF","ABL","ACG","ACI","ACR","ACX","ADA","ADG","ADR","AF1","AFD","AFL","AFO","AFP","AFR","AGC","AGH","AGL","AHR","AIG","ALL","ALX","AMU","AOG","AOS","ARA","ARB","ARE","ARI","ASG","ASO","AXP","AXR","B0D","B16","B2G","B4G","B6D","B8D","B9D","BBK","BCD","BDG","BDP","BDR","BEM","BFP","BGC","BGL","BGP","BGS","BHG","BMA","BMX","BNG","BNX","BOG","BRI","BXF","BXP","BXX","BXY","C3X","C4X","C5X","CAP","CBI","CBK","CBS","CDR","CEG","CGF","CHO","CR1","CR6","CRA","CT3","CTO","CTR","CTT","D6G","DAF","DAG","DDA","DDB","DDL","DEL","DFR","DFX","DG0","DGC","DGD","DGM","DGS","DIG","DLF","DLG","DMU","DNO","DOM","DP5","DQQ","DQR","DR2","DR3","DR4","DRI","DSR","DT6","DVC","E4P","E5G","EAG","EBG","EBQ","EGA","EJT","EPG","ERE","ERI","F1P","F1X","F6P","FBP","FCA","FCB","FCT","FDP","FDQ","FFC","FIX","FMO","FRU","FSI","FU4","FUB","FUC","FUD","FUL","FXP","G16","G1P","G2F","G3I","G4D","G4S","G6D","G6P","G6S","GAC","GAD","GAL","GC1","GC4","GCD","GCN","GCO","GCS","GCT","GCU","GCV","GCW","GCX","GE1","GFG","GFP","GIV","GL0","GL2","GL5","GL6","GL7","GL9","GLA","GLB","GLC","GLD","GLF","GLG","GLO","GLP","GLS","GLT","GLW","GMH","GN1","GNX","GP1","GP4","GPH","GPM","GQ1","GQ2","GQ4","GS1","GS4","GSA","GSD","GTE","GTH","GTK","GTR","GTZ","GU0","GU1","GU2","GU3","GU4","GU5","GU6","GU8","GU9","GUF","GUP","GUZ","GYP","GYV","H2P","HDL","HMS","HS2","HSD","HSG","HSH","HSJ","HSQ","HSR","HSU","HSX","HSY","HSZ","IAB","IDG","IDR","IDS","IDT","IDU","IDX","IDY","IMK","IN1","IPT","ISL","KBG","KD2","KDA","KDM","KDO","KFN","KO1","KO2","KTU","L6S","LAG","LAI","LAK","LAO","LAT","LB2","LBT","LCN","LDY","LGC","LGU","LM2","LMT","LMU","LOG","LOX","LPK","LSM","LTM","LVZ","LXB","LXZ","M1F","M3M","M6P","M8C","MA1","MA2","MA3","MAB","MAG","MAL","MAN","MAT","MAV","MAW","MBG","MCU","MDA","MDM","MDP","MFA","MFB","MFU","MG5","MGA","MGL","MLB","MMA","MMN","MN0","MRP","MTT","MUG","MVP","MXY","N1L","N9S","NAA","NAG","NBG","NDG","NED","NG1","NG6","NGA","NGB","NGC","NGE","NGF","NGL","NGS","NGY","NHF","NM6","NM9","NTF","NTO","NTP","NXD","NYT","OPG","OPM","ORP","OX2","P3M","P53","P6P","PA5","PNA","PNG","PNW","PRP","PSJ","PSV","PTQ","QDK","QPS","QV4","R1P","R1X","R2B","R5P","RAA","RAE","RAF","RAM","RAO","RAT","RB5","RBL","RCD","RDP","REL","RER","RF5","RG1","RGG","RHA","RIB","RIP","RNS","RNT","ROB","ROR","RPA","RST","RUB","RUU","RZM","S6P","S7P","SA0","SCR","SDD","SF6","SF9","SG4","SG5","SG6","SG7","SGA","SGC","SGD","SGN","SGS","SHB","SHG","SI3","SIO","SOE","SOL","SSG","SUC","SUP","SUS","T6P","T6T","TAG","TCB","TDG","TGK","TGY","TH1","TIA","TM5","TM6","TM9","TMR","TMX","TOA","TOC","TRE","TYV","UCD","UDC","VG1","X0X","X1X","X2F","X4S","X5S","X6X","XBP","XDN","XDP","XIF","XIM","XLF","XLS","XMM","XUL","XXR","XYP","XYS","YO5","Z3Q","Z6J","Z9M","ZDC","ZDM"],Ig=["CA","C","N","O","O1","O2","OC1","OC2","OX1","OXT","H","H1","H2","H3","HA","HN","BB"],Og=["P","OP1","OP2","HOP2","HOP3","O2'","O3'","O4'","O5'","C1'","C2'","C3'","C4'","C5'","H1'","H2'","H2''","HO2'","H3'","H4'","H5'","H5''","HO3'","HO5'","O2*","O3*","O4*","O5*","C1*","C2*","C3*","C4*","C5*"],Lg={};function Rg(t){switch(t){case 0:return 0;case 1:return 1;case 2:return 2;case 3:return 3;case 4:return 4;default:return 8}}Lg[1]={trace:"CA",direction1:"C",direction2:["O","OC1","O1","OX1","OXT"],backboneStart:"N",backboneEnd:"C"},Lg[2]={trace:["C4'","C4*"],direction1:["C1'","C1*"],direction2:["C3'","C3*"],backboneStart:"P",backboneEnd:["O3'","O3*"]},Lg[3]={trace:["C3'","C3*"],direction1:["C2'","C2*"],direction2:["O4'","O4*"],backboneStart:"P",backboneEnd:["O3'","O3*"]},Lg[4]={trace:["CA","BB"],backboneStart:["CA","BB"],backboneEnd:["CA","BB"]},Lg[5]={trace:["C4'","C4*","P"],backboneStart:["C4'","C4*","P"],backboneEnd:["C4'","C4*","P"]},Lg[6]={trace:["C3'","C3*","C2'","P"],backboneStart:["C3'","C3*","C2'","P"],backboneEnd:["C3'","C3*","C2'","P"]},Lg[og]={};var Dg=new Map([[2,Gl(180)],[3,Gl(120)],[4,Gl(109.4721)],[6,Gl(90)]]);function kg(e,t){var i=[],r=new ri,n=new ri;return r.subVectors(t,e),e.eachBondedAtom(function(t){1!==t.number&&(n.subVectors(t,e),i.push(r.angleTo(n)))}),i}function Bg(e,t){var i=e.clone(),r=new ri;r.subVectors(t,e);var n=[new ri,new ri],o=0;if(e.eachBondedAtom(function(t){1<o||1!==t.number&&(i.index=t.index,n[o++].subVectors(t,e))}),1===o&&i.eachBondedAtom(function(t){1<o||1!==t.number&&t.index!==e.index&&n[o++].subVectors(t,e)}),2===o){var a=n[0].cross(n[1]);return Math.abs(Math.PI/2-a.angleTo(r))}}function Ng(t,s){var e=t.structure,i=e.atomCount,c=new Int8Array(i),u=new Int8Array(i),h=new Int8Array(i),l=new Int8Array(i);return e.eachAtom(function(t){var e=t.index,i=function(r,t){var e,i=r.bondToElementCount(1),n=r.formalCharge||0,o="always"===t.assignCharge||"auto"===t.assignCharge&&0===n,a="always"===t.assignH||"auto"===t.assignH&&0===i,s=r.bondCount,c=(e=0,r.eachBond(function(t){return e+=t.bondOrder}),e),u=function(e){var r=e.structure.getBondProxy(),t=e.number,n=8===t||7===t;if(n&&4===e.bondCount)return!1;var o=!1;return e.eachBond(function(t){if(1<t.bondOrder)o=!0;else if(n){var i=t.getOtherAtom(e);i.eachBond(function(t){if(1<t.bondOrder){var e=i.number;if((15===e||16===e)&&8===t.getOtherAtom(i).number)return;o=!0}},r)}}),o}(r),h=0<c-s,l=0,p=8;switch(r.number){case 1:o&&(0===s?(n=1,p=0):1===s&&(n=0,p=1));break;case 6:o&&(n=0),a&&(l=Math.max(0,4-c-Math.abs(n))),p=Rg(s+l+Math.max(0,-n));break;case 7:if(o)if(a)if(u&&c<4)n=s-i==1&&c-i==2?1:0;else{var d=!1;r.eachBondedAtom(function(t){(16===t.number||t.isMetal())&&(d=!0)}),n=d?0:1}else n=c-3;a&&(l=Math.max(0,3-c+n)),p=Rg(u&&!h?s+l-n:s+l+1-n);break;case 8:o&&(a||(n=c-2),1===c&&r.eachBondedAtom(function(i){i.eachBond(function(t){var e=t.getOtherAtom(i);e.index!==r.index&&8===e.number&&2===t.bondOrder&&(n=-1)})})),a&&(l=Math.max(0,2-c+n)),p=Rg(u&&!h?s+l-n+1:s+l-n+2);break;case 16:o&&(a||(n=c<=3&&!r.bondToElementCount(8)?c-2:0)),a&&c<2&&(l=Math.max(0,2-c+n)),c<=3&&(p=Rg(s+l-n+2));break;case 9:case 17:case 35:case 53:case 85:o&&(n=c-1);break;case 3:case 11:case 19:case 37:case 55:case 87:o&&(n=1-c);break;case 4:case 12:case 20:case 38:case 56:case 88:o&&(n=2-c);break;default:console.warn("Requested charge, protonation for an unhandled element",r.element)}return[n,l,l+i,p]}(t,s),r=i[0],n=i[1],o=i[2],a=i[3];c[e]=r,u[e]=n,h[e]=o,l[e]=a}),{charge:c,implicitH:u,totalH:h,idealGeometry:l}}function Fg(t){if(t["@valenceModel"])return t["@valenceModel"];var e=Ng(t,{assignCharge:"auto",assignH:"auto"});return t["@valenceModel"]=e}function zg(t){return 15===t.number&&t.bondToElementCount(8)===t.bondCount}var Ug=["ARG","HIS","LYS"],jg=["GLU","ASP"];function Gg(t,e,i){void 0===i&&(i={});for(var f=bl(i.maxIonicDist,Kg.maxIonicDist),r=bl(i.maxPiStackingDist,Kg.maxPiStackingDist),m=bl(i.maxPiStackingOffset,Kg.maxPiStackingOffset),g=bl(i.maxPiStackingAngle,Kg.maxPiStackingAngle),n=bl(i.maxCationPiDist,Kg.maxCationPiDist),v=bl(i.maxCationPiOffset,Kg.maxCationPiOffset),y=bl(i.masterModelIndex,Kg.masterModelIndex),o=Math.max(f+2,r,n),b=r*r,x=n*n,a=e.features,s=e.spatialHash,c=e.contactStore,u=e.featureSet,_=a.types,h=a.centers,w=a.atomSets,l=h.x,p=h.y,S=h.z,d=_.length,A=t.atomStore.x,M=t.atomStore.y,E=t.atomStore.z,P=t.getAtomProxy(),T=t.getAtomProxy(),C=new ri,I=new ri,O=new ri,L=new ri,R=new ri,D=new ri,k=new ri,B=function(t,e){C.set(A[t[0]],M[t[0]],E[t[0]]),I.set(A[t[1]],M[t[1]],E[t[1]]),O.set(A[t[2]],M[t[2]],E[t[2]]),L.subVectors(C,I),R.subVectors(C,O),e.crossVectors(L,R)},N=function(t,e,i){return C.set(l[t],p[t],S[t]),I.set(l[e],p[e],S[e]),C.sub(I).projectOnPlane(i).add(I).distanceTo(I)},F=function(t,e,i){u.setBits(t,e),c.addContact(t,e,i)},z=function(d){s.eachWithin(l[d],p[d],S[d],o,function(t,e){if(!(t<=d||(P.index=w[d][0],T.index=w[t][0],Qg(P,T,y)))){var i,r,n,o,a,s=_[d],c=_[t];if(a=c,2===(o=s)&&1===a||1===o&&2===a)(function(t,e,i){for(var r=t.length,n=e.length,o=0;o<r;++o){P.index=t[o];for(var a=0;a<n;++a)if(T.index=e[a],P.distanceTo(T)<=i)return!0}return!1})(w[d],w[t],f)&&F(d,t,1);else if(n=c,3===s&&3===n){if(e<=b){B(w[d],D),B(w[t],k);var u=57.29578*D.angleTo(k);Math.min(N(d,t,k),N(t,d,D))<=m&&(u<=g||180-g<=u?F(d,t,3):u<=g+90&&90-g<=u&&F(d,t,3))}}else if(r=c,(3===(i=s)&&1===r||1===i&&3===r)&&e<=x){var h=3===s?[d,t]:[t,d],l=h[0],p=h[1];B(w[l],D),N(p,l,D)<=v&&F(l,p,2)}}})},U=0;U<d;++U)z(U)}function Vg(t){return"HIS"===t.resname&&7==t.number&&t.isRing()}var Hg=[3,11,19,37,55,12,20,38,56,13,31,49,81,21,50,82,83,51,80];var $g=[17,35,53,85];var Wg=[7,8,16],Xg=[6,7,15,16];var qg=Gl(180),Yg=Gl(120);function Zg(t,e,i){return!Jg(t,e,i)&&(t.modelIndex!==e.modelIndex||t.altloc&&e.altloc&&t.altloc!==e.altloc)}var Kg={maxHydrophobicDist:4,maxHbondDist:3.5,maxHbondSulfurDist:4.1,maxHbondAccAngle:45,maxHbondDonAngle:45,maxHbondAccPlaneAngle:90,maxHbondDonPlaneAngle:30,maxPiStackingDist:5.5,maxPiStackingOffset:2,maxPiStackingAngle:30,maxCationPiDist:6,maxCationPiOffset:2,maxIonicDist:5,maxHalogenBondDist:4,maxHalogenBondAngle:30,maxMetalDist:3,refineSaltBridges:!0,masterModelIndex:-1,lineOfSightDistFactor:1};function Jg(t,e,i){return t.modelIndex===i&&e.modelIndex!==i||e.modelIndex===i&&t.modelIndex!==i}function Qg(t,e,i){return!Jg(t,e,i)&&(t.modelIndex!==e.modelIndex||t.residueIndex===e.residueIndex||t.altloc&&e.altloc&&t.altloc!==e.altloc)}function tv(t){var e,s,i,c,r,u,n,h,o,a,l,p,d,f,m,g,v,y,b,x,_,w,S,A,M,E,P,T,C={types:[],groups:[],centers:{x:[],y:[],z:[]},atomSets:[]};return de.Debug&&Yp.time("calculateFeatures"),s=C,i=Fg((e=t).data).charge,c={},e.eachResidue(function(t){if(Ug.includes(t.resname)){var e=ig(1);t.eachAtom(function(t){7===t.number&&t.isSidechain()&&rg(e,t)}),ng(s,e)}else wg.includes(t.resname)||t.isNucleic()||(t.eachAtom(function(t){var e,i,r,n,o=!1,a=ig(1);n=0,6===(r=t).number&&3===r.bondCount&&3===r.bondToElementCount(7)&&r.eachBondedAtom(function(t){t.bondCount-t.bondToElementCount(1)==1&&++n}),2===n?(a.group=8,o=!0):(i=0,6===(e=t).number&&3===e.bondCount&&2===e.bondToElementCount(7)&&1===e.bondToElementCount(6)&&e.eachBondedAtom(function(t){t.bondCount-t.bondToElementCount(1)==1&&++i}),2===i&&(a.group=9,o=!0)),o&&(t.eachBondedAtom(function(t){7===t.number&&(c[t.index]=!0,rg(a,t))}),ng(s,a))}),t.eachAtom(function(t){var e=ig(1);0<i[t.index]&&(c[t.index]||(rg(e,t),ng(s,e)))}))}),u=C,n=Fg((r=t).data).charge,h={},r.eachResidue(function(t){if(jg.includes(t.resname)){var e=ig(2);t.eachAtom(function(t){8===t.number&&t.isSidechain()&&rg(e,t)}),ng(u,e)}else if(Eg.includes(t.resname)){var i=ig(2);t.eachAtom(function(t){zg(t)&&(i.group=6,t.eachBondedAtom(function(t){8===t.number&&rg(i,t)}),ng(u,i))})}else wg.includes(t.resname)||Eg.includes(t.resname)||(t.eachAtom(function(t){var e,i,r,n,o=!1,a=ig(2);16===(n=t).number&&3===n.bondToElementCount(8)?(a.group=4,o=!0):zg(t)?(a.group=6,o=!0):16===(r=t).number&&4===r.bondToElementCount(8)?(a.group=5,o=!0):(i=0,6===(e=t).number&&2===e.bondToElementCount(8)&&1===e.bondToElementCount(6)&&e.eachBondedAtom(function(t){8===t.number&&t.bondCount-t.bondToElementCount(1)==1&&++i}),2===i&&(a.group=10,o=!0)),o&&(t.eachBondedAtom(function(t){8===t.number&&(h[t.index]=!0,rg(a,t))}),ng(u,a))}),t.eachAtom(function(t){var e=ig(2);n[t.index]<0&&(h[t.index]||(rg(e,t),ng(u,e)))}))}),a=C,l=(o=t).getAtomProxy(),o.eachResidue(function(t){var e=t.getAromaticRings();if(e){var i=t.atomOffset;e.forEach(function(t){var e=ig(3);t.forEach(function(t){l.index=t+i,rg(e,l)}),ng(a,e)})}}),d=C,f=Fg((p=t).data),m=f.charge,g=f.implicitH,v=f.idealGeometry,p.eachAtom(function(t){var e=ig(5),i=t.number;if(8===i)rg(e,t),ng(d,e);else if(7===i){if(Vg(t))rg(e,t),ng(d,e);else if(m[t.index]<1){var r=t.bondCount+g[t.index],n=v[t.index];(4===n&&r<4||3===n&&r<3||2===n&&r<2)&&(rg(e,t),ng(d,e))}}else 16===i&&("CYS"!==t.resname&&"MET"!==t.resname&&-1!==t.formalCharge||(rg(e,t),ng(d,e)))}),b=C,x=Fg((y=t).data).totalH,y.eachAtom(function(t){var e=ig(4),i=t.number;Vg(t)?(rg(e,t),ng(b,e)):0<x[t.index]&&(7===i||8===i||16===i)&&(rg(e,t),ng(b,e))}),w=C,S=Fg((_=t).data).totalH,_.eachAtom(function(t){if(6===t.number&&0<S[t.index]&&(0<t.bondToElementCount(7)||0<t.bondToElementCount(8)||function(r){if(!r.isAromatic())return!1;var t=r.residueType.getRings();if(!t)return!1;var e=!1;return t.rings.forEach(function(t){e||t.some(function(t){return r.index-r.residueAtomOffset===t})&&(e=t.some(function(t){var e=r.residueType.atomTypeIdList[t],i=r.atomMap.get(e).number;return 7===i||8===i}))}),e}(t))){var e=ig(9);rg(e,t),ng(w,e)}}),A=C,t.eachAtom(function(t){var e=!1,i=!1,r=wg.includes(t.resname),n=Eg.includes(t.resname);if(r||n?r?8===t.number?["ASP","GLU","SER","THR","TYR","ASN","GLN"].includes(t.resname)&&t.isSidechain()?i=e=!0:t.isBackbone()&&(i=e=!0):16===t.number&&"CYS"===t.resname?i=e=!0:7===t.number&&"HIS"===t.resname&&t.isSidechain()&&(e=!0):n&&(8===t.number&&t.isBackbone()?i=e=!0:["N3","N4","N7"].includes(t.atomname)?e=!0:["O2","O4","O6"].includes(t.atomname)&&(i=e=!0)):t.isHalogen()||8===t.number||16===t.number?i=e=!0:7===t.number&&(e=!0),e){var o=ig(11);rg(o,t),ng(A,o)}if(i){var a=ig(10);rg(a,t),ng(A,a)}}),M=C,t.eachAtom(function(t){if(t.isTransitionMetal()||30===t.number||48===t.number){var e=ig(12);rg(e,t),ng(M,e)}else if(Hg.includes(t.number)){var i=ig(13);rg(i,t),ng(M,i)}}),E=C,t.eachAtom(function(t){var e=ig(8),i=!1;6===t.number?(i=!0,t.eachBondedAtom(function(t){var e=t.number;6!==e&&1!==e&&(i=!1)})):9===t.number&&(i=!0),i&&(rg(e,t),ng(E,e))}),P=C,t.eachAtom(function(t){if(Wg.includes(t.number)){var e=!1;if(t.eachBondedAtom(function(t){Xg.includes(t.number)&&(e=!0)}),e){var i=ig(7);rg(i,t),ng(P,i)}}}),T=C,t.eachAtom(function(t){if($g.includes(t.number)&&1===t.bondToElementCount(6)){var e=ig(6);rg(e,t),ng(T,e)}}),de.Debug&&Yp.timeEnd("calculateFeatures"),C}function ev(t,e){void 0===e&&(e=Kg);var i,r,n,o=tv(t),a=(r=(i=o).types,n=i.centers,{features:i,spatialHash:new Zm(n),contactStore:new Jm,featureSet:new tg(r.length,!1)});de.Debug&&Yp.time("calculateContacts"),Gg(t,a,e),function(t,e,i){void 0===i&&(i={});for(var r=bl(i.maxHbondDist,Kg.maxHbondDist),n=bl(i.maxHbondSulfurDist,Kg.maxHbondSulfurDist),A=Gl(bl(i.maxHbondAccAngle,Kg.maxHbondAccAngle)),M=Gl(bl(i.maxHbondDonAngle,Kg.maxHbondDonAngle)),E=Gl(bl(i.maxHbondAccPlaneAngle,Kg.maxHbondAccPlaneAngle)),P=Gl(bl(i.maxHbondDonPlaneAngle,Kg.maxHbondDonPlaneAngle)),T=bl(i.masterModelIndex,Kg.masterModelIndex),o=Math.max(r,n),C=r*r,a=e.features,s=e.spatialHash,I=e.contactStore,O=e.featureSet,L=a.types,c=a.centers,R=a.atomSets,u=c.x,h=c.y,l=c.z,p=L.length,D=Fg(t.data).idealGeometry,k=t.getAtomProxy(),B=t.getAtomProxy(),d=function(S){s.eachWithin(u[S],h[S],l[S],o,function(t,e){if(!(t<=S)){var i,r,n=L[S],o=L[t],a=(r=o,9===(i=n)&&5===r||5===i&&9===r);if(a||(c=o,5===(s=n)&&4===c||4===s&&5===c)){var s,c,u=5===o?[S,t]:[t,S],h=u[0],l=u[1];if(k.index=R[h][0],B.index=R[l][0],B.index!==k.index&&!Qg(k,B,T)&&!(16!==k.number&&16!==B.number&&C<e||k.connectedTo(B))){var p=kg(k,B),d=Dg.get(D[k.index])||Gl(120);if(!p.some(function(t){return Math.abs(d-t)>M})){if(3===D[k.index]){var f=Bg(k,B);if(void 0!==f&&P<f)return}var m=kg(B,k),g=Dg.get(D[B.index])||Gl(120);if(!m.some(function(t){return A<g-t})){if(3===D[B.index]){var v=Bg(B,k);if(void 0!==v&&E<v)return}O.setBits(h,l);var y,b,x,_,w=a?8:(_=b=B,(y=k).isWater()&&_.isWater()?9:(x=b,y.isBackbone()&&x.isBackbone()?10:4));I.addContact(h,l,w)}}}}}})},f=0;f<p;++f)d(f)}(t,a,e),function(t,e,i){void 0===i&&(i={});for(var r=bl(i.maxMetalDist,Kg.maxMetalDist),c=bl(i.masterModelIndex,Kg.masterModelIndex),n=e.features,o=e.spatialHash,u=e.contactStore,h=e.featureSet,l=n.types,a=n.centers,p=n.atomSets,d=a.x,f=a.y,m=a.z,s=l.length,g=t.getAtomProxy(),v=t.getAtomProxy(),y=function(s){o.eachWithin(d[s],f[s],m[s],r,function(t,e){if(!(t<=s||(g.index=p[s][0],v.index=p[t][0],Qg(g,v,c)))){var i=g.isMetal(),r=v.isMetal();if(i||r){var n,o,a=i?[l[s],l[t]]:[l[t],l[s]];o=a[1],(12===(n=a[0])?11===o||12===o:13===n?10===o:void 0)&&(h.setBits(s,t),u.addContact(s,t,7))}}})},b=0;b<s;++b)y(b)}(t,a,e),function(t,e,i){void 0===i&&(i={});for(var r=bl(i.maxHydrophobicDist,Kg.maxHydrophobicDist),o=bl(i.masterModelIndex,Kg.masterModelIndex),n=e.features,a=e.spatialHash,s=e.contactStore,c=e.featureSet,u=n.types,h=n.centers,l=n.atomSets,p=h.x,d=h.y,f=h.z,m=u.length,g=t.getAtomProxy(),v=t.getAtomProxy(),y=function(n){a.eachWithin(p[n],d[n],f[n],r,function(t,e){var i,r;t<=n||(g.index=l[n][0],v.index=l[t][0],Qg(g,v,o)||9===g.number&&9===v.number||g.connectedTo(v)||(i=u[n],r=u[t],8===i&&8===r&&(c.setBits(n,t),s.addContact(n,t,6))))})},b=0;b<m;++b)y(b)}(t,a,e),function(t,e,i){void 0===i&&(i={});for(var r=bl(i.maxHalogenBondDist,Kg.maxHalogenBondDist),h=Gl(bl(i.maxHalogenBondAngle,Kg.maxHalogenBondAngle)),l=bl(i.masterModelIndex,Kg.masterModelIndex),n=e.features,o=e.spatialHash,p=e.contactStore,d=e.featureSet,f=n.types,a=n.centers,m=n.atomSets,s=a.x,c=a.y,g=a.z,u=f.length,v=t.getAtomProxy(),y=t.getAtomProxy(),b=function(u){o.eachWithin(s[u],c[u],g[u],r,function(t,e){if(!(t<=u)&&(v.index=m[u][0],y.index=m[t][0],!Qg(v,y,l)&&(i=f[u],r=f[t],7===i&&6===r||6===i&&7===r))){var i,r,n=6===f[u]?[v,y]:[y,v],o=n[0],a=n[1],s=kg(o,a);if(1===s.length&&!(qg-s[0]>h)){var c=kg(a,o);0!==c.length&&(c.some(function(t){return h<Yg-t})||(d.setBits(u,t),p.addContact(u,t,5)))}}})},x=0;x<u;++x)b(x)}(t,a,e);var s,c,u,h,l,p,d,f,m,g,v,y,b,x,_,w,S,A,M,E,P,T,C,I,O,L,R,D,k,B,N,F,z,U,j,G,V,H,$,W,X,q,Y,Z,K,J,Q,tt=(c=(s=a).contactStore,u=eg({nodeArray1:c.index1,nodeArray2:c.index2,edgeCount:c.count,nodeCount:s.featureSet.length}),h=new tg(s.contactStore.count,!0),Object.assign({adjacencyList:u,contactSet:h},s));return function(t,e,i){void 0===i&&(i={}),de.Debug&&Yp.time("refineLineOfSight");var r=bl(i.lineOfSightDistFactor,Kg.lineOfSightDistFactor),a=bl(i.masterModelIndex,Kg.masterModelIndex),s=t.spatialHash,c=e.contactSet,n=e.contactStore,o=e.features,u=n.index1,h=n.index2,l=o.centers,p=o.atomSets,d=l.x,f=l.y,m=l.z,g=t.getAtomProxy(),v=t.getAtomProxy(),y=t.getAtomProxy(),b=new ri,x=new ri,_=3*r,w=r*r;c.forEach(function(i){b.set(d[u[i]],f[u[i]],m[u[i]]),x.set(d[h[i]],f[h[i]],m[h[i]]);var t=(b.x+x.x)/2,e=(b.y+x.y)/2,r=(b.z+x.z)/2,n=p[u[i]],o=p[h[i]];g.index=n[0],v.index=o[0],s.eachWithin(t,e,r,_,function(t,e){y.index=t,1!==y.number&&y.vdw*y.vdw*w>e&&!Zg(g,y,a)&&!Zg(v,y,a)&&!n.includes(t)&&!o.includes(t)&&1<b.distanceToSquared(y)&&1<x.distanceToSquared(y)&&(c.clear(i),de.Debug&&Yp.log("removing",g.qualifiedName(),v.qualifiedName(),"because",y.qualifiedName()))})}),de.Debug&&Yp.timeEnd("refineLineOfSight")}(t,tt,e),l=t,d=(p=tt).contactSet,f=p.contactStore,m=p.features,g=f.type,v=f.index1,y=f.index2,b=m.atomSets,x=l.getAtomProxy(),_=l.getAtomProxy(),w={},S=function(t,e,i){var r=w[i]||[1/0,-1],n=r[0],o=r[1];t<n?(-1!==o&&d.clear(o),w[i]=[t,e]):d.clear(e)},d.forEach(function(t){if(6===g[t]){x.index=b[v[t]][0],_.index=b[y[t]][0];var e=x.distanceTo(_);S(e,t,x.index+"|"+_.residueIndex),S(e,t,_.index+"|"+x.residueIndex)}}),e.refineSaltBridges&&(M=(A=tt).contactSet,E=A.contactStore,P=A.features,T=E.type,C=E.index1,I=E.index2,O=P.atomSets,L={},R=function(t,e){L[t]||(L[t]=[]),L[t].push(e)},M.forEach(function(e){1===T[e]&&(O[C[e]].forEach(function(t){return R(t,e)}),O[I[e]].forEach(function(t){return R(t,e)}))}),M.forEach(function(t){if(4===(e=T[t])||9===e||10===e){var e,i=L[O[C[t]][0]],r=L[O[I[t]][0]];if(i&&r)for(var n=i.length,o=0;o<n;++o)if(r.includes(i[o]))return void M.clear(t)}})),k=(D=tt).contactSet,B=D.contactStore,N=D.features,F=B.type,z=B.index1,U=B.index2,j=N.atomSets,G={},V=function(t,e){G[t]||(G[t]=[]),G[t].push(e)},k.forEach(function(e){3===F[e]&&(j[z[e]].forEach(function(t){return V(t,e)}),j[U[e]].forEach(function(t){return V(t,e)}))}),k.forEach(function(t){if(6===F[t]||2===F[t]){var e=G[j[z[t]][0]],i=G[j[U[t]][0]];if(e&&i)for(var r=e.length,n=0;n<r;++n)if(i.includes(e[n]))return void k.clear(t)}}),$=(H=tt).contactSet,W=H.contactStore,X=H.features,q=W.type,Y=W.index1,Z=W.index2,K=X.atomSets,J={},Q=function(t,e){J[t]||(J[t]=[]),J[t].push(e)},$.forEach(function(e){1===q[e]&&(K[Y[e]].forEach(function(t){return Q(t,e)}),K[Z[e]].forEach(function(t){return Q(t,e)}))}),$.forEach(function(t){if(7===q[t]){var e=J[K[Y[t]][0]],i=J[K[Z[t]][0]];if(e&&i)for(var r=e.length,n=0;n<r;++n)if(i.includes(e[n]))return void $.clear(e[n])}}),de.Debug&&Yp.timeEnd("calculateContacts"),tt}var iv={hydrogenBond:!0,hydrophobic:!0,halogenBond:!0,ionicInteraction:!0,metalCoordination:!0,cationPi:!0,piStacking:!0,weakHydrogenBond:!0,waterHydrogenBond:!0,backboneHydrogenBond:!0,radius:1,filterSele:""},rv=new ki;function nv(t,e,i){var a=xl(i,iv),s=[];a.hydrogenBond&&s.push(4),a.hydrophobic&&s.push(6),a.halogenBond&&s.push(5),a.ionicInteraction&&s.push(1),a.metalCoordination&&s.push(7),a.cationPi&&s.push(2),a.piStacking&&s.push(3),a.weakHydrogenBond&&s.push(8),a.waterHydrogenBond&&s.push(9),a.backboneHydrogenBond&&s.push(10);var c,r=t.features,n=t.contactSet,o=t.contactStore,u=r.centers,h=r.atomSets,l=u.x,p=u.y,d=u.z,f=o.index1,m=o.index2,g=o.type,v=[],y=[],b=[],x=[],_=[];return a.filterSele&&(c=Array.isArray(a.filterSele)?a.filterSele.map(function(t){return e.getAtomSet(new Lp(t))}):e.getAtomSet(new Lp(a.filterSele))),n.forEach(function(t){var e=g[t];if(s.includes(e)){if(c){var i=h[f[t]][0],r=h[m[t]][0];if(Array.isArray(c)){if(!(c[0].isSet(i)&&c[1].isSet(r)||c[1].isSet(i)&&c[0].isSet(r)))return}else if(!c.isSet(i)&&!c.isSet(r))return}var n=f[t],o=m[t];v.push(l[n],p[n],d[n]),y.push(l[o],p[o],d[o]),b.push.apply(b,function(t){switch(t){case 4:case 9:case 10:return rv.setHex(2851770).toArray();case 6:return rv.setHex(8421504).toArray();case 5:return rv.setHex(4259775).toArray();case 1:return rv.setHex(15779860).toArray();case 7:return rv.setHex(9191577).toArray();case 2:return rv.setHex(16744448).toArray();case 3:return rv.setHex(9220966).toArray();case 8:return rv.setHex(12967404).toArray();default:return rv.setHex(13421772).toArray()}}(e)),x.push(a.radius),_.push(t)}}),{position1:new Float32Array(v),position2:new Float32Array(y),color:new Float32Array(b),color2:new Float32Array(b),radius:new Float32Array(x),picking:new dv(_,t,e)}}var ov=function(t){this.array=t},av={type:{configurable:!0},data:{configurable:!0}};av.type.get=function(){return""},av.data.get=function(){return{}},ov.prototype.getIndex=function(t){return this.array?this.array[t]:t},ov.prototype.getObject=function(t){return{}},ov.prototype._applyTransformations=function(t,e,i){return e&&t.applyMatrix4(e.matrix),i&&t.applyMatrix4(i.matrix),t},ov.prototype._getPosition=function(t){return new ri},ov.prototype.getPosition=function(t,e,i){return this._applyTransformations(this._getPosition(t),e,i)},Object.defineProperties(ov.prototype,av);var sv=function(e){function t(t){e.call(this),this.shape=t}e&&(t.__proto__=e),(t.prototype=Object.create(e&&e.prototype)).constructor=t;var i={primitive:{configurable:!0},data:{configurable:!0},type:{configurable:!0}};return i.primitive.get=function(){},i.data.get=function(){return this.shape},i.type.get=function(){return this.primitive.type},t.prototype.getObject=function(t){return this.primitive.objectFromShape(this.shape,this.getIndex(t))},t.prototype._getPosition=function(t){return this.primitive.positionFromShape(this.shape,this.getIndex(t))},Object.defineProperties(t.prototype,i),t}(ov),cv=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),(e.prototype=Object.create(t&&t.prototype)).constructor=e;var i={primitive:{configurable:!0}};return i.primitive.get=function(){return Gm},Object.defineProperties(e.prototype,i),e}(sv),uv=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),(e.prototype=Object.create(t&&t.prototype)).constructor=e;var i={primitive:{configurable:!0}};return i.primitive.get=function(){return Vm},Object.defineProperties(e.prototype,i),e}(sv),hv=function(i){function t(t,e){i.call(this,t),this.structure=e}i&&(t.__proto__=i),(t.prototype=Object.create(i&&i.prototype)).constructor=t;var e={type:{configurable:!0},data:{configurable:!0}};return e.type.get=function(){return"atom"},e.data.get=function(){return this.structure},t.prototype.getObject=function(t){return this.structure.getAtomProxy(this.getIndex(t))},t.prototype._getPosition=function(t){return(new ri).copy(this.getObject(t))},Object.defineProperties(t.prototype,e),t}(ov),lv=function(e){function t(t){e.call(this),this.axes=t}e&&(t.__proto__=e),(t.prototype=Object.create(e&&e.prototype)).constructor=t;var i={type:{configurable:!0},data:{configurable:!0}};return i.type.get=function(){return"axes"},i.data.get=function(){return this.axes},t.prototype.getObject=function(){return{axes:this.axes}},t.prototype._getPosition=function(){return this.axes.center.clone()},Object.defineProperties(t.prototype,i),t}(ov),pv=function(r){function t(t,e,i){r.call(this,t),this.structure=e,this.bondStore=i||e.bondStore}r&&(t.__proto__=r),(t.prototype=Object.create(r&&r.prototype)).constructor=t;var e={type:{configurable:!0},data:{configurable:!0}};return e.type.get=function(){return"bond"},e.data.get=function(){return this.structure},t.prototype.getObject=function(t){var e=this.structure.getBondProxy(this.getIndex(t));return e.bondStore=this.bondStore,e},t.prototype._getPosition=function(t){var e=this.getObject(t);return(new ri).copy(e.atom1).add(e.atom2).multiplyScalar(.5)},Object.defineProperties(t.prototype,e),t}(ov),dv=function(r){function t(t,e,i){r.call(this,t),this.contacts=e,this.structure=i}r&&(t.__proto__=r),(t.prototype=Object.create(r&&r.prototype)).constructor=t;var e={type:{configurable:!0},data:{configurable:!0}};return e.type.get=function(){return"contact"},e.data.get=function(){return this.contacts},t.prototype.getObject=function(t){var e=this.getIndex(t),i=this.contacts,r=i.features,n=i.contactStore,o=r.centers,a=r.atomSets,s=o.x,c=o.y,u=o.z,h=n.index1,l=n.index2,p=n.type,d=h[e],f=l[e];return{center1:new ri(s[d],c[d],u[d]),center2:new ri(s[f],c[f],u[f]),atom1:this.structure.getAtomProxy(a[d][0]),atom2:this.structure.getAtomProxy(a[f][0]),type:function(t){switch(t){case 4:case 9:case 10:return"hydrogen bond";case 6:return"hydrophobic contact";case 5:return"halogen bond";case 1:return"ionic interaction";case 7:return"metal coordination";case 2:return"cation-pi interaction";case 3:return"pi-pi stacking";case 8:return"weak hydrogen bond";default:return"unknown contact"}}(p[e])}},t.prototype._getPosition=function(t){var e=this.getObject(t),i=e.center1,r=e.center2;return(new ri).addVectors(i,r).multiplyScalar(.5)},Object.defineProperties(t.prototype,e),t}(ov),fv=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),(e.prototype=Object.create(t&&t.prototype)).constructor=e;var i={primitive:{configurable:!0}};return i.primitive.get=function(){return Hm},Object.defineProperties(e.prototype,i),e}(sv),mv=function(r){function t(t,e,i){r.call(this,t),this.validation=e,this.structure=i}r&&(t.__proto__=r),(t.prototype=Object.create(r&&r.prototype)).constructor=t;var e={type:{configurable:!0},data:{configurable:!0}};return e.type.get=function(){return"clash"},e.data.get=function(){return this.validation},t.prototype.getObject=function(t){var e=this.validation,i=this.getIndex(t);return{validation:e,index:i,clash:e.clashArray[i]}},t.prototype._getAtomProxyFromSele=function(t){var e=new Lp(t),i=this.structure.getAtomIndices(e)[0];return this.structure.getAtomProxy(i)},t.prototype._getPosition=function(t){var e=this.getObject(t).clash,i=this._getAtomProxyFromSele(e.sele1),r=this._getAtomProxyFromSele(e.sele2);return(new ri).copy(i).add(r).multiplyScalar(.5)},Object.defineProperties(t.prototype,e),t}(ov),gv=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),(e.prototype=Object.create(t&&t.prototype)).constructor=e;var i={type:{configurable:!0}};return i.type.get=function(){return"distance"},Object.defineProperties(e.prototype,i),e}(pv),vv=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),(e.prototype=Object.create(t&&t.prototype)).constructor=e;var i={primitive:{configurable:!0}};return i.primitive.get=function(){return $m},Object.defineProperties(e.prototype,i),e}(sv),yv=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),(e.prototype=Object.create(t&&t.prototype)).constructor=e;var i={primitive:{configurable:!0}};return i.primitive.get=function(){return Um},Object.defineProperties(e.prototype,i),e}(sv),bv=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),(e.prototype=Object.create(t&&t.prototype)).constructor=e;var i={primitive:{configurable:!0}};return i.primitive.get=function(){return zm},Object.defineProperties(e.prototype,i),e}(sv),xv=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),(e.prototype=Object.create(t&&t.prototype)).constructor=e;var i={type:{configurable:!0}};return i.type.get=function(){return"ignore"},Object.defineProperties(e.prototype,i),e}(ov),_v=function(i){function t(t,e){i.call(this,t),this.mesh=e}i&&(t.__proto__=i),(t.prototype=Object.create(i&&i.prototype)).constructor=t;var e={type:{configurable:!0}};return e.type.get=function(){return"mesh"},t.prototype.getObject=function(){var t=this.mesh;return{shape:this.shape,name:t.name,serial:t.serial}},t.prototype._getPosition=function(){return this.__position||(this.__position=hm(this.mesh.position)),this.__position},Object.defineProperties(t.prototype,e),t}(sv),wv=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),(e.prototype=Object.create(t&&t.prototype)).constructor=e;var i={primitive:{configurable:!0}};return i.primitive.get=function(){return Fm},Object.defineProperties(e.prototype,i),e}(sv),Sv=function(i){function t(t,e){i.call(this,t),this.surface=e}i&&(t.__proto__=i),(t.prototype=Object.create(i&&i.prototype)).constructor=t;var e={type:{configurable:!0},data:{configurable:!0}};return e.type.get=function(){return"surface"},e.data.get=function(){return this.surface},t.prototype.getObject=function(t){return{surface:this.surface,index:this.getIndex(t)}},t.prototype._getPosition=function(){return this.surface.center.clone()},Object.defineProperties(t.prototype,e),t}(ov),Av=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),(e.prototype=Object.create(t&&t.prototype)).constructor=e;var i={primitive:{configurable:!0}};return i.primitive.get=function(){return jm},Object.defineProperties(e.prototype,i),e}(sv),Mv=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),(e.prototype=Object.create(t&&t.prototype)).constructor=e;var i={primitive:{configurable:!0}};return i.primitive.get=function(){return Wm},Object.defineProperties(e.prototype,i),e}(sv),Ev=function(i){function t(t,e){i.call(this),this.unitcell=t,this.structure=e}i&&(t.__proto__=i),(t.prototype=Object.create(i&&i.prototype)).constructor=t;var e={type:{configurable:!0},data:{configurable:!0}};return e.type.get=function(){return"unitcell"},e.data.get=function(){return this.unitcell},t.prototype.getObject=function(){return{unitcell:this.unitcell,structure:this.structure}},t.prototype._getPosition=function(){return this.unitcell.getCenter(this.structure)},Object.defineProperties(t.prototype,e),t}(ov),Pv=(function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),(e.prototype=Object.create(t&&t.prototype)).constructor=e;var i={type:{configurable:!0}};i.type.get=function(){return"unknown"},Object.defineProperties(e.prototype,i)}(ov),function(i){function t(t,e){i.call(this,t),this.volume=e}i&&(t.__proto__=i),(t.prototype=Object.create(i&&i.prototype)).constructor=t;var e={type:{configurable:!0},data:{configurable:!0}};return e.type.get=function(){return"volume"},e.data.get=function(){return this.volume},t.prototype.getObject=function(t){var e=this.volume,i=this.getIndex(t);return{volume:e,index:i,value:e.data[i]}},t.prototype._getPosition=function(t){var e=this.volume.position,i=this.getIndex(t);return new ri(e[3*i],e[3*i+1],e[3*i+2])},Object.defineProperties(t.prototype,e),t}(ov)),Tv=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),(e.prototype=Object.create(t&&t.prototype)).constructor=e;var i={type:{configurable:!0}};return i.type.get=function(){return"slice"},Object.defineProperties(e.prototype,i),e}(Pv),Cv=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),(e.prototype=Object.create(t&&t.prototype)).constructor=e;var i={primitive:{configurable:!0}};return i.primitive.get=function(){return qm},Object.defineProperties(e.prototype,i),e}(sv),Iv=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),(e.prototype=Object.create(t&&t.prototype)).constructor=e;var i={primitive:{configurable:!0}};return i.primitive.get=function(){return Ym},Object.defineProperties(e.prototype,i),e}(sv);function Ov(){return new Uint32Array([0,265,515,778,1030,1295,1541,1804,2060,2309,2575,2822,3082,3331,3593,3840,400,153,915,666,1430,1183,1941,1692,2460,2197,2975,2710,3482,3219,3993,3728,560,825,51,314,1590,1855,1077,1340,2620,2869,2111,2358,3642,3891,3129,3376,928,681,419,170,1958,1711,1445,1196,2988,2725,2479,2214,4010,3747,3497,3232,1120,1385,1635,1898,102,367,613,876,3180,3429,3695,3942,2154,2403,2665,2912,1520,1273,2035,1786,502,255,1013,764,3580,3317,4095,3830,2554,2291,3065,2800,1616,1881,1107,1370,598,863,85,348,3676,3925,3167,3414,2650,2899,2137,2384,1984,1737,1475,1226,966,719,453,204,4044,3781,3535,3270,3018,2755,2505,2240,2240,2505,2755,3018,3270,3535,3781,4044,204,453,719,966,1226,1475,1737,1984,2384,2137,2899,2650,3414,3167,3925,3676,348,85,863,598,1370,1107,1881,1616,2800,3065,2291,2554,3830,4095,3317,3580,764,1013,255,502,1786,2035,1273,1520,2912,2665,2403,2154,3942,3695,3429,3180,876,613,367,102,1898,1635,1385,1120,3232,3497,3747,4010,2214,2479,2725,2988,1196,1445,1711,1958,170,419,681,928,3376,3129,3891,3642,2358,2111,2869,2620,1340,1077,1855,1590,314,51,825,560,3728,3993,3219,3482,2710,2975,2197,2460,1692,1941,1183,1430,666,915,153,400,3840,3593,3331,3082,2822,2575,2309,2060,1804,1541,1295,1030,778,515,265,0])}function Lv(){return new Int32Array([-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,8,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,8,3,9,8,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,2,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,8,3,1,2,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,2,10,0,2,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2,8,3,2,10,8,10,9,8,-1,-1,-1,-1,-1,-1,-1,3,11,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,11,2,8,11,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,9,0,2,3,11,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,11,2,1,9,11,9,8,11,-1,-1,-1,-1,-1,-1,-1,3,10,1,11,10,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,10,1,0,8,10,8,11,10,-1,-1,-1,-1,-1,-1,-1,3,9,0,3,11,9,11,10,9,-1,-1,-1,-1,-1,-1,-1,9,8,10,10,8,11,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,7,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,3,0,7,3,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,9,8,4,7,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,1,9,4,7,1,7,3,1,-1,-1,-1,-1,-1,-1,-1,1,2,10,8,4,7,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3,4,7,3,0,4,1,2,10,-1,-1,-1,-1,-1,-1,-1,9,2,10,9,0,2,8,4,7,-1,-1,-1,-1,-1,-1,-1,2,10,9,2,9,7,2,7,3,7,9,4,-1,-1,-1,-1,8,4,7,3,11,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,11,4,7,11,2,4,2,0,4,-1,-1,-1,-1,-1,-1,-1,9,0,1,8,4,7,2,3,11,-1,-1,-1,-1,-1,-1,-1,4,7,11,9,4,11,9,11,2,9,2,1,-1,-1,-1,-1,3,10,1,3,11,10,7,8,4,-1,-1,-1,-1,-1,-1,-1,1,11,10,1,4,11,1,0,4,7,11,4,-1,-1,-1,-1,4,7,8,9,0,11,9,11,10,11,0,3,-1,-1,-1,-1,4,7,11,4,11,9,9,11,10,-1,-1,-1,-1,-1,-1,-1,9,5,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,5,4,0,8,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,5,4,1,5,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,5,4,8,3,5,3,1,5,-1,-1,-1,-1,-1,-1,-1,1,2,10,9,5,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3,0,8,1,2,10,4,9,5,-1,-1,-1,-1,-1,-1,-1,5,2,10,5,4,2,4,0,2,-1,-1,-1,-1,-1,-1,-1,2,10,5,3,2,5,3,5,4,3,4,8,-1,-1,-1,-1,9,5,4,2,3,11,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,11,2,0,8,11,4,9,5,-1,-1,-1,-1,-1,-1,-1,0,5,4,0,1,5,2,3,11,-1,-1,-1,-1,-1,-1,-1,2,1,5,2,5,8,2,8,11,4,8,5,-1,-1,-1,-1,10,3,11,10,1,3,9,5,4,-1,-1,-1,-1,-1,-1,-1,4,9,5,0,8,1,8,10,1,8,11,10,-1,-1,-1,-1,5,4,0,5,0,11,5,11,10,11,0,3,-1,-1,-1,-1,5,4,8,5,8,10,10,8,11,-1,-1,-1,-1,-1,-1,-1,9,7,8,5,7,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,3,0,9,5,3,5,7,3,-1,-1,-1,-1,-1,-1,-1,0,7,8,0,1,7,1,5,7,-1,-1,-1,-1,-1,-1,-1,1,5,3,3,5,7,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,7,8,9,5,7,10,1,2,-1,-1,-1,-1,-1,-1,-1,10,1,2,9,5,0,5,3,0,5,7,3,-1,-1,-1,-1,8,0,2,8,2,5,8,5,7,10,5,2,-1,-1,-1,-1,2,10,5,2,5,3,3,5,7,-1,-1,-1,-1,-1,-1,-1,7,9,5,7,8,9,3,11,2,-1,-1,-1,-1,-1,-1,-1,9,5,7,9,7,2,9,2,0,2,7,11,-1,-1,-1,-1,2,3,11,0,1,8,1,7,8,1,5,7,-1,-1,-1,-1,11,2,1,11,1,7,7,1,5,-1,-1,-1,-1,-1,-1,-1,9,5,8,8,5,7,10,1,3,10,3,11,-1,-1,-1,-1,5,7,0,5,0,9,7,11,0,1,0,10,11,10,0,-1,11,10,0,11,0,3,10,5,0,8,0,7,5,7,0,-1,11,10,5,7,11,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,10,6,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,8,3,5,10,6,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,0,1,5,10,6,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,8,3,1,9,8,5,10,6,-1,-1,-1,-1,-1,-1,-1,1,6,5,2,6,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,6,5,1,2,6,3,0,8,-1,-1,-1,-1,-1,-1,-1,9,6,5,9,0,6,0,2,6,-1,-1,-1,-1,-1,-1,-1,5,9,8,5,8,2,5,2,6,3,2,8,-1,-1,-1,-1,2,3,11,10,6,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,11,0,8,11,2,0,10,6,5,-1,-1,-1,-1,-1,-1,-1,0,1,9,2,3,11,5,10,6,-1,-1,-1,-1,-1,-1,-1,5,10,6,1,9,2,9,11,2,9,8,11,-1,-1,-1,-1,6,3,11,6,5,3,5,1,3,-1,-1,-1,-1,-1,-1,-1,0,8,11,0,11,5,0,5,1,5,11,6,-1,-1,-1,-1,3,11,6,0,3,6,0,6,5,0,5,9,-1,-1,-1,-1,6,5,9,6,9,11,11,9,8,-1,-1,-1,-1,-1,-1,-1,5,10,6,4,7,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,3,0,4,7,3,6,5,10,-1,-1,-1,-1,-1,-1,-1,1,9,0,5,10,6,8,4,7,-1,-1,-1,-1,-1,-1,-1,10,6,5,1,9,7,1,7,3,7,9,4,-1,-1,-1,-1,6,1,2,6,5,1,4,7,8,-1,-1,-1,-1,-1,-1,-1,1,2,5,5,2,6,3,0,4,3,4,7,-1,-1,-1,-1,8,4,7,9,0,5,0,6,5,0,2,6,-1,-1,-1,-1,7,3,9,7,9,4,3,2,9,5,9,6,2,6,9,-1,3,11,2,7,8,4,10,6,5,-1,-1,-1,-1,-1,-1,-1,5,10,6,4,7,2,4,2,0,2,7,11,-1,-1,-1,-1,0,1,9,4,7,8,2,3,11,5,10,6,-1,-1,-1,-1,9,2,1,9,11,2,9,4,11,7,11,4,5,10,6,-1,8,4,7,3,11,5,3,5,1,5,11,6,-1,-1,-1,-1,5,1,11,5,11,6,1,0,11,7,11,4,0,4,11,-1,0,5,9,0,6,5,0,3,6,11,6,3,8,4,7,-1,6,5,9,6,9,11,4,7,9,7,11,9,-1,-1,-1,-1,10,4,9,6,4,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,10,6,4,9,10,0,8,3,-1,-1,-1,-1,-1,-1,-1,10,0,1,10,6,0,6,4,0,-1,-1,-1,-1,-1,-1,-1,8,3,1,8,1,6,8,6,4,6,1,10,-1,-1,-1,-1,1,4,9,1,2,4,2,6,4,-1,-1,-1,-1,-1,-1,-1,3,0,8,1,2,9,2,4,9,2,6,4,-1,-1,-1,-1,0,2,4,4,2,6,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,3,2,8,2,4,4,2,6,-1,-1,-1,-1,-1,-1,-1,10,4,9,10,6,4,11,2,3,-1,-1,-1,-1,-1,-1,-1,0,8,2,2,8,11,4,9,10,4,10,6,-1,-1,-1,-1,3,11,2,0,1,6,0,6,4,6,1,10,-1,-1,-1,-1,6,4,1,6,1,10,4,8,1,2,1,11,8,11,1,-1,9,6,4,9,3,6,9,1,3,11,6,3,-1,-1,-1,-1,8,11,1,8,1,0,11,6,1,9,1,4,6,4,1,-1,3,11,6,3,6,0,0,6,4,-1,-1,-1,-1,-1,-1,-1,6,4,8,11,6,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,7,10,6,7,8,10,8,9,10,-1,-1,-1,-1,-1,-1,-1,0,7,3,0,10,7,0,9,10,6,7,10,-1,-1,-1,-1,10,6,7,1,10,7,1,7,8,1,8,0,-1,-1,-1,-1,10,6,7,10,7,1,1,7,3,-1,-1,-1,-1,-1,-1,-1,1,2,6,1,6,8,1,8,9,8,6,7,-1,-1,-1,-1,2,6,9,2,9,1,6,7,9,0,9,3,7,3,9,-1,7,8,0,7,0,6,6,0,2,-1,-1,-1,-1,-1,-1,-1,7,3,2,6,7,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2,3,11,10,6,8,10,8,9,8,6,7,-1,-1,-1,-1,2,0,7,2,7,11,0,9,7,6,7,10,9,10,7,-1,1,8,0,1,7,8,1,10,7,6,7,10,2,3,11,-1,11,2,1,11,1,7,10,6,1,6,7,1,-1,-1,-1,-1,8,9,6,8,6,7,9,1,6,11,6,3,1,3,6,-1,0,9,1,11,6,7,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,7,8,0,7,0,6,3,11,0,11,6,0,-1,-1,-1,-1,7,11,6,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,7,6,11,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3,0,8,11,7,6,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,9,11,7,6,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,1,9,8,3,1,11,7,6,-1,-1,-1,-1,-1,-1,-1,10,1,2,6,11,7,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,2,10,3,0,8,6,11,7,-1,-1,-1,-1,-1,-1,-1,2,9,0,2,10,9,6,11,7,-1,-1,-1,-1,-1,-1,-1,6,11,7,2,10,3,10,8,3,10,9,8,-1,-1,-1,-1,7,2,3,6,2,7,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,7,0,8,7,6,0,6,2,0,-1,-1,-1,-1,-1,-1,-1,2,7,6,2,3,7,0,1,9,-1,-1,-1,-1,-1,-1,-1,1,6,2,1,8,6,1,9,8,8,7,6,-1,-1,-1,-1,10,7,6,10,1,7,1,3,7,-1,-1,-1,-1,-1,-1,-1,10,7,6,1,7,10,1,8,7,1,0,8,-1,-1,-1,-1,0,3,7,0,7,10,0,10,9,6,10,7,-1,-1,-1,-1,7,6,10,7,10,8,8,10,9,-1,-1,-1,-1,-1,-1,-1,6,8,4,11,8,6,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3,6,11,3,0,6,0,4,6,-1,-1,-1,-1,-1,-1,-1,8,6,11,8,4,6,9,0,1,-1,-1,-1,-1,-1,-1,-1,9,4,6,9,6,3,9,3,1,11,3,6,-1,-1,-1,-1,6,8,4,6,11,8,2,10,1,-1,-1,-1,-1,-1,-1,-1,1,2,10,3,0,11,0,6,11,0,4,6,-1,-1,-1,-1,4,11,8,4,6,11,0,2,9,2,10,9,-1,-1,-1,-1,10,9,3,10,3,2,9,4,3,11,3,6,4,6,3,-1,8,2,3,8,4,2,4,6,2,-1,-1,-1,-1,-1,-1,-1,0,4,2,4,6,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,9,0,2,3,4,2,4,6,4,3,8,-1,-1,-1,-1,1,9,4,1,4,2,2,4,6,-1,-1,-1,-1,-1,-1,-1,8,1,3,8,6,1,8,4,6,6,10,1,-1,-1,-1,-1,10,1,0,10,0,6,6,0,4,-1,-1,-1,-1,-1,-1,-1,4,6,3,4,3,8,6,10,3,0,3,9,10,9,3,-1,10,9,4,6,10,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,9,5,7,6,11,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,8,3,4,9,5,11,7,6,-1,-1,-1,-1,-1,-1,-1,5,0,1,5,4,0,7,6,11,-1,-1,-1,-1,-1,-1,-1,11,7,6,8,3,4,3,5,4,3,1,5,-1,-1,-1,-1,9,5,4,10,1,2,7,6,11,-1,-1,-1,-1,-1,-1,-1,6,11,7,1,2,10,0,8,3,4,9,5,-1,-1,-1,-1,7,6,11,5,4,10,4,2,10,4,0,2,-1,-1,-1,-1,3,4,8,3,5,4,3,2,5,10,5,2,11,7,6,-1,7,2,3,7,6,2,5,4,9,-1,-1,-1,-1,-1,-1,-1,9,5,4,0,8,6,0,6,2,6,8,7,-1,-1,-1,-1,3,6,2,3,7,6,1,5,0,5,4,0,-1,-1,-1,-1,6,2,8,6,8,7,2,1,8,4,8,5,1,5,8,-1,9,5,4,10,1,6,1,7,6,1,3,7,-1,-1,-1,-1,1,6,10,1,7,6,1,0,7,8,7,0,9,5,4,-1,4,0,10,4,10,5,0,3,10,6,10,7,3,7,10,-1,7,6,10,7,10,8,5,4,10,4,8,10,-1,-1,-1,-1,6,9,5,6,11,9,11,8,9,-1,-1,-1,-1,-1,-1,-1,3,6,11,0,6,3,0,5,6,0,9,5,-1,-1,-1,-1,0,11,8,0,5,11,0,1,5,5,6,11,-1,-1,-1,-1,6,11,3,6,3,5,5,3,1,-1,-1,-1,-1,-1,-1,-1,1,2,10,9,5,11,9,11,8,11,5,6,-1,-1,-1,-1,0,11,3,0,6,11,0,9,6,5,6,9,1,2,10,-1,11,8,5,11,5,6,8,0,5,10,5,2,0,2,5,-1,6,11,3,6,3,5,2,10,3,10,5,3,-1,-1,-1,-1,5,8,9,5,2,8,5,6,2,3,8,2,-1,-1,-1,-1,9,5,6,9,6,0,0,6,2,-1,-1,-1,-1,-1,-1,-1,1,5,8,1,8,0,5,6,8,3,8,2,6,2,8,-1,1,5,6,2,1,6,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,3,6,1,6,10,3,8,6,5,6,9,8,9,6,-1,10,1,0,10,0,6,9,5,0,5,6,0,-1,-1,-1,-1,0,3,8,5,6,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,10,5,6,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,11,5,10,7,5,11,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,11,5,10,11,7,5,8,3,0,-1,-1,-1,-1,-1,-1,-1,5,11,7,5,10,11,1,9,0,-1,-1,-1,-1,-1,-1,-1,10,7,5,10,11,7,9,8,1,8,3,1,-1,-1,-1,-1,11,1,2,11,7,1,7,5,1,-1,-1,-1,-1,-1,-1,-1,0,8,3,1,2,7,1,7,5,7,2,11,-1,-1,-1,-1,9,7,5,9,2,7,9,0,2,2,11,7,-1,-1,-1,-1,7,5,2,7,2,11,5,9,2,3,2,8,9,8,2,-1,2,5,10,2,3,5,3,7,5,-1,-1,-1,-1,-1,-1,-1,8,2,0,8,5,2,8,7,5,10,2,5,-1,-1,-1,-1,9,0,1,5,10,3,5,3,7,3,10,2,-1,-1,-1,-1,9,8,2,9,2,1,8,7,2,10,2,5,7,5,2,-1,1,3,5,3,7,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,8,7,0,7,1,1,7,5,-1,-1,-1,-1,-1,-1,-1,9,0,3,9,3,5,5,3,7,-1,-1,-1,-1,-1,-1,-1,9,8,7,5,9,7,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,5,8,4,5,10,8,10,11,8,-1,-1,-1,-1,-1,-1,-1,5,0,4,5,11,0,5,10,11,11,3,0,-1,-1,-1,-1,0,1,9,8,4,10,8,10,11,10,4,5,-1,-1,-1,-1,10,11,4,10,4,5,11,3,4,9,4,1,3,1,4,-1,2,5,1,2,8,5,2,11,8,4,5,8,-1,-1,-1,-1,0,4,11,0,11,3,4,5,11,2,11,1,5,1,11,-1,0,2,5,0,5,9,2,11,5,4,5,8,11,8,5,-1,9,4,5,2,11,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2,5,10,3,5,2,3,4,5,3,8,4,-1,-1,-1,-1,5,10,2,5,2,4,4,2,0,-1,-1,-1,-1,-1,-1,-1,3,10,2,3,5,10,3,8,5,4,5,8,0,1,9,-1,5,10,2,5,2,4,1,9,2,9,4,2,-1,-1,-1,-1,8,4,5,8,5,3,3,5,1,-1,-1,-1,-1,-1,-1,-1,0,4,5,1,0,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,4,5,8,5,3,9,0,5,0,3,5,-1,-1,-1,-1,9,4,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,11,7,4,9,11,9,10,11,-1,-1,-1,-1,-1,-1,-1,0,8,3,4,9,7,9,11,7,9,10,11,-1,-1,-1,-1,1,10,11,1,11,4,1,4,0,7,4,11,-1,-1,-1,-1,3,1,4,3,4,8,1,10,4,7,4,11,10,11,4,-1,4,11,7,9,11,4,9,2,11,9,1,2,-1,-1,-1,-1,9,7,4,9,11,7,9,1,11,2,11,1,0,8,3,-1,11,7,4,11,4,2,2,4,0,-1,-1,-1,-1,-1,-1,-1,11,7,4,11,4,2,8,3,4,3,2,4,-1,-1,-1,-1,2,9,10,2,7,9,2,3,7,7,4,9,-1,-1,-1,-1,9,10,7,9,7,4,10,2,7,8,7,0,2,0,7,-1,3,7,10,3,10,2,7,4,10,1,10,0,4,0,10,-1,1,10,2,8,7,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,9,1,4,1,7,7,1,3,-1,-1,-1,-1,-1,-1,-1,4,9,1,4,1,7,0,8,1,8,7,1,-1,-1,-1,-1,4,0,3,7,4,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,8,7,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,10,8,10,11,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3,0,9,3,9,11,11,9,10,-1,-1,-1,-1,-1,-1,-1,0,1,10,0,10,8,8,10,11,-1,-1,-1,-1,-1,-1,-1,3,1,10,11,3,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,2,11,1,11,9,9,11,8,-1,-1,-1,-1,-1,-1,-1,3,0,9,3,9,11,1,2,9,2,11,9,-1,-1,-1,-1,0,2,11,8,0,11,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3,2,11,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2,3,8,2,8,10,10,8,9,-1,-1,-1,-1,-1,-1,-1,9,10,2,0,9,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2,3,8,2,8,10,0,1,8,1,10,8,-1,-1,-1,-1,1,10,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,3,8,9,1,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,9,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,3,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1])}function Rv(){return[[0,4,4,4,2,0,0,0,2,2,0,0],[4,0,4,4,0,8,0,0,0,8,8,0],[4,4,0,4,0,0,8,0,0,0,8,8],[4,4,4,0,0,0,0,1,1,0,0,1],[2,0,0,0,0,8,8,8,2,2,0,0],[0,8,0,0,8,0,8,8,0,8,8,0],[0,0,8,0,8,8,0,8,0,0,8,8],[0,0,0,1,8,8,8,0,1,0,0,1],[2,0,0,1,2,0,0,1,0,2,0,1],[2,8,0,0,2,8,0,0,2,0,8,0],[0,8,8,0,0,8,8,0,0,8,0,8],[0,0,8,1,0,0,8,1,1,0,8,0]]}function Dv(I,P,T,C,d){var f,O,m,L,c,u,h,R=0,D=!1,k=!1,B=!1,l=P*T*C,N=P,F=P*T,z=new Int32Array(12),g=[],v=[],U=[],y=[],j=Ov(),G=Lv(),V=[[0,4,4,4,2,0,0,0,2,2,0,0],[4,0,4,4,0,8,0,0,0,8,8,0],[4,4,0,4,0,0,8,0,0,0,8,8],[4,4,4,0,0,0,0,1,1,0,0,1],[2,0,0,0,0,8,8,8,2,2,0,0],[0,8,0,0,8,0,8,8,0,8,8,0],[0,0,8,0,8,8,0,8,0,0,8,8],[0,0,0,1,8,8,8,0,1,0,0,1],[2,0,0,1,2,0,0,1,0,2,0,1],[2,8,0,0,2,8,0,0,2,0,8,0],[0,8,8,0,0,8,8,0,0,8,0,8],[0,0,8,1,0,0,8,1,1,0,8,0]];function b(t,e,i){return t+(e-t)*i}function H(t,e,i){return F*(i=(i+h)%C)+N*(e=(e+u)%T)+(t=(t+c)%P)}function $(t,e,i,r,n,o,a){var s=3*t;if(O[s]<0){var c=(R-o)/(a-o),u=f,h=3*m;if(g[h+0]=i+c,g[h+1]=r,g[h+2]=n,!D){var l=3*t;v[h]=-b(u[l],u[l+3],c),v[h+1]=-b(u[l+1],u[l+4],c),v[h+2]=-b(u[l+2],u[l+5],c)}d&&(y[m]=d[t+Math.round(c)]),O[s]=m,z[e]=m,m+=1}else z[e]=O[s]}function W(t,e,i,r,n,o,a){var s=3*t+1;if(O[s]<0){var c=(R-o)/(a-o),u=f,h=3*m;if(g[h]=i,g[h+1]=r+c,g[h+2]=n,!D){var l=3*t,p=l+3*N;v[h]=-b(u[l],u[p],c),v[h+1]=-b(u[l+1],u[p+1],c),v[h+2]=-b(u[l+2],u[p+2],c)}d&&(y[m]=d[t+Math.round(c)*N]),O[s]=m,z[e]=m,m+=1}else z[e]=O[s]}function X(t,e,i,r,n,o,a){var s=3*t+2;if(O[s]<0){var c=(R-o)/(a-o),u=f,h=3*m;if(g[h]=i,g[h+1]=r,g[h+2]=n+c,!D){var l=3*t,p=l+3*F;v[h]=-b(u[l],u[p],c),v[h+1]=-b(u[l+1],u[p+1],c),v[h+2]=-b(u[l+2],u[p+2],c)}d&&(y[m]=d[t+Math.round(c)*F]),O[s]=m,z[e]=m,m+=1}else z[e]=O[s]}function q(t){var e=3*t;0===f[e]&&(f[e]=I[(t-1+l)%l]-I[(t+1)%l],f[e+1]=I[(t-N+l)%l]-I[(t+N)%l],f[e+2]=I[(t-F+l)%l]-I[(t+F)%l])}function Y(t,e,i,r,n){var o,a,s,c,u,h,l;B?(r=H(t,e,i),o=H(t+1,e,i),a=H(t,e+1,i),s=H(t,e,i+1),c=H(t+1,e+1,i),u=H(t+1,e,i+1),h=H(t,e+1,i+1),l=H(t+1,e+1,i+1)):(o=r+1,c=(a=r+N)+1,u=(s=r+F)+1,l=(h=a+F)+1);var p=0,d=I[r],f=I[o],m=I[a],g=I[c],v=I[s],y=I[u],b=I[h],x=I[l];d<R&&(p|=1),f<R&&(p|=2),m<R&&(p|=8),g<R&&(p|=4),v<R&&(p|=16),y<R&&(p|=32),b<R&&(p|=128),x<R&&(p|=64);var _=j[p];if(0===_)return 0;var w=t+1,S=e+1,A=i+1;1&_&&(D||(q(r),q(o)),$(r,0,t,e,i,d,f)),2&_&&(D||(q(o),q(c)),W(o,1,w,e,i,f,g)),4&_&&(D||(q(a),q(c)),$(a,2,t,S,i,m,g)),8&_&&(D||(q(r),q(a)),W(r,3,t,e,i,d,m)),16&_&&(D||(q(s),q(u)),$(s,4,t,e,A,v,y)),32&_&&(D||(q(u),q(l)),W(u,5,w,e,A,y,x)),64&_&&(D||(q(h),q(l)),$(h,6,t,S,A,b,x)),128&_&&(D||(q(s),q(h)),W(s,7,t,e,A,v,b)),256&_&&(D||(q(r),q(s)),X(r,8,t,e,i,d,v)),512&_&&(D||(q(o),q(u)),X(o,9,w,e,i,f,y)),1024&_&&(D||(q(c),q(l)),X(c,10,w,S,i,g,x)),2048&_&&(D||(q(a),q(h)),X(a,11,t,S,i,m,b));for(var M,E,P,T=p<<4,C=0;-1!==G[T+C];)M=G[T+C],E=G[T+C+1],P=G[T+C+2],k?(V[M][E]&n&&(U[L++]=z[M],U[L++]=z[E]),V[E][P]&n&&(U[L++]=z[E],U[L++]=z[P]),V[M][P]&n&&(U[L++]=z[M],U[L++]=z[P])):(U[L++]=z[E],U[L++]=z[M],U[L++]=z[P]),C+=3}function p(t,e,i,r,n,o){var a,s,c,u,h,l,p,d,f,m,g,v,y;if(t=void 0!==t?t:0,e=void 0!==e?e:0,i=void 0!==i?i:0,r=void 0!==r?r:P-1,n=void 0!==n?n:T-1,o=void 0!==o?o:C-1,B||(D?(t=Math.max(0,t),e=Math.max(0,e),i=Math.max(0,i),r=Math.min(P-1,r),n=Math.min(T-1,n),o=Math.min(C-1,o)):(t=Math.max(1,t),e=Math.max(1,e),i=Math.max(1,i),r=Math.min(P-2,r),n=Math.min(T-2,n),o=Math.min(C-2,o))),B)for(d=t-2,f=e-2,g=r+2,v=n+2,y=o+2,h=m=i-2;h<y;++h)for(u=f;u<v;++u)for(c=d;c<g;++c)s=3*H(c,u,h),O[s]=-1,O[s+1]=-1,O[s+2]=-1;else for(d=Math.max(0,t-2),f=Math.max(0,e-2),m=Math.max(0,i-2),g=Math.min(P,r+2),v=Math.min(T,n+2),y=Math.min(C,o+2),h=m;h<y;++h)for(p=F*h,u=f;u<v;++u)for(l=p+N*u,c=d;c<g;++c)O[a=3*(l+c)]=-1,O[a+1]=-1,O[a+2]=-1;if(!B){var b,x=t,_=e,w=i,S=r,A=n,M=o;for(b=!1,h=i;h<o;++h){for(u=e;u<n;++u){for(c=t;c<r;++c)if(I[a=P*T*h+P*u+c]>=R){w=h,b=!0;break}if(b)break}if(b)break}for(b=!1,u=e;u<n;++u){for(h=w;h<o;++h){for(c=t;c<r;++c)if(I[a=P*T*h+P*u+c]>=R){_=u,b=!0;break}if(b)break}if(b)break}for(b=!1,c=t;c<r;++c){for(u=_;u<n;++u){for(h=w;h<o;++h)if(I[a=P*T*h+P*u+c]>=R){x=c,b=!0;break}if(b)break}if(b)break}for(b=!1,h=o;i<=h;--h){for(u=n;e<=u;--u){for(c=r;t<=c;--c)if(I[a=P*T*h+P*u+c]>=R){M=h,b=!0;break}if(b)break}if(b)break}for(b=!1,u=n;e<=u;--u){for(h=M;i<=h;--h){for(c=r;t<=c;--c)if(I[a=P*T*h+P*u+c]>=R){A=u,b=!0;break}if(b)break}if(b)break}for(b=!1,c=r;t<=c;--c){for(u=A;e<=u;--u){for(h=M;i<=h;--h)if(I[a=P*T*h+P*u+c]>=R){S=c,b=!0;break}if(b)break}if(b)break}D?(t=Math.max(0,x-1),e=Math.max(0,_-1),i=Math.max(0,w-1),r=Math.min(P-1,S+1),n=Math.min(T-1,A+1),o=Math.min(C-1,M+1)):(t=Math.max(1,x-1),e=Math.max(1,_-1),i=Math.max(1,w-1),r=Math.min(P-2,S+1),n=Math.min(T-2,A+1),o=Math.min(C-2,M+1))}var E=15;for(h=i;h<o;++h,E&=-5)for(p=F*h,E|=2,u=e;u<n;++u,E&=-3)for(l=p+N*u,E|=1,c=t;c<r;++c,E&=-2)Y(c,u,h,a=l+c,E)}this.triangulate=function(t,e,i,r,n){R=t,k=r,B=n,(D=e||k)||f||(f=new Float32Array(3*l));var o=3*l;if(O&&O.length===o||(O=new Int32Array(o)),void(L=m=0)!==i){var a=i[0].map(Math.round),s=i[1].map(Math.round);c=P*Math.ceil(Math.abs(a[0])/P),u=T*Math.ceil(Math.abs(a[1])/T),h=C*Math.ceil(Math.abs(a[2])/C),p(a[0],a[1],a[2],s[0],s[1],s[2])}else c=u=h=0,p();return g.length=3*m,D||(v.length=3*m),U.length=L,d&&(y.length=m),{position:new Float32Array(g),normal:D?void 0:new Float32Array(v),index:Ll(U,g.length/3),atomindex:d?new Int32Array(y):void 0,contour:k}}}sd.add("arrow",uv),sd.add("box",bv),sd.add("cone",fv),sd.add("cylinder",cv),sd.add("ellipsoid",vv),sd.add("octahedron",yv),sd.add("sphere",wv),sd.add("tetrahedron",Av),sd.add("torus",Mv),sd.add("point",Cv),sd.add("wideline",Iv),Object.assign(Dv,{__deps:[Ov,Lv,Rv,Ll]});var kv=function(t,e){this.cols=t,this.rows=e,this.size=this.cols*this.rows,this.data=new Float32Array(this.size)};function Bv(t,e){for(var i=0,r=0,n=e.rows,o=e.cols,a=0,s=0,c=0,u=e.data,h=t.data;i<n;s+=1,a+=o,i++)for(c=s,r=0;r<o;c+=n,r++)h[c]=u[a+r]}function Nv(t,e,i){for(var r=0,n=0,o=0,a=0,s=0,c=0,u=0,h=e.cols,l=e.rows,p=i.rows,d=e.data,f=i.data,m=t.data,g=0;r<l;a+=h,r++)for(n=c=0;n<p;u++,n++){for(s=a,o=g=0;o<h;s++,c++,o++)g+=d[s]*f[c];m[u]=g}}function Fv(t,e,i){var r=t.data,n=e.data,o=i.data,a=n[0],s=n[1],c=n[2],u=n[3],h=n[4],l=n[5],p=n[6],d=n[7],f=n[8],m=o[0],g=o[1],v=o[2],y=o[3],b=o[4],x=o[5],_=o[6],w=o[7],S=o[8];r[0]=a*m+s*y+c*_,r[1]=a*g+s*b+c*w,r[2]=a*v+s*x+c*S,r[3]=u*m+h*y+l*_,r[4]=u*g+h*b+l*w,r[5]=u*v+h*x+l*S,r[6]=p*m+d*y+f*_,r[7]=p*g+d*b+f*w,r[8]=p*v+d*x+f*S}function zv(t){for(var e=t.rows,i=t.cols,r=t.data,n=new Array(i),o=0;o<i;++o)n[o]=0;for(var a=0,s=0;a<e;++a)for(var c=0;c<i;++c,++s)n[c]+=r[s];for(var u=0;u<i;++u)n[u]/=e;return n}function Uv(t,e){for(var i=t.rows,r=t.cols,n=t.data,o=0,a=0;o<i;++o)for(var s=0;s<r;++s,++a)n[a]-=e[s]}function jv(t,e,i,r){r=t[e],t[e]=t[i],t[i]=r}kv.prototype.copyTo=function(t){t.data.set(this.data)};var Gv=1.192092896e-7,Vv=1e-37;function Hv(t,e,i,r){var n=0,o=0,a=t.rows,s=t.cols,c=a,u=s;c<u&&(n=1,o=c,c=u,u=o);var h=new kv(c,c),l=new kv(1,u),p=new kv(u,u);if(0===n)Bv(h,t);else{for(o=0;o<s*a;o++)h.data[o]=t.data[o];for(;o<u*c;o++)h.data[o]=0}if(function(t,e,i,r,n,o,a,s){for(var c,u,h=2*Gv,l=Vv,p=0,d=0,f=0,m=0,g=Math.max(o,30),v=0,y=0,b=0,x=0,_=0,w=0,S=0,A=0,M=0,E=0,P=0,T=0,C=0,I=0,O=0,L=0,R=0,D=4660,k=0,B=0,N=0,F=new Float64Array(a<<3);p<a;p++){for(P=f=0;f<o;f++)P+=(A=t[p*e+f])*A;if(F[p]=P,r){for(f=0;f<a;f++)r[p*n+f]=0;r[p*n+p]=1}}for(;m<g;m++){for(p=_=0;p<a-1;p++)for(d=p+1;d<a;d++){for(v=p*e|0,y=d*e|0,O=F[p],L=0,R=F[d],f=2,L+=t[v]*t[y],L+=t[v+1]*t[y+1];f<o;f++)L+=t[v+f]*t[y+f];if(!(Math.abs(L)<=h*Math.sqrt(O*R))){for(c=L*=2,u=T=O-R,c=Math.abs(c),C=(u=Math.abs(u))<c?(u/=c,c*Math.sqrt(1+u*u)):0<u?(c/=u,u*Math.sqrt(1+c*c)):0,T<0?(I=.5*(C-T),w=L/(C*(S=Math.sqrt(I/C))*2)):S=L/(C*(w=Math.sqrt((C+T)/(2*C)))*2),R=O=0,f=2,M=w*t[v]+S*t[y],E=-S*t[v]+w*t[y],O+=(t[v]=M)*M,R+=(t[y]=E)*E,M=w*t[v+1]+S*t[y+1],E=-S*t[v+1]+w*t[y+1],O+=(t[v+1]=M)*M,R+=(t[y+1]=E)*E;f<o;f++)M=w*t[v+f]+S*t[y+f],E=-S*t[v+f]+w*t[y+f],O+=(t[v+f]=M)*M,R+=(t[y+f]=E)*E;if(F[p]=O,F[d]=R,_=1,r)for(x=d*n|0,f=2,M=w*r[b=p*n|0]+S*r[x],E=-S*r[b]+w*r[x],r[b]=M,r[x]=E,M=w*r[b+1]+S*r[x+1],E=-S*r[b+1]+w*r[x+1],r[b+1]=M,r[x+1]=E;f<a;f++)M=w*r[b+f]+S*r[x+f],E=-S*r[b+f]+w*r[x+f],r[b+f]=M,r[x+f]=E}}if(0===_)break}for(p=0;p<a;p++){for(P=f=0;f<o;f++)P+=(A=t[p*e+f])*A;F[p]=Math.sqrt(P)}for(p=0;p<a-1;p++){for(f=(d=p)+1;f<a;f++)F[d]<F[f]&&(d=f);if(p!==d&&(jv(F,p,d,P),r)){for(f=0;f<o;f++)jv(t,p*e+f,d*e+f,A);for(f=0;f<a;f++)jv(r,p*n+f,d*n+f,A)}}for(p=0;p<a;p++)i[p]=F[p];if(r)for(p=0;p<s;p++){for(P=p<a?F[p]:0;P<=l;){for(B=1/o,f=0;f<o;f++)k=0!=(256&(D=214013*D+2531011)>>16)?B:-B,t[p*e+f]=k;for(m=0;m<2;m++)for(d=0;d<p;d++){for(f=P=0;f<o;f++)P+=t[p*e+f]*t[d*e+f];for(f=N=0;f<o;f++)A=t[p*e+f]-P*t[d*e+f],t[p*e+f]=A,N+=Math.abs(A);for(N=N?1/N:0,f=0;f<o;f++)t[p*e+f]*=N}for(f=P=0;f<o;f++)P+=(A=t[p*e+f])*A;P=Math.sqrt(P)}for(S=1/P,f=0;f<o;f++)t[p*e+f]*=S}}(h.data,c,l.data,p.data,u,c,u,c),e){for(o=0;o<u;o++)e.data[o]=l.data[o];for(;o<s;o++)e.data[o]=0}0===n?(i&&Bv(i,h),r&&Bv(r,p)):(i&&Bv(i,p),r&&Bv(r,h))}function $v(){return new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1])}function Wv(t,e,i,r,n,o,a,s,c,u,h,l,p,d,f,m,g){t[0]=e,t[4]=i,t[8]=r,t[12]=n,t[1]=o,t[5]=a,t[9]=s,t[13]=c,t[2]=u,t[6]=h,t[10]=l,t[14]=p,t[3]=d,t[7]=f,t[11]=m,t[15]=g}function Xv(t,e,i){var r=e[0],n=e[4],o=e[8],a=e[12],s=e[1],c=e[5],u=e[9],h=e[13],l=e[2],p=e[6],d=e[10],f=e[14],m=e[3],g=e[7],v=e[11],y=e[15],b=i[0],x=i[4],_=i[8],w=i[12],S=i[1],A=i[5],M=i[9],E=i[13],P=i[2],T=i[6],C=i[10],I=i[14],O=i[3],L=i[7],R=i[11],D=i[15];t[0]=r*b+n*S+o*P+a*O,t[4]=r*x+n*A+o*T+a*L,t[8]=r*_+n*M+o*C+a*R,t[12]=r*w+n*E+o*I+a*D,t[1]=s*b+c*S+u*P+h*O,t[5]=s*x+c*A+u*T+h*L,t[9]=s*_+c*M+u*C+h*R,t[13]=s*w+c*E+u*I+h*D,t[2]=l*b+p*S+d*P+f*O,t[6]=l*x+p*A+d*T+f*L,t[10]=l*_+p*M+d*C+f*R,t[14]=l*w+p*E+d*I+f*D,t[3]=m*b+g*S+v*P+y*O,t[7]=m*x+g*A+v*T+y*L,t[11]=m*_+g*M+v*C+y*R,t[15]=m*w+g*E+v*I+y*D}function qv(t,e,i,r){Wv(t,e,0,0,0,0,i,0,0,0,0,r,0,0,0,0,1)}function Yv(t,e,i,r){Wv(t,1,0,0,e,0,1,0,i,0,0,1,r,0,0,0,1)}function Zv(t,e){var i=Math.cos(e),r=Math.sin(e);Wv(t,i,0,r,0,0,1,0,0,-r,0,i,0,0,0,0,1)}function Kv(){return new Float32Array([1,0,0,0,1,0,0,0,1])}function Jv(t,e){var i=gm([e[0],e[1],e[2]]),r=gm([e[4],e[5],e[6]]),n=gm([e[8],e[9],e[10]]),o=gm();vm(o,r,n),t[0]=o[0],t[1]=o[1],t[2]=o[2],vm(o,n,i),t[3]=o[0],t[4]=o[1],t[5]=o[2],vm(o,i,r),t[6]=o[0],t[7]=o[1],t[8]=o[2]}function Qv(t,e,i,r){i=i||1,r=r||!0;var n,o=t.length/3,a=e.length/3;r&&(n=new Float32Array(3*o));var s,c,u,h,l=new Float32Array(3*o),p=new Array(20);for(s=0;s<20;++s)p[s]=new Uint32Array(o);for(s=0;s<o;++s)p[0][s]=0;for(s=0;s<a;++s){var d=3*s,f=3*s+1,m=3*s+2;for(h=!0,u=p[c=0][e[d]];c<u;++c)if(e[f]===p[c+1][e[d]]){h=!1;break}for(h&&(p[0][e[d]]++,p[p[0][e[d]]][e[d]]=e[f]),h=!0,u=p[c=0][e[d]];c<u;++c)if(e[m]===p[c+1][e[d]]){h=!1;break}for(h&&(p[0][e[d]]++,p[p[0][e[d]]][e[d]]=e[m]),h=!0,u=p[c=0][e[f]];c<u;++c)if(e[d]===p[c+1][e[f]]){h=!1;break}for(h&&(p[0][e[f]]++,p[p[0][e[f]]][e[f]]=e[d]),h=!0,u=p[c=0][e[f]];c<u;++c)if(e[m]===p[c+1][e[f]]){h=!1;break}for(h&&(p[0][e[f]]++,p[p[0][e[f]]][e[f]]=e[m]),h=!0,c=0;c<p[0][e[m]];++c)if(e[d]===p[c+1][e[m]]){h=!1;break}for(h&&(p[0][e[m]]++,p[p[0][e[m]]][e[m]]=e[d]),h=!0,u=p[c=0][e[m]];c<u;++c)if(e[f]===p[c+1][e[m]]){h=!1;break}h&&(p[0][e[m]]++,p[p[0][e[m]]][e[m]]=e[f])}for(var g,v,y,b,x,_=0;_<i;++_){for(s=0;s<o;++s)if(g=3*s,(y=p[0][s])<3)l[g]=t[g],l[g+1]=t[g+1],l[g+2]=t[g+2];else if(3===y||4===y){for(l[g]=0,l[g+1]=0,c=l[g+2]=0;c<y;++c)v=3*p[c+1][s],l[g]+=t[v],l[g+1]+=t[v+1],l[g+2]+=t[v+2];l[g]+=.5*t[g],l[g+1]+=.5*t[g+1],l[g+2]+=.5*t[g+2],x=.5+y,l[g]/=x,l[g+1]/=x,l[g+2]/=x}else{for(l[g]=0,l[g+1]=0,c=l[g+2]=0;c<y;++c)v=3*p[c+1][s],l[g]+=t[v],l[g+1]+=t[v+1],l[g+2]+=t[v+2];l[g]+=1*t[g],l[g+1]+=1*t[g+1],l[g+2]+=1*t[g+2],b=1+y,l[g]/=b,l[g+1]/=b,l[g+2]/=b}if(t.set(l),r){ty(t,e,n);var w=3*o;for(g=0;g<w;g+=3)t[g]+=.75/4.5*-1*n[g],t[g+1]+=.75/4.5*-1*n[g+1],t[g+2]+=.75/4.5*-1*n[g+2]}}}function ty(t,e,i){var r,n;if(void 0===i)i=new Float32Array(t.length);else for(r=0,n=i.length;r<n;r++)i[r]=0;var o=new Float32Array(3),a=new Float32Array(3),s=new Float32Array(3),c=new Float32Array(3),u=new Float32Array(3);if(e)for(r=0,n=e.length;r<n;r+=3){var h=3*e[r],l=3*e[r+1],p=3*e[r+2];_m(o,t,h),_m(a,t,l),_m(s,t,p),bm(c,s,a),bm(u,o,a),vm(c,c,u),i[h]+=c[0],i[h+1]+=c[1],i[h+2]+=c[2],i[l]+=c[0],i[l+1]+=c[1],i[l+2]+=c[2],i[p]+=c[0],i[p+1]+=c[1],i[p+2]+=c[2]}else for(r=0,n=t.length;r<n;r+=9)_m(o,t,r),_m(a,t,r+3),_m(s,t,r+6),bm(c,s,a),bm(u,o,a),vm(c,c,u),i[r]=c[0],i[r+1]=c[1],i[r+2]=c[2],i[r+3]=c[0],i[r+4]=c[1],i[r+5]=c[2],i[r+6]=c[0],i[r+7]=c[1],i[r+8]=c[2];return mm(i),i}function ey(t){for(var e={},i=0,r=t.length;i<r;++i)e[t[i]]=!0;return e}function iy(t,e,i,r,n){var o=1/r*3;Pm(t,t,n+(o+=i)),Tm(e,e,n+o),Mm(t,t,r),Cm(t,t),Am(t,t,r),Mm(e,e,r),Im(e,e),Am(e,e,r);var a=new Float32Array(3);bm(a,e,t),Mm(a,a,r),Im(a,a),Tm(a,a,1);var s=256*Math.pow(10,6),c=a[0]*a[1]*a[2]*3;s<=c&&(Mm(t,t,r*=Math.pow(s/c,1/3)),Cm(t,t),Am(t,t,r),Mm(e,e,r),Im(e,e),Am(e,e,r),bm(a,e,t),Mm(a,a,r),Im(a,a),Tm(a,a,1));var u=new Float32Array(t);Om(u,u);var h=$v(),l=$v();Zv(l,Gl(90)),Xv(h,h,l);var p=$v();qv(p,-1/r,1/r,1/r),Xv(h,h,p);var d=$v();return Yv(d,-r*u[2],-r*u[1],-r*u[0]),Xv(h,h,d),{dim:a,tran:u,matrix:h,scaleFactor:r}}qv.__deps=[Wv],Yv.__deps=[Wv],Zv.__deps=[Wv],Jv.__deps=[gm,vm],Object.assign(Qv,{__deps:[ty]}),Object.assign(ty,{__deps:[bm,vm,_m,mm]}),Object.assign(iy,{__deps:[Gl,Pm,Tm,Am,Mm,Cm,Im,bm,Om,$v,Xv,Yv,qv,Zv]});var ry=function(t,e,i){this.name=t||"",this.path=e||"",this.info={},this.center=new ri,this.boundingBox=new Pi,i instanceof _r||i instanceof $r||i instanceof ya?this.fromGeometry(i):i&&(this.set(i.position,i.index,i.normal,i.color,i.atomindex,i.contour),this.boundingBox.setFromArray(i.position),this.boundingBox.getCenter(this.center))},ny={type:{configurable:!0}};function oy(t,e,i,r,n){var c=new Dv(t,e,i,r,n);this.getSurface=function(t,e,i,r,n,o){void 0===o&&(o=!1);var a=c.triangulate(t,e,i,n,o);if(e&&!n&&(Qv(a.position,a.index,e,!0),a.normal=ty(a.position,a.index)),r&&(dm(r,a.position),a.normal)){var s=Kv();Jv(s,r),fm(s,a.normal)}return a}}ny.type.get=function(){return"Surface"},ry.prototype.set=function(t,e,i,r,n,o){void 0===o&&(o=!1),this.position=t,this.index=e,this.normal=i,this.color=r,this.atomindex=n,this.size=t.length/3,this.contour=o},ry.prototype.fromGeometry=function(t){var e,i,r,n;if(de.Debug&&Yp.time("GeometrySurface.fromGeometry"),t instanceof _r?(t.computeVertexNormals(!0),e=(new $r).fromGeometry(t)):e=t instanceof $r?t:t[0],e.boundingBox||e.computeBoundingBox(),this.boundingBox.copy(e.boundingBox),this.boundingBox.getCenter(this.center),e instanceof $r){var o=e.attributes,a=!!o.normal&&o.normal.array;(!a||0===a[0]&&0===a[1]&&0===a[2])&&e.computeVertexNormals(),i=o.position.array,r=o.index?o.index.array:null,n=o.normal.array}this.set(i,r,n,void 0,void 0),de.Debug&&Yp.timeEnd("GeometrySurface.setGeometry")},ry.prototype.getPosition=function(){return this.position},ry.prototype.getColor=function(t){var e=t||{},i=(e.surface=this).size,r=new Float32Array(3*i),n=Qp.getScheme(e);if(n.volumeColor||"random"===e.scheme)for(var o=0;o<i;++o)n.volumeColorToArray(o,r,3*o);else if(n.positionColor)for(var a=new ri,s=this.position,c=0;c<i;++c){var u=3*c;a.set(s[u],s[u+1],s[u+2]),n.positionColorToArray(a,r,u)}else if(n.atomColor&&this.atomindex)for(var h=e.structure.getAtomProxy(),l=this.atomindex,p=0;p<i;++p)h.index=l[p],n.atomColorToArray(h,r,3*p);else{var d=new ki(e.value);Vd(i,d.r,d.g,d.b,r)}return r},ry.prototype.getPicking=function(t){return this.atomindex&&t?new hv(this.atomindex,t):new Sv(Hd(this.size),this)},ry.prototype.getNormal=function(){return this.normal},ry.prototype.getSize=function(t,e){return Gd(this.size,t*e)},ry.prototype.getIndex=function(){return this.index},ry.prototype.getFilteredIndex=function(t,e){if(t&&this.atomindex){for(var i=new Lp(t),r=e.getAtomSet(i),n=[],o=this.atomindex,a=this.index,s=a.length,c=this.contour?2:3,u=0,h=0;h<s;h+=c){for(var l=!0,p=0;p<c;p++){var d=o[a[h+p]];if(!r.get(d)){l=!1;break}}if(l)for(var f=0;f<c;f++,u++)n[u]=a[h+f]}return Ll(n,this.position.length/3)}return this.index},ry.prototype.getAtomindex=function(){return this.atomindex},ry.prototype.dispose=function(){},Object.defineProperties(ry.prototype,ny),Object.assign(oy,{__deps:[Qv,ty,Dv,dm,fm,Kv,Jv]}),Jp.add("surf",function(t,e){var i=t.data.args,r=t.data.params;if(i&&(self.volsurf=new oy(i[0],i[1],i[2],i[3],i[4])),r){var n=self.volsurf.getSurface(r.isolevel,r.smooth,r.box,r.matrix,r.contour,r.wrap),o=[n.position.buffer,n.index.buffer];n.normal&&o.push(n.normal.buffer),n.atomindex&&o.push(n.atomindex.buffer),e({sd:n,p:r},o)}},[oy]);var ay=function(t,e,i,r,n,o,a){this.name=t,this.path=e,this.matrix=new ei,this.normalMatrix=new ni,this.inverseMatrix=new ei,this.center=new ri,this.boundingBox=new Pi,this.setData(i,r,n,o,a)},sy={type:{configurable:!0},position:{configurable:!0},min:{configurable:!0},max:{configurable:!0},sum:{configurable:!0},mean:{configurable:!0},rms:{configurable:!0}};function cy(t){return"front"===t?G:"back"===t?wt:et}sy.type.get=function(){return"Volume"},ay.prototype.setData=function(t,e,i,r,n){this.nx=e||1,this.ny=i||1,this.nz=r||1,this.data=t||new Float32Array(1),this.setAtomindex(n),delete this._position,delete this._min,delete this._max,delete this._mean,delete this._rms,this.worker&&this.worker.terminate()},ay.prototype.setStats=function(t,e,i,r){this._min=t,this._max=e,this._mean=i,this._rms=r},ay.prototype.setMatrix=function(t){this.matrix.copy(t);var e=this.boundingBox,i=this.center,r=this.nx-1,n=this.ny-1,o=this.nz-1;e.makeEmpty(),e.expandByPoint(i.set(r,n,o)),e.expandByPoint(i.set(r,n,0)),e.expandByPoint(i.set(r,0,o)),e.expandByPoint(i.set(r,0,0)),e.expandByPoint(i.set(0,n,o)),e.expandByPoint(i.set(0,0,o)),e.expandByPoint(i.set(0,n,0)),e.expandByPoint(i.set(0,0,0)),e.applyMatrix4(this.matrix),e.getCenter(this.center);var a=this.matrix.elements,s=new ri(a[0],a[1],a[2]),c=new ri(a[4],a[5],a[6]),u=new ri(a[8],a[9],a[10]),h=new ri,l=this.normalMatrix.elements;h.crossVectors(c,u),l[0]=h.x,l[1]=h.y,l[2]=h.z,h.crossVectors(u,s),l[3]=h.x,l[4]=h.y,l[5]=h.z,h.crossVectors(s,c),l[6]=h.x,l[7]=h.y,l[8]=h.z,this.inverseMatrix.getInverse(this.matrix)},ay.prototype.setAtomindex=function(t){this.atomindex=t},ay.prototype.getBox=function(t,e,i){return i||(i=new Pi),i.set(t,t),i.expandByScalar(e),i.applyMatrix4(this.inverseMatrix),i.min.round(),i.max.round(),i},ay.prototype._getBox=function(t,e){if(t&&e){this.__box||(this.__box=new Pi);var i=this.getBox(t,e,this.__box);return[i.min.toArray(),i.max.toArray()]}},ay.prototype._makeSurface=function(t,e,i){var r=this.name+"@"+e.toPrecision(2),n=new ry(r,"",t);return n.info.isolevel=e,n.info.smooth=i,n.info.volume=this,n},ay.prototype.getSurface=function(t,e,i,r,n,o){void 0===o&&(o=!1),t=isNaN(t)?this.getValueForSigma(2):t,e=bl(e,0),void 0===this.volsurf&&(this.volsurf=new oy(this.data,this.nx,this.ny,this.nz,this.atomindex));var a=this._getBox(i,r),s=this.volsurf.getSurface(t,e,a,this.matrix.elements,n,o);return this._makeSurface(s,t,e)},ay.prototype.getSurfaceWorker=function(i,r,n,o,a,s,c){var u=this;if(i=isNaN(i)?this.getValueForSigma(2):i,r=r||0,window.hasOwnProperty("Worker")){void 0===this.workerPool&&(this.workerPool=new um("surf",2));var t={},e=this.workerPool.getNextWorker();0===e.postCount&&Object.assign(t,{args:[this.data,this.nx,this.ny,this.nz,this.atomindex]}),Object.assign(t,{params:{isolevel:i,smooth:r,box:this._getBox(n,o),matrix:this.matrix.elements,contour:a,wrap:s}}),e.post(t,void 0,function(t){var e=t.data.sd,i=t.data.p;c(u._makeSurface(e,i.isolevel,i.smooth))},function(t){console.warn("Volume.getSurfaceWorker error - trying without worker",t);var e=u.getSurface(i,r,n,o,a,s);c(e)})}else{var h=this.getSurface(i,r,n,o,a,s);c(h)}},ay.prototype.getValueForSigma=function(t){return this.mean+bl(t,2)*this.rms},ay.prototype.getSigmaForValue=function(t){return(bl(t,0)-this.mean)/this.rms},sy.position.get=function(){if(!this._position){for(var t=this.nz,e=this.ny,i=this.nx,r=new Float32Array(i*e*t*3),n=0,o=0;o<t;++o)for(var a=0;a<e;++a)for(var s=0;s<i;++s)r[n+0]=s,r[n+1]=a,r[n+2]=o,n+=3;dm(this.matrix.elements,r),this._position=r}return this._position},ay.prototype.getDataAtomindex=function(){return this.atomindex},ay.prototype.getDataPosition=function(){return this.position},ay.prototype.getDataColor=function(t){var e=t||{};e.volume=this,e.scale=e.scale||"Spectral",e.domain=e.domain||[this.min,this.max];for(var i=Qp.getScheme(e),r=this.position.length/3,n=new Float32Array(3*r),o=0;o<r;++o)i.volumeColorToArray(o,n,3*o);return n},ay.prototype.getDataPicking=function(){var t=Hd(this.position.length/3);return new Pv(t,this)},ay.prototype.getDataSize=function(t,e){var i,r=this.data,n=this.position.length/3;switch(t){case"value":i=new Float32Array(r);break;case"abs-value":i=new Float32Array(r);for(var o=0;o<n;++o)i[o]=Math.abs(i[o]);break;case"value-min":i=new Float32Array(r);for(var a=this.min,s=0;s<n;++s)i[s]-=a;break;case"deviation":i=new Float32Array(r);break;default:i=Gd(n,t)}if(1!==e)for(var c=0;c<n;++c)i[c]*=e;return i},sy.min.get=function(){return void 0===this._min&&(this._min=Zd(this.data)),this._min},sy.max.get=function(){return void 0===this._max&&(this._max=Yd(this.data)),this._max},sy.sum.get=function(){return void 0===this._sum&&(this._sum=Kd(this.data)),this._sum},sy.mean.get=function(){return void 0===this._mean&&(this._mean=Jd(this.data)),this._mean},sy.rms.get=function(){return void 0===this._rms&&(this._rms=function(t){for(var e=t.length,i=0,r=0;r<e;++r){var n=t[r];i+=n*n}return Math.sqrt(i/e)}(this.data)),this._rms},ay.prototype.clone=function(){var t=new ay(this.name,this.path,this.data,this.nx,this.ny,this.nz,this.atomindex);return t.matrix.copy(this.matrix),t.header=Object.assign({},this.header),t},ay.prototype.dispose=function(){this.workerPool&&this.workerPool.terminate()},Object.defineProperties(ay.prototype,sy),rd.add("shader/Mesh.vert","#define STANDARD\nuniform float clipNear;\nuniform vec3 clipCenter;\n#if defined( NEAR_CLIP ) || defined( RADIUS_CLIP ) || ( !defined( PICKING ) && !defined( NOLIGHT ) )\nvarying vec3 vViewPosition;\n#endif\n#if defined( RADIUS_CLIP )\nvarying vec3 vClipCenter;\n#endif\n#if defined( PICKING )\n#include unpack_color\nattribute float primitiveId;\nvarying vec3 vPickingColor;\n#elif defined( NOLIGHT )\nvarying vec3 vColor;\n#else\n#include color_pars_vertex\n#ifndef FLAT_SHADED\nvarying vec3 vNormal;\n#endif\n#endif\n#include common\nvoid main(){\n#if defined( PICKING )\nvPickingColor = unpackColor( primitiveId );\n#elif defined( NOLIGHT )\nvColor = color;\n#else\n#include color_vertex\n#include beginnormal_vertex\n#include defaultnormal_vertex\n#ifndef FLAT_SHADED\nvNormal = normalize( transformedNormal );\n#endif\n#endif\n#include begin_vertex\n#include project_vertex\n#if defined( NEAR_CLIP ) || defined( RADIUS_CLIP ) || ( !defined( PICKING ) && !defined( NOLIGHT ) )\nvViewPosition = -mvPosition.xyz;\n#endif\n#if defined( RADIUS_CLIP )\nvClipCenter = -( modelViewMatrix * vec4( clipCenter, 1.0 ) ).xyz;\n#endif\n#include nearclip_vertex\n}"),rd.add("shader/Mesh.frag","#define STANDARD\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 interiorColor;\nuniform float interiorDarkening;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\nuniform float clipNear;\nuniform float clipRadius;\n#if defined( NEAR_CLIP ) || defined( RADIUS_CLIP ) || ( !defined( PICKING ) && !defined( NOLIGHT ) )\nvarying vec3 vViewPosition;\n#endif\n#if defined( RADIUS_CLIP )\nvarying vec3 vClipCenter;\n#endif\n#if defined( PICKING )\nuniform float objectId;\nvarying vec3 vPickingColor;\n#elif defined( NOLIGHT )\nvarying vec3 vColor;\n#else\n#ifndef FLAT_SHADED\nvarying vec3 vNormal;\n#endif\n#include common\n#include color_pars_fragment\n#include fog_pars_fragment\n#include bsdfs\n#include lights_pars_begin\n#include lights_physical_pars_fragment\n#endif\nvoid main(){\n#include nearclip_fragment\n#include radiusclip_fragment\n#if defined( PICKING )\nif( opacity < 0.3 )\ndiscard;\ngl_FragColor = vec4( vPickingColor, objectId );\n#elif defined( NOLIGHT )\ngl_FragColor = vec4( vColor, opacity );\n#else\nvec4 diffuseColor = vec4( diffuse, opacity );\nReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\nvec3 totalEmissiveLight = emissive;\n#include color_fragment\n#include roughnessmap_fragment\n#include metalnessmap_fragment\n#include normal_fragment_begin\n#include lights_physical_fragment\n#include lights_fragment_begin\n#include lights_fragment_end\nvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveLight;\n#include interior_fragment\ngl_FragColor = vec4( outgoingLight, diffuseColor.a );\n#include premultiplied_alpha_fragment\n#include tonemapping_fragment\n#include encodings_fragment\n#include fog_fragment\n#include opaque_back_fragment\n#endif\n}");var uy={f:1,v2:2,v3:3,c:3};function hy(t,e){t.matrix.copy(e),t.matrix.decompose(t.position,t.quaternion,t.scale),t.matrixWorldNeedsUpdate=!0}var ly={opaqueBack:!1,side:"double",opacity:1,depthWrite:!0,clipNear:0,clipRadius:0,clipCenter:new ri,flatShaded:!1,wireframe:!1,roughness:.4,metalness:0,diffuse:16777215,diffuseInterior:!1,useInteriorColor:!1,interiorColor:14540253,interiorDarkening:0,forceTransparent:!1,matrix:new ei,disablePicking:!1,sortParticles:!1,background:!1},py={opaqueBack:{updateShader:!0},side:{updateShader:!0,property:!0},opacity:{uniform:!0},depthWrite:{property:!0},clipNear:{updateShader:!0,property:!0},clipRadius:{updateShader:!0,uniform:!0},clipCenter:{uniform:!0},flatShaded:{updateShader:!0},background:{updateShader:!0},wireframe:{updateVisibility:!0},roughness:{uniform:!0},metalness:{uniform:!0},diffuse:{uniform:!0},diffuseInterior:{updateShader:!0},useInteriorColor:{updateShader:!0},interiorColor:{uniform:!0},interiorDarkening:{uniform:!0},matrix:{}},dy=function(t,e){void 0===e&&(e={}),this.parameterTypes=py,this.geometry=new $r,this.indexVersion=0,this.wireframeIndexVersion=-1,this.group=new ya,this.wireframeGroup=new ya,this.pickingGroup=new ya,this.vertexShader="",this.fragmentShader="",this.isImpostor=!1,this.isText=!1,this.isSurface=!1,this.isPoint=!1,this.isLine=!1,this.dynamic=!0,this.visible=!0,this.wireframeIndexCount=0,this.parameters=xl(e,this.defaultParameters),this.uniforms=Ri.merge([Fi.common,{fogColor:{value:null},fogNear:{value:0},fogFar:{value:0},opacity:{value:this.parameters.opacity},clipNear:{value:0},clipRadius:{value:this.parameters.clipRadius},clipCenter:{value:this.parameters.clipCenter}},{emissive:{value:new ki(0)},roughness:{value:this.parameters.roughness},metalness:{value:this.parameters.metalness},interiorColor:{value:new ki(this.parameters.interiorColor)},interiorDarkening:{value:this.parameters.interiorDarkening}},Fi.lights]),this.uniforms.diffuse.value.set(this.parameters.diffuse),this.pickingUniforms={clipNear:{value:0},objectId:{value:0},opacity:{value:this.parameters.opacity}};var i=t.position||t.position1;this._positionDataSize=i?i.length/3:0,t.primitiveId||(t.primitiveId=Hd(this._positionDataSize)),this.addAttributes({position:{type:"v3",value:t.position},color:{type:"c",value:t.color},primitiveId:{type:"f",value:t.primitiveId}}),e.matrix&&(this.matrix=e.matrix),t.index&&this.initIndex(t.index),this.picking=t.picking,this.makeWireframeGeometry()},fy={defaultParameters:{configurable:!0},matrix:{configurable:!0},transparent:{configurable:!0},size:{configurable:!0},attributeSize:{configurable:!0},pickable:{configurable:!0}};fy.defaultParameters.get=function(){return ly},fy.matrix.set=function(t){this.setMatrix(t)},fy.matrix.get=function(){return this.group.matrix.clone()},fy.transparent.get=function(){return this.parameters.opacity<1||this.parameters.forceTransparent},fy.size.get=function(){return this._positionDataSize},fy.attributeSize.get=function(){return this.size},fy.pickable.get=function(){return!!this.picking&&!this.parameters.disablePicking},dy.prototype.setMatrix=function(t){hy(this.group,t),hy(this.wireframeGroup,t),hy(this.pickingGroup,t)},dy.prototype.initIndex=function(t){this.geometry.setIndex(new wr(t,1)),this.geometry.getIndex().setDynamic(this.dynamic)},dy.prototype.makeMaterial=function(){var t=cy(this.parameters.side),e=new An({uniforms:this.uniforms,vertexShader:"",fragmentShader:"",depthTest:!0,transparent:this.transparent,depthWrite:this.parameters.depthWrite,lights:!0,fog:!0,side:t});e.vertexColors=2,e.extensions.derivatives=this.parameters.flatShaded,e.extensions.fragDepth=this.isImpostor;var i=new An({uniforms:this.uniforms,vertexShader:"",fragmentShader:"",depthTest:!0,transparent:this.transparent,depthWrite:this.parameters.depthWrite,lights:!1,fog:!0,side:t});i.vertexColors=2;var r=new An({uniforms:this.pickingUniforms,vertexShader:"",fragmentShader:"",depthTest:!0,transparent:!1,depthWrite:this.parameters.depthWrite,lights:!1,fog:!1,side:t,blending:q});r.vertexColors=2,r.extensions.fragDepth=this.isImpostor,e.clipNear=this.parameters.clipNear,i.clipNear=this.parameters.clipNear,r.clipNear=this.parameters.clipNear,this.material=e,this.wireframeMaterial=i,this.pickingMaterial=r,this.updateShader()},dy.prototype.makeWireframeGeometry=function(){this.makeWireframeIndex();var t=this.geometry,e=this.wireframeIndex,i=new $r;i.attributes=t.attributes,e&&(i.setIndex(new wr(e,1).setDynamic(this.dynamic)),i.setDrawRange(0,this.wireframeIndexCount)),this.wireframeGeometry=i},dy.prototype.makeWireframeIndex=function(){var n=[];function t(t,e){if(e<t){var i=t;t=e,e=i}var r=n[t];return void 0===r?(n[t]=[e],!0):!r.includes(e)&&(r.push(e),!0)}var e=this.geometry,i=e.index;if(this.parameters.wireframe)if(i){var r,o=i.array,a=o.length;if(e.drawRange.count!==1/0&&(a=e.drawRange.count),this.wireframeIndex&&this.wireframeIndex.length>2*a)r=this.wireframeIndex;else r=Ll(2*a,e.attributes.position.count);for(var s=0,c=n.length=0;c<a;c+=3){var u=o[c+0],h=o[c+1],l=o[c+2];t(u,h)&&(r[s+0]=u,r[s+1]=h,s+=2),t(h,l)&&(r[s+0]=h,r[s+1]=l,s+=2),t(l,u)&&(r[s+0]=l,r[s+1]=u,s+=2)}this.wireframeIndex=r,this.wireframeIndexCount=s,this.wireframeIndexVersion=this.indexVersion}else{var p,d=e.attributes.position.count;p=this.wireframeIndex&&this.wireframeIndex.length>2*d?this.wireframeIndex:Ll(2*d,d);for(var f=0,m=0;f<d;f+=3)p[m+0]=f,p[m+1]=f+1,p[m+2]=f+1,p[m+3]=f+2,p[m+4]=f+2,p[m+5]=f,m+=6;this.wireframeIndex=p,this.wireframeIndexCount=2*d,this.wireframeIndexVersion=this.indexVersion}else this.wireframeIndex=new Uint16Array(0),this.wireframeIndexCount=0},dy.prototype.updateWireframeIndex=function(){if(this.wireframeGeometry&&this.wireframeIndex){if(this.wireframeGeometry.setDrawRange(0,1/0),this.wireframeIndexVersion<this.indexVersion&&this.makeWireframeIndex(),this.wireframeIndex.length>this.wireframeGeometry.index.array.length)this.wireframeGeometry.setIndex(new wr(this.wireframeIndex,1).setDynamic(this.dynamic));else{var t=this.wireframeGeometry.getIndex();t.set(this.wireframeIndex),t.needsUpdate=0<this.wireframeIndexCount,t.updateRange.count=this.wireframeIndexCount}this.wireframeGeometry.setDrawRange(0,this.wireframeIndexCount)}},dy.prototype.getRenderOrder=function(){var t=0;return this.isText?t=1:this.transparent&&(t=this.isSurface?3:2),t},dy.prototype._getMesh=function(t){this.material||this.makeMaterial();var e,i=this.geometry,r=this[t];return(e=this.isLine?new Na(i,r):this.isPoint?new Ua(i,r):new Pn(i,r)).frustumCulled=!1,e.renderOrder=this.getRenderOrder(),e},dy.prototype.getMesh=function(){return this._getMesh("material")},dy.prototype.getWireframeMesh=function(){var t;return this.material||this.makeMaterial(),this.wireframeGeometry||this.makeWireframeGeometry(),(t=new Na(this.wireframeGeometry,this.wireframeMaterial)).frustumCulled=!1,t.renderOrder=this.getRenderOrder(),t},dy.prototype.getPickingMesh=function(){return this._getMesh("pickingMaterial")},dy.prototype.getShader=function(t,e){return Cd(t,this.getDefines(e))},dy.prototype.getVertexShader=function(t){return this.getShader(this.vertexShader,t)},dy.prototype.getFragmentShader=function(t){return this.getShader(this.fragmentShader,t)},dy.prototype.getDefines=function(t){var e={};return this.parameters.clipNear&&(e.NEAR_CLIP=1),this.parameters.clipRadius&&(e.RADIUS_CLIP=1),"picking"===t?e.PICKING=1:(("background"===t||this.parameters.background)&&(e.NOLIGHT=1),this.parameters.flatShaded&&(e.FLAT_SHADED=1),this.parameters.opaqueBack&&(e.OPAQUE_BACK=1),this.parameters.diffuseInterior&&(e.DIFFUSE_INTERIOR=1),this.parameters.useInteriorColor&&(e.USE_INTERIOR_COLOR=1)),e},dy.prototype.getParameters=function(){return this.parameters},dy.prototype.addUniforms=function(t){this.uniforms=Ri.merge([this.uniforms,t]),this.pickingUniforms=Ri.merge([this.pickingUniforms,t])},dy.prototype.addAttributes=function(t){for(var e in t){var i=void 0,r=t[e],n=this.attributeSize*uy[r.type];r.value?(n!==r.value.length&&Yp.error("attribute value has wrong length",e),i=r.value):i=Ol("float32",n),this.geometry.addAttribute(e,new wr(i,uy[r.type]).setDynamic(this.dynamic))}},dy.prototype.updateRenderOrder=function(){var e=this.getRenderOrder();function t(t){t.renderOrder=e}this.group.children.forEach(t),this.pickingGroup&&this.pickingGroup.children.forEach(t)},dy.prototype.updateShader=function(){var t=this.material,e=this.wireframeMaterial,i=this.pickingMaterial;t.vertexShader=this.getVertexShader(),t.fragmentShader=this.getFragmentShader(),t.needsUpdate=!0,e.vertexShader=this.getShader("Line.vert"),e.fragmentShader=this.getShader("Line.frag"),e.needsUpdate=!0,i.vertexShader=this.getVertexShader("picking"),i.fragmentShader=this.getFragmentShader("picking"),i.needsUpdate=!0},dy.prototype.setParameters=function(t){var e=t,i=this.parameterTypes,r=this.parameters,n={},o={},a=!1,s=!1;for(var c in e){var u=e[c];void 0!==u&&(r[c]=u,void 0!==i[c]&&(i[c].property&&(!0!==i[c].property?n[i[c].property]=u:n[c]=u),i[c].uniform&&(!0!==i[c].uniform?o[i[c].uniform]=u:o[c]=u),i[c].updateShader&&(a=!0),i[c].updateVisibility&&(s=!0),this.dynamic&&"wireframe"===c&&!0===u&&this.updateWireframeIndex(),"flatShaded"===c&&(this.material.extensions.derivatives=this.parameters.flatShaded||this.isText),"forceTransparent"===c&&(n.transparent=this.transparent),"matrix"===c&&(this.matrix=u)))}this.setProperties(n),this.setUniforms(o),a&&this.updateShader(),s&&this.setVisibility(this.visible)},dy.prototype.setAttributes=function(t){var e=this.geometry,i=e.attributes;for(var r in t)if("picking"!==r){var n=t[r],o=n.length;if("index"===r){var a=e.getIndex();e.setDrawRange(0,1/0),o>a.array.length?e.setIndex(new wr(n,1).setDynamic(this.dynamic)):(a.set(n),a.needsUpdate=0<o,a.updateRange.count=o,e.setDrawRange(0,o)),this.indexVersion++,this.parameters.wireframe&&this.updateWireframeIndex()}else{var s=i[r];o>s.array.length?e.addAttribute(r,new wr(n,s.itemSize).setDynamic(this.dynamic)):(i[r].set(n),i[r].needsUpdate=0<o,i[r].updateRange.count=o)}}},dy.prototype.setUniforms=function(t){if(t){var e=this.material.uniforms,i=this.wireframeMaterial.uniforms,r=this.pickingMaterial.uniforms;for(var n in t)"opacity"===n&&this.setProperties({transparent:this.transparent}),void 0!==e[n]&&(e[n].value.isVector3?e[n].value.copy(t[n]):e[n].value.set?e[n].value.set(t[n]):e[n].value=t[n]),void 0!==i[n]&&(i[n].value.isVector3?i[n].value.copy(t[n]):i[n].value.set?i[n].value.set(t[n]):i[n].value=t[n]),void 0!==r[n]&&(r[n].value.isVector3?r[n].value.copy(t[n]):r[n].value.set?r[n].value.set(t[n]):r[n].value=t[n])}},dy.prototype.setProperties=function(t){if(t){var e=this.material,i=this.wireframeMaterial,r=this.pickingMaterial;for(var n in t){var o=n,a=t[o];"transparent"===o?this.updateRenderOrder():"side"===o&&(a=cy(a)),e[o]=a,i[o]=a,r[o]=a}e.needsUpdate=!0,i.needsUpdate=!0,r.needsUpdate=!0}},dy.prototype.setVisibility=function(t){this.visible=t,this.parameters.wireframe?(this.group.visible=!1,this.wireframeGroup.visible=t,this.pickable&&(this.pickingGroup.visible=!1)):(this.group.visible=t,this.wireframeGroup.visible=!1,this.pickable&&(this.pickingGroup.visible=t))},dy.prototype.dispose=function(){this.material&&this.material.dispose(),this.wireframeMaterial&&this.wireframeMaterial.dispose(),this.pickingMaterial&&this.pickingMaterial.dispose(),this.geometry.dispose(),this.wireframeGeometry&&this.wireframeGeometry.dispose()},dy.prototype.toJSON=function(){var t={};for(var e in this)"group"!==e&&"wireframeGroup"!==e&&"pickingGroup"!=e&&"picking"!==e&&(t[e]=this[e]);return t},Object.defineProperties(dy.prototype,fy);var my=function(i){function t(t,e){void 0===e&&(e={}),i.call(this,t,e),this.vertexShader="Mesh.vert",this.fragmentShader="Mesh.frag",this.addAttributes({normal:{type:"v3",value:t.normal}}),void 0===t.normal&&this.geometry.computeVertexNormals()}return i&&(t.__proto__=i),(t.prototype=Object.create(i&&i.prototype)).constructor=t}(dy),gy=function(t){function e(){t.apply(this,arguments),this.isSurface=!0}return t&&(e.__proto__=t),(e.prototype=Object.create(t&&t.prototype)).constructor=e}(my);function vy(t){t.visible=!0}function yy(t){t.visible=!1}var by=function(t){this.group=new ya,this.wireframeGroup=new ya,this.pickingGroup=new ya,this.frontMeshes=[],this.backMeshes=[],this.size=t.size,this.side=t.parameters.side,this.visible=t.visible,this.geometry=t.geometry,this.picking=t.picking,this.group=new ya,this.wireframeGroup=new ya,this.pickingGroup=new ya,this.matrix=t.matrix;var e=t,i=new t.constructor({position:new Float32Array(0)});e.makeMaterial(),i.makeMaterial(),i.picking=t.picking,i.geometry=t.geometry,i.wireframeGeometry=t.wireframeGeometry,i.setParameters(t.getParameters()),i.updateShader(),e.setParameters({side:"front"}),i.setParameters({side:"back",opacity:i.parameters.opacity}),this.buffer=t,this.frontBuffer=e,this.backBuffer=i},xy={matrix:{configurable:!0},pickable:{configurable:!0},parameters:{configurable:!0}};xy.matrix.set=function(t){dy.prototype.setMatrix.call(this,t)},xy.matrix.get=function(){return this.group.matrix.clone()},xy.pickable.get=function(){return!!this.picking&&!this.parameters.disablePicking},xy.parameters.get=function(){return this.buffer.parameters},by.prototype.getParameters=function(){var t=Object.assign({},this.buffer.parameters);return t.side=this.side,t},by.prototype.getMesh=function(t){var e,i;return t?(i=this.backBuffer.getPickingMesh(),e=this.frontBuffer.getPickingMesh()):(i=this.backBuffer.getMesh(),e=this.frontBuffer.getMesh()),this.frontMeshes.push(e),this.backMeshes.push(i),this.setParameters({side:this.side}),(new ya).add(i,e)},by.prototype.getWireframeMesh=function(){return this.buffer.getWireframeMesh()},by.prototype.getPickingMesh=function(){return this.getMesh(!0)},by.prototype.setAttributes=function(t){this.buffer.setAttributes(t)},by.prototype.setParameters=function(t){"front"===(t=Object.assign({},t)).side?(this.frontMeshes.forEach(vy),this.backMeshes.forEach(yy)):"back"===t.side?(this.frontMeshes.forEach(yy),this.backMeshes.forEach(vy)):"double"===t.side&&(this.frontMeshes.forEach(vy),this.backMeshes.forEach(vy)),void 0!==t.side&&(this.side=t.side),delete t.side,void 0!==t.matrix&&(this.matrix=t.matrix),delete t.matrix,this.frontBuffer.setParameters(t),void 0!==t.wireframe&&(this.wireframe=t.wireframe,this.setVisibility(this.visible)),delete t.wireframe,this.backBuffer.setParameters(t)},by.prototype.setVisibility=function(t){this.visible=t,this.parameters.wireframe?(this.group.visible=!1,this.wireframeGroup.visible=t,this.pickable&&(this.pickingGroup.visible=!1)):(this.group.visible=t,this.wireframeGroup.visible=!1,this.pickable&&(this.pickingGroup.visible=t))},by.prototype.dispose=function(){this.frontBuffer.dispose(),this.backBuffer.dispose()},Object.defineProperties(by.prototype,xy),rd.add("shader/Line.vert","uniform float clipNear;\nuniform vec3 clipCenter;\nvarying vec3 vViewPosition;\n#if defined( RADIUS_CLIP )\nvarying vec3 vClipCenter;\n#endif\n#include color_pars_vertex\nvoid main(){\n#include color_vertex\n#include begin_vertex\n#include project_vertex\nvViewPosition = -mvPosition.xyz;\n#if defined( RADIUS_CLIP )\nvClipCenter = -( modelViewMatrix * vec4( clipCenter, 1.0 ) ).xyz;\n#endif\n#include nearclip_vertex\n}"),rd.add("shader/Line.frag","uniform float opacity;\nuniform float clipNear;\nuniform float clipRadius;\nvarying vec3 vViewPosition;\n#if defined( RADIUS_CLIP )\nvarying vec3 vClipCenter;\n#endif\n#include common\n#include color_pars_fragment\n#include fog_pars_fragment\nvoid main(){\n#include nearclip_fragment\n#include radiusclip_fragment\ngl_FragColor = vec4( vColor, opacity );\n#include premultiplied_alpha_fragment\n#include tonemapping_fragment\n#include encodings_fragment\n#include fog_fragment\n}");var _y=function(t){function e(){t.apply(this,arguments),this.isLine=!0,this.vertexShader="Line.vert",this.fragmentShader="Line.frag"}return t&&(e.__proto__=t),(e.prototype=Object.create(t&&t.prototype)).constructor=e}(dy),wy=function(r){function t(t,e,i){r.call(this,t,e,i),this.type="surface",this.parameters=Object.assign({isolevelType:{type:"select",options:{value:"value",sigma:"sigma"}},isolevel:{type:"number",precision:2,max:1e3,min:-1e3},negateIsolevel:{type:"boolean"},isolevelScroll:{type:"boolean"},smooth:{type:"integer",precision:1,max:10,min:0},background:{type:"boolean",rebuild:!0},opaqueBack:{type:"boolean",buffer:!0},boxSize:{type:"integer",precision:1,max:100,min:0},colorVolume:{type:"hidden"},contour:{type:"boolean",rebuild:!0},useWorker:{type:"boolean",rebuild:!0},wrap:{type:"boolean",rebuild:!0}},this.parameters),t instanceof ay?(this.surface=void 0,this.volume=t):(this.surface=t,this.volume=void 0),this.boxCenter=new ri,this.__boxCenter=new ri,this.box=new Pi,this.__box=new Pi,this._position=new ri,this.setBox=function(){this._position.copy(e.translationGroup.position).negate(),this._position.equals(this.boxCenter)||this.setParameters({boxCenter:this._position})},this.toBePrepared=!0,this.viewer.signals.ticked.add(this.setBox,this),this.init(i)}return r&&(t.__proto__=r),((t.prototype=Object.create(r&&r.prototype)).constructor=t).prototype.init=function(t){var e=t||{};e.colorScheme=bl(e.colorScheme,"uniform"),e.colorValue=bl(e.colorValue,14540253),this.isolevelType=bl(e.isolevelType,"sigma"),this.isolevel=bl(e.isolevel,2),this.negateIsolevel=bl(e.negateIsolevel,!1),this.isolevelScroll=bl(e.isolevelScroll,!1),this.smooth=bl(e.smooth,0),this.background=bl(e.background,!1),this.opaqueBack=bl(e.opaqueBack,!0),this.boxSize=bl(e.boxSize,0),this.colorVolume=bl(e.colorVolume,void 0),this.contour=bl(e.contour,!1),this.useWorker=bl(e.useWorker,!0),this.wrap=bl(e.wrap,!1),r.prototype.init.call(this,e),this.build()},t.prototype.attach=function(t){var e=this;this.bufferList.forEach(function(t){e.viewer.add(t)}),this.setVisibility(this.visible),t()},t.prototype.prepare=function(e){var t,i=this;if(this.volume)if(t="sigma"===this.isolevelType?this.volume.getValueForSigma(this.isolevel):this.isolevel,this.negateIsolevel&&(t*=-1),!this.surface||this.__isolevel!==t||this.__smooth!==this.smooth||this.__contour!==this.contour||this.__wrap!==this.wrap||this.__boxSize!==this.boxSize||0<this.boxSize&&!this.__boxCenter.equals(this.boxCenter)){this.__isolevel=t,this.__smooth=this.smooth,this.__contour=this.contour,this.__wrap=this.wrap,this.__boxSize=this.boxSize,this.__boxCenter.copy(this.boxCenter),this.__box.copy(this.box);var r=function(t){i.surface=t,e()};this.useWorker?this.volume.getSurfaceWorker(t,this.smooth,this.boxCenter,this.boxSize,this.contour,this.wrap,r):r(this.volume.getSurface(t,this.smooth,this.boxCenter,this.boxSize,this.contour,this.wrap))}else e();else e()},t.prototype.create=function(){var t,e={position:this.surface.getPosition(),color:this.surface.getColor(this.getColorParams()),index:this.surface.getIndex()};if(this.contour)t=new _y(e,this.getBufferParams({wireframe:!1}));else{Object.assign(e,{normal:this.surface.getNormal(),picking:this.surface.getPicking()});var i=new gy(e,this.getBufferParams({background:this.background,opaqueBack:this.opaqueBack,dullInterior:!1}));t=new by(i)}this.bufferList.push(t)},t.prototype.update=function(t){if(0!==this.bufferList.length){var e={};(t=t||{}).position&&(e.position=this.surface.getPosition()),t.color&&(e.color=this.surface.getColor(this.getColorParams())),t.index&&(e.index=this.surface.getIndex()),t.normal&&(e.normal=this.surface.getNormal()),this.bufferList.forEach(function(t){t.setAttributes(e)})}},t.prototype.setParameters=function(t,e,i){return t&&void 0!==t.isolevelType&&this.volume&&("value"===this.isolevelType&&"sigma"===t.isolevelType?this.isolevel=this.volume.getSigmaForValue(this.isolevel):"sigma"===this.isolevelType&&"value"===t.isolevelType&&(this.isolevel=this.volume.getValueForSigma(this.isolevel)),this.isolevelType=t.isolevelType),t&&t.boxCenter&&(this.boxCenter.copy(t.boxCenter),delete t.boxCenter),t&&t.wireframe&&(t.contour||void 0===t.contour&&this.contour)&&(t.wireframe=!1),r.prototype.setParameters.call(this,t,e,i),this.volume&&this.volume.getBox(this.boxCenter,this.boxSize,this.box),t&&void 0!==t.colorVolume&&e&&(e.color=!0),this.surface&&(void 0!==t.isolevel||void 0!==t.negateIsolevel||void 0!==t.smooth||void 0!==t.wrap||void 0!==t.boxSize||0<this.boxSize&&!this.__box.equals(this.box))&&this.build({position:!0,color:!0,index:!0,normal:!this.contour}),this},t.prototype.getColorParams=function(){var t=r.prototype.getColorParams.call(this);return t.volume=this.colorVolume,t},t.prototype.dispose=function(){this.viewer.signals.ticked.remove(this.setBox,this),r.prototype.dispose.call(this)},t}(sm),Sy=function(){};Sy.zoomScroll=function(t,e){t.trackballControls.zoom(e)},Sy.clipNearScroll=function(t,e){var i=t.getParameters();t.setParameters({clipNear:i.clipNear+e/10})},Sy.focusScroll=function(t,e){var i=2*t.getParameters().clipNear,r=Math.sign(e)*function(t,e,i){if(e<t)return t;var r=t/e;return((2*i-e)*r+(2*e-3*i))*r*r+i}((100-i)/10,5,.2);t.setFocus(i+r)},Sy.zoomFocusScroll=function(t,e){t.trackballControls.zoom(e);var i=t.viewer.camera.position.z;t.setFocus(100-Math.abs(i/8))},Sy.isolevelScroll=function(t,e){var r=Math.sign(e)/10;t.eachRepresentation(function(t,e){if(t.repr instanceof wy){var i=t.getParameters();i.isolevelScroll&&t.setParameters({isolevel:i.isolevel+r})}})},Sy.panDrag=function(t,e,i){t.trackballControls.pan(e,i)},Sy.rotateDrag=function(t,e,i){t.trackballControls.rotate(e,i)},Sy.zRotateDrag=function(t,e,i){t.trackballControls.zRotate(e,i)},Sy.zoomDrag=function(t,e,i){t.trackballControls.zoom((e+i)/-2)},Sy.zoomFocusDrag=function(t,e,i){t.trackballControls.zoom((e+i)/-2);var r=t.viewer.camera.position.z;t.setFocus(100-Math.abs(r/8))},Sy.panComponentDrag=function(t,e,i){t.trackballControls.panComponent(e,i)},Sy.panAtomDrag=function(t,e,i){t.trackballControls.panAtom(e,i)},Sy.rotateComponentDrag=function(t,e,i){t.trackballControls.rotateComponent(e,i)},Sy.movePick=function(t,e){e&&t.animationControls.move(e.position.clone())},Sy.tooltipPick=function(t,e){var i=t.tooltip;if(t.getParameters().tooltip&&e){var r=e.mouse.position;i.innerText=e.getLabel(),i.style.bottom=window.innerHeight-r.y+3+"px",i.style.left=r.x+3+"px",i.style.display="block"}else i.style.display="none"};var Ay={default:[["scroll",Sy.zoomScroll],["scroll-shift",Sy.focusScroll],["scroll-ctrl",Sy.isolevelScroll],["scroll-shift-ctrl",Sy.zoomFocusScroll],["drag-left",Sy.rotateDrag],["drag-right",Sy.panDrag],["drag-ctrl-left",Sy.panDrag],["drag-ctrl-right",Sy.zRotateDrag],["drag-shift-left",Sy.zoomDrag],["drag-middle",Sy.zoomFocusDrag],["drag-ctrl-shift-right",Sy.panComponentDrag],["drag-ctrl-shift-left",Sy.rotateComponentDrag],["clickPick-right",Sy.measurePick=function(t,e){if(e&&(e.atom||e.bond)){var i=e.atom||e.closestBondAtom;e.component.measurePick(i)}else t.measureClear()}],["clickPick-ctrl-left",Sy.measurePick],["clickPick-middle",Sy.movePick],["clickPick-left",Sy.movePick],["hoverPick",Sy.tooltipPick]],pymol:[["drag-left",Sy.rotateDrag],["drag-middle",Sy.panDrag],["drag-right",Sy.zoomDrag],["drag-shift-right",Sy.focusScroll],["clickPick-ctrl+shift-middle",Sy.movePick],["hoverPick",Sy.tooltipPick]],coot:[["scroll",Sy.isolevelScroll],["drag-left",Sy.rotateDrag],["drag-middle",Sy.panDrag],["drag-ctrl-left",Sy.panDrag],["drag-right",Sy.zoomFocusDrag],["drag-ctrl-right",Sy.focusScroll],["clickPick-middle",Sy.movePick],["hoverPick",Sy.tooltipPick]],astexviewer:[["drag-left",Sy.rotateDrag],["drag-ctrl-left",Sy.panDrag],["drag-shift-left",Sy.zoomDrag],["scroll",Sy.focusScroll],["clickPick-middle",Sy.movePick],["hoverPick",Sy.tooltipPick]]};function My(t){var e=t.split(/[-+]/),i="";e.includes("scroll")&&(i="scroll"),e.includes("drag")&&(i="drag"),e.includes("click")&&(i="click"),e.includes("doubleClick")&&(i="doubleClick"),e.includes("hover")&&(i="hover"),e.includes("clickPick")&&(i="clickPick"),e.includes("hoverPick")&&(i="hoverPick");var r=0;e.includes("alt")&&(r+=1),e.includes("ctrl")&&(r+=2),e.includes("meta")&&(r+=4),e.includes("shift")&&(r+=8);var n=0;return e.includes("left")&&(n+=1),e.includes("right")&&(n+=2),e.includes("middle")&&(n+=4),[i,r,n]}var Ey=function(t,e){void 0===e&&(e={}),this.stage=t,this.actionList=[],this.mouse=t.mouseObserver,this.disabled=e.disabled||!1,this.preset(e.preset||"default")};Ey.prototype.run=function(e){for(var i=this,r=[],t=arguments.length-1;0<t--;)r[t]=arguments[t+1];if(!this.disabled){var n=this.mouse.key||0,o=this.mouse.buttons||0;this.actionList.forEach(function(t){t.type===e&&t.key===n&&t.button===o&&t.callback.apply(t,[i.stage].concat(r))})}},Ey.prototype.add=function(t,e){var i=My(t),r=i[0],n=i[1],o=i[2];this.actionList.push({type:r,key:n,button:o,callback:e})},Ey.prototype.remove=function(t,e){var i=t.includes("*"),r=My(t),n=r[0],o=r[1],a=r[2],s=this.actionList.filter(function(t){return!((t.type===n||i&&""===n)&&(t.key===o||i&&0===o)&&(t.button===a||i&&0===a)&&(t.callback===e||void 0===e))});this.actionList=s},Ey.prototype.preset=function(t){var e=this;this.clear(),(Ay[t]||[]).forEach(function(t){return e.add(t[0],t[1])})},Ey.prototype.clear=function(){this.actionList.length=0};var Py=function(){};Py.autoView=function(t){t.autoView(1e3)},Py.toggleAnimations=function(t){t.animationControls.toggle()},Py.toggleRock=function(t){t.toggleRock()};var Ty={default:[["i",Py.toggleSpin=function(t){t.toggleSpin()}],["k",Py.toggleRock],["p",Py.toggleAnimations],["a",Py.toggleAntialiasing=function(t){var e=t.getParameters();t.setParameters({sampleLevel:-1===e.sampleLevel?0:-1})}],["r",Py.autoView]]},Cy=function(t,e){void 0===e&&(e={}),this.stage=t,this.actionList=[],this.disabled=e.disabled||!1,this.preset(e.preset||"default")};Cy.prototype.run=function(e){var i=this;this.disabled||this.actionList.forEach(function(t){t.key===e&&t.callback(i.stage)})},Cy.prototype.add=function(t,e){this.actionList.push({key:t,callback:e})},Cy.prototype.remove=function(e,i){var t=this.actionList.filter(function(t){return!(t.key===e&&(t.callback===i||void 0===i))});this.actionList=t},Cy.prototype.preset=function(t){var e=this;this.clear(),(Ty[t]||[]).forEach(function(t){return e.add(t[0],t[1])})},Cy.prototype.clear=function(){this.actionList.length=0};var Iy=function(t){this.stage=t,this.stage=t,this.mouse=t.mouseObserver,this.controls=t.mouseControls,this.mouse.signals.clicked.add(this._onClick,this),this.mouse.signals.hovered.add(this._onHover,this)};Iy.prototype._onClick=function(t,e){var i=this.stage.pickingControls.pick(t,e);this.stage.signals.clicked.dispatch(i),this.controls.run("clickPick",i)},Iy.prototype._onHover=function(t,e){var i=this.stage.pickingControls.pick(t,e);i&&this.mouse.down.equals(this.mouse.position)&&(this.stage.transformComponent=i.component,this.stage.transformAtom=i.atom),this.stage.signals.hovered.dispatch(i),this.controls.run("hoverPick",i)},Iy.prototype.dispose=function(){this.mouse.signals.clicked.remove(this._onClick,this),this.mouse.signals.hovered.remove(this._onHover,this)};var Oy=function(t){this.stage=t,this.stage=t,this.mouse=t.mouseObserver,this.controls=t.mouseControls,this.mouse.signals.moved.add(this._onMove,this),this.mouse.signals.scrolled.add(this._onScroll,this),this.mouse.signals.dragged.add(this._onDrag,this),this.mouse.signals.clicked.add(this._onClick,this),this.mouse.signals.hovered.add(this._onHover,this),this.mouse.signals.doubleClicked.add(this._onDblclick,this)};Oy.prototype._onMove=function(){this.stage.tooltip.style.display="none"},Oy.prototype._onScroll=function(t){this.controls.run("scroll",t)},Oy.prototype._onDrag=function(t,e){this.controls.run("drag",t,e)},Oy.prototype._onClick=function(t,e){this.controls.run("click",t,e)},Oy.prototype._onDblclick=function(t,e){this.controls.run("doubleClick",t,e)},Oy.prototype._onHover=function(t,e){this.controls.run("hover",t,e)},Oy.prototype.dispose=function(){this.mouse.signals.moved.remove(this._onMove,this),this.mouse.signals.scrolled.remove(this._onScroll,this),this.mouse.signals.dragged.remove(this._onDrag,this),this.mouse.signals.clicked.remove(this._onClick,this),this.mouse.signals.hovered.remove(this._onHover,this)};var Ly=function(t){this.stage=t,this.viewer=t.viewer,this.animationControls=t.animationControls,this.viewer.signals.ticked.add(this._onTick,this)};Ly.prototype._onTick=function(t){this.animationControls.run(t)},Ly.prototype.dispose=function(){this.viewer.signals.ticked.remove(this._onTick,this)};var Ry=!!Vp&&{passive:!0},Dy=function(t){this.stage=t,this.stage=t,this.controls=t.keyControls,this.domElement=t.viewer.renderer.domElement,this.domElement.setAttribute("tabIndex","-1"),this.domElement.style.outline="none",this._focusDomElement=this._focusDomElement.bind(this),this._onKeydown=this._onKeydown.bind(this),this._onKeyup=this._onKeyup.bind(this),this._onKeypress=this._onKeypress.bind(this),this.domElement.addEventListener("mousedown",this._focusDomElement),this.domElement.addEventListener("touchstart",this._focusDomElement,Ry),this.domElement.addEventListener("keydown",this._onKeydown),this.domElement.addEventListener("keyup",this._onKeyup),this.domElement.addEventListener("keypress",this._onKeypress)};Dy.prototype._onKeydown=function(){},Dy.prototype._onKeyup=function(){},Dy.prototype._onKeypress=function(t){var e;e="key"in KeyboardEvent.prototype?t.key:String.fromCharCode(t.which||t.keyCode),this.controls.run(e)},Dy.prototype._focusDomElement=function(){this.domElement.focus()},Dy.prototype.dispose=function(){this.domElement.removeEventListener("mousedown",this._focusDomElement),this.domElement.removeEventListener("touchstart",this._focusDomElement,Ry),this.domElement.removeEventListener("keydown",this._onKeypress),this.domElement.removeEventListener("keyup",this._onKeypress),this.domElement.removeEventListener("keypress",this._onKeypress)};var ky=function(t,e,i,r){void 0===r&&(r={}),this.component=t,this.position=e,this.offsetX=bl(r.offsetX,0),this.offsetY=bl(r.offsetY,0),this.visible=bl(r.visible,!0),this.stage=t.stage,this.viewer=t.stage.viewer,this._viewerPosition=new ri,this._updateViewerPosition(),this._canvasPosition=new ti,this._cameraPosition=new ri,this.element=document.createElement("div"),Object.assign(this.element.style,{display:"block",position:"absolute",pointerEvents:"none",whiteSpace:"nowrap",left:"-10000px"}),this.viewer.wrapper.appendChild(this.element),this.setContent(i),this.updateVisibility(),this.viewer.signals.rendered.add(this._update,this),this.component.signals.matrixChanged.add(this._updateViewerPosition,this)};ky.prototype.setContent=function(t){var e=this.element.style.display;if("none"===e&&(this.element.style.left="-10000px",this.element.style.display="block"),t instanceof HTMLElement)this.element.appendChild(t);else{var i=document.createElement("div");i.innerText=t,Object.assign(i.style,{backgroundColor:"rgba( 0, 0, 0, 0.6 )",color:"lightgrey",padding:"8px",fontFamily:"sans-serif"}),this.element.appendChild(i)}this._clientRect=this.element.getBoundingClientRect(),"none"===e&&(this.element.style.display=e)},ky.prototype.setVisibility=function(t){this.visible=t,this.updateVisibility()},ky.prototype.getVisibility=function(){return this.visible&&this.component.parameters.visible},ky.prototype.updateVisibility=function(){this.element.style.display=this.getVisibility()?"block":"none"},ky.prototype._updateViewerPosition=function(){this._viewerPosition.copy(this.position).applyMatrix4(this.component.matrix)},ky.prototype._update=function(){if(this.getVisibility()){var t=this.element.style,e=this._canvasPosition,i=this._viewerPosition,r=this._clientRect;if(this._cameraPosition.copy(i).add(this.viewer.translationGroup.position).applyMatrix4(this.viewer.rotationGroup.matrix).sub(this.viewer.camera.position),this._cameraPosition.z<0)t.display="none";else{t.display="block";var n=this._cameraPosition.length(),o=this.viewer.scene.fog;t.opacity=(1-Zl(o.near,o.far,n)).toString(),t.zIndex=Math.round(100*(o.far-n)).toString(),this.stage.viewerControls.getPositionOnCanvas(i,e),t.bottom=this.offsetX+e.y+r.height/2+"px",t.left=this.offsetY+e.x-r.width/2+"px"}}},ky.prototype.dispose=function(){this.viewer.wrapper.removeChild(this.element),this.viewer.signals.ticked.remove(this._update,this),this.component.signals.matrixChanged.remove(this._updateViewerPosition,this)};var By=new ei,Ny=new ri,Fy=new ii,zy=function(t){this.component=t,this.signals={changed:new op},this.stage=t.stage,this.viewer=t.stage.viewer},Uy={position:{configurable:!0},rotation:{configurable:!0}};Uy.position.get=function(){return this.component.position},Uy.rotation.get=function(){return this.component.quaternion},zy.prototype.changed=function(){this.component.updateMatrix(),this.viewer.requestRender(),this.signals.changed.dispatch()},zy.prototype.spin=function(t,e){By.getInverse(this.viewer.rotationGroup.matrix),Ny.copy(kl(t)).applyMatrix4(By),By.extractRotation(this.component.transform),By.premultiply(this.viewer.rotationGroup.matrix),By.getInverse(By),Ny.copy(kl(t)),Ny.applyMatrix4(By),By.makeRotationAxis(Ny,e),Fy.setFromRotationMatrix(By),this.component.quaternion.premultiply(Fy),this.changed()},Object.defineProperties(zy.prototype,Uy);var jy={"":"",vdw:"by vdW radius",covalent:"by covalent radius",sstruc:"by secondary structure",bfactor:"by bfactor",size:"size",data:"data",explicit:"explicit"},Gy=function(t){void 0===t&&(t={}),this.max=10,this.type=bl(t.type,"size"),this.scale=bl(t.scale,1),this.size=bl(t.size,1),this.data=bl(t.data,{})};Gy.prototype.atomRadius=function(t){var e;switch(this.type){case"vdw":e=t.vdw;break;case"covalent":e=t.covalent;break;case"bfactor":e=t.bfactor||1;break;case"sstruc":var i=t.sstruc;e="h"===i?.25:"g"===i?.25:"i"===i?.25:"e"===i?.25:"b"===i?.25:Og.includes(t.atomname)?.4:.1;break;case"data":e=bl(this.data[t.index],1);break;case"explicit":null===(e=t.radius)&&(e=this.size);break;default:e=this.size}return Math.min(e*this.scale,this.max)},Gy.types=jy;var Vy=new ri(-1,-1,-1),Hy=new ei,$y=function(t){var e=t.rows,i=e/3,r=new kv(e,3),n=new kv(3,3),o=new kv(1,3),a=new kv(3,3),s=new kv(3,3),c=zv(t);Uv(t,c),Bv(r,t),Nv(n,r,r),Hv(n,o,a,s);var u=new ri(c[0],c[1],c[2]),h=new ri(a.data[0],a.data[3],a.data[6]),l=new ri(a.data[1],a.data[4],a.data[7]),p=new ri(a.data[2],a.data[5],a.data[8]),d=h.clone().multiplyScalar(Math.sqrt(o.data[0]/i)),f=l.clone().multiplyScalar(Math.sqrt(o.data[1]/i)),m=p.clone().multiplyScalar(Math.sqrt(o.data[2]/i));this.begA=u.clone().sub(d),this.endA=u.clone().add(d),this.begB=u.clone().sub(f),this.endB=u.clone().add(f),this.begC=u.clone().sub(m),this.endC=u.clone().add(m),this.center=u,this.vecA=d,this.vecB=f,this.vecC=m,this.normVecA=h,this.normVecB=l,this.normVecC=p};$y.prototype.getBasisMatrix=function(t){void 0===t&&(t=new ei);var e=t;return e.makeBasis(this.normVecB,this.normVecA,this.normVecC),e.determinant()<0&&e.scale(Vy),e},$y.prototype.getRotationQuaternion=function(t){void 0===t&&(t=new ii);var e=t;return e.setFromRotationMatrix(this.getBasisMatrix(Hy)),e.inverse()},$y.prototype.getProjectedScaleForAtoms=function(t){var s=-1/0,c=-1/0,u=-1/0,h=-1/0,l=-1/0,p=-1/0,d=new ri,f=new ri,m=this.center,g=this.normVecA,v=this.normVecB,y=this.normVecC;return t.eachAtom(function(t){lm(d.copy(t),g,m);var e=f.subVectors(d,m).normalize().dot(g),i=d.distanceTo(m);0<e?s<i&&(s=i):c<i&&(c=i),lm(d.copy(t),v,m);var r=f.subVectors(d,m).normalize().dot(v),n=d.distanceTo(m);0<r?u<n&&(u=n):h<n&&(h=n),lm(d.copy(t),y,m);var o=f.subVectors(d,m).normalize().dot(y),a=d.distanceTo(m);0<o?l<a&&(l=a):p<a&&(p=a)}),{d1a:s,d2a:u,d3a:l,d1b:-c,d2b:-h,d3b:-p}};var Wy=function(t,e,i,r){this.volume=t,this.setFilter(e,i,r)},Xy={header:{configurable:!0},matrix:{configurable:!0},normalMatrix:{configurable:!0},inverseMatrix:{configurable:!0},center:{configurable:!0},boundingBox:{configurable:!0},min:{configurable:!0},max:{configurable:!0},mean:{configurable:!0},rms:{configurable:!0}};Xy.header.get=function(){return this.volume.header},Xy.matrix.get=function(){return this.volume.matrix},Xy.normalMatrix.get=function(){return this.volume.normalMatrix},Xy.inverseMatrix.get=function(){return this.volume.inverseMatrix},Xy.center.get=function(){return this.volume.center},Xy.boundingBox.get=function(){return this.volume.boundingBox},Xy.min.get=function(){return this.volume.min},Xy.max.get=function(){return this.volume.max},Xy.mean.get=function(){return this.volume.mean},Xy.rms.get=function(){return this.volume.rms},Wy.prototype._getFilterHash=function(t,e,i){return JSON.stringify([t,e,i])},Wy.prototype.setFilter=function(t,e,i){isNaN(t)&&this.header&&(t=this.header.DMEAN+2*this.header.ARMS),t=void 0===t||isNaN(t)?-1/0:t,e=bl(e,1/0),i=bl(i,!1);var r=this.volume.data,n=this.volume.position,o=this.volume.atomindex,a=this._getFilterHash(t,e,i);if(a!==this._filterHash){if(t===-1/0&&e===1/0)this.data=r,this.position=n,this.atomindex=o;else{var s=r.length;this._dataBuffer||(this._dataBuffer=new ArrayBuffer(4*s),this._positionBuffer=new ArrayBuffer(3*s*4),o&&(this._atomindexBuffer=new ArrayBuffer(4*s)));var c,u=new Float32Array(this._dataBuffer),h=new Float32Array(this._positionBuffer);o&&(c=new Uint32Array(this._atomindexBuffer));for(var l=0,p=0;p<s;++p){var d=3*p,f=r[p];if(!i&&t<=f&&f<=e||i&&(f<t||e<f)){var m=3*l;u[l]=f,h[m+0]=n[d+0],h[m+1]=n[d+1],h[m+2]=n[d+2],o&&c&&(c[l]=o[p]),l+=1}}this.data=new Float32Array(this._dataBuffer,0,l),this.position=new Float32Array(this._positionBuffer,0,3*l),o&&(this.atomindex=new Int32Array(this._atomindexBuffer,0,l))}this._filterHash=a}},Object.defineProperties(Wy.prototype,Xy),Wy.prototype.getValueForSigma=ay.prototype.getValueForSigma,Wy.prototype.getSigmaForValue=ay.prototype.getSigmaForValue,Wy.prototype.getDataAtomindex=ay.prototype.getDataAtomindex,Wy.prototype.getDataPosition=ay.prototype.getDataPosition,Wy.prototype.getDataColor=ay.prototype.getDataColor,Wy.prototype.getDataPicking=ay.prototype.getDataPicking,Wy.prototype.getDataSize=ay.prototype.getDataSize;var qy=function(t,e){var i=eg({nodeArray1:t.atomIndex1,nodeArray2:t.atomIndex2,edgeCount:t.count,nodeCount:e});this.countArray=i.countArray,this.offsetArray=i.offsetArray,this.indexArray=i.indexArray},Yy=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),(e.prototype=Object.create(t&&t.prototype)).constructor=e;var i={_defaultFields:{configurable:!0}};return i._defaultFields.get=function(){return[["atomIndex1",1,"int32"],["atomIndex2",1,"int32"],["bondOrder",1,"int8"]]},e.prototype.addBond=function(t,e,i){this.growIfFull();var r=this.count,n=t.index,o=e.index;n<o?(this.atomIndex1[r]=n,this.atomIndex2[r]=o):(this.atomIndex2[r]=n,this.atomIndex1[r]=o),i&&(this.bondOrder[r]=i),this.count+=1},e.prototype.addBondIfConnected=function(t,e,i){return!!t.connectedTo(e)&&(this.addBond(t,e,i),!0)},Object.defineProperties(e.prototype,i),e}(Km),Zy=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),(e.prototype=Object.create(t&&t.prototype)).constructor=e;var i={_defaultFields:{configurable:!0}};return i._defaultFields.get=function(){return[["residueIndex",1,"uint32"],["atomTypeId",1,"uint16"],["x",1,"float32"],["y",1,"float32"],["z",1,"float32"],["serial",1,"int32"],["bfactor",1,"float32"],["altloc",1,"uint8"],["occupancy",1,"float32"]]},e.prototype.setAltloc=function(t,e){this.altloc[t]=e.charCodeAt(0)},e.prototype.getAltloc=function(t){var e=this.altloc[t];return e?String.fromCharCode(e):""},Object.defineProperties(e.prototype,i),e}(Km),Ky=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),(e.prototype=Object.create(t&&t.prototype)).constructor=e;var i={_defaultFields:{configurable:!0}};return i._defaultFields.get=function(){return[["chainIndex",1,"uint32"],["atomOffset",1,"uint32"],["atomCount",1,"uint16"],["residueTypeId",1,"uint16"],["resno",1,"int32"],["sstruc",1,"uint8"],["inscode",1,"uint8"]]},e.prototype.setSstruc=function(t,e){this.sstruc[t]=e.charCodeAt(0)},e.prototype.getSstruc=function(t){var e=this.sstruc[t];return e?String.fromCharCode(e):""},e.prototype.setInscode=function(t,e){this.inscode[t]=e.charCodeAt(0)},e.prototype.getInscode=function(t){var e=this.inscode[t];return e?String.fromCharCode(e):""},Object.defineProperties(e.prototype,i),e}(Km),Jy=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),(e.prototype=Object.create(t&&t.prototype)).constructor=e;var i={_defaultFields:{configurable:!0}};return i._defaultFields.get=function(){return[["entityIndex",1,"uint16"],["modelIndex",1,"uint16"],["residueOffset",1,"uint32"],["residueCount",1,"uint32"],["chainname",4,"uint8"],["chainid",4,"uint8"]]},e.prototype.setChainname=function(t,e){var i=4*t;this.chainname[i]=e.charCodeAt(0),this.chainname[i+1]=e.charCodeAt(1),this.chainname[i+2]=e.charCodeAt(2),this.chainname[i+3]=e.charCodeAt(3)},e.prototype.getChainname=function(t){for(var e="",i=0;i<4;++i){var r=this.chainname[4*t+i];if(!r)break;e+=String.fromCharCode(r)}return e},e.prototype.setChainid=function(t,e){var i=4*t;this.chainid[i]=e.charCodeAt(0),this.chainid[i+1]=e.charCodeAt(1),this.chainid[i+2]=e.charCodeAt(2),this.chainid[i+3]=e.charCodeAt(3)},e.prototype.getChainid=function(t){for(var e="",i=0;i<4;++i){var r=this.chainid[4*t+i];if(!r)break;e+=String.fromCharCode(r)}return e},Object.defineProperties(e.prototype,i),e}(Km),Qy=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),(e.prototype=Object.create(t&&t.prototype)).constructor=e;var i={_defaultFields:{configurable:!0}};return i._defaultFields.get=function(){return[["chainOffset",1,"uint32"],["chainCount",1,"uint32"]]},Object.defineProperties(e.prototype,i),e}(Km),tb=function(t){this.polymer=t,this.size=t.residueCount};tb.prototype.getCenterIterator=function(s){void 0===s&&(s=0);var c=this.getPosition().center,u=c.length/3,h=0,e=-1,l=[new ri,new ri,new ri,new ri];return{size:u,next:function(){var t=this.get(e);return e+=1,t},get:function(t){t=Math.min(u-1,Math.max(0,t));var e=l[h%4],i=3*t;if(e.fromArray(c,i),s){for(var r=Math.min(s,t,u-t-1),n=1;n<=r;++n){var o=3*n,a=(r+1-n)/(r+1);e.x+=a*c[i-o+0]+a*c[i+o+0],e.y+=a*c[i-o+1]+a*c[i+o+1],e.z+=a*c[i-o+2]+a*c[i+o+2]}e.x/=r+1,e.y/=r+1,e.z/=r+1}return h+=1,e},reset:function(){h=0,e=-1}}},tb.prototype.getColor=function(t){var e=this.polymer,i=e.structure,r=e.residueCount,n=e.residueIndexStart,o=new Float32Array(3*r),a=t||{};a.structure=i;for(var s=Qp.getScheme(a),c=i.getResidueProxy(),u=i.getAtomProxy(),h=0;h<r;++h)c.index=n+h,u.index=c.traceAtomIndex,s.atomColorToArray(u,o,3*h);return{color:o}},tb.prototype.getPicking=function(){for(var t=this.polymer,e=t.structure,i=t.residueCount,r=t.residueIndexStart,n=new Float32Array(i),o=e.getResidueProxy(),a=0;a<i;++a)o.index=r+a,n[a]=o.traceAtomIndex;return{picking:new hv(n,e)}},tb.prototype.getSize=function(t){for(var e=this.polymer,i=e.structure,r=e.residueCount,n=e.residueIndexStart,o=new Float32Array(r),a=new Gy(t),s=i.getResidueProxy(),c=i.getAtomProxy(),u=0;u<r;++u)s.index=n+u,c.index=s.traceAtomIndex,o[u]=a.atomRadius(c);return{size:o}},tb.prototype.getPosition=function(){for(var t=this.polymer,e=t.structure,i=t.residueCount,r=i-3,n=new Float32Array(3*i),o=new Float32Array(3*i),a=new Float32Array(i),s=new Float32Array(i),c=new Float32Array(i),u=new Float32Array(i),h=new Float32Array(3*i),l=new ri,p=new ri,d=new ri,f=new ri,m=new ri,g=new ri,v=new ri,y=new ri,b=new ri,x=new ri,_=new ri,w=new ri(0,0,0),S="trace",A=e.getAtomProxy(),M=e.getAtomProxy(t.getAtomIndexByType(0,S)),E=e.getAtomProxy(t.getAtomIndexByType(1,S)),P=e.getAtomProxy(t.getAtomIndexByType(2,S)),T=0;T<r;++T){A.index=M.index,M.index=E.index,E.index=P.index,P.index=t.getAtomIndexByType(T+3,S);var C=3*T;l.subVectors(M,A),p.subVectors(E,M),d.subVectors(P,E),f.subVectors(l,p),m.subVectors(p,d),b.crossVectors(f,m).normalize(),b.toArray(o,C),0<T&&(a[T]=b.angleTo(x));var I=Math.cos(f.angleTo(m));u[T]=180/Math.PI*Math.acos(I);var O=f.length(),L=m.length();s[T]=Math.sqrt(L*O)/Math.max(2,2*(1-I)),c[T]=Math.abs(p.dot(b)),g.copy(f).multiplyScalar(s[T]/O),v.copy(m).multiplyScalar(s[T]/L),g.subVectors(M,g),v.subVectors(E,v),g.toArray(n,C+3),v.toArray(n,C+6),_.subVectors(A,w),_.toArray(h,C),x.copy(b),w.copy(g)}g.fromArray(n,3),v.fromArray(n,6),b.subVectors(g,v).normalize(),A.index=t.getAtomIndexByType(0,S),w.copy(A),y.copy(A),lm(y,b,g),y.toArray(n,0),_.subVectors(w,g),_.toArray(h,0),g.fromArray(n,3*i-6),v.fromArray(n,3*i-9),b.subVectors(g,v).normalize(),A.index=t.getAtomIndexByType(i-1,S),w.copy(A),y.copy(A),lm(y,b,g),y.toArray(n,3*i-3);for(var R=i-3;R<i;++R)g.fromArray(n,3*R),A.index=t.getAtomIndexByType(R,S),w.copy(A),_.subVectors(w,g),_.toArray(h,3*R);var D=new Float32Array(i),k=new Float32Array(i),B=new Float32Array(i),N=new Float32Array(i);D[1]=s[0],k[1]=u[0],B[1]=s[0];for(var F=2;F<i-2;++F)D[F]=.5*(s[F-2]+s[F-1]),k[F]=.5*(u[F-2]+u[F-1]),B[F]=.5*(c[F-2]+c[F-1]),g.fromArray(o,3*(F-2)),v.fromArray(o,3*(F-1)),N[F]=180/Math.PI*Math.acos(Math.cos(g.angleTo(v)));D[i-2]=s[i-4],k[i-2]=u[i-4],B[i-2]=c[i-4];var z=new Float32Array(3*i);Xd(o,z,0,0,3),Xd(o,z,0,3,3);for(var U=2;U<i-2;++U)g.fromArray(o,3*(U-2)),v.fromArray(o,3*(U-1)),b.addVectors(v,g).multiplyScalar(.5).normalize(),b.toArray(z,3*U);return Xd(o,z,3*i-12,3*i-6,3),Xd(o,z,3*i-12,3*i-3,3),{center:n,axis:z,bending:N,radius:D,rise:B,twist:k,resdir:h}};var eb=function(t){this.polymer=t,this.helixorient=new tb(t),this.position=this.helixorient.getPosition()};eb.prototype.getAxis=function(t,e,i,r,n){t=t||30,e=e||2.5,i=void 0!==i&&i;var o=this.polymer,a=o.structure,s=o.residueCount,c=o.residueIndexStart,u=this.position,h=r||{};h.structure=a;for(var l,p,d=Qp.getScheme(h),f=new Gy(n),m=0,g=0,v=[],y=[],b=[],x=[],_=[],w=[],S=[],A=[],M=[],E=new Float32Array(3*s),P=new Float32Array(3*s),T=new ri,C=new ri,I=a.getResidueProxy(),O=a.getResidueProxy(),L=a.getAtomProxy(),R=new ri,D=new ri,k=!1,B=0;B<s;++B)if(I.index=c+B,R.fromArray(u.center,3*B),B===s-1?k=!0:(O.index=c+B+1,D.fromArray(u.center,3*B+3),i&&I.sstruc!==O.sstruc?k=!0:R.distanceTo(D)>e?k=!0:u.bending[B]>t&&(k=!0)),k){if(B-m<4){m=B,k=!1;continue}L.index=I.traceAtomIndex,E=u.axis.subarray(3*m+3,3*B),P=u.center.subarray(3*m,3*B+3),l=hm(E).normalize(),p=hm(P),T.fromArray(P),lm(T,l,p),C.fromArray(P,P.length-3),lm(C,l,p),l.subVectors(C,T),l.toArray(v,g),p.toArray(y,g),T.toArray(b,g),C.toArray(x,g),d.atomColorToArray(L,_,g),w.push(L.index),S.push(f.atomRadius(L)),A.push(c+m),M.push(c+B+1-m),g+=3,m=B,k=!1}var N=new Float32Array(w);return{axis:new Float32Array(v),center:new Float32Array(y),begin:new Float32Array(b),end:new Float32Array(x),color:new Float32Array(_),picking:new hv(N,a),size:new Float32Array(S),residueOffset:A,residueCount:M}};var ib=function(t){this.scoreFunction=t,this.content=[],this.scoreFunction=t};ib.prototype.push=function(t){this.content.push(t),this.bubbleUp(this.content.length-1)},ib.prototype.pop=function(){var t=this.content[0],e=this.content.pop();return e&&0<this.content.length&&(this.content[0]=e,this.sinkDown(0)),t},ib.prototype.peek=function(){return this.content[0]},ib.prototype.remove=function(t){for(var e=this.content.length,i=0;i<e;i++)if(this.content[i]===t){var r=this.content.pop();return void(r&&i!==e-1&&(this.content[i]=r,this.scoreFunction(r)<this.scoreFunction(t)?this.bubbleUp(i):this.sinkDown(i)))}throw new Error("Node not found.")},ib.prototype.size=function(){return this.content.length},ib.prototype.bubbleUp=function(t){for(var e=this.content[t];0<t;){var i=Math.floor((t+1)/2)-1,r=this.content[i];if(!(this.scoreFunction(e)<this.scoreFunction(r)))break;this.content[i]=e,this.content[t]=r,t=i}},ib.prototype.sinkDown=function(t){for(var e=this.content.length,i=this.content[t],r=this.scoreFunction(i),n=0;;){var o=2*(t+1),a=o-1,s=null;if(a<e){var c=this.content[a];(n=this.scoreFunction(c))<r&&(s=a)}if(o<e){var u=this.content[o];this.scoreFunction(u)<(null===s?r:n)&&(s=o)}if(null===s)break;this.content[t]=this.content[s],this.content[s]=i,t=s}};var rb=function(t,e){this.points=t,this.metric=e,this.maxDepth=0,this.currentNode=0;for(var i=t.length/3,r=new Uint32Array(i),n=0;n<i;++n)r[n]=n;this.indices=r,this.nodes=new Int32Array(4*i),this.rootIndex=this.buildTree(0,-1,0,i)};rb.prototype.buildTree=function(t,e,i,r){t>this.maxDepth&&(this.maxDepth=t);var n=r-i;if(0===n)return-1;var o=4*this.currentNode,a=this.nodes;if(this.currentNode+=1,1===n)return a[o]=i,a[o+1]=-1,a[o+2]=-1,a[o+3]=e,o;for(var s,c,u,h,l,p=this.indices,d=this.points,f=i+Math.floor(n/2),m=t%3,g=i,v=r-1;g<v;){for(h=d[3*p[u=g+v>>1]+m],c=p[u],p[u]=p[v],p[v]=c,s=l=g;s<v;++s)d[3*p[s]+m]<h&&(c=p[l],p[l]=p[s],p[s]=c,++l);if(c=p[v],p[v]=p[l],p[l]=c,f===(u=l))break;f<u?v=u-1:g=u+1}return a[o]=f,a[o+1]=this.buildTree(t+1,o,i,f),a[o+2]=this.buildTree(t+1,o,f+1,r),a[o+3]=e,o},rb.prototype.getNodeDepth=function(t){var e=this.nodes[t+3];return-1===e?0:this.getNodeDepth(e)+1},rb.prototype.nearest=function(d,f,m){var g=this,v=new ib(function(t){return-t[1]}),y=this.nodes,b=this.points,x=this.indices,_=function(t){var e,i,r=g.getNodeDepth(t)%3,n=3*x[y[t]],o=[b[n+0],b[n+1],b[n+2]],a=g.metric(d,o);function s(t,e){v.push([t,e]),v.size()>f&&v.pop()}var c=y[t+1],u=y[t+2];if(-1!==u||-1!==c){e=-1===u?c:-1===c?u:d[r]<=b[n+r]?c:u,_(e),(v.size()<f||a<v.peek()[1])&&a<=m&&s(t,a);for(var h=[],l=0;l<3;l+=1)h[l]=l===r?d[l]:b[n+l];var p=g.metric(h,o);(v.size()<f||Math.abs(p)<v.peek()[1])&&Math.abs(p)<=m&&-1!==(i=e===c?u:c)&&_(i)}else(v.size()<f||a<v.peek()[1])&&a<=m&&s(t,a)};_(this.rootIndex);for(var t=[],e=0,i=Math.min(v.size(),f);e<i;e+=1)t.push(v.content[e]);return t},rb.prototype.verify=function(t,e){void 0===e&&(e=0);var i=1;if(void 0===t&&(t=this.rootIndex),-1===t)throw new Error("node is null");var r=e%3,n=this.nodes,o=this.points,a=this.indices,s=n[t+1],c=n[t+2];if(-1!==s){if(o[3*a[n[s]]+r]>o[3*a[n[t]]+r])throw new Error("left child is > parent!");i+=this.verify(s,e+1)}if(-1!==c){if(o[3*a[n[c]]+r]<o[3*a[n[t]]+r])throw new Error("right child is < parent!");i+=this.verify(c,e+1)}return i};var nb=function(t,e){void 0===e&&(e=0),this.structure=t,this.index=e,this.chainStore=t.chainStore,this.residueStore=t.residueStore,this.atomStore=t.atomStore,this.residueMap=t.residueMap,this.atomMap=t.atomMap},ob={bondHash:{configurable:!0},entity:{configurable:!0},entityIndex:{configurable:!0},modelIndex:{configurable:!0},chainIndex:{configurable:!0},residue:{configurable:!0},residueIndex:{configurable:!0},sstruc:{configurable:!0},inscode:{configurable:!0},resno:{configurable:!0},chainname:{configurable:!0},chainid:{configurable:!0},residueType:{configurable:!0},atomType:{configurable:!0},residueAtomOffset:{configurable:!0},resname:{configurable:!0},hetero:{configurable:!0},atomname:{configurable:!0},number:{configurable:!0},element:{configurable:!0},vdw:{configurable:!0},covalent:{configurable:!0},x:{configurable:!0},y:{configurable:!0},z:{configurable:!0},serial:{configurable:!0},bfactor:{configurable:!0},occupancy:{configurable:!0},altloc:{configurable:!0},partialCharge:{configurable:!0},radius:{configurable:!0},formalCharge:{configurable:!0},aromatic:{configurable:!0},bondCount:{configurable:!0}};function ab(t,e){var i=t[0]-e[0],r=t[1]-e[1],n=t[2]-e[2];return i*i+r*r+n*n}function sb(t,e){return Math.sqrt(ab(t,e))}ob.bondHash.get=function(){return this.structure.bondHash},ob.entity.get=function(){return this.structure.entityList[this.entityIndex]},ob.entityIndex.get=function(){return this.chainStore.entityIndex[this.chainIndex]},ob.modelIndex.get=function(){return this.chainStore.modelIndex[this.chainIndex]},ob.chainIndex.get=function(){return this.residueStore.chainIndex[this.residueIndex]},ob.residue.get=function(){return console.warn("residue - might be expensive"),this.structure.getResidueProxy(this.residueIndex)},ob.residueIndex.get=function(){return this.atomStore.residueIndex[this.index]},ob.residueIndex.set=function(t){this.atomStore.residueIndex[this.index]=t},ob.sstruc.get=function(){return this.residueStore.getSstruc(this.residueIndex)},ob.inscode.get=function(){return this.residueStore.getInscode(this.residueIndex)},ob.resno.get=function(){return this.residueStore.resno[this.residueIndex]},ob.chainname.get=function(){return this.chainStore.getChainname(this.chainIndex)},ob.chainid.get=function(){return this.chainStore.getChainid(this.chainIndex)},ob.residueType.get=function(){return this.residueMap.get(this.residueStore.residueTypeId[this.residueIndex])},ob.atomType.get=function(){return this.atomMap.get(this.atomStore.atomTypeId[this.index])},ob.residueAtomOffset.get=function(){return this.residueStore.atomOffset[this.residueIndex]},ob.resname.get=function(){return this.residueType.resname},ob.hetero.get=function(){return this.residueType.hetero},ob.atomname.get=function(){return this.atomType.atomname},ob.number.get=function(){return this.atomType.number},ob.element.get=function(){return this.atomType.element},ob.vdw.get=function(){return this.atomType.vdw},ob.covalent.get=function(){return this.atomType.covalent},ob.x.get=function(){return this.atomStore.x[this.index]},ob.x.set=function(t){this.atomStore.x[this.index]=t},ob.y.get=function(){return this.atomStore.y[this.index]},ob.y.set=function(t){this.atomStore.y[this.index]=t},ob.z.get=function(){return this.atomStore.z[this.index]},ob.z.set=function(t){this.atomStore.z[this.index]=t},ob.serial.get=function(){return this.atomStore.serial[this.index]},ob.serial.set=function(t){this.atomStore.serial[this.index]=t},ob.bfactor.get=function(){return this.atomStore.bfactor[this.index]},ob.bfactor.set=function(t){this.atomStore.bfactor[this.index]=t},ob.occupancy.get=function(){return this.atomStore.occupancy[this.index]},ob.occupancy.set=function(t){this.atomStore.occupancy[this.index]=t},ob.altloc.get=function(){return this.atomStore.getAltloc(this.index)},ob.altloc.set=function(t){this.atomStore.setAltloc(this.index,t)},ob.partialCharge.get=function(){return this.atomStore.partialCharge?this.atomStore.partialCharge[this.index]:null},ob.partialCharge.set=function(t){this.atomStore.partialCharge&&(this.atomStore.partialCharge[this.index]=t)},ob.radius.get=function(){return this.atomStore.radius?this.atomStore.radius[this.index]:null},ob.radius.set=function(t){this.atomStore.radius&&(this.atomStore.radius[this.index]=t)},ob.formalCharge.get=function(){return this.atomStore.formalCharge?this.atomStore.formalCharge[this.index]:null},ob.formalCharge.set=function(t){this.atomStore.formalCharge&&(this.atomStore.formalCharge[this.index]=t)},ob.aromatic.get=function(){return this.atomStore.aromatic?this.atomStore.aromatic[this.index]:this.residueType.isAromatic(this)?1:0},ob.aromatic.set=function(t){this.atomStore.aromatic&&(this.atomStore.aromatic[this.index]=t)},ob.bondCount.get=function(){return this.bondHash.countArray[this.index]},nb.prototype.eachBond=function(t,e){e=e||this.structure._bp;for(var i=this.index,r=this.bondHash,n=r.indexArray,o=r.countArray[i],a=r.offsetArray[i],s=0;s<o;++s)e.index=n[a+s],t(e)},nb.prototype.eachBondedAtom=function(e,t){var i=t||this.structure._ap,r=this.index;this.eachBond(function(t){i.index=r!==t.atomIndex1?t.atomIndex1:t.atomIndex2,e(i)}),this.index=r},nb.prototype.hasBondTo=function(e){var i=!1;return this.eachBondedAtom(function(t){e.index===t.index&&(i=!0)}),i},nb.prototype.bondToElementCount=function(e){var i=0,t=this.index;return this.eachBondedAtom(function(t){t.number===e&&(i+=1)}),this.index=t,i},nb.prototype.hasBondToElement=function(t){return 0<this.bondToElementCount(t)},nb.prototype.isBackbone=function(){var t=this.residueType.backboneIndexList;return 0<t.length&&t.includes(this.index-this.residueAtomOffset)},nb.prototype.isPolymer=function(){if(0<this.structure.entityList.length)return this.entity.isPolymer();var t=this.residueType.moleculeType;return 3===t||4===t||5===t},nb.prototype.isSidechain=function(){return this.isPolymer()&&!this.isBackbone()},nb.prototype.isCg=function(){var t=this.residueType.backboneType;return 4===t||5===t||6===t},nb.prototype.isTrace=function(){return this.index===this.residueType.traceAtomIndex+this.residueAtomOffset},nb.prototype.isHetero=function(){return 1===this.residueType.hetero},nb.prototype.isProtein=function(){return 3===this.residueType.moleculeType},nb.prototype.isNucleic=function(){var t=this.residueType.moleculeType;return 4===t||5===t},nb.prototype.isRna=function(){return 4===this.residueType.moleculeType},nb.prototype.isDna=function(){return 5===this.residueType.moleculeType},nb.prototype.isWater=function(){return 1===this.residueType.moleculeType},nb.prototype.isIon=function(){return 2===this.residueType.moleculeType},nb.prototype.isSaccharide=function(){return 6===this.residueType.moleculeType},nb.prototype.isHelix=function(){return lg.includes(this.sstruc)},nb.prototype.isSheet=function(){return pg.includes(this.sstruc)},nb.prototype.isTurn=function(){return dg.includes(this.sstruc)&&this.isProtein()},nb.prototype.isBonded=function(){return 0!==this.bondHash.countArray[this.index]},nb.prototype.isRing=function(){return void 0!==this.residueType.getRings().atomRings[this.index-this.residueAtomOffset]},nb.prototype.isAromatic=function(){return 1===this.aromatic},nb.prototype.isMetal=function(){return this.atomType.isMetal()},nb.prototype.isNonmetal=function(){return this.atomType.isNonmetal()},nb.prototype.isMetalloid=function(){return this.atomType.isMetalloid()},nb.prototype.isHalogen=function(){return this.atomType.isHalogen()},nb.prototype.isDiatomicNonmetal=function(){return this.atomType.isDiatomicNonmetal()},nb.prototype.isPolyatomicNonmetal=function(){return this.atomType.isPolyatomicNonmetal()},nb.prototype.isAlkaliMetal=function(){return this.atomType.isAlkaliMetal()},nb.prototype.isAlkalineEarthMetal=function(){return this.atomType.isAlkalineEarthMetal()},nb.prototype.isNobleGas=function(){return this.atomType.isNobleGas()},nb.prototype.isTransitionMetal=function(){return this.atomType.isTransitionMetal()},nb.prototype.isPostTransitionMetal=function(){return this.atomType.isPostTransitionMetal()},nb.prototype.isLanthanide=function(){return this.atomType.isLanthanide()},nb.prototype.isActinide=function(){return this.atomType.isActinide()},nb.prototype.getDefaultValence=function(){return this.atomType.getDefaultValence()},nb.prototype.getValenceList=function(){return this.atomType.getValenceList()},nb.prototype.getOuterShellElectronCount=function(){return this.atomType.getOuterShellElectronCount()},nb.prototype.distanceTo=function(t){var e=this.atomStore,i=t.atomStore,r=this.index,n=t.index,o=e.x[r]-i.x[n],a=e.y[r]-i.y[n],s=e.z[r]-i.z[n],c=o*o+a*a+s*s;return Math.sqrt(c)},nb.prototype.connectedTo=function(t){var e=this.atomStore,i=t.atomStore,r=this.index,n=t.index;if(e.altloc&&i.altloc){var o=e.altloc[r],a=i.altloc[n];if(0!==o&&0!==a&&32!==o&&32!==a&&o!==a)return!1}var s=e.x[r]-i.x[n],c=e.y[r]-i.y[n],u=e.z[r]-i.z[n],h=s*s+c*c+u*u;if(h<64&&this.isCg())return!0;if(isNaN(h))return!1;var l=this.covalent+t.covalent,p=l+.3,d=l-.5;return h<p*p&&d*d<h},nb.prototype.positionFromArray=function(t,e){return void 0===e&&(e=0),this.x=t[e+0],this.y=t[e+1],this.z=t[e+2],this},nb.prototype.positionToArray=function(t,e){void 0===t&&(t=[]),void 0===e&&(e=0);var i=this.index,r=this.atomStore;return t[e+0]=r.x[i],t[e+1]=r.y[i],t[e+2]=r.z[i],t},nb.prototype.positionToVector3=function(t){return void 0===t&&(t=new ri),t.x=this.x,t.y=this.y,t.z=this.z,t},nb.prototype.positionFromVector3=function(t){return this.x=t.x,this.y=t.y,this.z=t.z,this},nb.prototype.positionAdd=function(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this},nb.prototype.positionSub=function(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this},nb.prototype.getResidueBonds=function(t){void 0===t&&(t=!1);var e,i,r,n,o=this.residueAtomOffset,a=this.index-this.residueAtomOffset,s=this.residueType.getBonds(),c=s.atomIndices1,u=s.atomIndices2;for(t||(n=[]),e=c.indexOf(a);-1!==e;){if(r=u[e]+o,!n)return r;n.push(r),e=c.indexOf(a,e+1)}for(i=u.indexOf(a);-1!==i;){if(r=c[i]+o,!n)return r;n.push(r),i=u.indexOf(a,i+1)}return n},nb.prototype.qualifiedName=function(t){void 0===t&&(t=!1);var e="";return this.resname&&!t&&(e+="["+this.resname+"]"),void 0!==this.resno&&(e+=this.resno),this.inscode&&(e+="^"+this.inscode),this.chainname&&(e+=":"+this.chainname),this.atomname&&(e+="."+this.atomname),this.altloc&&(e+="%"+this.altloc),1<this.structure.modelStore.count&&(e+="/"+this.modelIndex),e},nb.prototype.clone=function(){return new nb(this.structure,this.index)},nb.prototype.toObject=function(){return{index:this.index,residueIndex:this.residueIndex,resname:this.resname,x:this.x,y:this.y,z:this.z,element:this.element,chainname:this.chainname,resno:this.resno,serial:this.serial,vdw:this.vdw,covalent:this.covalent,hetero:this.hetero,bfactor:this.bfactor,altloc:this.altloc,atomname:this.atomname,modelIndex:this.modelIndex}},Object.defineProperties(nb.prototype,ob);var cb=new Float32Array(3),ub=function(t,e){void 0===e&&(e=!1),de.Debug&&Yp.time("Kdtree build");var i=e?ab:sb,r=new Float32Array(3*t.atomCount),n=new Uint32Array(t.atomCount),o=0;t.eachAtom(function(t){r[o+0]=t.x,r[o+1]=t.y,r[o+2]=t.z,n[o/3]=t.index,o+=3}),this.atomIndices=n,this.points=r,this.kdtree=new rb(r,i),de.Debug&&Yp.timeEnd("Kdtree build")};ub.prototype.nearest=function(t,e,i){t instanceof ri?t.toArray(cb):t instanceof nb&&t.positionToArray(cb);for(var r=this.kdtree.nearest(cb,e,i),n=this.kdtree.indices,o=this.kdtree.nodes,a=this.atomIndices,s=[],c=0,u=r.length;c<u;++c){var h=r[c],l=h[0],p=h[1];s.push({index:a[n[o[l]]],distance:p})}return s};var hb={" ":"X","!":"Y","#":"Z",$:"-X","%":"-Y","&":"-Z","'":"Y+1/2","(":"1/2+X",")":"1/2+Y","*":"1/2-X","+":"1/2+Z",",":"1/2-Y","-":"1/2-Z",".":"X+1/2","/":"Z+1/2",0:"-X+1/2",1:"-Y+1/2",2:"-Z+1/2",3:"1/4+X",4:"1/4-Y",5:"1/4+Z",6:"1/4-X",7:"1/4+Y",8:"3/4-Y",9:"3/4+Z",":":"3/4+Y",";":"3/4+X","<":"3/4-X","=":"1/4-Z",">":"3/4-Z","?":"X-Y","@":"Y-X",A:"Z+1/3",B:"Z+2/3",C:"X+2/3",D:"Y+1/3",E:"-Y+2/3",F:"X-Y+1/3",G:"Y-X+2/3",H:"-X+1/3",I:"X+1/3",J:"Y+2/3",K:"-Y+1/3",L:"X-Y+2/3",M:"Y-X+1/3",N:"-X+2/3",O:"2/3+X",P:"1/3+Y",Q:"1/3+Z",R:"2/3-Y",S:"1/3+X-Y",T:"2/3+Y-X",U:"1/3-X",V:"2/3-X",W:"1/3-Y",X:"1/3-Z",Y:"2/3+Y",Z:"1/3+Y-X","[":"2/3+X-Y","]":"1/3+X","^":"2/3+Z",_:"2/3-Z","`":"5/6+Z",a:"1/6+Z",b:"5/6-Z",c:"1/6-Z",d:"Z+5/6",e:"Z+1/6",f:"Z+1/4",g:"+Y"},lb={"P 1":" !#","P -1":" !#$%&","P 1 2 1":" !#$!&","P 1 21 1":" !#$'&","C 1 2 1":" !#$!&()#*)&","P 1 m 1":" !# %#","P 1 c 1":" !# %+","C 1 m 1":" !# %#()#(,#","C 1 c 1":" !# %+()#(,+","P 1 2/m 1":" !# %#$!&$%&","P 1 21/m 1":" !#$)&$%& ,#","C 1 2/m 1":" !# %#$!&$%&()#(,#*)&*,&","P 1 2/c 1":" !#$!-$%& %+","P 1 21/c 1":" !#$%&$)- ,+","C 1 2/c 1":" !#$!-$%& %+()#*)-*,&(,+","P 2 2 2":" !#$%#$!& %&","P 2 2 21":" !#$%+$!- %&","P 21 21 2":" !#$%#*)&(,&","P 21 21 21":" !#*%+$)-(,&","C 2 2 21":" !#$%+$!- %&()#*,+*)-(,&","C 2 2 2":" !#$%#$!& %&()#*,#*)&(,&","F 2 2 2":" !#$%#$!& %& )+$,+$)- ,-(!+*%+*!-(%-()#*,#*)&(,&","I 2 2 2":" !#$%# %&$!&.'/01/.120'2","I 21 21 21":" !#*%+$)-(,&()+$,#*!& %-","P m m 2":" !#$%# %#$!#","P m c 21":" !#$%+ %+$!#","P c c 2":" !#$%# %+$!+","P m a 2":" !#$%#(%#*!#","P c a 21":" !#$%+(%#*!+","P n c 2":" !#$%# ,+$)+","P m n 21":" !#*%+(%+$!#","P b a 2":" !#$%#(,#*)#","P n a 21":" !#$%+(,#*)+","P n n 2":" !#$%#(,+*)+","C m m 2":" !#$%# %#$!#()#*,#(,#*)#","C m c 21":" !#$%+ %+$!#()#*,+(,+*)#","C c c 2":" !#$%# %+$!+()#*,#(,+*)+","A m m 2":" !#$%# %#$!# )+$,+ ,+$)+","A b m 2":" !#$%# ,#$)# )+$,+ %+$!+","A m a 2":" !#$%#(%#*!# )+$,+(,+*)+","A b a 2":" !#$%#(,#*)# )+$,+(%+*!+","F m m 2":" !#$%# %#$!# )+$,+ ,+$)+(!+*%+(%+*!+()#*,#(,#*)#","F d d 2":" !#$%#345675 )+$,+3896:9(!+*%+;49<79()#*,#;85<:5","I m m 2":" !#$%# %#$!#()+*,+(,+*)+","I b a 2":" !#$%#(,#*)#()+*,+ %+$!+","I m a 2":" !#$%#(%#*!#()+*,+ ,+$)+","P 2/m 2/m 2/m":" !#$%#$!& %&$%& !& %#$!#","P 2/n 2/n 2/n":" !#$%#$!& %&*,-()-(,+*)+","P 2/c 2/c 2/m":" !#$%#$!- %-$%& !& %+$!+","P 2/b 2/a 2/n":" !#$%#$!& %&*,&()&(,#*)#","P 21/m 2/m 2/a":" !#*%#$!&(%&$%&(!& %#*!#","P 2/n 21/n 2/a":" !#*%#*)- ,-$%&(!&(,+$)+","P 2/m 2/n 21/a":" !#*%+*!- %&$%&(!-(%+$!#","P 21/c 2/c 2/a":" !#*%#$!-(%-$%&(!& %+*!+","P 21/b 21/a 2/m":" !#$%#*)&(,&$%& !&(,#*)#","P 21/c 21/c 2/n":" !#*,#$)-(%-$%&()& ,+*!+","P 2/b 21/c 21/m":" !#$%+$)- ,&$%& !- ,+$)#","P 21/n 21/n 2/m":" !#$%#*)-(,-$%& !&(,+*)+","P 21/m 21/m 2/n":" !#$%#*'&.,&*,&.'& %#$!#","P 21/b 2/c 21/n":" !#*,+$!-(,&$%&()- %+*)#","P 21/b 21/c 21/a":" !#*%+$)-(,&$%&(!- ,+*)#","P 21/n 21/m 21/a":" !#0%/$'&.12$%&.!2 1#0'/","C 2/m 2/c 21/m":" !#$%+$!- %&$%& !- %+$!#()#*,+*)-(,&*,&()-(,+*)#","C 2/m 2/c 21/a":" !#$,+$)- %&$%& )- ,+$!#()#*%+*!-(,&*,&(!-(%+*)#","C 2/m 2/m 2/m":" !#$%#$!& %&$%& !& %#$!#()#*,#*)&(,&*,&()&(,#*)#","C 2/c 2/c 2/m":" !#$%#$!- %-$%& !& %+$!+()#*,#*)-(,-*,&()&(,+*)+","C 2/m 2/m 2/a":" !#$,#$)& %&$%& )& ,#$!#()#*%#*!&(,&*,&(!&(%#*)#","C 2/c 2/c 2/a":" !#*,#$!&(,&$,-(!- ,+*!+()#$%#*)& %&*%- )-(%+$)+","F 2/m 2/m 2/m":" !#$%#$!& %&$%& !& %#$!# )+$,+$)- ,-$,- )- ,+$)+(!+*%+*!-(%-*%-(!-(%+*!+()#*,#*)&(,&*,&()&(,#*)#","F 2/d 2/d 2/d":" !#$%#$!& %&64=37=345675 )+$,+$)- ,-68>3:>3896:9(!+*%+*!-(%-<4>;7>;49<79()#*,#*)&(,&<8=;:=;85<:5","I 2/m 2/m 2/m":" !#$%#$!& %&$%& !& %#$!#()+*,+*)-(,-*,-()-(,+*)+","I 2/b 2/a 2/m":" !#$%#*)&(,&$%& !&(,#*)#()+*,+$!- %-*,-()- %+$!+","I 21/b 21/c 21/a":" !#*%+$)-(,&$%&(!- ,+*)#()+$,#*!& %-*,- )&(%#$!+","I 21/m 21/m 21/a":" !#$,#$)& %&$%& )& ,#$!#()+*%+*!-(,-*,-(!-(%+*)+","P 4":" !#$%#% #!$#","P 41":" !#$%+% 5!$9","P 42":" !#$%#% +!$+","P 43":" !#$%+% 9!$5","I 4":" !#$%#% #!$#()+*,+,(+)*+","I 41":" !#*,+%(5)$9()+$%#, 9!*5","P -4":" !#$%#!$&% &","I -4":" !#$%#!$&% &()+*,+)*-,(-","P 4/m":" !#$%#% #!$#$%& !&!$&% &","P 42/m":" !#$%#% +!$+$%& !&!$-% -","P 4/n":" !#$%#,(#)*#*,&()&!$&% &","P 42/n":" !#$%#,(+)*+*,-()-!$&% &","I 4/m":" !#$%#% #!$#$%& !&!$&% &()+*,+,(+)*+*,-()-)*-,(-","I 41/a":" !#*,+%(5)$9$,=(!>!$&,(-()+$%#, 9!*5*%> )=)*-% &","P 4 2 2":" !#$%#% #!$#$!& %&! &%$&","P 4 21 2":" !#$%#,(#)*#*)&(,&! &%$&","P 41 2 2":" !#$%+% 5!$9$!& %-! >%$=","P 41 21 2":" !#$%+,(5)*9*)=(,>! &%$-","P 42 2 2":" !#$%#% +!$+$!& %&! -%$-","P 42 21 2":" !#$%#,(+)*+*)-(,-! &%$&","P 43 2 2":" !#$%+% 9!$5$!& %-! =%$>","P 43 21 2":" !#$%+,(9)*5*)>(,=! &%$-","I 4 2 2":" !#$%#% #!$#$!& %&! &%$&()+*,+,(+)*+*)-(,-)(-,*-","I 41 2 2":" !#*,+%(5)$9*!> ,=)(-%$&()+$%#, 9!*5$)=(%>! &,*-","P 4 m m":" !#$%#% #!$# %#$!#%$#! #","P 4 b m":" !#$%#% #!$#(,#*)#,*#)(#","P 42 c m":" !#$%#% +!$+ %+$!+%$#! #","P 42 n m":" !#$%#,(+)*+(,+*)+%$#! #","P 4 c c":" !#$%#% #!$# %+$!+%$+! +","P 4 n c":" !#$%#% #!$#(,+*)+,*+)(+","P 42 m c":" !#$%#% +!$+ %#$!#%$+! +","P 42 b c":" !#$%#% +!$+(,#*)#,*+)(+","I 4 m m":" !#$%#% #!$# %#$!#%$#! #()+*,+,(+)*+(,+*)+,*+)(+","I 4 c m":" !#$%#% #!$# %+$!+%$+! +()+*,+,(+)*+(,#*)#,*#)(#","I 41 m d":" !#*,+%(5)$9 %#*)+%*5) 9()+$%#, 9!*5(,+$!#,$9!(5","I 41 c d":" !#*,+%(5)$9 %+*)#%*9) 5()+$%#, 9!*5(,#$!+,$5!(9","P -4 2 m":" !#$%#% &!$&$!& %&%$#! #","P -4 2 c":" !#$%#% &!$&$!- %-%$+! +","P -4 21 m":" !#$%#% &!$&*)&(,&,*#)(#","P -4 21 c":" !#$%#% &!$&*)-(,-,*+)(+","P -4 m 2":" !#$%#!$&% & %#$!#! &%$&","P -4 c 2":" !#$%#% &!$& %+$!+! -%$-","P -4 b 2":" !#$%#% &!$&(,#*)#)(&,*&","P -4 n 2":" !#$%#% &!$&(,+*)+)(-,*-","I -4 m 2":" !#$%#% &!$& %#$!#! &%$&()+*,+,(-)*-(,+*)+)(-,*-","I -4 c 2":" !#$%#% &!$& %+$!+! -%$-()+*,+,(-)*-(,#*)#)(&,*&","I -4 2 m":" !#$%#% &!$&$!& %&%$#! #()+*,+,(-)*-*)-(,-,*+)(+","I -4 2 d":" !#$%#% &!$&*!>(%>,$9) 9()+*,+,(-)*-$)= ,=%*5!(5","P 4/m 2/m 2/m":" !#$%#% #!$#$!& %&! &%$&$%& !&!$&% & %#$!#%$#! #","P 4/m 2/c 2/c":" !#$%#% #!$#$!- %-! -%$-$%& !&!$&% & %+$!+%$+! +","P 4/n 2/b 2/m":" !#$%#% #!$#$!& %&! &%$&*,&()&)*&,(&(,#*)#,*#)(#","P 4/n 2/n 2/c":" !#$%#% #!$#$!& %&! &%$&*,-()-)*-,(-(,+*)+,*+)(+","P 4/m 21/b 2/m":" !#$%#% #!$#*)&(,&)(&,*&$%& !&!$&% &(,#*)#,*#)(#","P 4/m 21/n 2/c":" !#$%#% #!$#*)-(,-)(-,*-$%& !&!$&% &(,+*)+,*+)(+","P 4/n 21/m 2/m":" !#$%#,(#)*#*)&(,&! &%$&*,&()&!$&% & %#$!#,*#)(#","P 4/n 2/c 2/c":" !#$%#,(#)*#*)-(,-! -%$-*,&()&!$&% & %+$!+,*+)(+","P 42/m 2/m 2/c":" !#$%#% +!$+$!& %&! -%$-$%& !&!$-% - %#$!#%$+! +","P 42/m 2/c 2/m":" !#$%#% +!$+$!- %-! &%$&$%& !&!$-% - %+$!+%$#! #","P 42/n 2/b 2/c":" !#$%#,(+)*+$!- %-)(&,*&*,-()-!$&% &(,#*)#%$+! +","P 42/n 2/n 2/m":" !#$%#,(+)*+$!& %&)(-,*-*,-()-!$&% &(,+*)+%$#! #","P 42/m 21/b 2/c":" !#$%#% +!$+*)&(,&)(-,*-$%& !&!$-% -(,#*)#,*+)(+","P 42/m 21/n 2/m":" !#$%#,./'*/*'-.,-! &%$&$%& !&'*-,.-.,/*'/%$#! #","P 42/n 21/m 2/c":" !#$%#,(+)*+*)-(,-! &%$&*,-()-!$&% & %#$!#,*+)(+","P 42/n 21/c 2/m":" !#$%#,(+)*+*)&(,&! -%$-*,-()-!$&% & %+$!+,*#)(#","I 4/m 2/m 2/m":" !#$%#% #!$#$!& %&! &%$&$%& !&!$&% & %#$!#%$#! #()+*,+,(+)*+*)-(,-)(-,*-*,-()-)*-,(-(,+*)+,*+)(+","I 4/m 2/c 2/m":" !#$%#% #!$#$!- %-! -%$-$%& !&!$&% & %+$!+%$+! +()+*,+,(+)*+*)&(,&)(&,*&*,-()-)*-,(-(,#*)#,*#)(#","I 41/a 2/m 2/d":" !#*,+%(5)$9*!> ,=)(-%$&$,=(!>!$&,(-(,+$!#,$9!(5()+$%#, 9!*5$)=(%>! &,*-*%> )=)*-% & %#*)+%*5) 9","I 41/a 2/c 2/d":" !#*,+%(5)$9*!= ,>)(&%$-$,=(!>!$&,(-(,#$!+,$5!(9()+$%#, 9!*5$)>(%=! -,*&*%> )=)*-% & %+*)#%*9) 5","P 3":" !#%?#@$#","P 31":" !#%?A@$B","P 32":" !#%?B@$A","H 3":" !#%?#@$#CDAEFAGHAIJBKLBMNB","R 3":" !## !!# ","P -3":" !#%?#@$#$%&!@&? &","H -3":" !#%?#@$#$%&!@&? &OPQRSQTUQVWXYZX[]X]Y^W[^ZV^UR_PT_SO_","R -3":" !## !!# $%&&$%%&$","P 3 1 2":" !#%?#@$#%$&@!& ?&","P 3 2 1":" !#%?#@$#! &?%&$@&","P 31 1 2":" !#%?Q@$^%$_@!X ?&","P 31 2 1":" !#%?A@$B! &?%_$@X","P 32 1 2":" !#%?^@$Q%$X@!_ ?&","P 32 2 1":" !#%?B@$A! &?%X$@_","H 3 2":" !#%?#@$#! &?%&$@&OPQRSQTUQY]X[WXVZX]Y^W[^ZV^PO_SR_UT_","R 3 2":" !## !!# %$&$&%&%$","P 3 m 1":" !#%?#@$#%$#@!# ?#","P 3 1 m":" !#%?#@$#! #?%#$@#","P 3 c 1":" !#%?#@$#%$+@!+ ?+","P 3 1 c":" !#%?#@$#! +?%+$@+","H 3 m":" !#%?#@$#%$#@!# ?#OPQRSQTUQRUQTPQOSQ]Y^W[^ZV^WV^ZY^][^","R 3 m":" !## !!# ! # #!#! ","H 3 c":" !#%?#@$#%$+@!+ ?+OPQRSQTUQRU`TP`OS`]Y^W[^ZV^WVaZYa][a","R 3 c":" !## !!# '././'/'.","P -3 1 2/m":" !#%?#@$#%$&@!& ?&$%&!@&? &! #?%#$@#","P -3 1 2/c":" !#%?#@$#%$-@!- ?-$%&!@&? &! +?%+$@+","P -3 2/m 1":" !#%?#@$#! &?%&$@&$%&!@&? &%$#@!# ?#","P -3 2/c 1":" !#%?#@$#! -?%-$@-$%&!@&? &%$+@!+ ?+","H -3 2/m":" !#%?#@$#! &?%&$@&$%&!@&? &%$#@!# ?#OPQRSQTUQY]X[WXVZXVWXYZX[]XRUQTPQOSQ]Y^W[^ZV^PO_SR_UT_UR_PT_SO_WV^ZY^][^","R -3 2/m":" !## !!# %$&$&%&%$$%&&$%%&$! # #!#! ","H -3 2/c":" !#%?#@$#! -?%-$@-$%&!@&? &%$+@!+ ?+OPQRSQTUQY]b[WbVZbVWXYZX[]XRU`TP`OS`]Y^W[^ZV^POcSRcUTcUR_PT_SO_WVaZYa][a","R -3 2/c":" !## !!# 102021210$%&&$%%&$'././'/'.","P 6":" !#%?#@$#$%#!@#? #","P 61":" !#%?A@$B$%/!@d? e","P 65":" !#%?B@$A$%/!@e? d","P 62":" !#%?^@$Q$%#!@^? Q","P 64":" !#%?Q@$^$%#!@Q? ^","P 63":" !#%?#@$#$%+!@+? +","P -6":" !#%?#@$# !&%?&@$&","P 6/m":" !#%?#@$#$%#!@#? #$%&!@&? & !&%?&@$&","P 63/m":" !#%?#@$#$%+!@+? +$%&!@&? & !-%?-@$-","P 6 2 2":" !#%?#@$#$%#!@#? #! &?%&$@&%$&@!& ?&","P 61 2 2":" !#%?Q@$^$%+!@`? a! X?%&$@_%$b@!- ?c","P 65 2 2":" !#%?^@$Q$%+!@a? `! _?%&$@X%$c@!- ?b","P 62 2 2":" !#%?^@$Q$%#!@^? Q! _?%&$@X%$_@!& ?X","P 64 2 2":" !#%?Q@$^$%#!@Q? ^! X?%&$@_%$X@!& ?_","P 63 2 2":" !#%?#@$#$%+!@+? +! &?%&$@&%$-@!- ?-","P 6 m m":" !#%?#@$#$%#!@#? #%$#@!# ?#! #?%#$@#","P 6 c c":" !#%?#@$#$%#!@#? #%$+@!+ ?+! +?%+$@+","P 63 c m":" !#%?#@$#$%+!@+? +%$+@!+ ?+! #?%#$@#","P 63 m c":" !#%?#@$#$%+!@+? +%$#@!# ?#! +?%+$@+","P -6 m 2":" !#%?#@$# !&%?&@$&%$#@!# ?#%$&@!& ?&","P -6 c 2":" !#%?#@$# !-%?-@$-%$+@!+ ?+%$&@!& ?&","P -6 2 m":" !#%?#@$# !&%?&@$&! &?%&$@&! #?%#$@#","P -6 2 c":" !#%?#@$# !-%?-@$-! &?%&$@&! +?%+$@+","P 6/m 2/m 2/m":" !#%?#@$#$%#!@#? #! &?%&$@&%$&@!& ?&$%&!@&? & !&@$&%?&%$#@!# ?#! #?%#$@#","P 6/m 2/c 2/c":" !#%?#@$#$%#!@#? #! -?%-$@-%$-@!- ?-$%&!@&? & !&@$&%?&%$+@!+ ?+! +?%+$@+","P 63/m 2/c 2/m":" !#%?#@$#$%+!@+? +! -?%-$@-%$&@!& ?&$%&!@&? & !-@$-%?-%$+@!+ ?+! #?%#$@#","P 63/m 2/m 2/c":" !#%?#@$#$%+!@+? +! &?%&$@&%$-@!- ?-$%&!@&? & !-@$-%?-%$#@!# ?#! +?%+$@+","P 2 3":" !#$%#$!& %&# !#$%&$!& %!# %#$!&$%& ","F 2 3":" !#$%#$!& %&# !#$%&$!& %!# %#$!&$%&  )+$,+$)- ,-#()#*,&*)&(,!+(%+*!-*%-((!+*%+*!-(%-+ )+$,-$)- ,)#(,#*)&*,&(()#*,#*)&(,&+(!+*%-*!-(%)+ ,+$)-$,- ","I 2 3":" !#$%#$!& %&# !#$%&$!& %!# %#$!&$%& ()+*,+*)-(,-+()+*,-*)-(,)+(,+*)-*,-(","P 21 3":" !#*%+$)-(,&# !+*%-$)&(,!# %+*)-$,&(","I 21 3":" !#*%+$)-(,&# !+*%-$)&(,!# %+*)-$,&(()+$,#*!& %-+()#$,&*!- %)+(,#$!&*%- ","P 2/m -3":" !#$%#$!& %&# !#$%&$!& %!# %#$!&$%& $%& !& %#$!#&$%& !# %#$!%&$!& %# !#$","P 2/n -3":" !#$%#$!& %&# !#$%&$!& %!# %#$!&$%& *,-()-(,+*)+-*,-()+(,+*),-*)-(,+()+*","F 2/m -3":" !#$%#$!& %&# !#$%&$!& %!# %#$!&$%& $%& !& %#$!#&$%& !# %#$!%&$!& %# !#$ )+$,+$)- ,-#()#*,&*)&(,!+(%+*!-*%-($,- )- ,+$)+&*,&()#(,#*)%-*!-(%+(!+*(!+*%+*!-(%-+ )+$,-$)- ,)#(,#*)&*,&(*%-(!-(%+*!+-$,- )+ ,+$),&*)&(,#()#*()#*,#*)&(,&+(!+*%-*!-(%)+ ,+$)-$,- *,&()&(,#*)#-*%-(!+(%+*!,-$)- ,+ )+$","F 2/d -3":" !#$%#$!& %&# !#$%&$!& %!# %#$!&$%& 64=37=345675=64=375345674=67=3453756 )+$,+$)- ,-#()#*,&*)&(,!+(%+*!-*%-(68>3:>3896:9=<8=;:5;85<:4><7>;49;79<(!+*%+*!-(%-+ )+$,-$)- ,)#(,#*)&*,&(<4>;7>;49<79>68>3:93896:8=<:=;85;:5<()#*,#*)&(,&+(!+*%-*!-(%)+ ,+$)-$,- <8=;:=;8f<:f><4>;79;49<78>6:>3893:96","I 2/m -3":" !#$%#$!& %&# !#$%&$!& %!# %#$!&$%& $%& !& %#$!#&$%& !# %#$!%&$!& %# !#$()+*,+*)-(,-+()+*,-*)-(,)+(,+*)-*,-(*,-()-(,+*)+-*,-()+(,+*),-*)-(,+()+*","P 21/a -3":" !#*%+$)-(,&# !+*%-$)&(,!# %+*)-$,&($%&(!- ,+*)#&$%-(!+ ,#*)%&$!-(,+ )#*","I 21/a -3":" !#*%+$)-(,&# !+*%-$)&(,!# %+*)-$,&($%&(!- ,+*)#&$%-(!+ ,#*)%&$!-(,+ )#*()+$,#*g& %-+()#$,&*!- %)+(,#$!&*%- *,- )&(%#$!+-*,& )#(%+$!,-*)& %#(!+$","P 4 3 2":" !#$%#$!& %&# !#$%&$!& %!# %#$!&$%& ! &%$&!$#% # #%$#!$&% &!#!$#% &! &%$","P 42 3 2":" !#$%#$!& %&# !#$%&$!& %!# %#$!&$%& )(-,*-)*+,(+(+,*+)*-,(-)+)*+,(-)(-,*","F 4 3 2":" !#$%#$!& %&# !#$%&$!& %!# %#$!&$%& ! &%$&!$#% # #%$#!$&% &!#!$#% &! &%$ )+$,+$)- ,-#()#*,&*)&(,!+(%+*!-*%-(!(-%*-!*+%(+ +,$+)$-, -)#)*#,(&)(&,*(!+*%+*!-(%-+ )+$,-$)- ,)#(,#*)&*,&() -,$-)$+, +(#,*#)*&,(&)+!*+%(-!(-%*()#*,#*)&(,&+(!+*%-*!-(%)+ ,+$)-$,- )(&,*&)*#,(#(+%*+!*-%(-!+)$+, -) -,$","F 41 3 2":" !#$,+*)&(%-# !+$,&*)-(%!# ,+$)&*%-(:3>46=7<98;5;58<976=43>:97<58;>:3=46 )+$%#*!-(,&#()+*%&$!- ,!+(,#*)-$%& :;=4<>765839;94<5:6>83=79:6543>7;=8<(!+*,#$)- %&+ )#$%-*!&(,)#(%+*!&$,- 73=86>:<54;935469:<=8;>7576983=:;>4<()#*%+$!& ,-+(!#*,-$)& %)+ %#$!-*,&(7;>8<=:69435398657<>4;=:5:<94;=73>86","I 4 3 2":" !#$%#$!& %&# !#$%&$!& %!# %#$!&$%& ! &%$&!$#% # #%$#!$&% &!#!$#% &! &%$()+*,+*)-(,-+()+*,-*)-(,)+(,+*)-*,-()(-,*-)*+,(+(+,*+)*-,(-)+)*+,(-)(-,*","P 43 3 2":" !#*%+$)-(,&# !+*%-$)&(,!# %+*)-$,&(7;>46=:<5839398<5:6=4;>75:<983>7;=46","P 41 3 2":" !#*%+$)-(,&# !+*%-$)&(,!# %+*)-$,&(:3=8<>7694;5;54697<>83=:97654;=:3>8<","I 41 3 2":" !#*%+$)-(,&# !+*%-$)&(,!# %+*)-$,&(:3=8<>7694;5;54697<>83=:97654;=:3>8<()+$,#*!& %-+()#$,&*!- %)+(,#$!&*%- 7;>46=:<5839398<5:6=4;>75:<983>7;=46","P -4 3 m":" !#$%#$!& %&# !#$%&$!& %!# %#$!&$%& ! #%$#!$&% & #!$#%$&! &%#! #%$&!$&% ","F -4 3 m":" !#$%#$!& %&# !#$%&$!& %!# %#$!&$%& ! #%$#!$&% & #!$#%$&! &%#! #%$&!$&%  )+$,+$)- ,-#()#*,&*)&(,!+(%+*!-*%-(!(+%*+!*-%(- +)$+,$-) -,#)(#,*&)*&,((!+*%+*!-(%-+ )+$,-$)- ,)#(,#*)&*,&() +,$+)$-, -(#)*#,*&)(&,+!(+%*-!*-%(()#*,#*)&(,&+(!+*%-*!-(%)+ ,+$)-$,- )(#,*#)*&,(&(+!*+%*-!(-%+) +,$-)$-, ","I -4 3 m":" !#$%#$!& %&# !#$%&$!& %!# %#$!&$%& ! #%$#!$&% & #!$#%$&! &%#! #%$&!$&% ()+*,+*)-(,-+()+*,-*)-(,)+(,+*)-*,-()(+,*+)*-,(-(+)*+,*-)(-,+)(+,*-)*-,(","P -4 3 n":" !#$%#$!& %&# !#$%&$!& %!# %#$!&$%& )(+,*+)*-,(-(+)*+,*-)(-,+)(+,*-)*-,(","F -4 3 c":" !#$%#$!& %&# !#$%&$!& %!# %#$!&$%& )(+,*+)*-,(-(+)*+,*-)(-,+)(+,*-)*-,( )+$,+$)- ,-#()#*,&*)&(,!+(%+*!-*%-() #,$#)$&, &(#!*#%*&!(&%+! +%$-!$-% (!+*%+*!-(%-+ )+$,-$)- ,)#(,#*)&*,&(!(#%*#!*&%(& +!$+%$-! -%#) #,$&)$&, ()#*,#*)&(,&+(!+*%-*!-(%)+ ,+$)-$,- ! +%$+!$-% - #)$#,$&) &,#!(#%*&!*&%(","I -4 3 d":" !#*%+$)-(,&# !+*%-$)&(,!# %+*)-$,&(7354<9:6>8;=357<946>:;=857394<>:6=8;()+$,#*!& %-+()#$,&*!- %)+(,#$!&*%- :;98657<=43>;9:658<=73>49:;586=7<>43","P 4/m -3 2/m":" !#$%#$!& %&# !#$%&$!& %!# %#$!&$%& ! &%$&!$#% # #%$#!$&% &!#!$#% &! &%$$%& !& %#$!#&$%& !# %#$!%&$!& %# !#$%$#! #% &!$&$&! &% #!$#%&% &!$#%$#! ","P 4/n -3 2/n":" !#$%#$!& %&# !#$%&$!& %!# %#$!&$%& ! &%$&!$#% # #%$#!$&% &!#!$#% &! &%$*,-()-(,+*)+-*,-()+(,+*),-*)-(,+()+*,*+)(+,(-)*-*-)(-,(+)*+,-,(-)*+,*+)(","P 42/m -3 2/n":" !#$%#$!& %&# !#$%&$!& %!# %#$!&$%& )(-,*-)*+,(+(+,*+)*-,(-)+)*+,(-)(-,*$%& !& %#$!#&$%& !# %#$!%&$!& %# !#$,*+)(+,(-)*-*-)(-,(+)*+,-,(-)*+,*+)(","P 42/n -3 2/m":" !#$%#$!& %&# !#$%&$!& %!# %#$!&$%& )(-,*-)*+,(+(+,*+)*-,(-)+)*+,(-)(-,**,-()-(,+*)+-*,-()+(,+*),-*)-(,+()+*%$#! #% &!$&$&! &% #!$#%&% &!$#%$#! ","F 4/m -3 2/m":" !#$%#$!& %&# !#$%&$!& %!# %#$!&$%& ! &%$&!$#% # #%$#!$&% &!#!$#% &! &%$$%& !& %#$!#&$%& !# %#$!%&$!& %# !#$%$#! #% &!$&$&! &% #!$#%&% &!$#%$#!  )+$,+$)- ,-#()#*,&*)&(,!+(%+*!-*%-(!(-%*-!*+%(+ +,$+)$-, -)#)*#,(&)(&,*$,- )- ,+$)+&*,&()#(,#*)%-*!-(%+(!+*%*+!(+%(-!*-$-) -, +)$+,&,(&)*#,*#)((!+*%+*!-(%-+ )+$,-$)- ,)#(,#*)&*,&() -,$-)$+, +(#,*#)*&,(&)+!*+%(-!(-%**%-(!-(%+*!+-$,- )+ ,+$),&*)&(,#()#*,$+) +, -)$-*&)(&,(#)*#,-%(-!*+%*+!(()#*,#*)&(,&+(!+*%-*!-(%)+ ,+$)-$,- )(&,*&)*#,(#(+%*+!*-%(-!+)$+, -) -,$*,&()&(,#*)#-*%-(!+(%+*!,-$)- ,+ )+$,*#)(#,(&)*&*-!(-%(+!*+%-, -)$+,$+) ","F 4/m -3 2/c":" !#$%#$!& %&# !#$%&$!& %!# %#$!&$%& )(-,*-)*+,(+(+,*+)*-,(-)+)*+,(-)(-,*$%& !& %#$!#&$%& !# %#$!%&$!& %# !#$,*+)(+,(-)*-*-)(-,(+)*+,-,(-)*+,*+)( )+$,+$)- ,-#()#*,&*)&(,!+(%+*!-*%-() &,$&)$#, #(#%*#!*&%(&!+!$+% -! -%$$,- )- ,+$)+&*,&()#(,#*)%-*!-(%+(!+*,$#) #, &)$&*&!(&%(#!*#%-% -!$+%$+! (!+*%+*!-(%-+ )+$,-$)- ,)#(,#*)&*,&(!(&%*&!*#%(# +%$+!$-% -!#)$#, &) &,$*%-(!-(%+*!+-$,- )+ ,+$),&*)&(,#()#*%*#!(#%(&!*&$-! -% +!$+%&, &)$#,$#) ()#*,#*)&(,&+(!+*%-*!-(%)+ ,+$)-$,- ! -%$-!$+% + #,$#)$&, &)#!*#%(&!(&%**,&()&(,#*)#-*%-(!+(%+*!,-$)- ,+ )+$%$+! +% -!$-$&) &, #)$#,&%(&!*#%*#!(","F 41/d -3 2/m":" !#$,+*)&(%-# !+$,&*)-(%!# ,+$)&*%-(:3>46=7<98;5;58<976=43>:97<58;>:3=4664=3:>;85<79=64>3:5;89<74=6:>385;79<,$+! #%(-)*&*&)(-% #!$+,-%(&)*+,$#!  )+$%#*!-(,&#()+*%&$!- ,!+(,#*)-$%& :;=4<>765839;94<5:6>83=79:6543>7;=8<68>37=;49<:5=<8>;753496:4><:=;893756,*#!(+% &)$-*-!(&, +)$#%-, &!$+%*#)((!+*,#$)- %&+ )#$%-*!&(,)#(%+*!&$,- 73=86>:<54;935469:<=8;>7576983=:;>4<<4>;:=389675>68=379;45<:8=<7>;453:96%$#) +,(&!*-$&! -,(#)*+%&% -)$#,*+!(()#*%+$!& ,-+(!#*,-$)& %)+ %#$!-*,&(7;>8<=:69435398657<>4;=:5:<94;=73>86<8=;7>3456:9><4=;:9385678>67=349;:5<%*+)(#, -!$&$-) &%(+!*#,&,(-!*#%$+) ","F 41/d -3 2/c":" !#$,+*)&(%-# !+$,&*)-(%!# ,+$)&*%-(:3>46=7<98;5;58<976=43>:97<58;>:3=46<8>;7=3496:5><8=;793456:8><7=;493:56%*#)(+, &!$-$-! &,(+)*#%&, -!$#%*+)( )+$%#*!-(,&#()+*%&$!- ,!+(,#*)-$%& :;=4<>765839;94<5:6>83=79:6543>7;=8<<4=;:>385679>64=3:9;85<78=67>345;:9<%$+) #,(-!*&$&) -%(#!*+,&%(-)*#,$+! (!+*,#$)- %&+ )#$%-*!&(,)#(%+*!&$,- 73=86>:<54;935469:<=8;>7576983=:;>4<68=37>;45<:9=<4>;:5389674>6:=389;75<,*+!(#% -)$&*-)(&% +!$#,-,(&!*+%$#) ()#*%+$!& ,-+(!#*,-$)& %)+ %#$!-*,&(7;>8<=:69435398657<>4;=:5:<94;=73>8664>3:=;89<75=68>375;49<:4=<:>;853796,$#! +%(&)*-*&!(-, #)$+%-% &)$+,*#!(","I 4/m -3 2/m":" !#$%#$!& %&# !#$%&$!& %!# %#$!&$%& ! &%$&!$#% # #%$#!$&% &!#!$#% &! &%$$%& !& %#$!#&$%& !# %#$!%&$!& %# !#$%$#! #% &!$&$&! &% #!$#%&% &!$#%$#! ()+*,+*)-(,-+()+*,-*)-(,)+(,+*)-*,-()(-,*-)*+,(+(+,*+)*-,(-)+)*+,(-)(-,**,-()-(,+*)+-*,-()+(,+*),-*)-(,+()+*,*+)(+,(-)*-*-)(-,(+)*+,-,(-)*+,*+)(","I 41/a -3 2/d":" !#*%+$)-(,&# !+*%-$)&(,!# %+*)-$,&(:3=8<>7694;5;54697<>83=:97654;=:3>8<$%&(!- ,+*)#&$%-(!+ ,#*)%&$!-(,+ )#*4<97358;=:6>6>:;=8357<94=8;>:694<573()+$,#*!& %-+()#$,&*!- %)+(,#$!&*%- 7;>46=:<5839398<5:6=4;>75:<983>7;=46*,- )&(%#$!+-*,& )#(%+$!,-*)& %#(!+$865:;943>7<=<=73>4;9:658>43=7<5869:;","P 1 1 2":" !#$%#","P 1 1 21":" !#$%+","B 1 1 2":" !#$%#(g+*%+","A 1 2 1":" !#$!& )+$)-","C 1 21 1":" !#$)&()#*!&","I 1 2 1":" !#$!&.'/0'2","I 1 21 1":" !#$)&.'/0!-","P 1 1 m":" !# !&","P 1 1 b":" !# )&","B 1 1 m":" !# !&(!+(!-","B 1 1 b":" !# )&(!+()-","P 1 1 2/m":" !# !&$%#$%&","P 1 1 21/m":" !#$%+$%& !-","B 1 1 2/m":" !# !&$%#$%&(!+(!-*%+*%-","P 1 1 2/b":" !#$,#$%& )&","P 1 1 21/b":" !#$%&$,+ )-","B 1 1 2/b":" !#$,#$%& )&(!+*,+*%-()-","P 21 2 2":" !#$!&(%&*%#","P 2 21 2":" !# ,&$)&$%#","P 21 21 2 (a)":" !#*,#.%&$'&","P 21 2 21":" !#$!&(%-*%+","P 2 21 21":" !# %&$)-$,+","C 2 2 21a)":" !#*%+(,&$)-()#$,+ %&*!-","C 2 2 2a":" !#*,#.%&$'&()#$%# ,&*!&","F 2 2 2a":" !#*,#.%&$'& '/*%/.12$!2.!/$,/ %20'2.'#$%# 1&0!&","I 2 2 2a":" !#*,#.%&$'&()+$%+*!- ,-","P 21/m 21/m 2/n a":" !#*,#$)&(%&$%&.'& ,#*!#","P 42 21 2a":" !#*,#%.+'$+$'&.%&! -,*-","I 2 3a":" !#*,#.%&$'&!# ,- '&$%/$# !-*!/$%&.%()+$%+ ,-*!-)+(%&(!-*,#*+()&$)#*,- ,"},pb=/^[1-9]$/;function db(t){var e="";return 0<t.length&&(e=":"+Cl(t).join(" OR :")),new Lp(e)}var fb=function(t){void 0===t&&(t=""),this.name=t,this.partList=[]},mb={type:{configurable:!0}};mb.type.get=function(){return"Assembly"},fb.prototype.addPart=function(t,e){var i=new gb(t,e);return this.partList.push(i),i},fb.prototype.getAtomCount=function(i){return this.partList.reduce(function(t,e){return t+e.getAtomCount(i)},0)},fb.prototype.getResidueCount=function(i){return this.partList.reduce(function(t,e){return t+e.getResidueCount(i)},0)},fb.prototype.getInstanceCount=function(){var e=0;return this.partList.forEach(function(t){e+=t.matrixList.length}),e},fb.prototype.isIdentity=function(t){if(1!==this.partList.length)return!1;var e=this.partList[0];if(1!==e.matrixList.length)return!1;if(!(new ei).equals(e.matrixList[0]))return!1;var i=[];return t.eachChain(function(t){i.push(t.chainname)}),i=Cl(i),e.chainList.length===i.length},fb.prototype.getBoundingBox=function(i){var r=new Pi;return this.partList.forEach(function(t){var e=t.getBoundingBox(i);r.expandByPoint(e.min),r.expandByPoint(e.max)}),r},fb.prototype.getCenter=function(t){return this.getBoundingBox(t).getCenter(new ri)},fb.prototype.getSelection=function(){var e=[];return this.partList.forEach(function(t){e=e.concat(t.chainList)}),db(e)},Object.defineProperties(fb.prototype,mb);var gb=function(t,e){void 0===t&&(t=[]),void 0===e&&(e=[]),this.matrixList=t,this.chainList=e},vb={type:{configurable:!0}};vb.type.get=function(){return"AssemblyPart"},gb.prototype._getCount=function(t,e){var i=this,r=0;return t.eachChain(function(t){(0===i.chainList.length||i.chainList.includes(t.chainname))&&(r+=t[e])}),this.matrixList.length*r},gb.prototype.getAtomCount=function(t){return this._getCount(t,"atomCount")},gb.prototype.getResidueCount=function(t){return this._getCount(t,"residueCount")},gb.prototype.getBoundingBox=function(t){var e=new Pi,i=new Pi,r=this.getSelection(),n=t.getBoundingBox(r);return this.matrixList.forEach(function(t){i.copy(n).applyMatrix4(t),e.expandByPoint(i.min),e.expandByPoint(i.max)}),e},gb.prototype.getSelection=function(){return db(this.chainList)},gb.prototype.getView=function(t){var e=this.getSelection();return e?t.getView(e):t},gb.prototype.getInstanceList=function(){for(var t=[],e=0,i=this.matrixList.length;e<i;++e)t.push({id:e+1,name:e,matrix:this.matrixList[e]});return t},Object.defineProperties(gb.prototype,vb);var yb=function(t){this.structure=t,this.currentModelindex=null,this.currentChainid=null,this.currentResname=null,this.currentResno=null,this.currentInscode=void 0,this.currentHetero=null,this.previousResname="",this.previousHetero=null,this.ai=-1,this.ri=-1,this.ci=-1,this.mi=-1};function bb(t,e){if(e){de.Debug&&Yp.time("assignSecondaryStructure");var i=[];t.eachModel(function(t){t.eachChain(function(t){i.push(t.chainname)})});var c=i.slice().sort(),u=[];c.forEach(function(t){u.push(i.indexOf(t))});var l=e.helices.filter(function(t){return 0<=Pl(c,t[0])});l.sort(function(t,e){var i=t[0],r=e[0],n=t[1],o=e[1];if(i===r)return n===o?0:n<o?-1:1;var a=Pl(c,i),s=Pl(c,r);return u[a]<u[s]?-1:1});var p=t.residueStore;t.eachModel(function(t){var a=0,s=l.length;if(0!==s){var c=l[a],u=!1,h=!1;t.eachChain(function(t){var e=!1;if(t.chainname===c[0])for(var i=t.residueCount,r=t.residueOffset,n=r+i,o=r;o<n;++o)if(p.resno[o]===c[1]&&p.getInscode(o)===c[2]&&(u=!0),u&&(p.sstruc[o]=c[6],p.resno[o]===c[4]&&p.getInscode(o)===c[5]&&(u=!1,(a+=1)<s?(o=r-1,c=l[a],e=t.chainname!==c[0]):h=!0)),e||h)return})}});var d=e.sheets.filter(function(t){return 0<=Pl(c,t[0])});d.sort(function(t,e){var i=t[0],r=e[0];if(i===r)return 0;var n=Pl(c,i),o=Pl(c,r);return u[n]<u[o]?-1:1});var f="e".charCodeAt(0);t.eachModel(function(t){var a=0,s=d.length;if(0!==s){var c=d[a],u=!1,h=!1;t.eachChain(function(t){var e=!1;if(t.chainname===c[0])for(var i=t.residueCount,r=t.residueOffset,n=r+i,o=r;o<n;++o)if(p.resno[o]===c[1]&&p.getInscode(o)===c[2]&&(u=!0),u&&(p.sstruc[o]=f,p.resno[o]===c[4]&&p.getInscode(o)===c[5]&&(u=!1,(a+=1)<s?(o=r-1,c=d[a],e=t.chainname!==c[0]):h=!0)),e||h)return})}}),de.Debug&&Yp.timeEnd("assignSecondaryStructure")}}yb.prototype.addResidueType=function(t){for(var e=this.structure.atomStore,i=this.structure.residueStore,r=this.structure.residueMap,n=i.atomCount[t],o=i.atomOffset[t],a=new Array(n),s=0;s<n;++s)a[s]=e.atomTypeId[o+s];i.residueTypeId[t]=r.add(this.previousResname,a,this.previousHetero)},yb.prototype.addAtom=function(t,e,i,r,n,o,a,s){var c=this.structure.atomStore,u=this.structure.residueStore,h=this.structure.chainStore,l=this.structure.modelStore,p=!1,d=!1,f=!1;this.currentModelindex!==t?(f=d=p=!0,this.mi+=1,this.ci+=1,this.ri+=1):this.currentChainid!==i?(f=d=!0,this.ci+=1,this.ri+=1):this.currentResno===n&&this.currentResname===r&&this.currentInscode===s||(f=!0,this.ri+=1),this.ai+=1,p&&(l.growIfFull(),l.chainOffset[this.mi]=this.ci,l.chainCount[this.mi]=0,l.count+=1,h.modelIndex[this.ci]=this.mi),d&&(h.growIfFull(),h.setChainname(this.ci,e),h.setChainid(this.ci,i),h.residueOffset[this.ci]=this.ri,h.residueCount[this.ci]=0,h.count+=1,h.modelIndex[this.ci]=this.mi,l.chainCount[this.mi]+=1,u.chainIndex[this.ri]=this.ci),f&&(this.previousResname=this.currentResname,this.previousHetero=this.currentHetero,0<this.ri&&this.addResidueType(this.ri-1),u.growIfFull(),u.resno[this.ri]=n,void 0!==a&&(u.sstruc[this.ri]=a.charCodeAt(0)),void 0!==s&&(u.inscode[this.ri]=s.charCodeAt(0)),u.atomOffset[this.ri]=this.ai,u.atomCount[this.ri]=0,u.count+=1,u.chainIndex[this.ri]=this.ci,h.residueCount[this.ci]+=1),c.count+=1,c.residueIndex[this.ai]=this.ri,u.atomCount[this.ri]+=1,this.currentModelindex=t,this.currentChainid=i,this.currentResname=r,this.currentResno=n,this.currentInscode=s,this.currentHetero=o},yb.prototype.finalize=function(){this.previousResname=this.currentResname,this.previousHetero=this.currentHetero,-1<this.ri&&this.addResidueType(this.ri)};var xb,_b=(xb=function(t,e,i,r){for(var n=t.structure,o=t.residueIndexStart,a=n.getResidueProxy(),s=n.getResidueProxy(),c=n.getAtomProxy(),u=n.getAtomProxy(),h=Math.max(0,e-2);h<=e;++h)for(var l=2;l<5;++l)if(!(h+l>=t.residueCount)){a.index=o+h,s.index=o+h+l,c.index=a.traceAtomIndex,u.index=s.traceAtomIndex;var p=c.distanceTo(u);if(Math.abs(p-i[l-2])>r)return!1}return!0},function(t){de.Debug&&Yp.time("calculateSecondaryStructure"),t.eachPolymer(function(t){if(!(t.residueCount<4)){if(t.isCg())!function(t){for(var e=t.residueStore,i=t.residueIndexStart,r=new eb(t).position,n=new ri,o=new ri,a=0,s=t.residueCount;a<s;++a){n.fromArray(r.center,3*a),o.fromArray(r.center,3*a+3);var c=n.distanceTo(o);c<2&&1<c&&r.bending[a]<20&&(e.sstruc[i+a]="h".charCodeAt(0),e.sstruc[i+a+1]="h".charCodeAt(0))}}(t);else{if(!t.isProtein())return;!function(t){for(var e=t.residueStore,i=t.residueIndexStart,r=0,n=t.residueCount;r<n;++r){var o="c";xb(t,r,[5.45,5.18,6.37],2.1)?o="h":xb(t,r,[6.1,10.4,13],1.42)&&(o="e"),e.sstruc[i+r]=o.charCodeAt(0)}}(t)}var e,i=0;t.eachResidue(function(t){t.sstruc===e?i+=1:(1===i&&(t.index-=1,t.sstruc="c"),i=1,e=t.sstruc)})}}),de.Debug&&Yp.timeEnd("calculateSecondaryStructure")}),wb="ABCDEFGHIJKLMNOPQRSTUVWXYZ";function Sb(t){for(var e=wb.length,i=t,r=0,n=wb[i%e];e<=i;)i=Math.floor(i/e),n+=wb[i%e],r+=1;return 5<=r&&Yp.warn("chainname overflow"),n}function Ab(t,a){void 0===a&&(a=!1),de.Debug&&Yp.time("calculateChainnames");var e=!0;if(t.eachChain(function(t){t.chainname&&(e=!1)}),e){var s=t.modelStore,c=t.chainStore,u=t.residueStore,h=t.getAtomProxy(),l=t.getAtomProxy(),p=0,d=0,f=0,m=0,g=[];1===u.count?g.push({mIndex:0,chainname:"A",rStart:0,rCount:1}):t.eachResidueN(2,function(t,e){var i=!1,r=t.backboneType,n=e.backboneType,o=og;m=t.index,t.modelIndex!==e.modelIndex?i=!0:t.moleculeType!==e.moleculeType?i=!0:r!==o&&r===n&&(h.index=t.backboneEndAtomIndex,l.index=e.backboneStartAtomIndex,i=a?!h.hasBondTo(l):!h.connectedTo(l)),i||e.index!==u.count-1||(i=!0,m=e.index),i&&(g.push({mIndex:d,chainname:Sb(p),rStart:f,rCount:m-f+1}),p+=1,t.modelIndex!==e.modelIndex&&(p=0,d+=1),e.index===u.count-1&&m!==e.index&&g.push({mIndex:d,chainname:Sb(p),rStart:u.count-1,rCount:1}),f=e.index,m=e.index)}),c.count=0,g.forEach(function(t){!function(t,e,i,r){for(var n=c.count,o=0;o<r;++o)u.chainIndex[i+o]=n;c.growIfFull(),c.modelIndex[n]=t,c.setChainname(n,e),c.setChainid(n,e),c.residueOffset[n]=i,c.residueCount[n]=r,c.count+=1,s.chainCount[t]+=1}(t.mIndex,t.chainname,t.rStart,t.rCount)});var i=0;t.eachModel(function(t){s.chainOffset[t.index]=i,s.chainCount[t.index]-=1,i+=s.chainCount[t.index]})}de.Debug&&Yp.timeEnd("calculateChainnames")}function Mb(t){de.Debug&&Yp.time("calculateBonds"),Tb(t),Cb(t),de.Debug&&Yp.timeEnd("calculateBonds")}var Eb={"HIS|CD2|CG":2,"HIS|CE1|ND1":2,"ARG|CZ|NH2":2,"PHE|CE1|CZ":2,"PHE|CD2|CE2":2,"PHE|CD1|CG":2,"TRP|CD1|CG":2,"TRP|CD2|CE2":2,"TRP|CE3|CZ3":2,"TRP|CH2|CZ2":2,"ASN|CG|OD1":2,"GLN|CD|OE1":2,"TYR|CD1|CG":2,"TYR|CD2|CE2":2,"TYR|CE1|CZ":2,"ASP|CG|OD1":2,"GLU|CD|OE1":2,"G|C8|N7":2,"G|C4|C5":2,"G|C2|N3":2,"G|C6|O6":2,"C|C4|N3":2,"C|C5|C6":2,"C|C2|O2":2,"A|C2|N3":2,"A|C6|N1":2,"A|C4|C5":2,"A|C8|N7":2,"U|C5|C6":2,"U|C2|O2":2,"U|C4|O4":2,"DG|C8|N7":2,"DG|C4|C5":2,"DG|C2|N3":2,"DG|C6|O6":2,"DC|C4|N3":2,"DC|C5|C6":2,"DC|C2|O2":2,"DA|C2|N3":2,"DA|C6|N1":2,"DA|C4|C5":2,"DA|C8|N7":2,"DT|C5|C6":2,"DT|C2|O2":2,"DT|C4|O4":2};function Pb(t,e,i){var r;return e=(r=e<i?[e,i]:[i,e])[0],i=r[1],wg.includes(t)&&"C"===e&&"O"===i?2:Eg.includes(t)&&"OP1"===e&&"P"===i?2:Eb[t+"|"+e+"|"+i]||1}function Tb(t,g){void 0===g&&(g=!1),de.Debug&&Yp.time("calculateBondsWithin");var v=t.bondStore,y=t.rungBondStore,b=t.getAtomSet(!1),x=t.getAtomProxy(),_=t.getAtomProxy(),w=t.getBondProxy(),S=g?null:function(t){de.Debug&&Yp.time("calculateAtomBondMap");var r=[];return t.eachBond(function(t){var e=t.atomIndex1,i=t.atomIndex2;void 0===r[e]&&(r[e]=[]),r[e][i]=t.index}),de.Debug&&Yp.timeEnd("calculateAtomBondMap"),r}(t);t.eachResidue(function(t){if(!g&&S){var e=t.atomCount,i=t.atomOffset;if(500<e)return void Yp.warn("more than 500 atoms, skip residue for auto-bonding",t.qualifiedName());for(var r=t.getBonds(),n=r.atomIndices1,o=r.atomIndices2,a=r.bondOrders,s=n.length,c=0;c<s;++c){var u=n[c],h=o[c],l=u+i,p=h+i,d=S[l];if(void 0!==d&&void 0!==d[p])w.index=d[p],a[t.residueType.getBondIndex(u,h)]=w.bondOrder;else x.index=l,_.index=p,v.addBond(x,_,a[c])}}var f=t.residueType.traceAtomIndex,m=t.residueType.rungEndAtomIndex;-1!==f&&-1!==m&&(x.index=t.traceAtomIndex,_.index=t.rungEndAtomIndex,y.addBond(x,_),b.set(x.index),b.set(_.index))}),t.atomSetDict.rung=b,de.Debug&&Yp.timeEnd("calculateBondsWithin")}function Cb(t,n,o){void 0===n&&(n=!1),void 0===o&&(o=!1),de.Debug&&Yp.time("calculateBondsBetween");var a=t.bondStore,s=t.backboneBondStore,c=t.getAtomSet(!1),u=t.getAtomProxy(),h=t.getAtomProxy();function e(t,e){var i=t.backboneType,r=e.backboneType;i!==og&&i===r&&(u.index=t.backboneEndAtomIndex,h.index=e.backboneStartAtomIndex,(o&&u.hasBondTo(h)||u.connectedTo(h))&&(n||a.addBond(u,h,1),u.index=t.traceAtomIndex,h.index=e.traceAtomIndex,s.addBond(u,h),c.set(u.index),c.set(h.index)))}0===s.count&&s.resize(t.residueStore.count),t.eachResidueN(2,e);var i=t.getResidueProxy(),r=t.getResidueProxy();if(t.eachChain(function(t){0!==t.residueCount&&(i.index=t.residueOffset,r.index=t.residueOffset+t.residueCount-1,e(r,i))}),t.atomSetDict.backbone=c,!n){de.Debug&&Yp.time("calculateBondsBetween inter");var l=t.spatialHash;t.eachResidue(function(t){t.backboneType!==og||t.isWater()||t.eachAtom(function(e){e.isMetal()||l.eachWithin(e.x,e.y,e.z,4,function(t){h.index=t,e.modelIndex!==h.modelIndex||e.residueIndex===h.residueIndex||h.isMetal()||a.addBondIfConnected(e,h,1)})})}),de.Debug&&Yp.timeEnd("calculateBondsBetween inter")}de.Debug&&Yp.timeEnd("calculateBondsBetween")}function Ib(t){if(t.unitcell){de.Debug&&Yp.time("buildUnitcellAssembly");var n=t.unitcell,o=t.center.clone().applyMatrix4(n.cartToFrac),a=o.clone().floor(),s=function(t){var e=lb[t],i={};if(void 0===e)return console.warn("spacegroup '"+t+"' not found in symop library"),i;for(var r=[],n=0,o=e.length;n<o;n+=3){for(var a=[],s=0;s<3;++s)a.push(hb[e[n+s]]);r.push(a)}return r.forEach(function(t){var s=0,e=(new ei).set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1),c=e.elements;i[t.toString()]=e,t.forEach(function(t){for(var e=!1,i=!1,r=0,n=t.length;r<n;++r){var o=t[r];if("-"===o)e=!0;else if("+"===o)e=!1;else if("/"===o)i=!0;else if("X"===o)c[0+s]=e?-1:1;else if("Y"===o)c[4+s]=e?-1:1;else if("Z"===o)c[8+s]=e?-1:1;else if(pb.test(o)){var a=parseInt(o);i?c[12+s]/=a:c[12+s]=a}else Yp.warn("getSymmetryOperations: unknown token '"+o+"'")}s+=1})}),i}(n.spacegroup),c=new ri,u=new ri,e=new fb("UNITCELL"),i=m(),r=[];if(t.biomolDict.NCS){r.push.apply(r,[new ei].concat(t.biomolDict.NCS.partList[0].matrixList));var h=[];i.forEach(function(e){r.forEach(function(t){h.push(e.clone().multiply(t))})}),e.addPart(h)}else e.addPart(i);var l=new ri,p=new fb("SUPERCELL"),d=Array.prototype.concat.call(m(l.set(1,0,0)),m(l.set(0,1,0)),m(l.set(0,0,1)),m(l.set(-1,0,0)),m(l.set(0,-1,0)),m(l.set(0,0,-1)),m(l.set(1,1,0)),m(l.set(1,0,1)),m(l.set(0,1,1)),m(l.set(-1,-1,0)),m(l.set(-1,0,-1)),m(l.set(0,-1,-1)),m(l.set(1,-1,-1)),m(l.set(1,1,-1)),m(l.set(1,-1,1)),m(l.set(-1,1,1)),m(l.set(-1,-1,1)),m(l.set(-1,1,-1)),m(l.set(0,1,-1)),m(l.set(0,-1,1)),m(l.set(1,0,-1)),m(l.set(-1,0,1)),m(l.set(1,-1,0)),m(l.set(-1,1,0)),m(),m(l.set(1,1,1)),m(l.set(-1,-1,-1)));if(t.biomolDict.NCS){var f=[];d.forEach(function(e){r.forEach(function(t){f.push(e.clone().multiply(t))})}),p.addPart(f)}else p.addPart(d);t.biomolDict.UNITCELL=e,t.biomolDict.SUPERCELL=p,de.Debug&&Yp.timeEnd("buildUnitcellAssembly")}function m(i){var r=[];return Object.keys(s).forEach(function(t){var e=s[t].clone();c.copy(o).applyMatrix4(e).floor(),u.setFromMatrixPosition(e),u.sub(c),u.add(a),i&&u.add(i),e.setPosition(u),e.multiplyMatrices(n.fracToCart,e),e.multiply(n.cartToFrac),r.push(e)}),r}}var Ob=["H","C","O","N","S","P"],Lb=["NA","CL","FE"];function Rb(t){var e=t.trim().toUpperCase();parseInt(e.charAt(0))&&(e=e.substr(1)),parseInt(e.charAt(0))&&(e=e.substr(1));var i=e.length;if(0===i)return"";if(1===i)return e;if(2===i){if(-1!==Lb.indexOf(e))return e;if(-1!==Ob.indexOf(e[0]))return e[0]}return 3<=i&&-1!==Ob.indexOf(e[0])?e[0]:""}function Db(t){var e=t.bondHash,m=e.countArray,g=e.offsetArray,v=e.indexArray,y=t.getBondProxy();t.eachResidue(function(t){var e=t.residueType;if(void 0===e.bonds){var u=t.atomOffset,h=[],l=[],p=[],d={},f=u+t.atomCount;t.eachAtom(function(t){for(var e=t.index,i=g[e],r=0,n=m[e];r<n;++r){y.index=v[i+r];var o=y.atomIndex1;if(!(o<u||f<=o)){var a=y.atomIndex2;if(!(a<u||f<=a)){if(a<o){var s=a;a=o,o=s}var c=o+"|"+a;void 0===d[c]&&(d[c]=!0,h.push(o-u),l.push(a-u),p.push(y.bondOrder))}}}}),e.bonds={atomIndices1:h,atomIndices2:l,bondOrders:p}}})}var kb=[3,11,19,37,55,87],Bb=[4,12,20,38,56,88],Nb=[6,15,16,34],Fb=[1,7,8,9,17,35,53],zb=[2,10,18,36,54,86],Ub=[13,30,31,48,49,50,80,81,82,83,84,85,112],jb=[5,14,32,33,51,52,85],Gb=[9,17,35,53,85],Vb=function(t,e,i){this.structure=t,this.atomname=e,i=i||Rb(e),this.element=i,this.number=fg[i]||0,this.vdw=mg[this.number]||2,this.covalent=gg[this.number]||1.6};Vb.prototype.getDefaultValence=function(){var t=vg[this.number];return t?t[0]:-1},Vb.prototype.getValenceList=function(){return vg[this.number]||[]},Vb.prototype.getOuterShellElectronCount=function(){return yg[this.number]||2},Vb.prototype.isMetal=function(){return this.isAlkaliMetal()||this.isAlkalineEarthMetal()||this.isLanthanide()||this.isActinide()||this.isTransitionMetal()||this.isPostTransitionMetal()},Vb.prototype.isNonmetal=function(){return this.isDiatomicNonmetal()||this.isPolyatomicNonmetal()||this.isNobleGas()},Vb.prototype.isMetalloid=function(){return jb.includes(this.number)},Vb.prototype.isHalogen=function(){return Gb.includes(this.number)},Vb.prototype.isDiatomicNonmetal=function(){return Fb.includes(this.number)},Vb.prototype.isPolyatomicNonmetal=function(){return Nb.includes(this.number)},Vb.prototype.isAlkaliMetal=function(){return kb.includes(this.number)},Vb.prototype.isAlkalineEarthMetal=function(){return Bb.includes(this.number)},Vb.prototype.isNobleGas=function(){return zb.includes(this.number)},Vb.prototype.isTransitionMetal=function(){var t=this.number;return 21<=t&&t<=29||39<=t&&t<=47||72<=t&&t<=79||104<=t&&t<=108},Vb.prototype.isPostTransitionMetal=function(){return Ub.includes(this.number)},Vb.prototype.isLanthanide=function(){return 57<=this.number&&this.number<=71},Vb.prototype.isActinide=function(){return 89<=this.number&&this.number<=103};var Hb=function(t){this.structure=t,this.dict={},this.list=[],this.structure=t};Hb.prototype.add=function(t,e){t=t.toUpperCase(),e=e?e.toUpperCase():Rb(t);var i=t+"|"+e,r=this.dict[i];if(void 0===r){var n=new Vb(this.structure,t,e);r=this.list.length,this.dict[i]=r,this.list.push(n)}return r},Hb.prototype.get=function(t){return this.list[t]};var $b=function(t,e,i,r,n,o){this.structure=t,this.bondReferenceAtomIndices=[],this.resname=e,this.atomTypeIdList=i,this.hetero=r?1:0,this.chemCompType=n,this.bonds=o,this.atomCount=i.length,this.moleculeType=this.getMoleculeType(),this.backboneType=this.getBackboneType(0),this.backboneEndType=this.getBackboneType(-1),this.backboneStartType=this.getBackboneType(1),this.backboneIndexList=this.getBackboneIndexList();var a=Lg[this.backboneType],s=Lg[this.backboneStartType],c=Lg[this.backboneEndType],u=this.getAtomIndexByName(a.trace);this.traceAtomIndex=bl(u,-1);var h=this.getAtomIndexByName(a.direction1);this.direction1AtomIndex=bl(h,-1);var l=this.getAtomIndexByName(a.direction2);this.direction2AtomIndex=bl(l,-1);var p=this.getAtomIndexByName(s.backboneStart);this.backboneStartAtomIndex=bl(p,-1);var d,f=this.getAtomIndexByName(c.backboneEnd);this.backboneEndAtomIndex=bl(f,-1),d=Mg.includes(e)?this.getAtomIndexByName("N1"):this.getAtomIndexByName("N3"),this.rungEndAtomIndex=bl(d,-1)};$b.prototype.getBackboneIndexList=function(){var t,e=[];switch(this.moleculeType){case 3:t=Ig;break;case 4:case 5:t=Og;break;default:return e}for(var i=this.structure.atomMap,r=this.atomTypeIdList,n=0,o=this.atomCount;n<o;++n){var a=i.get(r[n]);t.includes(a.atomname)&&e.push(n)}return e},$b.prototype.getMoleculeType=function(){return this.isProtein()?3:this.isRna()?4:this.isDna()?5:this.isWater()?1:this.isIon()?2:this.isSaccharide()?6:0},$b.prototype.getBackboneType=function(t){return this.hasProteinBackbone(t)?1:this.hasRnaBackbone(t)?2:this.hasDnaBackbone(t)?3:this.hasCgProteinBackbone(t)?4:this.hasCgRnaBackbone(t)?5:this.hasCgDnaBackbone(t)?6:og},$b.prototype.isProtein=function(){return this.chemCompType?ag.includes(this.chemCompType):this.hasAtomWithName("CA","C","N")||wg.includes(this.resname)},$b.prototype.isCg=function(){var t=this.backboneType;return 4===t||5===t||6===t},$b.prototype.isNucleic=function(){return this.isRna()||this.isDna()},$b.prototype.isRna=function(){return this.chemCompType?sg.includes(this.chemCompType):this.hasAtomWithName(["P","O3'","O3*"],["C4'","C4*"],["O2'","O2*","F2'","F2*"])||Sg.includes(this.resname)&&this.hasAtomWithName(["O2'","O2*","F2'","F2*"])},$b.prototype.isDna=function(){return this.chemCompType?cg.includes(this.chemCompType):this.hasAtomWithName(["P","O3'","O3*"],["C3'","C3*"])&&!this.hasAtomWithName(["O2'","O2*","F2'","F2*"])||Ag.includes(this.resname)},$b.prototype.isHetero=function(){return 1===this.hetero},$b.prototype.isIon=function(){return Tg.includes(this.resname)},$b.prototype.isWater=function(){return Pg.includes(this.resname)},$b.prototype.isSaccharide=function(){return this.chemCompType?ug.includes(this.chemCompType):Cg.includes(this.resname)},$b.prototype.isStandardAminoacid=function(){return wg.includes(this.resname)},$b.prototype.isStandardBase=function(){return Eg.includes(this.resname)},$b.prototype.hasBackboneAtoms=function(t,e){var i=Lg[e];return-1===t?this.hasAtomWithName(i.trace,i.backboneEnd,i.direction1,i.direction2):0===t?this.hasAtomWithName(i.trace,i.direction1,i.direction2):1===t?this.hasAtomWithName(i.trace,i.backboneStart,i.direction1,i.direction2):this.hasAtomWithName(i.trace,i.backboneStart,i.backboneEnd,i.direction1,i.direction2)},$b.prototype.hasProteinBackbone=function(t){return this.isProtein()&&this.hasBackboneAtoms(t,1)},$b.prototype.hasRnaBackbone=function(t){return this.isRna()&&this.hasBackboneAtoms(t,2)},$b.prototype.hasDnaBackbone=function(t){return this.isDna()&&this.hasBackboneAtoms(t,3)},$b.prototype.hasCgProteinBackbone=function(t){return this.atomCount<7&&this.isProtein()&&this.hasBackboneAtoms(t,4)},$b.prototype.hasCgRnaBackbone=function(t){return this.atomCount<11&&this.isRna()&&this.hasBackboneAtoms(t,5)},$b.prototype.hasCgDnaBackbone=function(t){return this.atomCount<11&&this.isDna()&&this.hasBackboneAtoms(t,6)},$b.prototype.hasBackbone=function(t){return this.hasProteinBackbone(t)||this.hasRnaBackbone(t)||this.hasDnaBackbone(t)||this.hasCgProteinBackbone(t)||this.hasCgRnaBackbone(t)||this.hasCgDnaBackbone(t)},$b.prototype.getAtomIndexByName=function(t){var e=this.atomCount,i=this.structure.atomMap,r=this.atomTypeIdList;if(Array.isArray(t))for(var n=0;n<e;++n){var o=r[n];if(t.includes(i.get(o).atomname))return n}else for(var a=0;a<e;++a){var s=r[a];if(t===i.get(s).atomname)return a}},$b.prototype.hasAtomWithName=function(){for(var t=[],e=arguments.length;e--;)t[e]=arguments[e];for(var i=t.length,r=0;r<i;++r)if(void 0!==t[r]&&void 0===this.getAtomIndexByName(t[r]))return!1;return!0},$b.prototype.getBonds=function(t){return void 0===this.bonds&&(this.bonds=function(t){var e=t.structure,i=e.getAtomProxy(),r=e.getAtomProxy(),n=t.atomCount,o=t.atomOffset,a=o+n-1,s=[],c=[],u=[];if(500<n)de.Debug&&Yp.warn("more than 500 atoms, skip residue for auto-bonding",t.qualifiedName());else if(50<n)for(var h=new ub(t,!0),l=t.isCg()?1.2:2.3,p=o;p<a;++p){i.index=p;for(var d=i.covalent+l+.3,f=h.nearest(i,1/0,d*d),m=f.length,g=0;g<m;++g)r.index=f[g].index,i.index<r.index&&i.connectedTo(r)&&(s.push(i.index-o),c.push(r.index-o),u.push(Pb(i.resname,i.atomname,r.atomname)))}else for(var v=o;v<a;++v)for(var y=(i.index=v)+1;y<=a;++y)r.index=y,i.connectedTo(r)&&(s.push(v-o),c.push(y-o),u.push(Pb(i.resname,i.atomname,r.atomname)));return{atomIndices1:s,atomIndices2:c,bondOrders:u}}(t)),this.bonds},$b.prototype.getRings=function(){return void 0===this.rings&&this.calculateRings(),this.rings},$b.prototype.getBondGraph=function(){return void 0===this.bondGraph&&this.calculateBondGraph(),this.bondGraph},$b.prototype.getAromatic=function(t){return void 0===this.aromaticAtoms&&this.calculateAromatic(this.structure.getResidueProxy(t.residueIndex)),this.aromaticAtoms},$b.prototype.getAromaticRings=function(t){return void 0===this.aromaticRings&&this.calculateAromatic(t),this.aromaticRings},$b.prototype.calculateBondGraph=function(){for(var t=this.bondGraph={},e=this.getBonds(),i=e.atomIndices1.length,r=e.atomIndices1,n=e.atomIndices2,o=0;o<i;++o){var a=r[o],s=n[o];(t[a]=t[a]||[]).push(s),(t[s]=t[s]||[]).push(a)}},$b.prototype.calculateRings=function(){for(var t=function(t,e){for(var i={count:e,visited:new Int32Array(e),queue:new Int32Array(e),pred:new Int32Array(e),left:new Int32Array(Zb),right:new Int32Array(Zb),color:new Int32Array(e),currentColor:0,rings:[],atomRings:[],bonds:t},r=0;r<e;r++)i.visited[r]=-1,i.pred[r]=-1;return i}(this.getBondGraph(),this.atomCount),e=0;e<t.count;e++)0<=t.visited[e]||Yb(t,e);this.rings={atomRings:t.atomRings,rings:t.rings}},$b.prototype.isAromatic=function(t){return this.aromaticAtoms=this.getAromatic(t),1===this.aromaticAtoms[t.index-t.residueAtomOffset]},$b.prototype.calculateAromatic=function(e){var i=this,r=this.aromaticAtoms=new Uint8Array(this.atomCount),t=this.getRings().rings,n=t.map(function(t){return function(t){if(t.some(function(t){return!Wb.includes(t.number)}))return!1;var e=0,i=new kv(3,t.length),r=i.data;return t.forEach(function(t){r[e+0]=t.x,r[e+1]=t.y,r[e+2]=t.z,e+=3}),new $y(i).vecC.length()<Xb}(t.map(function(t){return i.structure.getAtomProxy(t+e.atomOffset)}))}),o=this.aromaticRings=[];t.forEach(function(t,e){n[e]&&(o.push(t),t.forEach(function(t){return r[t]=1}))})},$b.prototype.assignBondReferenceAtomIndices=function(){for(var t=this.getBondGraph(),e=this.getRings(),i=e.atomRings,r=e.rings,n=this.bonds,o=n.atomIndices1,a=n.atomIndices2,s=n.bondOrders,c=this.bondReferenceAtomIndices,u=n.atomIndices1.length,h=c.length=0;h<u;++h)if(!(s[h]<=1)){var l=void 0,p=o[h],d=a[h],f=i[p],m=i[d];if(f&&m)for(var g=0;g<f.length;g++)if(-1!==m.indexOf(f[g])){l=r[f[g]];break}if(1<t[p].length)for(var v=0;v<t[p].length;++v){var y=t[p][v];if(y!==d&&(void 0===l||-1!==l.indexOf(y))){c[h]=y;break}}else if(1<t[d].length)for(var b=0;b<t[d].length;++b){var x=t[d][b];if(x!==p&&(void 0===l||-1!==l.indexOf(x))){c[h]=x;break}}}},$b.prototype.getBondIndex=function(t,e){for(var i=this.bonds,r=i.atomIndices1,n=i.atomIndices2,o=r.indexOf(t),a=n.indexOf(e),s=a;-1!==o;){for(;-1!==a;){if(o===a)return o;a=n.indexOf(e,a+1)}o=r.indexOf(t,o+1),a=s}},$b.prototype.getBondReferenceAtomIndex=function(t,e){var i=this.getBondIndex(t,e);if(void 0!==i)return 0===this.bondReferenceAtomIndices.length&&this.assignBondReferenceAtomIndices(),this.bondReferenceAtomIndices[i]};var Wb=[5,6,7,8,14,15,16,32,33,50,51,83],Xb=.05;function qb(t,e,i){if(!(i<e)){for(var r=t.pred,n=t.color,o=t.left,a=t.right,s=++t.currentColor,c=e,u=0;u<Zb&&(n[c]=s,!((c=r[c])<0));u++);var h=0,l=0,p=!1,d=0;c=i;for(var f=0;f<Zb;f++){if(n[c]===s){d=c,p=!0;break}if((c=r[a[l++]=c])<0)break}if(p){c=e;for(var m=0;m<Zb&&d!==(o[h++]=c)&&!((c=r[c])<0);m++);for(var g=h+l,v=new Array(g),y=0,b=0;b<h;b++)v[y++]=o[b];for(var x=l-1;0<=x;x--)v[y++]=a[x];for(var _=t.rings.length,w=0;w<g;++w){var S=v[w];t.atomRings[S]?t.atomRings[S].push(_):t.atomRings[S]=[_]}t.rings.push(v)}}}function Yb(t,e){var i=t.bonds,r=t.visited,n=t.queue,o=t.pred;r[e]=1,n[0]=e;for(var a=0,s=1;a<s;){var c=n[a++];if(void 0!==i[c])for(var u=i[c].length,h=0;h<u;h++){var l=i[c][h];0<r[l]?o[l]!==c&&o[c]!==l&&qb(t,c,l):(r[l]=1,o[n[s++]=l]=c)}}}var Zb=4;var Kb=function(t){this.structure=t,this.dict={},this.list=[]};Kb.prototype.add=function(t,e,i,r,n){void 0===r&&(r=""),t=t.toUpperCase();var o,a,s=(o=i,void 0===(a=r)&&(a=""),t+"|"+e.join(",")+"|"+(o?1:0)+"|"+a),c=this.dict[s];if(void 0===c){var u=new $b(this.structure,t,e,i,r,n);c=this.list.length,this.dict[s]=c,this.list.push(u)}return c},Kb.prototype.get=function(t){return this.list[t]};var Jb=function(t,e){void 0===e&&(e=0),this.structure=t,this.index=e,this.bondStore=t.bondStore,this._v12=new ri,this._v13=new ri,this._ap1=this.structure.getAtomProxy(),this._ap2=this.structure.getAtomProxy(),this._ap3=this.structure.getAtomProxy()},Qb={atom1:{configurable:!0},atom2:{configurable:!0},atomIndex1:{configurable:!0},atomIndex2:{configurable:!0},bondOrder:{configurable:!0}};Qb.atom1.get=function(){return this.structure.getAtomProxy(this.atomIndex1)},Qb.atom2.get=function(){return this.structure.getAtomProxy(this.atomIndex2)},Qb.atomIndex1.get=function(){return this.bondStore.atomIndex1[this.index]},Qb.atomIndex1.set=function(t){this.bondStore.atomIndex1[this.index]=t},Qb.atomIndex2.get=function(){return this.bondStore.atomIndex2[this.index]},Qb.atomIndex2.set=function(t){this.bondStore.atomIndex2[this.index]=t},Qb.bondOrder.get=function(){return this.bondStore.bondOrder[this.index]},Qb.bondOrder.set=function(t){this.bondStore.bondOrder[this.index]=t},Jb.prototype.getOtherAtomIndex=function(t){return t===this.atomIndex1?this.atomIndex2:this.atomIndex1},Jb.prototype.getOtherAtom=function(t){return this.structure.getAtomProxy(this.getOtherAtomIndex(t.index))},Jb.prototype.getReferenceAtomIndex=function(){var t=this._ap1,e=this._ap2;if(t.index=this.atomIndex1,e.index=this.atomIndex2,t.residueIndex===e.residueIndex){var i=t.index-t.residueAtomOffset,r=e.index-e.residueAtomOffset,n=t.residueType.getBondReferenceAtomIndex(i,r);if(void 0!==n)return n+t.residueAtomOffset;console.warn("No reference atom found",t.index,e.index)}},Jb.prototype.calculateShiftDir=function(t){void 0===t&&(t=new ri);var e=this._ap1,i=this._ap2,r=this._ap3,n=this._v12,o=this._v13;e.index=this.atomIndex1,i.index=this.atomIndex2;var a=this.getReferenceAtomIndex();n.subVectors(e,i).normalize(),void 0!==a?(r.index=a,o.subVectors(e,r)):o.copy(e),o.normalize();var s=n.dot(o);return 1-Math.abs(s)<1e-5&&(o.set(1,0,0),s=n.dot(o),1-Math.abs(s)<1e-5&&(o.set(0,1,0),s=n.dot(o))),t.copy(o.sub(n.multiplyScalar(s))).normalize()},Jb.prototype.qualifiedName=function(){return this.atomIndex1+"="+this.atomIndex2},Jb.prototype.clone=function(){return new Jb(this.structure,this.index)},Jb.prototype.toObject=function(){return{atomIndex1:this.atomIndex1,atomIndex2:this.atomIndex2,bondOrder:this.bondOrder}},Object.defineProperties(Jb.prototype,Qb);var tx=function(t,e){void 0===e&&(e=0),this.structure=t,this.index=e,this.chainStore=t.chainStore,this.residueStore=t.residueStore,this.atomStore=t.atomStore,this.residueMap=t.residueMap,this.atomMap=t.atomMap},ex={entity:{configurable:!0},entityIndex:{configurable:!0},chain:{configurable:!0},chainIndex:{configurable:!0},atomOffset:{configurable:!0},atomCount:{configurable:!0},atomEnd:{configurable:!0},modelIndex:{configurable:!0},chainname:{configurable:!0},chainid:{configurable:!0},resno:{configurable:!0},sstruc:{configurable:!0},inscode:{configurable:!0},residueType:{configurable:!0},resname:{configurable:!0},hetero:{configurable:!0},moleculeType:{configurable:!0},backboneType:{configurable:!0},backboneStartType:{configurable:!0},backboneEndType:{configurable:!0},traceAtomIndex:{configurable:!0},direction1AtomIndex:{configurable:!0},direction2AtomIndex:{configurable:!0},backboneStartAtomIndex:{configurable:!0},backboneEndAtomIndex:{configurable:!0},rungEndAtomIndex:{configurable:!0},x:{configurable:!0},y:{configurable:!0},z:{configurable:!0}};ex.entity.get=function(){return this.structure.entityList[this.entityIndex]},ex.entityIndex.get=function(){return this.chainStore.entityIndex[this.chainIndex]},ex.chain.get=function(){return this.structure.getChainProxy(this.chainIndex)},ex.chainIndex.get=function(){return this.residueStore.chainIndex[this.index]},ex.chainIndex.set=function(t){this.residueStore.chainIndex[this.index]=t},ex.atomOffset.get=function(){return this.residueStore.atomOffset[this.index]},ex.atomOffset.set=function(t){this.residueStore.atomOffset[this.index]=t},ex.atomCount.get=function(){return this.residueStore.atomCount[this.index]},ex.atomCount.set=function(t){this.residueStore.atomCount[this.index]=t},ex.atomEnd.get=function(){return this.atomOffset+this.atomCount-1},ex.modelIndex.get=function(){return this.chainStore.modelIndex[this.chainIndex]},ex.chainname.get=function(){return this.chainStore.getChainname(this.chainIndex)},ex.chainid.get=function(){return this.chainStore.getChainid(this.chainIndex)},ex.resno.get=function(){return this.residueStore.resno[this.index]},ex.resno.set=function(t){this.residueStore.resno[this.index]=t},ex.sstruc.get=function(){return this.residueStore.getSstruc(this.index)},ex.sstruc.set=function(t){this.residueStore.setSstruc(this.index,t)},ex.inscode.get=function(){return this.residueStore.getInscode(this.index)},ex.inscode.set=function(t){this.residueStore.setInscode(this.index,t)},ex.residueType.get=function(){return this.residueMap.get(this.residueStore.residueTypeId[this.index])},ex.resname.get=function(){return this.residueType.resname},ex.hetero.get=function(){return this.residueType.hetero},ex.moleculeType.get=function(){return this.residueType.moleculeType},ex.backboneType.get=function(){return this.residueType.backboneType},ex.backboneStartType.get=function(){return this.residueType.backboneStartType},ex.backboneEndType.get=function(){return this.residueType.backboneEndType},ex.traceAtomIndex.get=function(){return this.residueType.traceAtomIndex+this.atomOffset},ex.direction1AtomIndex.get=function(){return this.residueType.direction1AtomIndex+this.atomOffset},ex.direction2AtomIndex.get=function(){return this.residueType.direction2AtomIndex+this.atomOffset},ex.backboneStartAtomIndex.get=function(){return this.residueType.backboneStartAtomIndex+this.atomOffset},ex.backboneEndAtomIndex.get=function(){return this.residueType.backboneEndAtomIndex+this.atomOffset},ex.rungEndAtomIndex.get=function(){return this.residueType.rungEndAtomIndex+this.atomOffset},ex.x.get=function(){for(var t=0,e=this.atomOffset;e<=this.atomEnd;++e)t+=this.atomStore.x[e];return t/this.atomCount},ex.y.get=function(){for(var t=0,e=this.atomOffset;e<=this.atomEnd;++e)t+=this.atomStore.y[e];return t/this.atomCount},ex.z.get=function(){for(var t=0,e=this.atomOffset;e<=this.atomEnd;++e)t+=this.atomStore.z[e];return t/this.atomCount},tx.prototype.eachAtom=function(t,e){var i=this.atomCount,r=this.atomOffset,n=this.structure._ap,o=r+i;if(e&&e.atomOnlyTest)for(var a=e.atomOnlyTest,s=r;s<o;++s)n.index=s,a(n)&&t(n);else for(var c=r;c<o;++c)n.index=c,t(n)},tx.prototype.positionToArray=function(t,e){return void 0===t&&(t=[]),void 0===e&&(e=0),t[e+0]=this.x,t[e+1]=this.y,t[e+2]=this.z,t},tx.prototype.isProtein=function(){return 3===this.residueType.moleculeType},tx.prototype.isNucleic=function(){var t=this.residueType.moleculeType;return 4===t||5===t},tx.prototype.isRna=function(){return 4===this.residueType.moleculeType},tx.prototype.isDna=function(){return 5===this.residueType.moleculeType},tx.prototype.isCg=function(){var t=this.residueType.backboneType;return 4===t||5===t||6===t},tx.prototype.isPolymer=function(){if(0<this.structure.entityList.length)return this.entity.isPolymer();var t=this.residueType.moleculeType;return 3===t||4===t||5===t},tx.prototype.isHetero=function(){return 1===this.residueType.hetero},tx.prototype.isWater=function(){return 1===this.residueType.moleculeType},tx.prototype.isIon=function(){return 2===this.residueType.moleculeType},tx.prototype.isSaccharide=function(){return 6===this.residueType.moleculeType},tx.prototype.isStandardAminoacid=function(){return this.residueType.isStandardAminoacid()},tx.prototype.isStandardBase=function(){return this.residueType.isStandardBase()},tx.prototype.isHelix=function(){return lg.includes(this.sstruc)},tx.prototype.isSheet=function(){return pg.includes(this.sstruc)},tx.prototype.isTurn=function(){return dg.includes(this.sstruc)&&this.isProtein()},tx.prototype.getAtomType=function(t){return this.atomMap.get(this.atomStore.atomTypeId[t])},tx.prototype.getResname1=function(){return _g[this.resname.toUpperCase()]||"X"},tx.prototype.getBackboneType=function(t){switch(t){case-1:return this.residueType.backboneStartType;case 1:return this.residueType.backboneEndType;default:return this.residueType.backboneType}},tx.prototype.getAtomIndexByName=function(t){var e=this.residueType.getAtomIndexByName(t);return void 0!==e&&(e+=this.atomOffset),e},tx.prototype.hasAtomWithName=function(t){return this.residueType.hasAtomWithName(t)},tx.prototype.getAtomnameList=function(){console.warn("getAtomnameList - might be expensive");for(var t=this.atomCount,e=this.atomOffset,i=new Array(t),r=0;r<t;++r)i[r]=this.getAtomType(e+r).atomname;return i},tx.prototype.connectedTo=function(t){var e=this.structure.getAtomProxy(this.backboneEndAtomIndex),i=this.structure.getAtomProxy(t.backboneStartAtomIndex);return!(!e||!i)&&e.connectedTo(i)},tx.prototype.getNextConnectedResidue=function(){var t=this.chainStore.residueOffset[this.chainIndex],e=this.chainStore.residueCount[this.chainIndex],i=this.index+1;if(i<t+e){var r=this.structure.getResidueProxy(i);if(this.connectedTo(r))return r}else if(i===t+e){var n=this.structure.getResidueProxy(t);if(this.connectedTo(n))return n}},tx.prototype.getPreviousConnectedResidue=function(t){var e=this.chainStore.residueOffset[this.chainIndex],i=this.index-1;if(e<=i){var r=bl(t,this.structure.getResidueProxy());if(r.index=i,r.connectedTo(this))return r}else if(i===e-1){var n=this.chainStore.residueCount[this.chainIndex],o=bl(t,this.structure.getResidueProxy());if(o.index=e+n-1,o.connectedTo(this))return o}},tx.prototype.getBonds=function(){return this.residueType.getBonds(this)},tx.prototype.getRings=function(){return this.residueType.getRings()},tx.prototype.getAromaticRings=function(){return this.residueType.getAromaticRings(this)},tx.prototype.qualifiedName=function(t){void 0===t&&(t=!1);var e="";return this.resname&&!t&&(e+="["+this.resname+"]"),void 0!==this.resno&&(e+=this.resno),this.inscode&&(e+="^"+this.inscode),this.chain&&(e+=":"+this.chainname),e+="/"+this.modelIndex},tx.prototype.clone=function(){return new tx(this.structure,this.index)},tx.prototype.toObject=function(){return{index:this.index,chainIndex:this.chainIndex,atomOffset:this.atomOffset,atomCount:this.atomCount,resno:this.resno,resname:this.resname,sstruc:this.sstruc}},Object.defineProperties(tx.prototype,ex);var ix=function(t,e,i){this.structure=t,this.residueIndexStart=e,this.residueIndexEnd=i,this.chainStore=t.chainStore,this.residueStore=t.residueStore,this.atomStore=t.atomStore,this.residueCount=i-e+1;var r=this.structure.getResidueProxy(this.residueIndexStart),n=this.structure.getResidueProxy(this.residueIndexEnd);this.isPrevConnected=void 0!==r.getPreviousConnectedResidue();var o=n.getNextConnectedResidue();this.isNextConnected=void 0!==o,this.isNextNextConnected=void 0!==o&&void 0!==o.getNextConnectedResidue(),this.isCyclic=n.connectedTo(r),this.__residueProxy=this.structure.getResidueProxy()},rx={chainIndex:{configurable:!0},modelIndex:{configurable:!0},chainname:{configurable:!0}};rx.chainIndex.get=function(){return this.residueStore.chainIndex[this.residueIndexStart]},rx.modelIndex.get=function(){return this.chainStore.modelIndex[this.chainIndex]},rx.chainname.get=function(){return this.chainStore.getChainname(this.chainIndex)},ix.prototype.isProtein=function(){return this.__residueProxy.index=this.residueIndexStart,this.__residueProxy.isProtein()},ix.prototype.isCg=function(){return this.__residueProxy.index=this.residueIndexStart,this.__residueProxy.isCg()},ix.prototype.isNucleic=function(){return this.__residueProxy.index=this.residueIndexStart,this.__residueProxy.isNucleic()},ix.prototype.getMoleculeType=function(){return this.__residueProxy.index=this.residueIndexStart,this.__residueProxy.moleculeType},ix.prototype.getBackboneType=function(t){return this.__residueProxy.index=this.residueIndexStart,this.__residueProxy.getBackboneType(t)},ix.prototype.getAtomIndexByType=function(t,e){this.isCyclic?-1===t?t=this.residueCount-1:t===this.residueCount&&(t=0):(-1!==t||this.isPrevConnected||(t+=1),t!==this.residueCount||this.isNextNextConnected||(t-=1));var i,r=this.__residueProxy;switch(r.index=this.residueIndexStart+t,e){case"trace":i=r.traceAtomIndex;break;case"direction1":i=r.direction1AtomIndex;break;case"direction2":i=r.direction2AtomIndex;break;default:i=r.getAtomIndexByName(e)}return i},ix.prototype.eachAtom=function(e,i){this.eachResidue(function(t){t.eachAtom(e,i)})},ix.prototype.eachAtomN=function(t,e,i){for(var r=this.residueCount,n=new Array(t),o=0;o<t;++o)n[o]=this.structure.getAtomProxy(this.getAtomIndexByType(o,i));e.apply(this,n);for(var a=t;a<r;++a){for(var s=1;s<t;++s)n[s-1].index=n[s].index;n[t-1].index=this.getAtomIndexByType(a,i),e.apply(this,n)}},ix.prototype.eachResidue=function(t){for(var e=this.structure.getResidueProxy(),i=this.residueCount,r=this.residueIndexStart,n=0;n<i;++n)e.index=r+n,t(e)},ix.prototype.qualifiedName=function(){var t=this.structure.getResidueProxy(this.residueIndexStart),e=this.structure.getResidueProxy(this.residueIndexEnd);return t.qualifiedName()+" - "+e.qualifiedName()},Object.defineProperties(ix.prototype,rx);var nx=function(t,e){void 0===e&&(e=0),this.structure=t,this.index=e,this.chainStore=t.chainStore,this.residueStore=t.residueStore},ox={entity:{configurable:!0},model:{configurable:!0},entityIndex:{configurable:!0},modelIndex:{configurable:!0},residueOffset:{configurable:!0},residueCount:{configurable:!0},residueEnd:{configurable:!0},atomOffset:{configurable:!0},atomEnd:{configurable:!0},atomCount:{configurable:!0},chainname:{configurable:!0},chainid:{configurable:!0}};ox.entity.get=function(){return this.structure.entityList[this.entityIndex]},ox.model.get=function(){return this.structure.getModelProxy(this.modelIndex)},ox.entityIndex.get=function(){return this.chainStore.entityIndex[this.index]},ox.entityIndex.set=function(t){this.chainStore.entityIndex[this.index]=t},ox.modelIndex.get=function(){return this.chainStore.modelIndex[this.index]},ox.modelIndex.set=function(t){this.chainStore.modelIndex[this.index]=t},ox.residueOffset.get=function(){return this.chainStore.residueOffset[this.index]},ox.residueOffset.set=function(t){this.chainStore.residueOffset[this.index]=t},ox.residueCount.get=function(){return this.chainStore.residueCount[this.index]},ox.residueCount.set=function(t){this.chainStore.residueCount[this.index]=t},ox.residueEnd.get=function(){return this.residueOffset+this.residueCount-1},ox.atomOffset.get=function(){return this.residueStore.atomOffset[this.residueOffset]},ox.atomEnd.get=function(){return this.residueStore.atomOffset[this.residueEnd]+this.residueStore.atomCount[this.residueEnd]-1},ox.atomCount.get=function(){return 0===this.residueCount?0:this.atomEnd-this.atomOffset+1},ox.chainname.get=function(){return this.chainStore.getChainname(this.index)},ox.chainname.set=function(t){this.chainStore.setChainname(this.index,t)},ox.chainid.get=function(){return this.chainStore.getChainid(this.index)},ox.chainid.set=function(t){this.chainStore.setChainid(this.index,t)},nx.prototype.eachAtom=function(e,i){this.eachResidue(function(t){t.eachAtom(e,i)},i)},nx.prototype.eachResidue=function(t,e){var i=this.residueCount,r=this.residueOffset,n=this.structure._rp,o=r+i;if(e&&e.test){var a=e.residueOnlyTest;if(a)for(var s=r;s<o;++s)n.index=s,a(n)&&t(n);else for(var c=r;c<o;++c)n.index=c,t(n)}else for(var u=r;u<o;++u)n.index=u,t(n)},nx.prototype.eachResidueN=function(t,e){var i=this.residueCount,r=this.residueOffset,n=r+i;if(!(i<t)){for(var o=new Array(t),a=0;a<t;++a)o[a]=this.structure.getResidueProxy(r+a);e.apply(this,o);for(var s=r+t;s<n;++s){for(var c=0;c<t;++c)o[c].index+=1;e.apply(this,o)}}},nx.prototype.eachPolymer=function(t,e){for(var i=0,r=0,n=e?e.residueOnlyTest:void 0,o=this.model.structure,a=this.residueCount,s=this.residueOffset,c=s+a,u=this.structure.getResidueProxy(),h=this.structure.getResidueProxy(s),l=this.structure.getAtomProxy(),p=this.structure.getAtomProxy(),d=!0,f=s+1;f<c;++f){u.index=h.index,h.index=f;var m=d?u.backboneEndType:u.backboneType,g=h.backboneType;d&&(i=u.index,d=!1),r=h.index,m!==og&&m===g?(l.index=u.backboneEndAtomIndex,p.index=h.backboneStartAtomIndex,l&&p&&l.connectedTo(p)&&(!n||n(u)&&n(h))||(1<u.index-i&&t(new ix(o,i,u.index)),i=r)):(m!==og&&1<u.index-i&&t(new ix(o,i,u.index)),i=r)}1<r-i&&this.structure.getResidueProxy(i).backboneEndType&&t(new ix(o,i,r))},nx.prototype.qualifiedName=function(){return":"+this.chainname+"/"+this.modelIndex},nx.prototype.clone=function(){return new nx(this.structure,this.index)},nx.prototype.toObject=function(){return{index:this.index,residueOffset:this.residueOffset,residueCount:this.residueCount,chainname:this.chainname}},Object.defineProperties(nx.prototype,ox);var ax=function(t,e){void 0===e&&(e=0),this.structure=t,this.index=e,this.modelStore=t.modelStore,this.chainStore=t.chainStore,this.residueStore=t.residueStore},sx={chainOffset:{configurable:!0},chainCount:{configurable:!0},residueOffset:{configurable:!0},atomOffset:{configurable:!0},chainEnd:{configurable:!0},residueEnd:{configurable:!0},atomEnd:{configurable:!0},residueCount:{configurable:!0},atomCount:{configurable:!0}};sx.chainOffset.get=function(){return this.modelStore.chainOffset[this.index]},sx.chainOffset.set=function(t){this.modelStore.chainOffset[this.index]=t},sx.chainCount.get=function(){return this.modelStore.chainCount[this.index]},sx.chainCount.set=function(t){this.modelStore.chainCount[this.index]=t},sx.residueOffset.get=function(){return this.chainStore.residueOffset[this.chainOffset]},sx.atomOffset.get=function(){return this.residueStore.atomOffset[this.residueOffset]},sx.chainEnd.get=function(){return this.chainOffset+this.chainCount-1},sx.residueEnd.get=function(){return this.chainStore.residueOffset[this.chainEnd]+this.chainStore.residueCount[this.chainEnd]-1},sx.atomEnd.get=function(){return this.residueStore.atomOffset[this.residueEnd]+this.residueStore.atomCount[this.residueEnd]-1},sx.residueCount.get=function(){return 0===this.chainCount?0:this.residueEnd-this.residueOffset+1},sx.atomCount.get=function(){return 0===this.residueCount?0:this.atomEnd-this.atomOffset+1},ax.prototype.eachAtom=function(e,i){this.eachChain(function(t){t.eachAtom(e,i)},i)},ax.prototype.eachResidue=function(e,i){this.eachChain(function(t){t.eachResidue(e,i)},i)},ax.prototype.eachPolymer=function(e,i){if(i&&i.chainOnlyTest){var r=i.chainOnlyTest;this.eachChain(function(t){r(t)&&t.eachPolymer(e,i)})}else this.eachChain(function(t){t.eachPolymer(e,i)})},ax.prototype.eachChain=function(t,e){var i=this.chainCount,r=this.chainOffset,n=this.structure._cp,o=r+i;if(e&&e.test){var a=e.chainOnlyTest;if(a)for(var s=r;s<o;++s)n.index=s,a(n)&&t(n);else for(var c=r;c<o;++c)n.index=c,t(n)}else for(var u=r;u<o;++u)n.index=u,t(n)},ax.prototype.qualifiedName=function(){return"/"+this.index},ax.prototype.clone=function(){return new ax(this.structure,this.index)},ax.prototype.toObject=function(){return{index:this.index,chainOffset:this.chainOffset,chainCount:this.chainCount}},Object.defineProperties(ax.prototype,sx);var cx=function(t,e){void 0===t&&(t=""),void 0===e&&(e=""),this.signals={refreshed:new op},this.init(t,e)},ux={type:{configurable:!0}};cx.prototype.init=function(t,e){this.name=t,this.path=e,this.title="",this.id="",this.data={structure:this,"@spatialLookup":void 0,"@valenceModel":void 0},this.header={},this.extraData={},this.atomSetCache={},this.atomSetDict={},this.biomolDict={},this.entityList=[],this.unitcell=void 0,this.frames=[],this.boxes=[],this.validation=void 0,this.bondStore=new Yy(0),this.backboneBondStore=new Yy(0),this.rungBondStore=new Yy(0),this.atomStore=new Zy(0),this.residueStore=new Ky(0),this.chainStore=new Jy(0),this.modelStore=new Qy(0),this.atomMap=new Hb(this),this.residueMap=new Kb(this),this.bondHash=void 0,this.spatialHash=void 0,this.atomSet=void 0,this.bondSet=void 0,this.center=new ri,this.boundingBox=new Pi,this._bp=this.getBondProxy(),this._ap=this.getAtomProxy(),this._rp=this.getResidueProxy(),this._cp=this.getChainProxy()},ux.type.get=function(){return"Structure"},cx.prototype.finalizeAtoms=function(){this.atomSet=this.getAtomSet(),this.atomCount=this.atomStore.count,this.boundingBox=this.getBoundingBox(void 0,this.boundingBox),this.center=this.boundingBox.getCenter(new ri),this.spatialHash=new Zm(this.atomStore,this.boundingBox)},cx.prototype.finalizeBonds=function(){for(var t in this.bondSet=this.getBondSet(),this.bondCount=this.bondStore.count,this.bondHash=new qy(this.bondStore,this.atomStore.count),this.atomSetCache={},this.atomSetDict.rung||(this.atomSetDict.rung=this.getAtomSet(!1)),this.atomSetDict)this.atomSetCache["__"+t]=this.atomSetDict[t].clone()},cx.prototype.getBondProxy=function(t){return new Jb(this,t)},cx.prototype.getAtomProxy=function(t){return new nb(this,t)},cx.prototype.getResidueProxy=function(t){return new tx(this,t)},cx.prototype.getChainProxy=function(t){return new nx(this,t)},cx.prototype.getModelProxy=function(t){return new ax(this,t)},cx.prototype.getBondSet=function(){var t=this.bondStore.count,e=new tg(t),i=this.atomSet;if(i)if(i.isAllSet())e.setAll();else if(i.isAllClear())e.clearAll();else for(var r=this.getBondProxy(),n=0;n<t;++n)r.index=n,i.isSet(r.atomIndex1,r.atomIndex2)&&e.set(r.index);else e.setAll();return e},cx.prototype.getBackboneBondSet=function(){var t=this.backboneBondStore.count,e=new tg(t),i=this.atomSetCache.__backbone;if(i){var r=this.getBondProxy();r.bondStore=this.backboneBondStore;for(var n=0;n<t;++n)r.index=n,i.isSet(r.atomIndex1,r.atomIndex2)&&e.set(r.index)}else e.setAll();return e},cx.prototype.getRungBondSet=function(){var t=this.rungBondStore.count,e=new tg(t),i=this.atomSetCache.__rung;if(i){var r=this.getBondProxy();r.bondStore=this.rungBondStore;for(var n=0;n<t;++n)r.index=n,i.isSet(r.atomIndex1,r.atomIndex2)&&e.set(r.index)}else e.setAll();return e},cx.prototype.getAtomSet=function(t){var e=this.atomStore.count;if(void 0===t)return new tg(e,!0);if(t instanceof tg)return t;if(!0===t)return new tg(e,!0);if(t&&t.test){var i=t.string;if(i in this.atomSetCache)return this.atomSetCache[i];if(""===i)return new tg(e,!0);var r=new tg(e);return this.eachAtom(function(t){r.set(t.index)},t),this.atomSetCache[i]=r}return!1===t?new tg(e):new tg(e,!0)},cx.prototype.getAtomSetWithinSelection=function(t,e){var i=this.spatialHash,r=this.getAtomSet(!1),n=this.getAtomProxy();return i&&this.getAtomSet(t).forEach(function(t){n.index=t,i.within(n.x,n.y,n.z,e).forEach(function(t){r.set(t)})}),r},cx.prototype.getAtomSetWithinPoint=function(t,e){var i=t,r=this.getAtomSet(!1);return this.spatialHash&&this.spatialHash.within(i.x,i.y,i.z,e).forEach(function(t){r.set(t)}),r},cx.prototype.getAtomSetWithinVolume=function(t,e,i,r,n){var o=new Wy(t,i,r,n),a=o.getDataPosition(),s=a.length,c=o.matrix.getMaxScaleOnAxis(),u=this.getAtomSet(!1);if(!this.spatialHash)return u;for(var h=0;h<s;h+=3)this.spatialHash.within(a[h],a[h+1],a[h+2],c).forEach(function(t){u.set(t)});return u},cx.prototype.getAtomSetWithinGroup=function(t){var i=this.atomStore.residueIndex,r=this.getAtomSet(!1),n=this.getResidueProxy();return this.getAtomSet(t).forEach(function(t){n.index=i[t];for(var e=n.atomOffset;e<=n.atomEnd;++e)r.set(e)}),r},cx.prototype.getSelection=function(){return!1},cx.prototype.getStructure=function(){return this},cx.prototype.eachEntity=function(e,i){this.entityList.forEach(function(t){void 0!==i&&t.getEntityType()!==i||e(t)})},cx.prototype.eachBond=function(e,t){var i,r=this.getBondProxy();if(t&&t.test&&(i=this.getBondSet(),this.bondSet&&i.intersection(this.bondSet)),i)i.forEach(function(t){r.index=t,e(r)});else for(var n=this.bondStore.count,o=0;o<n;++o)r.index=o,e(r)},cx.prototype.eachAtom=function(e,i){if(i&&i.test)this.eachModel(function(t){t.eachAtom(e,i)},i);else for(var t=this.atomStore.count,r=this.getAtomProxy(),n=0;n<t;++n)r.index=n,e(r)},cx.prototype.eachResidue=function(t,e){if(e&&e.test){var i=this.modelStore.count,r=this.getModelProxy(),n=e.modelOnlyTest;if(n)for(var o=0;o<i;++o)r.index=o,n(r)&&r.eachResidue(t,e);else for(var a=0;a<i;++a)r.index=a,r.eachResidue(t,e)}else for(var s=this.residueStore.count,c=this.getResidueProxy(),u=0;u<s;++u)c.index=u,t(c)},cx.prototype.eachResidueN=function(t,e){var i=this.residueStore.count;if(!(i<t)){for(var r=new Array(t),n=0;n<t;++n)r[n]=this.getResidueProxy(n);e.apply(this,r);for(var o=t;o<i;++o){for(var a=0;a<t;++a)r[a].index+=1;e.apply(this,r)}}},cx.prototype.eachPolymer=function(e,i){if(i&&i.modelOnlyTest){var r=i.modelOnlyTest;this.eachModel(function(t){r(t)&&t.eachPolymer(e,i)})}else this.eachModel(function(t){t.eachPolymer(e,i)})},cx.prototype.eachChain=function(e,i){if(i&&i.test)this.eachModel(function(t){t.eachChain(e,i)});else for(var t=this.chainStore.count,r=this.getChainProxy(),n=0;n<t;++n)r.index=n,e(r)},cx.prototype.eachModel=function(t,e){var i=this.modelStore.count,r=this.getModelProxy();if(e&&e.test){var n=e.modelOnlyTest;if(n)for(var o=0;o<i;++o)r.index=o,n(r)&&t(r);else for(var a=0;a<i;++a)r.index=a,t(r)}else for(var s=0;s<i;++s)r.index=s,t(r)},cx.prototype.getAtomData=function(t){var e=Object.assign({},t);e.colorParams&&(e.colorParams.structure=this.getStructure());var r,n,i=e.what,o=bl(e.atomSet,this.atomSet),a={},s=this.getAtomProxy(),c=o.getSize();i&&!i.position||(a.position=new Float32Array(3*c)),i&&!i.color||!e.colorParams||(a.color=new Float32Array(3*c),n=Qp.getScheme(e.colorParams)),i&&!i.picking||(a.picking=new hv(new Float32Array(c),this.getStructure())),i&&!i.radius||(a.radius=new Float32Array(c),r=new Gy(e.radiusParams)),i&&!i.index||(a.index=new Uint32Array(c));var u=a.position,h=a.color,l=a.picking,p=a.radius,d=a.index;return o.forEach(function(t,e){var i=3*e;s.index=t,u&&s.positionToArray(u,i),h&&n.atomColorToArray(s,h,i),l&&(l.array[e]=t),p&&(p[e]=r.atomRadius(s)),d&&(d[e]=t)}),a},cx.prototype.getBondData=function(t){var e=Object.assign({},t);e.colorParams&&(e.colorParams.structure=this.getStructure());var i,r,n=e.what,o=bl(e.bondSet,this.bondSet),a=bl(e.multipleBond,"off"),s="off"!==a,c="offset"===a,u=bl(e.bondScale,.4),h=bl(e.bondSpacing,1),l={},p=this.getBondProxy();e.bondStore&&(p.bondStore=e.bondStore);var d,f=this.getAtomProxy(),m=this.getAtomProxy();if(s){var g=p.bondStore.bondOrder;d=0,o.forEach(function(t){d+=g[t]})}else d=o.getSize();n&&!n.position||(l.position1=new Float32Array(3*d),l.position2=new Float32Array(3*d)),n&&!n.color||!e.colorParams||(l.color=new Float32Array(3*d),l.color2=new Float32Array(3*d),r=Qp.getScheme(e.colorParams)),n&&!n.picking||(l.picking=new pv(new Float32Array(d),this.getStructure(),e.bondStore)),(!n||n.radius||s&&n.position)&&(i=new Gy(e.radiusParams)),n&&!n.radius||(l.radius=new Float32Array(d),e.radius2&&(l.radius2=new Float32Array(d)));var v,y,b,x,_,w,S=l.position1,A=l.position2,M=l.color,E=l.color2,P=l.picking,T=l.radius,C=l.radius2,I=0,O=new ri,L=new ri,R=new ri;return o.forEach(function(t){if(y=3*I,p.index=t,f.index=p.atomIndex1,m.index=p.atomIndex2,x=p.bondOrder,S)if(s&&1<x){var e=i.atomRadius(f);w=e*u/(.5*x),p.calculateShiftDir(R),c?(_=2*h*e,R.multiplyScalar(_),R.negate(),L.subVectors(m,f).multiplyScalar(Math.max(.1,_/1.88)),f.positionToArray(S,y),m.positionToArray(A,y),2<=x&&(O.addVectors(f,R).add(L).toArray(S,y+3),O.addVectors(m,R).sub(L).toArray(A,y+3),3<=x&&(O.subVectors(f,R).add(L).toArray(S,y+6),O.subVectors(m,R).sub(L).toArray(A,y+6)))):(_=(h-u)*e,R.multiplyScalar(_),2===x?(O.addVectors(f,R).toArray(S,y),O.subVectors(f,R).toArray(S,y+3),O.addVectors(m,R).toArray(A,y),O.subVectors(m,R).toArray(A,y+3)):3===x?(f.positionToArray(S,y),O.addVectors(f,R).toArray(S,y+3),O.subVectors(f,R).toArray(S,y+6),m.positionToArray(A,y),O.addVectors(m,R).toArray(A,y+3),O.subVectors(m,R).toArray(A,y+6)):(f.positionToArray(S,y),m.positionToArray(A,y)))}else f.positionToArray(S,y),m.positionToArray(A,y);if(M&&E&&(r.bondColorToArray(p,1,M,y),r.bondColorToArray(p,0,E,y),s&&1<x))for(v=1;v<x;++v)qd(M,y,b=3*v+y,3),qd(E,y,b,3);if(P&&P.array&&(P.array[I]=t,s&&1<x))for(v=1;v<x;++v)P.array[I+v]=t;if(T&&(T[I]=i.atomRadius(f),s&&1<x))for(w=T[I]*u/(c?1:.5*x),v=c?1:0;v<x;++v)T[I+v]=w;if(C&&(C[I]=i.atomRadius(m),s&&1<x))for(w=C[I]*u/(c?1:.5*x),v=c?1:0;v<x;++v)C[I+v]=w;I+=s?x:1}),l},cx.prototype.getBackboneAtomData=function(t){return t=Object.assign({atomSet:this.atomSetCache.__backbone},t),this.getAtomData(t)},cx.prototype.getBackboneBondData=function(t){return t=Object.assign({bondSet:this.getBackboneBondSet(),bondStore:this.backboneBondStore},t),this.getBondData(t)},cx.prototype.getRungAtomData=function(t){return t=Object.assign({atomSet:this.atomSetCache.__rung},t),this.getAtomData(t)},cx.prototype.getRungBondData=function(t){return t=Object.assign({bondSet:this.getRungBondSet(),bondStore:this.rungBondStore},t),this.getBondData(t)},cx.prototype.getBoundingBox=function(t,e){de.Debug&&Yp.time("getBoundingBox"),e=e||new Pi;var n=1/0,o=1/0,a=1/0,s=-1/0,c=-1/0,u=-1/0;return this.eachAtom(function(t){var e=t.x,i=t.y,r=t.z;e<n&&(n=e),i<o&&(o=i),r<a&&(a=r),s<e&&(s=e),c<i&&(c=i),u<r&&(u=r)},t),e.min.set(n,o,a),e.max.set(s,c,u),de.Debug&&Yp.timeEnd("getBoundingBox"),e},cx.prototype.getPrincipalAxes=function(t){de.Debug&&Yp.time("getPrincipalAxes");var e=0,i=new kv(3,this.atomCount),r=i.data;return this.eachAtom(function(t){r[e+0]=t.x,r[e+1]=t.y,r[e+2]=t.z,e+=3},t),de.Debug&&Yp.timeEnd("getPrincipalAxes"),new $y(i)},cx.prototype.atomCenter=function(t){return t?this.getBoundingBox(t).getCenter(new ri):this.center.clone()},cx.prototype.hasCoords=function(){if(void 0===this._hasCoords){var t=this.atomStore;this._hasCoords=0!==Zd(t.x)||0!==Yd(t.x)||0!==Zd(t.y)||0!==Yd(t.y)||0!==Zd(t.z)||0!==Yd(t.z)||t.count/this.modelStore.count==1}return this._hasCoords},cx.prototype.getSequence=function(t){var e=[],i=this.getResidueProxy();return this.eachAtom(function(t){i.index=t.residueIndex,t.index===i.traceAtomIndex&&e.push(i.getResname1())},t),e},cx.prototype.getAtomIndices=function(t){if(t&&t.string){var e=[];return this.eachAtom(function(t){e.push(t.index)},t),new Uint32Array(e)}return this.getAtomData({what:{index:!0}}).index},cx.prototype.getChainnameCount=function(t){var e=new Set;return this.eachChain(function(t){t.residueCount&&e.add(t.chainname)},t),e.size},cx.prototype.updatePosition=function(e){var i=0;this.eachAtom(function(t){t.positionFromArray(e,i),i+=3},void 0),this._hasCoords=void 0},cx.prototype.refreshPosition=function(){this.getBoundingBox(void 0,this.boundingBox),this.boundingBox.getCenter(this.center),this.spatialHash=new Zm(this.atomStore,this.boundingBox)},cx.prototype.dispose=function(){this.frames&&(this.frames.length=0),this.boxes&&(this.boxes.length=0),this.bondStore.dispose(),this.backboneBondStore.dispose(),this.rungBondStore.dispose(),this.atomStore.dispose(),this.residueStore.dispose(),this.chainStore.dispose(),this.modelStore.dispose(),delete this.bondStore,delete this.atomStore,delete this.residueStore,delete this.chainStore,delete this.modelStore,delete this.frames,delete this.boxes,delete this.bondSet,delete this.atomSet},Object.defineProperties(cx.prototype,ux);var hx=new Pi,lx=[Vm,zm,Hm,Gm,$m,Um,Fm,jm,Xm,Wm,qm,Ym],px={aspectRatio:1.5,sphereDetail:2,radialSegments:50,disableImpostor:!1,openEnded:!1,dashedCylinder:!1,labelParams:{},pointSize:2,sizeAttenuation:!1,useTexture:!0,lineWidth:2},dx=function(t,e){var i=this;void 0===t&&(t="shape"),void 0===e&&(e={}),this.boundingBox=new Pi,this.bufferList=[],this.meshCount=0,this._primitiveData={},this.name=t,this.parameters=xl(e,px),lx.forEach(function(e){Object.keys(e.fields).forEach(function(t){i._primitiveData[e.getShapeKey(t)]=[]}),i._primitiveData[e.getShapeKey("name")]=[]})},fx={center:{configurable:!0},type:{configurable:!0}};dx.prototype.addBuffer=function(t){this.bufferList.push(t);var e=t.geometry;return e.boundingBox||e.computeBoundingBox(),this.boundingBox.union(e.boundingBox),this},dx.prototype.addMesh=function(t,e,i,r,n){t=Fl(t),e=Fl(e),Array.isArray(i)&&(i=Ll(i,t.length)),r&&(r=Fl(r));var o={position:t,color:e,index:i,normal:r},a=new _v(this,Object.assign({serial:this.meshCount,name:n},o)),s=new my(Object.assign({picking:a},o));return this.bufferList.push(s),hx.setFromArray(t),this.boundingBox.union(hx),this.meshCount+=1,this},dx.prototype.addSphere=function(t,e,i,r){return Fm.objectToShape(this,{position:t,color:e,radius:i,name:r}),this},dx.prototype.addEllipsoid=function(t,e,i,r,n,o){return $m.objectToShape(this,{position:t,color:e,radius:i,majorAxis:r,minorAxis:n,name:o}),this},dx.prototype.addTorus=function(t,e,i,r,n,o){return Wm.objectToShape(this,{position:t,color:e,radius:i,majorAxis:r,minorAxis:n,name:o}),this},dx.prototype.addCylinder=function(t,e,i,r,n){return Gm.objectToShape(this,{position1:t,position2:e,color:i,radius:r,name:n}),this},dx.prototype.addCone=function(t,e,i,r,n){return Hm.objectToShape(this,{position1:t,position2:e,color:i,radius:r,name:n}),this},dx.prototype.addArrow=function(t,e,i,r,n){return Vm.objectToShape(this,{position1:t,position2:e,color:i,radius:r,name:n}),this},dx.prototype.addBox=function(t,e,i,r,n,o){return zm.objectToShape(this,{position:t,color:e,size:i,heightAxis:r,depthAxis:n,name:o}),this},dx.prototype.addOctahedron=function(t,e,i,r,n,o){return Um.objectToShape(this,{position:t,color:e,size:i,heightAxis:r,depthAxis:n,name:o}),this},dx.prototype.addTetrahedron=function(t,e,i,r,n,o){return jm.objectToShape(this,{position:t,color:e,size:i,heightAxis:r,depthAxis:n,name:o}),this},dx.prototype.addText=function(t,e,i,r){return Xm.objectToShape(this,{position:t,color:e,size:i,text:r}),this},dx.prototype.addPoint=function(t,e,i){return qm.objectToShape(this,{position:t,color:e,name:i}),this},dx.prototype.addWideline=function(t,e,i,r){return Ym.objectToShape(this,{position1:t,position2:e,color:i,name:r}),this},dx.prototype.addLabel=function(t,e,i,r){return console.warn("Shape.addLabel is deprecated, use .addText instead"),this.addText(t,e,i,r)},dx.prototype.getBufferList=function(){var e=this,i=[];return lx.forEach(function(t){e._primitiveData[t.getShapeKey("color")].length&&i.push(t.bufferFromShape(e,e.parameters))}),this.bufferList.concat(i)},dx.prototype.dispose=function(){var i=this;this.bufferList.forEach(function(t){t.dispose()}),this.bufferList.length=0,lx.forEach(function(e){Object.keys(e.fields).forEach(function(t){i._primitiveData[e.getShapeKey(t)].length=0}),i._primitiveData[e.getShapeKey("name")].length=0})},fx.center.get=function(){return this._center||(this._center=this.boundingBox.getCenter(new ri)),this._center},fx.type.get=function(){return"Shape"},Object.defineProperties(dx.prototype,fx);var mx=function(r){function t(t,e,i){Array.isArray(t)||(t=[t]),r.call(this,t,e,i),this.type="buffer",this.parameters=Object.assign({},this.parameters,{colorScheme:null,colorScale:null,colorValue:null,colorDomain:null,colorMode:null}),this.buffer=t,this.init(i)}return r&&(t.__proto__=r),((t.prototype=Object.create(r&&r.prototype)).constructor=t).prototype.init=function(t){r.prototype.init.call(this,t),this.build()},t.prototype.create=function(){this.bufferList.push.apply(this.bufferList,this.buffer)},t.prototype.attach=function(t){var e=this;this.bufferList.forEach(function(t){e.viewer.add(t),t.setParameters(e.getBufferParams())}),this.setVisibility(this.visible),t()},t}(sm),gx=new ei,vx=new ni;var yx=function(y){function t(t,e,i){var r,n,o,a,s,c,u,h,l,p,d;void 0===e&&(e={}),y.call(this,(r=t,a=(n=i).attributes.position.array,s=n.index?n.index.array:void 0,c=r.position.length/3,u=a.length/3,h=c*u,l=new Float32Array(3*h),p=new Float32Array(3*h),d=new Float32Array(3*h),s&&(o=Ll(c*s.length,h)),{position:l,color:d,index:o,normal:p,primitiveId:r.primitiveId||$d(c,u),picking:r.picking}),e),this.updateNormals=!1;var f=i.attributes.position.array,m=i.attributes.normal.array,g=i.index?i.index.array:void 0;this.geoPosition=f,this.geoNormal=m,this.geoIndex=g,this.positionCount=t.position.length/3,this.geoPositionCount=f.length/3,this.transformedGeoPosition=new Float32Array(3*this.geoPositionCount),this.transformedGeoNormal=new Float32Array(3*this.geoPositionCount);var v=this.geometry.attributes;this.meshPosition=v.position.array,this.meshColor=v.color.array,this.meshNormal=v.normal.array,this.setAttributes(t),g&&(this.meshIndex=this.geometry.getIndex().array,this.makeIndex())}return y&&(t.__proto__=y),((t.prototype=Object.create(y&&y.prototype)).constructor=t).prototype.setAttributes=function(t,e){void 0===t&&(t={}),void 0===e&&(e=!1);var i,r,n,o,a,s,c,u,h,l=this.geometry.attributes,p=this.updateNormals;t.position&&(i=t.position,n=this.geoPosition,c=this.meshPosition,a=this.transformedGeoPosition,l.position.needsUpdate=!0,(p||e)&&(o=this.geoNormal,h=this.meshNormal,s=this.transformedGeoNormal,l.normal.needsUpdate=!0)),t.color&&(r=t.color,u=this.meshColor,l.color.needsUpdate=!0);for(var d=this.positionCount,f=this.geoPositionCount,m=0;m<d;++m){var g=void 0,v=void 0,y=m*f*3,b=3*m;if(i&&a&&c&&h&&n&&o&&(a.set(n),gx.makeTranslation(i[b],i[b+1],i[b+2]),this.applyPositionTransform(gx,m,b),dm(gx.elements,a),c.set(a,y),p&&s?(s.set(o),vx.getNormalMatrix(gx),fm(vx.elements,s),h.set(s,y)):e&&h.set(o,y)),r&&u)for(g=0;g<f;++g)u[v=y+3*g]=r[b],u[v+1]=r[b+1],u[v+2]=r[b+2]}},t.prototype.makeIndex=function(){var t=this.geoIndex,e=this.meshIndex;if(t)for(var i=this.positionCount,r=this.geoPositionCount,n=3*(t.length/3),o=0;o<i;++o){var a=o*n,s=a+n;e.set(t,a);for(var c=a;c<s;++c)e[c]+=o*r}},t}(my),bx=new ri,xx=Object.assign({sphereDetail:1},ly),_x=function(i){function t(t,e){void 0===e&&(e={}),i.call(this,t,e,new es(1,bl(e.sphereDetail,1))),this.setAttributes(t,!0)}i&&(t.__proto__=i),(t.prototype=Object.create(i&&i.prototype)).constructor=t;var e={defaultParameters:{configurable:!0}};return e.defaultParameters.get=function(){return xx},t.prototype.applyPositionTransform=function(t,e){var i=this._radius[e];bx.set(i,i,i),t.scale(bx)},t.prototype.setAttributes=function(t,e){void 0===t&&(t={}),t.radius&&(this._radius=t.radius),i.prototype.setAttributes.call(this,t,e)},Object.defineProperties(t.prototype,e),t}(yx);rd.add("shader/SphereImpostor.vert","uniform mat4 projectionMatrixInverse;\nuniform float clipNear;\nvarying float vRadius;\nvarying float vRadiusSq;\nvarying vec3 vPoint;\nvarying vec3 vPointViewPosition;\nattribute vec2 mapping;\nattribute float radius;\n#ifdef PICKING\n#include unpack_color\nattribute float primitiveId;\nvarying vec3 vPickingColor;\n#else\n#include color_pars_vertex\n#endif\n#include matrix_scale\nconst mat4 D = mat4(\n1.0, 0.0, 0.0, 0.0,\n0.0, 1.0, 0.0, 0.0,\n0.0, 0.0, 1.0, 0.0,\n0.0, 0.0, 0.0, -1.0\n);\nmat4 transpose( in mat4 inMatrix ) {\nvec4 i0 = inMatrix[0];\nvec4 i1 = inMatrix[1];\nvec4 i2 = inMatrix[2];\nvec4 i3 = inMatrix[3];\nmat4 outMatrix = mat4(\nvec4(i0.x, i1.x, i2.x, i3.x),\nvec4(i0.y, i1.y, i2.y, i3.y),\nvec4(i0.z, i1.z, i2.z, i3.z),\nvec4(i0.w, i1.w, i2.w, i3.w)\n);\nreturn outMatrix;\n}\nvoid ComputePointSizeAndPositionInClipCoordSphere(){\nvec2 xbc;\nvec2 ybc;\nmat4 T = mat4(\nradius, 0.0, 0.0, 0.0,\n0.0, radius, 0.0, 0.0,\n0.0, 0.0, radius, 0.0,\nposition.x, position.y, position.z, 1.0\n);\nmat4 R = transpose( projectionMatrix * modelViewMatrix * T );\nfloat A = dot( R[ 3 ], D * R[ 3 ] );\nfloat B = -2.0 * dot( R[ 0 ], D * R[ 3 ] );\nfloat C = dot( R[ 0 ], D * R[ 0 ] );\nxbc[ 0 ] = ( -B - sqrt( B * B - 4.0 * A * C ) ) / ( 2.0 * A );\nxbc[ 1 ] = ( -B + sqrt( B * B - 4.0 * A * C ) ) / ( 2.0 * A );\nfloat sx = abs( xbc[ 0 ] - xbc[ 1 ] ) * 0.5;\nA = dot( R[ 3 ], D * R[ 3 ] );\nB = -2.0 * dot( R[ 1 ], D * R[ 3 ] );\nC = dot( R[ 1 ], D * R[ 1 ] );\nybc[ 0 ] = ( -B - sqrt( B * B - 4.0 * A * C ) ) / ( 2.0 * A );\nybc[ 1 ] = ( -B + sqrt( B * B - 4.0 * A * C ) ) / ( 2.0 * A );\nfloat sy = abs( ybc[ 0 ] - ybc[ 1 ] ) * 0.5;\ngl_Position.xy = vec2( 0.5 * ( xbc.x + xbc.y ), 0.5 * ( ybc.x + ybc.y ) );\ngl_Position.xy -= mapping * vec2( sx, sy );\ngl_Position.xy *= gl_Position.w;\n}\nvoid main(void){\n#ifdef PICKING\nvPickingColor = unpackColor( primitiveId );\n#else\n#include color_vertex\n#endif\nvRadius = radius * matrixScale( modelViewMatrix );\nvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\nmvPosition.z -= vRadius;\ngl_Position = projectionMatrix * vec4( mvPosition.xyz, 1.0 );\nComputePointSizeAndPositionInClipCoordSphere();\nvRadiusSq = vRadius * vRadius;\nvec4 vPoint4 = projectionMatrixInverse * gl_Position;\nvPoint = vPoint4.xyz / vPoint4.w;\nvPointViewPosition = -mvPosition.xyz / mvPosition.w;\n}"),rd.add("shader/SphereImpostor.frag","#define STANDARD\n#define IMPOSTOR\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 interiorColor;\nuniform float interiorDarkening;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\nuniform float clipNear;\nuniform mat4 projectionMatrix;\nuniform float ortho;\nvarying float vRadius;\nvarying float vRadiusSq;\nvarying vec3 vPoint;\nvarying vec3 vPointViewPosition;\n#ifdef PICKING\nuniform float objectId;\nvarying vec3 vPickingColor;\n#else\n#include common\n#include color_pars_fragment\n#include fog_pars_fragment\n#include bsdfs\n#include lights_pars_begin\n#include lights_physical_pars_fragment\n#endif\nbool flag2 = false;\nbool interior = false;\nvec3 cameraPos;\nvec3 cameraNormal;\nfloat calcDepth( in vec3 cameraPos ){\nvec2 clipZW = cameraPos.z * projectionMatrix[2].zw + projectionMatrix[3].zw;\nreturn 0.5 + 0.5 * clipZW.x / clipZW.y;\n}\nfloat calcClip( vec3 cameraPos ){\nreturn dot( vec4( cameraPos, 1.0 ), vec4( 0.0, 0.0, 1.0, clipNear - 0.5 ) );\n}\nbool Impostor( out vec3 cameraPos, out vec3 cameraNormal ){\nvec3 cameraSpherePos = -vPointViewPosition;\ncameraSpherePos.z += vRadius;\nvec3 rayOrigin = mix( vec3( 0.0, 0.0, 0.0 ), vPoint, ortho );\nvec3 rayDirection = mix( normalize( vPoint ), vec3( 0.0, 0.0, 1.0 ), ortho );\nvec3 cameraSphereDir = mix( cameraSpherePos, rayOrigin - cameraSpherePos, ortho );\nfloat B = dot( rayDirection, cameraSphereDir );\nfloat det = B * B + vRadiusSq - dot( cameraSphereDir, cameraSphereDir );\nif( det < 0.0 ){\ndiscard;\nreturn false;\n}\nfloat sqrtDet = sqrt( det );\nfloat posT = mix( B + sqrtDet, B + sqrtDet, ortho );\nfloat negT = mix( B - sqrtDet, sqrtDet - B, ortho );\ncameraPos = rayDirection * negT + rayOrigin;\n#ifdef NEAR_CLIP\nif( calcDepth( cameraPos ) <= 0.0 ){\ncameraPos = rayDirection * posT + rayOrigin;\ninterior = true;\n}else if( calcClip( cameraPos ) > 0.0 ){\ncameraPos = rayDirection * posT + rayOrigin;\ninterior = true;\nflag2 = true;\n}\n#else\nif( calcDepth( cameraPos ) <= 0.0 ){\ncameraPos = rayDirection * posT + rayOrigin;\ninterior = true;\n}\n#endif\ncameraNormal = normalize( cameraPos - cameraSpherePos );\ncameraNormal *= float(!interior) * 2.0 - 1.0;\nreturn !interior;\n}\nvoid main(void){\nbool flag = Impostor( cameraPos, cameraNormal );\n#ifdef NEAR_CLIP\nif( calcClip( cameraPos ) > 0.0 )\ndiscard;\n#endif\ngl_FragDepthEXT = calcDepth( cameraPos );\nif( !flag ){\n#ifdef NEAR_CLIP\nif( flag2 ){\ngl_FragDepthEXT = max( 0.0, calcDepth( vec3( - ( clipNear - 0.5 ) ) ) + ( 0.0000001 / vRadius ) );\n}else if( gl_FragDepthEXT >= 0.0 ){\ngl_FragDepthEXT = 0.0 + ( 0.0000001 / vRadius );\n}\n#else\nif( gl_FragDepthEXT >= 0.0 ){\ngl_FragDepthEXT = 0.0 + ( 0.0000001 / vRadius );\n}\n#endif\n}\nif (gl_FragDepthEXT < 0.0)\ndiscard;\nif (gl_FragDepthEXT > 1.0)\ndiscard;\n#ifdef PICKING\nif( opacity < 0.3 )\ndiscard;\ngl_FragColor = vec4( vPickingColor, objectId );\n#else\nvec3 vNormal = cameraNormal;\nvec3 vViewPosition = -cameraPos;\nvec4 diffuseColor = vec4( diffuse, opacity );\nReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\nvec3 totalEmissiveLight = emissive;\n#include color_fragment\n#include roughnessmap_fragment\n#include metalnessmap_fragment\n#include normal_fragment_begin\n#include lights_physical_fragment\n#include lights_fragment_begin\n#include lights_fragment_end\nvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveLight;\nif( interior ){\n#ifdef USE_INTERIOR_COLOR\noutgoingLight.xyz = interiorColor;\n#else\n#ifdef DIFFUSE_INTERIOR\noutgoingLight.xyz = vColor;\n#endif\n#endif\noutgoingLight.xyz *= 1.0 - interiorDarkening;\n}\ngl_FragColor = vec4( outgoingLight, diffuseColor.a );\n#include premultiplied_alpha_fragment\n#include tonemapping_fragment\n#include encodings_fragment\n#include fog_fragment\n#endif\n}");var wx=function(n){function t(t,e,i){void 0===i&&(i={}),n.call(this,e,i),this.index=Ll(this.indexSize,this.attributeSize),this.makeIndex(),this.initIndex(this.index),this.addAttributes({mapping:{type:t,value:null}}),this.setAttributes({primitiveId:Hd(this.size)})}n&&(t.__proto__=n),(t.prototype=Object.create(n&&n.prototype)).constructor=t;var e={attributeSize:{configurable:!0},indexSize:{configurable:!0}};return e.attributeSize.get=function(){return this.size*this.mappingSize},e.indexSize.get=function(){return this.size*this.mappingIndicesSize},t.prototype.addAttributes=function(t){var e={};for(var i in t){var r=t[i];e[i]={type:r.type,value:null}}n.prototype.addAttributes.call(this,e)},t.prototype.getAttributeIndex=function(t){return 3*t*this.mappingSize},t.prototype.setAttributes=function(t){t&&!t.position&&t.position1&&t.position2&&(t.position=Ud(t.position1,t.position2));var e,i,r,n,o,a,s,c=this.size,u=this.mappingSize,h=this.geometry.attributes;for(var l in t)if("index"!==l&&"picking"!==l){i=t[l],r=(e=h[l]).itemSize,n=e.array;for(var p=0;p<c;++p){a=(o=p*r)*u;for(var d=0;d<u;++d){s=a+r*d;for(var f=0;f<r;++f)n[s+f]=i[o+f]}}e.needsUpdate=!0}},t.prototype.makeMapping=function(){for(var t=this.size,e=this.mapping,i=this.mappingSize,r=this.mappingItemSize,n=this.geometry.attributes.mapping.array,o=0;o<t;o++)n.set(e,o*r*i)},t.prototype.makeIndex=function(){for(var t=this.size,e=this.mappingSize,i=this.mappingIndices,r=this.mappingIndicesSize,n=this.index,o=0;o<t;o++){var a=o*r,s=o*e;n.set(i,a);for(var c=0;c<r;++c)n[a+c]+=s}},Object.defineProperties(t.prototype,e),t}(dy),Sx=new Float32Array([-1,1,-1,-1,1,1,1,-1]),Ax=new Uint16Array([0,1,2,1,3,2]),Mx=function(i){function t(t,e){void 0===e&&(e={}),i.call(this,"v2",t,e)}i&&(t.__proto__=i),(t.prototype=Object.create(i&&i.prototype)).constructor=t;var e={mapping:{configurable:!0},mappingIndices:{configurable:!0},mappingIndicesSize:{configurable:!0},mappingSize:{configurable:!0},mappingItemSize:{configurable:!0}};return e.mapping.get=function(){return Sx},e.mappingIndices.get=function(){return Ax},e.mappingIndicesSize.get=function(){return 6},e.mappingSize.get=function(){return 4},e.mappingItemSize.get=function(){return 2},Object.defineProperties(t.prototype,e),t}(wx),Ex=function(i){function t(t,e){void 0===e&&(e={}),i.call(this,t,e),this.isImpostor=!0,this.vertexShader="SphereImpostor.vert",this.fragmentShader="SphereImpostor.frag",this.addUniforms({projectionMatrixInverse:{value:new ei},ortho:{value:0}}),this.addAttributes({radius:{type:"f",value:null}}),this.setAttributes(t),this.makeMapping()}return i&&(t.__proto__=i),(t.prototype=Object.create(i&&i.prototype)).constructor=t}(Mx),Px=(Object.assign({disableImpostor:!1},xx),function(t,e){return!Xp||e&&e.disableImpostor?new _x(t,e):new Ex(t,e)});ad.add("sphere",Px),rd.add("shader/Point.vert","uniform float clipNear;\nuniform float clipRadius;\nuniform vec3 clipCenter;\nuniform float size;\nuniform float canvasHeight;\nuniform float pixelRatio;\n#if defined( RADIUS_CLIP )\nvarying vec3 vClipCenter;\n#endif\n#if defined( PICKING )\n#include unpack_color\nattribute float primitiveId;\nvarying vec3 vPickingColor;\n#else\n#include color_pars_vertex\nvarying vec3 vViewPosition;\n#endif\n#include common\nvoid main(){\n#if defined( PICKING )\nvPickingColor = unpackColor( primitiveId );\n#else\n#include color_vertex\n#endif\n#include begin_vertex\n#include project_vertex\n#ifdef USE_SIZEATTENUATION\ngl_PointSize = size * pixelRatio * ( ( canvasHeight / 2.0 ) / -mvPosition.z );\n#else\ngl_PointSize = size * pixelRatio;\n#endif\n#ifndef PICKING\nvViewPosition = -mvPosition.xyz;\n#endif\n#if defined( RADIUS_CLIP )\nvClipCenter = -( modelViewMatrix * vec4( clipCenter, 1.0 ) ).xyz;\n#endif\n#include nearclip_vertex\n#include radiusclip_vertex\n}"),rd.add("shader/Point.frag","uniform vec3 diffuse;\nuniform float opacity;\nuniform float clipNear;\nuniform float clipRadius;\n#if defined( RADIUS_CLIP )\nvarying vec3 vClipCenter;\n#endif\n#ifdef USE_MAP\nuniform sampler2D map;\n#endif\n#if defined( PICKING )\nuniform float objectId;\nvarying vec3 vPickingColor;\n#else\n#include common\n#include color_pars_fragment\n#include fog_pars_fragment\nvarying vec3 vViewPosition;\n#endif\nvoid main(){\n#include nearclip_fragment\n#include radiusclip_fragment\n#if defined( PICKING )\n#ifdef USE_MAP\nif( texture2D( map, vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y ) ).a < 0.5 )\ndiscard;\n#endif\nif( opacity < 0.3 )\ndiscard;\ngl_FragColor = vec4( vPickingColor, objectId );\n#else\nvec3 outgoingLight = vec3( 0.0 );\nvec4 diffuseColor = vec4( diffuse, 1.0 );\n#ifdef USE_MAP\ndiffuseColor *= texture2D( map, vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y ) );\n#endif\n#include color_fragment\n#include alphatest_fragment\noutgoingLight = diffuseColor.rgb;\ngl_FragColor = vec4( outgoingLight, diffuseColor.a * opacity );\n#include premultiplied_alpha_fragment\n#include tonemapping_fragment\n#include encodings_fragment\n#include fog_fragment\n#endif\n}");var Tx=Object.assign({pointSize:1,sizeAttenuation:!0,sortParticles:!1,alphaTest:.5,useTexture:!1,forceTransparent:!1,edgeBleach:0},ly),Cx=Object.assign({pointSize:{uniform:"size"},sizeAttenuation:{updateShader:!0},sortParticles:{},alphaTest:{updateShader:!0},useTexture:{updateShader:!0},forceTransparent:{},edgeBleach:{uniform:!0}},py),Ix=function(r){function t(t,e){void 0===e&&(e={}),r.call(this,t,e),this.parameterTypes=Cx,this.vertexShader="Point.vert",this.fragmentShader="Point.frag",this.isPoint=!0,this.addUniforms({size:{value:this.parameters.pointSize},canvasHeight:{value:1},pixelRatio:{value:1},map:{value:null}})}r&&(t.__proto__=r),(t.prototype=Object.create(r&&r.prototype)).constructor=t;var e={defaultParameters:{configurable:!0}};return e.defaultParameters.get=function(){return Tx},t.prototype.makeMaterial=function(){r.prototype.makeMaterial.call(this),this.makeTexture();var t=this.material,e=this.wireframeMaterial,i=this.pickingMaterial;t.uniforms.map.value=this.tex,t.needsUpdate=!0,e.uniforms.map.value=this.tex,e.needsUpdate=!0,i.uniforms.map.value=this.tex,i.needsUpdate=!0},t.prototype.makeTexture=function(){this.tex&&this.tex.dispose(),this.tex=function(t){for(var e,i,r=t||{},n=bl(r.width,256),o=bl(r.height,256),a=[n/2,o/2],s=Math.min(n/2,o/2),c=bl(r.delta,1/(s+1))*s,u=0,h=0,l=new Uint8Array(n*o*4),p=0,d=l.length;p<d;p+=4){var f=1-Zl(s-c,s,(e=a[0]-u,i=a[1]-h,Math.sqrt(e*e+i*i)));l[p]=255*f,l[p+1]=255*f,l[p+2]=255*f,l[p+3]=255*f,++u===n&&(u=0,h++)}var m=new Ei(l,n,o);return m.needsUpdate=!0,m}({delta:this.parameters.edgeBleach})},t.prototype.getDefines=function(t){var e=r.prototype.getDefines.call(this,t);return this.parameters.sizeAttenuation&&(e.USE_SIZEATTENUATION=1),this.parameters.useTexture&&(e.USE_MAP=1),0<this.parameters.alphaTest&&this.parameters.alphaTest<=1&&(e.ALPHATEST=this.parameters.alphaTest.toPrecision(2)),e},t.prototype.setUniforms=function(t){t&&void 0!==t.edgeBleach&&(this.makeTexture(),t.map=this.tex),r.prototype.setUniforms.call(this,t)},t.prototype.dispose=function(){r.prototype.dispose.call(this),this.tex&&this.tex.dispose()},Object.defineProperties(t.prototype,e),t}(dy);ad.add("point",Ix);var Ox=function(r){function t(t,e,i){r.call(this,t,e,i),this.type="dot",this.parameters=Object.assign({thresholdType:{type:"select",rebuild:!0,options:{value:"value",sigma:"sigma"}},thresholdMin:{type:"number",precision:3,max:1/0,min:-1/0,rebuild:!0},thresholdMax:{type:"number",precision:3,max:1/0,min:-1/0,rebuild:!0},thresholdOut:{type:"boolean",rebuild:!0},dotType:{type:"select",rebuild:!0,options:{"":"",sphere:"sphere",point:"point"}},radiusType:{type:"select",options:{"":"",value:"value","abs-value":"abs-value","value-min":"value-min",deviation:"deviation",size:"size"}},radius:{type:"number",precision:3,max:10,min:.001,property:"size"},scale:{type:"number",precision:3,max:10,min:.001},sphereDetail:!0,disableImpostor:!0,pointSize:{type:"number",precision:1,max:100,min:0,buffer:!0},sizeAttenuation:{type:"boolean",buffer:!0},sortParticles:{type:"boolean",rebuild:!0},useTexture:{type:"boolean",buffer:!0},alphaTest:{type:"range",step:.001,max:1,min:0,buffer:!0},forceTransparent:{type:"boolean",buffer:!0},edgeBleach:{type:"range",step:.001,max:1,min:0,buffer:!0}},this.parameters,{colorScheme:{type:"select",update:"color",options:{"":"",value:"value",uniform:"uniform",random:"random"}}}),t instanceof ay?(this.surface=void 0,this.volume=new Wy(t)):(this.surface=t,this.volume=void 0),this.init(i)}return r&&(t.__proto__=r),((t.prototype=Object.create(r&&r.prototype)).constructor=t).prototype.init=function(t){var e=t||{};e.colorScheme=bl(e.colorScheme,"uniform"),e.colorValue=bl(e.colorValue,14540253),this.thresholdType=bl(e.thresholdType,"sigma"),this.thresholdMin=bl(e.thresholdMin,2),this.thresholdMax=bl(e.thresholdMax,1/0),this.thresholdOut=bl(e.thresholdOut,!1),this.dotType=bl(e.dotType,"point"),this.radius=bl(e.radius,.1),this.scale=bl(e.scale,1),this.pointSize=bl(e.pointSize,1),this.sizeAttenuation=bl(e.sizeAttenuation,!0),this.sortParticles=bl(e.sortParticles,!1),this.useTexture=bl(e.useTexture,!1),this.alphaTest=bl(e.alphaTest,.5),this.forceTransparent=bl(e.forceTransparent,!1),this.edgeBleach=bl(e.edgeBleach,0),r.prototype.init.call(this,e),this.build()},t.prototype.attach=function(t){var e=this;this.bufferList.forEach(function(t){e.viewer.add(t)}),this.setVisibility(this.visible),t()},t.prototype.create=function(){var t={};if(this.volume){var e,i,r=this.volume;"sigma"===this.thresholdType?(e=r.getValueForSigma(this.thresholdMin),i=r.getValueForSigma(this.thresholdMax)):(e=this.thresholdMin,i=this.thresholdMax),r.setFilter(e,i,this.thresholdOut),Object.assign(t,{position:r.getDataPosition(),color:r.getDataColor(this.getColorParams())}),"sphere"===this.dotType&&Object.assign(t,{radius:r.getDataSize(this.radius,this.scale),picking:r.getDataPicking()})}else{var n=this.surface;Object.assign(t,{position:n.getPosition(),color:n.getColor(this.getColorParams())}),"sphere"===this.dotType&&Object.assign(t,{radius:n.getSize(this.radius,this.scale),picking:n.getPicking()})}"sphere"===this.dotType?this.dotBuffer=new Px(t,this.getBufferParams({sphereDetail:this.sphereDetail,disableImpostor:this.disableImpostor,dullInterior:!1})):this.dotBuffer=new Ix(t,this.getBufferParams({pointSize:this.pointSize,sizeAttenuation:this.sizeAttenuation,sortParticles:this.sortParticles,useTexture:this.useTexture,alphaTest:this.alphaTest,forceTransparent:this.forceTransparent,edgeBleach:this.edgeBleach})),this.bufferList.push(this.dotBuffer)},t.prototype.update=function(t){if(void 0===t&&(t={}),0!==this.bufferList.length){var e={};t.color&&(this.volume?Object.assign(e,{color:this.volume.getDataColor(this.getColorParams())}):Object.assign(e,{color:this.surface.getColor(this.getColorParams())})),"sphere"===this.dotType&&(t.radius||t.scale)&&(this.volume?Object.assign(e,{radius:this.volume.getDataSize(this.radius,this.scale)}):Object.assign(e,{radius:this.surface.getSize(this.radius,this.scale)})),this.dotBuffer.setAttributes(e)}},t.prototype.setParameters=function(t,e,i){return void 0===e&&(e={}),t&&void 0!==t.thresholdType&&this.volume instanceof ay&&("value"===this.thresholdType&&"sigma"===t.thresholdType?(this.thresholdMin=this.volume.getSigmaForValue(this.thresholdMin),this.thresholdMax=this.volume.getSigmaForValue(this.thresholdMax)):"sigma"===this.thresholdType&&"value"===t.thresholdType&&(this.thresholdMin=this.volume.getValueForSigma(this.thresholdMin),this.thresholdMax=this.volume.getValueForSigma(this.thresholdMax)),this.thresholdType=t.thresholdType),t&&void 0!==t.radiusType&&("radius"===t.radiusType?this.radius=.1:this.radius=parseFloat(t.radiusType),e.radius=!0,"sphere"!==this.dotType||Xp&&!this.disableImpostor||(i=!0)),t&&void 0!==t.radius&&(e.radius=!0,"sphere"!==this.dotType||Xp&&!this.disableImpostor||(i=!0)),t&&void 0!==t.scale&&(e.scale=!0,"sphere"!==this.dotType||Xp&&!this.disableImpostor||(i=!0)),r.prototype.setParameters.call(this,t,e,i),this},t}(sm);rd.add("shader/Image.vert","uniform float clipRadius;\nuniform vec3 clipCenter;\nvarying vec2 vUv;\n#if defined( NEAR_CLIP ) || defined( RADIUS_CLIP ) || !defined( PICKING )\nvarying vec3 vViewPosition;\n#endif\n#if defined( RADIUS_CLIP )\nvarying vec3 vClipCenter;\n#endif\nvoid main() {\n#include begin_vertex\n#include project_vertex\nvUv = uv;\n#if defined( NEAR_CLIP ) || defined( RADIUS_CLIP ) || !defined( PICKING )\nvViewPosition = -mvPosition.xyz;\n#endif\n#if defined( RADIUS_CLIP )\nvClipCenter = -( modelViewMatrix * vec4( clipCenter, 1.0 ) ).xyz;\n#endif\n}"),rd.add("shader/Image.frag","uniform sampler2D map;\nuniform float opacity;\nuniform vec2 mapSize;\nuniform float clipNear;\nuniform float clipRadius;\nvarying vec2 vUv;\n#if defined( NEAR_CLIP ) || defined( RADIUS_CLIP ) || !defined( PICKING )\nvarying vec3 vViewPosition;\n#endif\n#if defined( RADIUS_CLIP )\nvarying vec3 vClipCenter;\n#endif\n#if defined( PICKING )\nuniform sampler2D pickingMap;\nuniform float objectId;\n#else\n#include fog_pars_fragment\n#endif\n#if defined( CUBIC_INTERPOLATION )\n#if defined( CATMULROM_FILTER ) || defined( MITCHELL_FILTER )\n#if defined( CATMULROM_FILTER )\nconst float B = 0.0;\nconst float C = 0.5;\n#elif defined( MITCHELL_FILTER )\nconst float B = 0.333;\nconst float C = 0.333;\n#endif\nfloat filter( float x ){\nfloat f = x;\nif( f < 0.0 ){\nf = -f;\n}\nif( f < 1.0 ){\nreturn ( ( 12.0 - 9.0 * B - 6.0 * C ) * ( f * f * f ) +\n( -18.0 + 12.0 * B + 6.0 *C ) * ( f * f ) +\n( 6.0 - 2.0 * B ) ) / 6.0;\n}else if( f >= 1.0 && f < 2.0 ){\nreturn ( ( -B - 6.0 * C ) * ( f * f * f )\n+ ( 6.0 * B + 30.0 * C ) * ( f *f ) +\n( - ( 12.0 * B ) - 48.0 * C ) * f +\n8.0 * B + 24.0 * C ) / 6.0;\n}else{\nreturn 0.0;\n}\n}\n#elif defined( BSPLINE_FILTER )\nfloat filter( float x ){\nfloat f = x;\nif( f < 0.0 ){\nf = -f;\n}\nif( f >= 0.0 && f <= 1.0 ){\nreturn ( 2.0 / 3.0 ) + ( 0.5 ) * ( f * f * f ) - ( f * f );\n}else if( f > 1.0 && f <= 2.0 ){\nreturn 1.0 / 6.0 * pow( ( 2.0 - f ), 3.0 );\n}\nreturn 1.0;\n}\n#else\nfloat filter( float x ){\nreturn 1.0;\n}\n#endif\nvec4 biCubic( sampler2D tex, vec2 texCoord ){\nvec2 texelSize = 1.0 / mapSize;\ntexCoord -= texelSize / 2.0;\nvec4 nSum = vec4( 0.0 );\nfloat nDenom = 0.0;\nvec2 cell = fract( texCoord * mapSize );\nfor( float m = -1.0; m <= 2.0; ++m ){\nfor( float n = -1.0; n <= 2.0; ++n ){\nvec4 vecData = texture2D(\ntex, texCoord + texelSize * vec2( m, n )\n);\nfloat c = filter( m - cell.x ) * filter( -n + cell.y );\nnSum += vecData * c;\nnDenom += c;\n}\n}\nreturn nSum / nDenom;\n}\n#endif\nvoid main(){\n#include nearclip_fragment\n#include radiusclip_fragment\n#if defined( CUBIC_INTERPOLATION )\ngl_FragColor = biCubic( map, vUv );\n#else\ngl_FragColor = texture2D( map, vUv );\n#endif\n#if defined( PICKING )\nif( gl_FragColor.a < 0.3 )\ndiscard;\ngl_FragColor = vec4( texture2D( pickingMap, vUv ).xyz, objectId );\n#else\nif( gl_FragColor.a < 0.01 )\ndiscard;\ngl_FragColor.a *= opacity;\n#include fog_fragment\n#endif\n}");var Lx=new Uint16Array([0,1,2,1,3,2]),Rx=new Float32Array([0,1,0,0,1,1,1,0]),Dx=Object.assign({filter:"nearest",forceTransparent:!0},ly),kx=Object.assign({filter:{updateShader:!0,uniform:!0}},py),Bx=function(l){function t(t,e){l.call(this,{position:t.position,index:Lx,picking:t.picking},e),this.parameterTypes=kx,this.alwaysTransparent=!0,this.hasWireframe=!1,this.vertexShader="Image.vert",this.fragmentShader="Image.frag";var i=t.imageData,r=t.width,n=t.height,o=new Ei(i,r,n);o.flipY=!0,this.tex=o;for(var a=i.length,s=new Uint8Array(a),c=0;c<a;c+=4){var u=c/4;s[c]=u>>16&255,s[c+1]=u>>8&255,s[c+2]=255&u}var h=new Ei(s,r,n);h.flipY=!0,h.minFilter=Vt,h.magFilter=Vt,this.pickingTex=h,this.addUniforms({map:{value:o},pickingMap:{value:h},mapSize:{value:new ti(r,n)}}),this.geometry.addAttribute("uv",new wr(Rx,2))}l&&(t.__proto__=l),(t.prototype=Object.create(l&&l.prototype)).constructor=t;var e={defaultParameters:{configurable:!0}};return e.defaultParameters.get=function(){return Dx},t.prototype.getDefines=function(t){var e=l.prototype.getDefines.call(this,t),i=this.parameters.filter;return i.startsWith("cubic")&&(e.CUBIC_INTERPOLATION=1,i.endsWith("bspline")?e.BSPLINE_FILTER=1:i.endsWith("catmulrom")?e.CATMULROM_FILTER=1:i.endsWith("mitchell")&&(e.MITCHELL_FILTER=1)),e},t.prototype.updateTexture=function(){var t=this.tex,e=this.parameters.filter;e.startsWith("cubic")?(t.minFilter=Vt,t.magFilter=Vt):"linear"===e?(t.minFilter=Wt,t.magFilter=Wt):(t.minFilter=Vt,t.magFilter=Vt),t.needsUpdate=!0,this.pickingTex.needsUpdate=!0},t.prototype.makeMaterial=function(){l.prototype.makeMaterial.call(this),this.updateTexture();var t=this.material;t.uniforms.map.value=this.tex,t.blending=Y,t.needsUpdate=!0;var e=this.wireframeMaterial;e.uniforms.map.value=this.tex,e.blending=Y,e.needsUpdate=!0;var i=this.pickingMaterial;i.uniforms.map.value=this.tex,i.uniforms.pickingMap.value=this.pickingTex,i.blending=Y,i.needsUpdate=!0},t.prototype.setUniforms=function(t){t&&void 0!==t.filter&&(this.updateTexture(),t.map=this.tex),l.prototype.setUniforms.call(this,t)},Object.defineProperties(t.prototype,e),t}(dy),Nx=function(t,e){var i=e||{};this.dimension=bl(i.dimension,"x"),this.positionType=bl(i.positionType,"percent"),this.position=bl(i.position,30),this.thresholdType=bl(i.thresholdType,"sigma"),this.thresholdMin=bl(i.thresholdMin,-1/0),this.thresholdMax=bl(i.thresholdMax,1/0),this.normalize=bl(i.normalize,!1),this.volume=t};Nx.prototype.getPositionFromCoordinate=function(t){var e,i=this.dimension,r=this.volume,n=r.matrix,o=(new ri).setFromMatrixPosition(n)[i],a=(new ri).setFromMatrixScale(n)[i];return e="x"===i?r.nx:"y"===i?r.ny:r.nz,Math.round(((t-o)/(e/100)+1)/a)},Nx.prototype.getData=function(t){t=t||{};var e,n=this.volume,i=n.data,o=n.matrix;function r(t){return Math.round(t/100*(e-1))}function a(t,e,i,r){return 3*(i*n.ny*n.nx+e*n.nx+t)+r}e="coordinate"===this.positionType?this.getPositionFromCoordinate(this.position):this.position;var s,c,u,h,l,p=new Float32Array(12),d=new ri,f=0,m=0,g=0,v=n.nx,y=n.ny,b=n.nz;function x(t,e,i,r){d.set(t,e,i).applyMatrix4(o).toArray(p,r)}"x"===this.dimension?(u=r(n.nx),h=n.ny-1,l=n.nz-1,s=n.nz,c=n.ny,v=(f=u)+1,x(u,0,0,0),x(u,h,0,3),x(u,0,l,6),x(u,h,l,9)):"y"===this.dimension?(u=n.nx-1,h=r(n.ny),l=n.nz-1,s=n.nz,c=n.nx,y=(m=h)+1,x(0,h,0,0),x(u,h,0,3),x(0,h,l,6),x(u,h,l,9)):"z"===this.dimension&&(u=n.nx-1,h=n.ny-1,l=r(n.nz),s=n.nx,c=n.ny,b=(g=l)+1,x(0,0,l,0),x(0,h,l,3),x(u,0,l,6),x(u,h,l,9));var _,w,S=0,A=0,M=new Uint8Array(s*c*4),E=new Float32Array(s*c);"sigma"===this.thresholdType?(_=n.getValueForSigma(this.thresholdMin),w=n.getValueForSigma(this.thresholdMax)):(_=this.thresholdMin,w=this.thresholdMax);var P=Object.assign({},t.colorParams,{volume:n});this.normalize&&(P.domain=[0,1]);var T,C=Qp.getScheme(P),I=new Float32Array(3),O=C.getScale(),L=0,R=0;if(this.normalize){L=1/0,T=-1/0;for(var D=m;D<y;++D)for(var k=f;k<v;++k)for(var B=g;B<b;++B){var N=i[a(k,D,B,0)/3];N<L&&(L=N),T<N&&(T=N)}R=T-L}for(var F=m;F<y;++F)for(var z=f;z<v;++z)for(var U=g;U<b;++U){var j=a(z,F,U,0)/3,G=i[j];this.normalize&&(G=(G-L)/R),C.colorToArray(O(G),I),M[S]=Math.round(255*I[0]),M[S+1]=Math.round(255*I[1]),M[S+2]=Math.round(255*I[2]),M[S+3]=_<G&&G<w?255:0,E[A]=j,++A,S+=4}var V=new Tv(E,n);return{position:p,imageData:M,width:s,height:c,picking:V}};var Fx=function(r){function t(t,e,i){r.call(this,t,e,i),this.type="slice",this.parameters=Object.assign({filter:{type:"select",buffer:!0,options:{nearest:"nearest",linear:"linear","cubic-bspline":"cubic-bspline","cubic-catmulrom":"cubic-catmulrom","cubic-mitchell":"cubic-mitchell"}},positionType:{type:"select",rebuild:!0,options:{percent:"percent",coordinate:"coordinate"}},position:{type:"range",step:.1,max:100,min:1,rebuild:!0},dimension:{type:"select",rebuild:!0,options:{x:"x",y:"y",z:"z"}},thresholdType:{type:"select",rebuild:!0,options:{value:"value",sigma:"sigma"}},thresholdMin:{type:"number",precision:3,max:1/0,min:-1/0,rebuild:!0},thresholdMax:{type:"number",precision:3,max:1/0,min:-1/0,rebuild:!0},normalize:{type:"boolean",rebuild:!0}},this.parameters,{flatShaded:null,side:null,wireframe:null,linewidth:null,colorScheme:null,roughness:null,metalness:null,diffuse:null}),this.volume=t,this.init(i)}return r&&(t.__proto__=r),((t.prototype=Object.create(r&&r.prototype)).constructor=t).prototype.init=function(t){var e=this.volume,i=t||{};i.colorDomain=bl(i.colorDomain,[e.min,e.max]),i.colorScheme=bl(i.colorScheme,"value"),i.colorScale=bl(i.colorScale,"Spectral"),this.colorScheme="value",this.dimension=bl(i.dimension,"x"),this.filter=bl(i.filter,"cubic-bspline"),this.positionType=bl(i.positionType,"percent"),this.position=bl(i.position,30),this.thresholdType=bl(i.thresholdType,"sigma"),this.thresholdMin=bl(i.thresholdMin,-1/0),this.thresholdMax=bl(i.thresholdMax,1/0),this.normalize=bl(i.normalize,!1),r.prototype.init.call(this,i),this.build()},t.prototype.attach=function(t){var e=this;this.bufferList.forEach(function(t){e.viewer.add(t)}),this.setVisibility(this.visible),t()},t.prototype.create=function(){var t=new Nx(this.volume,{positionType:this.positionType,position:this.position,dimension:this.dimension,thresholdType:this.thresholdType,thresholdMin:this.thresholdMin,thresholdMax:this.thresholdMax,normalize:this.normalize}),e=new Bx(t.getData({colorParams:this.getColorParams()}),this.getBufferParams({filter:this.filter}));this.bufferList.push(e)},t}(sm);function zx(t){Yp.error("makeRepresentation: representation type "+t+" unknown")}var Ux={name:"some element",status:""},jx=function(t,e){void 0===e&&(e={}),this.stage=t,this.signals={statusChanged:new op,nameChanged:new op,disposed:new op},this.parameters=xl(e,this.defaultParameters),this.uuid=$l()},Gx={defaultParameters:{configurable:!0},name:{configurable:!0}};Gx.defaultParameters.get=function(){return Ux},Gx.name.get=function(){return this.parameters.name},jx.prototype.setStatus=function(t){return this.parameters.status=t,this.signals.statusChanged.dispatch(t),this},jx.prototype.setName=function(t){return this.parameters.name=t,this.signals.nameChanged.dispatch(t),this},jx.prototype.dispose=function(){this.signals.disposed.dispatch()},Object.defineProperties(jx.prototype,Gx);var Vx=Object.assign({visible:!0},Ux),Hx=function(n){function t(t,e,i,r){void 0===i&&(i={}),n.call(this,t,Object.assign({name:e.type},i)),this.parent=r,this.signals=Object.assign({visibilityChanged:new op,parametersChanged:new op},this.signals),this.setRepresentation(e)}n&&(t.__proto__=n),(t.prototype=Object.create(n&&n.prototype)).constructor=t;var e={defaultParameters:{configurable:!0},visible:{configurable:!0},type:{configurable:!0}};return e.defaultParameters.get=function(){return Vx},e.visible.get=function(){return this.parameters.visible},e.type.get=function(){return"representation"},t.prototype.getType=function(){return this.repr.type},t.prototype.setRepresentation=function(t){this._disposeRepresentation(),this.repr=t,this.stage.tasks.listen(this.repr.tasks),this.updateVisibility()},t.prototype._disposeRepresentation=function(){this.repr&&(this.stage.tasks.unlisten(this.repr.tasks),this.repr.dispose())},t.prototype.dispose=function(){this.parent&&this.parent.hasRepresentation(this)?this.parent.removeRepresentation(this):(this._disposeRepresentation(),this.signals.disposed.dispatch())},t.prototype.setVisibility=function(t){return this.parameters.visible=t,this.updateVisibility(),this.signals.visibilityChanged.dispatch(this.parameters.visible),this},t.prototype.getVisibility=function(){return this.parent?this.parent.parameters.visible&&this.parameters.visible:this.parameters.visible},t.prototype.toggleVisibility=function(){return this.setVisibility(!this.parameters.visible)},t.prototype.updateVisibility=function(){this.repr.setVisibility(this.getVisibility())},t.prototype.update=function(t){return this.repr.update(t),this},t.prototype.build=function(t){return this.repr.build(t),this},t.prototype.setSelection=function(t){var e=this.repr;return e.setSelection&&e.setSelection(t),this},t.prototype.setParameters=function(t){return this.repr.setParameters(t),this.signals.parametersChanged.dispatch(this.repr.getParameters()),this},t.prototype.getParameters=function(){return this.repr.getParameters()},t.prototype.setColor=function(t){return this.repr.setColor(t),this},Object.defineProperties(t.prototype,e),t}(jx),$x=new ei,Wx=new ri,Xx={name:"",status:"",visible:!0},qx=function(t,e,i){void 0===i&&(i={}),this.stage=t,this.object=e,this.signals={representationAdded:new op,representationRemoved:new op,visibilityChanged:new op,matrixChanged:new op,statusChanged:new op,nameChanged:new op,disposed:new op},this.reprList=[],this.annotationList=[],this.matrix=new ei,this.position=new ri,this.quaternion=new ii,this.scale=new ri(1,1,1),this.transform=new ei,this.parameters=xl(i,this.defaultParameters),this.uuid=$l(),this.viewer=t.viewer,this.controls=new zy(this)},Yx={defaultParameters:{configurable:!0},name:{configurable:!0},status:{configurable:!0},visible:{configurable:!0}};Yx.defaultParameters.get=function(){return Xx},Yx.name.get=function(){return this.parameters.name},Yx.status.get=function(){return this.parameters.status},Yx.visible.get=function(){return this.parameters.visible},qx.prototype.setPosition=function(t){return Array.isArray(t)?this.position.fromArray(t):this.position.copy(t),this.updateMatrix(),this},qx.prototype.setRotation=function(t){if(Array.isArray(t))if(3===t.length){var e=(new Gi).fromArray(t);this.quaternion.setFromEuler(e)}else this.quaternion.fromArray(t);else t instanceof Gi?this.quaternion.setFromEuler(t):this.quaternion.copy(t);return this.updateMatrix(),this},qx.prototype.setScale=function(t){return this.scale.set(t,t,t),this.updateMatrix(),this},qx.prototype.setTransform=function(t){return this.transform.copy(t),this.updateMatrix(),this},qx.prototype.updateMatrix=function(){var e=this,t=this.getCenterUntransformed(Wx);this.matrix.makeTranslation(-t.x,-t.y,-t.z),$x.makeRotationFromQuaternion(this.quaternion),this.matrix.premultiply($x),$x.makeScale(this.scale.x,this.scale.y,this.scale.z),this.matrix.premultiply($x);var i=this.position;$x.makeTranslation(i.x+t.x,i.y+t.y,i.z+t.z),this.matrix.premultiply($x),this.matrix.premultiply(this.transform),this.reprList.forEach(function(t){t.setParameters({matrix:e.matrix})}),this.stage.viewer.updateBoundingBox(),this.signals.matrixChanged.dispatch(this.matrix)},qx.prototype.addAnnotation=function(t,e,i){var r=new ky(this,t,e,i);return this.annotationList.push(r),r},qx.prototype.eachAnnotation=function(t){this.annotationList.slice().forEach(t)},qx.prototype.removeAnnotation=function(t){var e=this.annotationList.indexOf(t);-1!==e&&(this.annotationList.splice(e,1),t.dispose())},qx.prototype.removeAllAnnotations=function(){this.eachAnnotation(function(t){return t.dispose()}),this.annotationList.length=0},qx.prototype._addRepresentation=function(t,e,i,r){void 0===r&&(r=!1);var n=i||{},o=this.stage.getParameters();n.matrix=this.matrix.clone(),n.quality=n.quality||o.quality,n.disableImpostor=bl(n.disableImpostor,!o.impostor),n.useWorker=bl(n.useWorker,o.workerDefault),n.visible=bl(n.visible,!0);var a=Object.assign({},n,{visible:this.parameters.visible&&n.visible}),s=function(t,e,i,r){var n;if(de.Debug&&Yp.time("makeRepresentation "+t),e instanceof cx){if(!(n=ed.get(t)))return void zx(t)}else if(e instanceof ry)if("surface"===t)n=wy;else{if("dot"!==t)return void zx(t);n=Ox}else if(e instanceof ay)if("surface"===t)n=wy;else if("dot"===t)n=Ox;else{if("slice"!==t)return void zx(t);n=Fx}else if(e instanceof dx)n=mx,e=e.getBufferList();else{if("buffer"!==t)return void Yp.error("makeRepresentation: object "+e+" unknown");n=mx}var o=new n(e,i,r);return de.Debug&&Yp.timeEnd("makeRepresentation "+t),o}(t,e,this.viewer,a),c=new Hx(this.stage,s,n,this);return r||(this.reprList.push(c),this.signals.representationAdded.dispatch(c)),c},qx.prototype.addBufferRepresentation=function(t,e){return this._addRepresentation.call(this,"buffer",t,e)},qx.prototype.hasRepresentation=function(t){return-1!==this.reprList.indexOf(t)},qx.prototype.eachRepresentation=function(t){this.reprList.slice().forEach(t)},qx.prototype.removeRepresentation=function(t){var e=this.reprList.indexOf(t);-1!==e&&(this.reprList.splice(e,1),t.dispose(),this.signals.representationRemoved.dispatch(t))},qx.prototype.updateRepresentations=function(e){this.reprList.forEach(function(t){return t.update(e)}),this.stage.viewer.requestRender()},qx.prototype.removeAllRepresentations=function(){this.eachRepresentation(function(t){return t.dispose()})},qx.prototype.dispose=function(){this.removeAllAnnotations(),this.removeAllRepresentations(),delete this.annotationList,delete this.reprList,this.signals.disposed.dispatch()},qx.prototype.setVisibility=function(t){return this.parameters.visible=t,this.eachRepresentation(function(t){return t.updateVisibility()}),this.eachAnnotation(function(t){return t.updateVisibility()}),this.signals.visibilityChanged.dispatch(t),this},qx.prototype.setStatus=function(t){return this.parameters.status=t,this.signals.statusChanged.dispatch(t),this},qx.prototype.setName=function(t){return this.parameters.name=t,this.signals.nameChanged.dispatch(t),this},qx.prototype.getBox=function(){for(var t,e=[],i=arguments.length;i--;)e[i]=arguments[i];return(t=this).getBoxUntransformed.apply(t,e).clone().applyMatrix4(this.matrix)},qx.prototype.getCenter=function(){for(var t,e=[],i=arguments.length;i--;)e[i]=arguments[i];return(t=this).getCenterUntransformed.apply(t,e).clone().applyMatrix4(this.matrix)},qx.prototype.getZoom=function(){for(var t,e=[],i=arguments.length;i--;)e[i]=arguments[i];return this.stage.getZoomForBox((t=this).getBox.apply(t,e))},qx.prototype.getBoxUntransformed=function(){for(var t=[],e=arguments.length;e--;)t[e]=arguments[e];return new Pi},qx.prototype.getCenterUntransformed=function(){for(var t=[],e=arguments.length;e--;)t[e]=arguments[e];return this.getBoxUntransformed().getCenter(new ri)},qx.prototype.autoView=function(t){this.stage.animationControls.zoomMove(this.getCenter(),this.getZoom(),bl(t,0))},Object.defineProperties(qx.prototype,Yx);var Zx=function(t){void 0===t&&(t=[]);for(var e=(this.list=t).length,i=0;i<e;++i){t[i].signals.disposed.add(this._remove,this)}},Kx={first:{configurable:!0}};Zx.prototype._remove=function(t){var e=this.list.indexOf(t);-1!==e&&this.list.splice(e,1)},Kx.first.get=function(){return 0<this.list.length?this.list[0]:void 0},Zx.prototype.forEach=function(t){return this.list.forEach(t),this},Zx.prototype.dispose=function(){return this.forEach(function(t){return t.dispose()})},Object.defineProperties(Zx.prototype,Kx);var Jx=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),((e.prototype=Object.create(t&&t.prototype)).constructor=e).prototype.setParameters=function(e){return this.forEach(function(t){return t.setParameters(e)})},e.prototype.setVisibility=function(e){return this.forEach(function(t){return t.setVisibility(e)})},e.prototype.setSelection=function(e){return this.forEach(function(t){return t.setSelection(e)})},e.prototype.setColor=function(e){return this.forEach(function(t){return t.setColor(e)})},e.prototype.update=function(e){return this.forEach(function(t){return t.update(e)})},e.prototype.build=function(e){return this.forEach(function(t){return t.build(e)})},e.prototype.dispose=function(t){return this.forEach(function(t){return t.dispose()})},e}(Zx),Qx=Object.assign({defaultStep:1,defaultTimeout:50,defaultInterpolateType:"",defaultInterpolateStep:5,defaultMode:"loop",defaultDirection:"forward",initialFrame:0},Ux),t_=function(n){function t(t,e,i){var r=this;void 0===i&&(i={}),n.call(this,t,Object.assign({name:e.name},i)),this.trajectory=e,this.signals=Object.assign(this.signals,{frameChanged:new op,playerChanged:new op,countChanged:new op,parametersChanged:new op}),e.signals.frameChanged.add(function(t){r.signals.frameChanged.dispatch(t)}),e.signals.playerChanged.add(function(t){r.signals.playerChanged.dispatch(t)}),e.signals.countChanged.add(function(t){r.signals.countChanged.dispatch(t)}),void 0!==i.initialFrame&&this.setFrame(i.initialFrame)}n&&(t.__proto__=n),(t.prototype=Object.create(n&&n.prototype)).constructor=t;var e={defaultParameters:{configurable:!0},type:{configurable:!0}};return e.defaultParameters.get=function(){return Qx},e.type.get=function(){return"trajectory"},t.prototype.setFrame=function(t){this.trajectory.setFrame(t)},t.prototype.setParameters=function(t){void 0===t&&(t={}),this.trajectory.setParameters(t),this.signals.parametersChanged.dispatch(t)},t.prototype.dispose=function(){this.trajectory.dispose(),n.prototype.dispose.call(this)},Object.defineProperties(t.prototype,e),t}(jx),e_=function(t,e){this.name=t,this.path=e,this.coordinates=[],this.boxes=[],this.times=[],this.timeOffset=0,this.deltaTime=1},i_={type:{configurable:!0}};i_.type.get=function(){return"Frames"},Object.defineProperties(e_.prototype,i_);var r_=function(t,e){var i,r;if(this.A=new kv(3,3),this.W=new kv(1,3),this.U=new kv(3,3),this.V=new kv(3,3),this.VH=new kv(3,3),this.R=new kv(3,3),this.tmp=new kv(3,3),this.c=new kv(3,3),t instanceof cx)i=t.atomCount;else{if(!(t instanceof Float32Array))return;i=t.length/3}if(e instanceof cx)r=e.atomCount;else{if(!(e instanceof Float32Array))return;r=e.length/3}var n=Math.min(i,r),o=new kv(3,n),a=new kv(3,n);this.coords1t=new kv(n,3),this.coords2t=new kv(n,3),this.transformationMatrix=new ei,this.c.data.set([1,0,0,0,1,0,0,0,-1]),this.prepCoords(t,o,n,!1),this.prepCoords(e,a,n,!1),this._superpose(o,a)};r_.prototype._superpose=function(t,e){var i,r,n,o,a,s,c,u,h,l,p,d,f,m,g,v,y,b,x,_,w,S;this.mean1=zv(t),this.mean2=zv(e),Uv(t,this.mean1),Uv(e,this.mean2),Bv(this.coords1t,t),Bv(this.coords2t,e),Nv(this.A,this.coords2t,this.coords1t),Hv(this.A,this.W,this.U,this.V),i=this.V,r=this.VH,n=i.data,o=r.data,a=n[4],s=n[8],c=n[5],u=n[7],h=n[0],l=h*a,p=h*c,d=n[3],f=n[1],m=d*f,g=n[2],v=d*g,y=n[6],_=1/(l*s-p*u-m*s+v*u+(b=y*f)*c-(x=y*g)*a),o[0]=(a*s-c*u)*_,o[1]=-(f*s-g*u)*_,o[2]=-(-f*c+g*a)*_,o[3]=-(d*s-c*y)*_,o[4]=(h*s-x)*_,o[5]=-(p-v)*_,o[6]=-(-d*u+a*y)*_,o[7]=-(h*u-b)*_,o[8]=(l-m)*_,Fv(this.R,this.U,this.VH),w=this.R,(S=w.data)[0]*S[4]*S[8]-S[0]*S[5]*S[7]-S[3]*S[1]*S[8]+S[3]*S[2]*S[7]+S[6]*S[1]*S[5]-S[6]*S[2]*S[4]<0&&(de.Debug&&Yp.log("R not a right handed system"),Fv(this.tmp,this.c,this.VH),Fv(this.R,this.U,this.tmp));var A=new kv(4,4),M=new kv(4,4),E=new kv(4,4),P=new kv(4,4),T=new kv(4,4),C=new kv(4,4),I=this.R.data,O=this.mean1,L=this.mean2;P.data.set([1,0,0,-O[0],0,1,0,-O[1],0,0,1,-O[2],0,0,0,1]),T.data.set([I[0],I[1],I[2],0,I[3],I[4],I[5],0,I[6],I[7],I[8],0,0,0,0,1]),C.data.set([1,0,0,L[0],0,1,0,L[1],0,0,1,L[2],0,0,0,1]),Bv(M,P),Nv(A,T,M),Bv(E,A),Nv(M,C,E),Bv(A,M),this.transformationMatrix.elements=A.data},r_.prototype.prepCoords=function(t,e,i,r){var n=0,o=e.data,a=3,s=3*i;if(r&&(s=4*i,a=4),t instanceof cx)t.eachAtom(function(t){n<s&&(o[n+0]=t.x,o[n+1]=t.y,o[n+2]=t.z,r&&(o[n+3]=1),n+=a)});else if(t instanceof Float32Array)for(;n<s;n+=a)n<s&&(o[n]=t[n],o[n+1]=t[n+1],o[n+2]=t[n+2],r&&(o[n+3]=1));else Yp.warn("prepCoords: input type unknown")},r_.prototype.transform=function(t){var e;if(t instanceof cx)e=t.atomCount;else{if(!(t instanceof Float32Array))return;e=t.length/3}var i=new kv(4,e),r=new kv(e,4);this.prepCoords(t,i,e,!0);var n=this.transformationMatrix,o=n.determinant();if(!o)return o;var a=new kv(4,4);a.data=n.elements,function(t,e,i){for(var r=0,n=0,o=0,a=0,s=0,c=0,u=0,h=0,l=e.cols,p=e.rows,d=i.cols,f=e.data,m=i.data,g=t.data,v=0;r<p;a+=l,r++)for(n=u=0;n<d;h++,u++,n++){for(c=u,s=a,o=v=0;o<l;s++,c+=d,o++)v+=f[s]*m[c];g[h]=v}}(r,i,a);var s=0,c=r.data;if(t instanceof cx){t.eachAtom(function(t){t.x=c[s],t.y=c[s+1],t.z=c[s+2],s+=4});var u=new ei;u.getInverse(n);var h=t.biomolDict;for(var l in h){if(h.hasOwnProperty(l))h[l].partList.forEach(function(t){t.matrixList.forEach(function(t){t.premultiply(n),t.multiply(u)})})}}else if(t instanceof Float32Array)for(var p=4*e;s<p;s+=4)t[s]=c[s],t[s+1]=c[s+1],t[s+2]=c[s+2];else Yp.warn("transform: input type unknown");return this.transformationMatrix};var n_={step:1,timeout:50,start:0,end:0,interpolateType:"",interpolateStep:5,mode:"loop",direction:"forward"},o_=function(t,e){var i=this;void 0===e&&(e={}),this.signals={startedRunning:new op,haltedRunning:new op},this._run=!1,this._previousTime=0,this._currentTime=0,this._currentStep=1,t.signals.playerChanged.add(function(t){t!==i&&i.pause()},this);var r=bl(t.frameCount,1);this.traj=t,this.parameters=xl(e,n_),this.parameters.end=Math.min(bl(e.end,r-1),r-1),this.parameters.step=bl(e.step,Math.ceil((r+1)/100)),this._currentFrame=this.parameters.start,this._direction="bounce"===this.parameters.direction?"forward":this.parameters.direction,t.signals.countChanged.add(function(t){i.parameters.end=Math.min(bl(i.parameters.end,t-1),t-1)},this),this._animate=this._animate.bind(this)},a_={isRunning:{configurable:!0}};a_.isRunning.get=function(){return this._run},o_.prototype.setParameters=function(t){void 0===t&&(t={}),_l(this.parameters,t),void 0!==t.direction&&"bounce"!==this.parameters.direction&&(this._direction=this.parameters.direction)},o_.prototype._animate=function(){if(this._run){this._currentTime=window.performance.now();var t=this._currentTime-this._previousTime,e=this.parameters.interpolateType?this.parameters.interpolateStep:1,i=this.parameters.timeout/e,r=this.traj;if(r&&r.frameCount&&!r.inProgress&&i<=t)if(this.parameters.interpolateType)if(this._currentStep>this.parameters.interpolateStep&&(this._currentStep=1),1===this._currentStep&&(this._currentFrame=this._nextInterpolated()),r.hasFrame(this._currentFrame)){this._currentStep+=1;var n=this._currentStep/(this.parameters.interpolateStep+1),o=this._currentFrame,a=o[0],s=o[1],c=o[2],u=o[3];r.setFrameInterpolated(a,s,c,u,n,this.parameters.interpolateType),this._previousTime=this._currentTime}else r.loadFrame(this._currentFrame);else{var h=this._next();r.hasFrame(h)?(r.setFrame(h),this._previousTime=this._currentTime):r.loadFrame(h)}window.requestAnimationFrame(this._animate)}},o_.prototype._next=function(){var t,e=this.parameters;return((t="forward"===this._direction?this.traj.currentFrame+e.step:this.traj.currentFrame-e.step)>e.end||t<e.start)&&("bounce"===e.direction&&("forward"===this._direction?this._direction="backward":this._direction="forward"),"once"===e.mode?(this.pause(),t="forward"===e.direction?e.end:"backward"===e.direction?e.start:"forward"===this._direction?e.start:e.end):"forward"===this._direction?(t=e.start,e.interpolateType&&(t=Math.min(e.end,t+e.step))):(t=e.end,e.interpolateType&&(t=Math.max(e.start,t-e.step)))),t},o_.prototype._nextInterpolated=function(){var t,e,i,r=this.parameters,n=this._next();return"forward"===this._direction?(t=Math.max(r.start,n-r.step),e=Math.max(r.start,n-2*r.step),i=Math.max(r.start,n-3*r.step)):(t=Math.min(r.end,n+r.step),e=Math.min(r.end,n+2*r.step),i=Math.min(r.end,n+3*r.step)),[n,t,e,i]},o_.prototype.toggle=function(){this._run?this.pause():this.play()},o_.prototype.play=function(){if(!this._run){this.traj.player!==this&&this.traj.setPlayer(this),this._currentStep=1;var t=this.parameters,e=this.traj.currentFrame,i=Math.ceil(e/t.step)*t.step;"forward"===t.direction&&e>=t.end?i=t.start:"backward"===t.direction&&e<=t.start&&(i=t.end),this.traj.setFrame(i),this._run=!0,this._animate(),this.signals.startedRunning.dispatch()}},o_.prototype.pause=function(){this._run=!1,this.signals.haltedRunning.dispatch()},o_.prototype.stop=function(){this.pause(),this.traj.setFrame(this.parameters.start)},Object.defineProperties(o_.prototype,a_);var s_=function(t,e,i){var r=this;void 0===i&&(i={}),this.signals={countChanged:new op,frameChanged:new op,playerChanged:new op},this.frameCache={},this.loadQueue={},this.boxCache={},this.pathCache={},this.frameCacheSize=0,this._frameCount=0,this._currentFrame=-1,this._disposed=!1,this.deltaTime=bl(i.deltaTime,0),this.timeOffset=bl(i.timeOffset,0),this.centerPbc=bl(i.centerPbc,!1),this.removePbc=bl(i.removePbc,!1),this.removePeriodicity=bl(i.removePeriodicity,!1),this.superpose=bl(i.superpose,!1),this.name=t.replace(/^.*[\\/]/,""),this.trajPath=t,this.selection=new Lp(bl(i.sele,"backbone and not hydrogen")),this.selection.signals.stringChanged.add(function(){r.selectionIndices=r.structure.getAtomIndices(r.selection),r._resetCache(),r._saveInitialCoords(),r.setFrame(r._currentFrame)})},c_={frameCount:{configurable:!0},currentFrame:{configurable:!0}};c_.frameCount.get=function(){return this._frameCount},c_.currentFrame.get=function(){return this._currentFrame},s_.prototype._init=function(t){this.setStructure(t),this._loadFrameCount(),this.setPlayer(new o_(this))},s_.prototype._loadFrameCount=function(){},s_.prototype.setStructure=function(t){this.structure=t,this.atomCount=t.atomCount,this.backboneIndices=this._getIndices(new Lp("backbone and not hydrogen")),this._makeAtomIndices(),this._saveStructureCoords(),this.selectionIndices=this._getIndices(this.selection),this._resetCache(),this._saveInitialCoords(),this.setFrame(this._currentFrame)},s_.prototype._saveInitialCoords=function(){var t=this;this.structure.hasCoords()?(this.initialCoords=new Float32Array(this.structureCoords),this._makeSuperposeCoords()):this.frameCache[0]?(this.initialCoords=new Float32Array(this.frameCache[0]),this._makeSuperposeCoords()):this.loadFrame(0,function(){return t._saveInitialCoords()})},s_.prototype._saveStructureCoords=function(){this.structureCoords=this.structure.getAtomData({what:{position:!0}}).position},s_.prototype.setSelection=function(t){return this.selection.setString(t),this},s_.prototype._getIndices=function(t){var e=0,i=t.test,r=[];return i&&this.structure.eachAtom(function(t){i(t)&&r.push(e),e+=1}),r},s_.prototype._makeSuperposeCoords=function(){var t=3*this.selectionIndices.length;this.coords1=new Float32Array(t),this.coords2=new Float32Array(t);for(var e=this.initialCoords,i=this.coords2,r=0;r<t;r+=3){var n=3*this.selectionIndices[r/3];i[r+0]=e[n+0],i[r+1]=e[n+1],i[r+2]=e[n+2]}},s_.prototype._makeAtomIndices=function(){Yp.error("Trajectory._makeAtomIndices not implemented")},s_.prototype._resetCache=function(){this.frameCache={},this.loadQueue={},this.boxCache={},this.pathCache={},this.frameCacheSize=0,this.initialCoords=new Float32Array(0)},s_.prototype.setParameters=function(t){void 0===t&&(t={});var e=!1;void 0!==t.centerPbc&&t.centerPbc!==this.centerPbc&&(this.centerPbc=t.centerPbc,e=!0),void 0!==t.removePeriodicity&&t.removePeriodicity!==this.removePeriodicity&&(this.removePeriodicity=t.removePeriodicity,e=!0),void 0!==t.removePbc&&t.removePbc!==this.removePbc&&(this.removePbc=t.removePbc,e=!0),void 0!==t.superpose&&t.superpose!==this.superpose&&(this.superpose=t.superpose,e=!0),this.deltaTime=bl(t.deltaTime,this.deltaTime),this.timeOffset=bl(t.timeOffset,this.timeOffset),e&&(this._resetCache(),this.setFrame(this._currentFrame))},s_.prototype.hasFrame=function(t){var e=this;return Array.isArray(t)?t.every(function(t){return!!e.frameCache[t]}):!!this.frameCache[t]},s_.prototype.setFrame=function(t,e){var i=this;return void 0===t||(this.inProgress=!0,-1===t||this.frameCache[t]?(this._updateStructure(t),e&&e()):this.loadFrame(t,function(){i._updateStructure(t),e&&e()})),this},s_.prototype._interpolate=function(t,e,i,r,n,o){var a,s=this.frameCache;a="spline"===o?function(t,e,i,r,n){for(var o=t.length,a=new Float32Array(o),s=0;s<o;s+=3){var c=s+1,u=s+2;a[s]=Yl(r[s],i[s],e[s],t[s],n,1),a[c]=Yl(r[c],i[c],e[c],t[c],n,1),a[u]=Yl(r[u],i[u],e[u],t[u],n,1)}return a}(s[t],s[e],s[i],s[r],n):function(t,e,i){for(var r=t.length,n=new Float32Array(r),o=0;o<r;o+=3){var a=o+1,s=o+2;n[o]=ql(e[o],t[o],i),n[a]=ql(e[a],t[a],i),n[s]=ql(e[s],t[s],i)}return n}(s[t],s[e],n),this.structure.updatePosition(a),this._currentFrame=t,this.signals.frameChanged.dispatch(t)},s_.prototype.setFrameInterpolated=function(t,e,i,r,n,o,a){var s=this;if(void 0===t)return this;var c=this.frameCache,u=[];return c[r]||u.push(r),c[i]||u.push(i),c[e]||u.push(e),c[t]||u.push(t),u.length?this.loadFrame(u,function(){s._interpolate(t,e,i,r,n,o),a&&a()}):(this._interpolate(t,e,i,r,n,o),a&&a()),this},s_.prototype.loadFrame=function(t,e){var i=this;Array.isArray(t)?t.forEach(function(t){i.loadQueue[t]||i.frameCache[t]||(i.loadQueue[t]=!0,i._loadFrame(t,function(){delete i.loadQueue[t]}))}):this.loadQueue[t]||this.frameCache[t]||(this.loadQueue[t]=!0,this._loadFrame(t,function(){delete i.loadQueue[t],e&&e()}))},s_.prototype._loadFrame=function(t,e){Yp.error("Trajectory._loadFrame not implemented",t,e)},s_.prototype._updateStructure=function(t){this._disposed?console.error("updateStructure: traj disposed"):(-1===t?this.structureCoords&&this.structure.updatePosition(this.structureCoords):this.structure.updatePosition(this.frameCache[t]),this.structure.trajectory={name:this.trajPath,frame:t},this._currentFrame=t,this.inProgress=!1,this.signals.frameChanged.dispatch(t))},s_.prototype._doSuperpose=function(t){for(var e=3*this.selectionIndices.length,i=this.coords1,r=this.coords2,n=0;n<e;n+=3){var o=3*this.selectionIndices[n/3];i[n+0]=t[o+0],i[n+1]=t[o+1],i[n+2]=t[o+2]}new r_(i,r).transform(t)},s_.prototype._process=function(t,e,i,r){if(this._setFrameCount(r),e){if(0<this.backboneIndices.length&&this.centerPbc){var n=[e[0],e[4],e[8]];!function(t,e,i){if(0!==i[0]&&0!==i[8]&&0!==i[4])for(var r=t.length,n=i[0],o=i[1],a=i[2],s=-e[0]+n+n/2,c=-e[1]+o+o/2,u=-e[2]+a+a/2,h=0;h<r;h+=3)t[h+0]=(t[h+0]+s)%n,t[h+1]=(t[h+1]+c)%o,t[h+2]=(t[h+2]+u)%a}(i,(a=this.backboneIndices,[zd(s=i,(c=n)[0],3,0,a),zd(s,c[1],3,1,a),zd(s,c[2],3,2,a)]),n)}if(this.removePeriodicity)!function(t,e,i){if(0!==e[0]&&0!==e[8]&&0!==e[4]){for(var r=t.length,n=3;n<r;n+=3)for(var o=0;o<3;++o){var a=(t[n+o]-i[o])/e[3*o+o];.5<Math.abs(a)&&(t[n+o]-=e[3*o+o]*Math.round(a))}}}(i,e,[Jd(o=i,3,0),Jd(o,3,1),Jd(o,3,2)]);this.removePbc&&function(t,e){if(0!==e[0]&&0!==e[8]&&0!==e[4]){for(var i=t.length,r=3;r<i;r+=3)for(var n=0;n<3;++n){var o=t[r+n]-t[r-3+n];if(Math.abs(o)>.9*e[3*n+n])if(0<o)for(var a=0;a<3;++a)t[r+a]-=e[3*n+a];else for(var s=0;s<3;++s)t[r+s]+=e[3*n+s]}}}(i,e)}var o,a,s,c;0<this.selectionIndices.length&&this.coords1&&this.superpose&&this._doSuperpose(i),this.frameCache[t]=i,this.boxCache[t]=e,this.frameCacheSize+=1},s_.prototype._setFrameCount=function(t){t!==this._frameCount&&(this._frameCount=t,this.signals.countChanged.dispatch(t))},s_.prototype.dispose=function(){this._resetCache(),this._disposed=!0,this.player&&this.player.stop()},s_.prototype.setPlayer=function(t){this.player=t,this.signals.playerChanged.dispatch(t)},s_.prototype.getFrameTime=function(t){return this.timeOffset+t*this.deltaTime},Object.defineProperties(s_.prototype,c_);var u_=function(n){function t(t,e,i){var r=i||{};r.timeOffset=bl(r.timeOffset,t.timeOffset),r.deltaTime=bl(r.deltaTime,t.deltaTime),n.call(this,"",e,r),this.name=t.name,this.path=t.path,this.frames=t.coordinates,this.boxes=t.boxes,this._init(e)}n&&(t.__proto__=n),(t.prototype=Object.create(n&&n.prototype)).constructor=t;var e={type:{configurable:!0}};return e.type.get=function(){return"frames"},t.prototype._makeAtomIndices=function(){"StructureView"===this.structure.type?this.atomIndices=this.structure.getAtomIndices():this.atomIndices=void 0},t.prototype._loadFrame=function(t,e){var i,r=this.frames[t];if(this.atomIndices){var n=this.atomIndices,o=n.length;i=new Float32Array(3*o);for(var a=0;a<o;++a){var s=3*a,c=3*n[a];i[s+0]=r[c+0],i[s+1]=r[c+1],i[s+2]=r[c+2]}}else i=new Float32Array(r);var u=this.boxes[t],h=this.frames.length;this._process(t,u,i,h),"function"==typeof e&&e()},t.prototype._loadFrameCount=function(){this.frames&&this._setFrameCount(this.frames.length)},Object.defineProperties(t.prototype,e),t}(s_),h_=function(r){function t(t,e,i){r.call(this,"",e,i),this._init(e)}r&&(t.__proto__=r),(t.prototype=Object.create(r&&r.prototype)).constructor=t;var e={type:{configurable:!0}};return e.type.get=function(){return"structure"},t.prototype._makeAtomIndices=function(){this.structure.atomSet&&this.structure.atomSet.getSize()<this.structure.atomStore.count?this.atomIndices=this.structure.getAtomIndices():this.atomIndices=void 0},t.prototype._loadFrame=function(t,e){var i,r=this.structure,n=r.frames[t];if(this.atomIndices){var o=this.atomIndices,a=o.length;i=new Float32Array(3*a);for(var s=0;s<a;++s){var c=3*s,u=3*o[s];i[c+0]=n[u+0],i[c+1]=n[u+1],i[c+2]=n[u+2]}}else i=new Float32Array(n);var h=r.boxes[t],l=r.frames.length;this._process(t,h,i,l),"function"==typeof e&&e()},t.prototype._loadFrameCount=function(){this._setFrameCount(this.structure.frames.length)},Object.defineProperties(t.prototype,e),t}(s_),l_=function(r){function t(t,e,i){r.call(this,t,e,i),this._init(e)}r&&(t.__proto__=r),(t.prototype=Object.create(r&&r.prototype)).constructor=t;var e={type:{configurable:!0}};return e.type.get=function(){return"remote"},t.prototype._makeAtomIndices=function(){var t=[];if("StructureView"===this.structure.type){for(var e=this.structure.getAtomIndices(),i=e.length,r=e[0],n=e[0],o=1;o<i;++o){var a=e[o];n+1<a&&(t.push([r,n+1]),r=a),n=a}t.push([r,n+1])}else t.push([0,this.atomCount]);this.atomIndices=t},t.prototype._loadFrame=function(n,o){var a=this,s=new XMLHttpRequest,c=de.TrajectoryDatasource.getFrameUrl(this.trajPath,n),t=de.TrajectoryDatasource.getFrameParams(this.trajPath,this.atomIndices);s.open("POST",c,!0),s.responseType="arraybuffer",s.setRequestHeader("Content-type","application/x-www-form-urlencoded"),s.addEventListener("load",function(){var t=s.response;if(t){var e=new Int32Array(t,0,1)[0],i=new Float32Array(t,8,9),r=new Float32Array(t,44);a._process(n,i,r,e),"function"==typeof o&&o()}else Yp.error("empty arrayBuffer for '"+c+"'")},!1),s.send(t)},t.prototype._loadFrameCount=function(){var t=this,e=new XMLHttpRequest,i=de.TrajectoryDatasource.getCountUrl(this.trajPath);e.open("GET",i,!0),e.addEventListener("load",function(){t._setFrameCount(parseInt(e.response))},!1),e.send()},Object.defineProperties(t.prototype,e),t}(s_);cx.prototype.getView=function(t){return new p_(this,t)};var p_=function(i){function t(t,e){i.call(this),this.structure=t,this.selection=e,this.center=new ri,this.boundingBox=new Pi,this._bp=this.getBondProxy(),this._ap=this.getAtomProxy(),this._rp=this.getResidueProxy(),this._cp=this.getChainProxy(),this.selection&&this.selection.signals.stringChanged.add(this.refresh,this),this.structure.signals.refreshed.add(this.refresh,this),this.refresh()}i&&(t.__proto__=i);var e={type:{configurable:!0},name:{configurable:!0},path:{configurable:!0},title:{configurable:!0},id:{configurable:!0},data:{configurable:!0},atomSetDict:{configurable:!0},biomolDict:{configurable:!0},entityList:{configurable:!0},unitcell:{configurable:!0},frames:{configurable:!0},boxes:{configurable:!0},validation:{configurable:!0},bondStore:{configurable:!0},backboneBondStore:{configurable:!0},rungBondStore:{configurable:!0},atomStore:{configurable:!0},residueStore:{configurable:!0},chainStore:{configurable:!0},modelStore:{configurable:!0},atomMap:{configurable:!0},residueMap:{configurable:!0},bondHash:{configurable:!0},spatialHash:{configurable:!0},_hasCoords:{configurable:!0}};return((t.prototype=Object.create(i&&i.prototype)).constructor=t).prototype.init=function(){},e.type.get=function(){return"StructureView"},e.name.get=function(){return this.structure.name},e.path.get=function(){return this.structure.path},e.title.get=function(){return this.structure.title},e.id.get=function(){return this.structure.id},e.data.get=function(){return this.structure.data},e.atomSetDict.get=function(){return this.structure.atomSetDict},e.biomolDict.get=function(){return this.structure.biomolDict},e.entityList.get=function(){return this.structure.entityList},e.unitcell.get=function(){return this.structure.unitcell},e.frames.get=function(){return this.structure.frames},e.boxes.get=function(){return this.structure.boxes},e.validation.get=function(){return this.structure.validation},e.bondStore.get=function(){return this.structure.bondStore},e.backboneBondStore.get=function(){return this.structure.backboneBondStore},e.rungBondStore.get=function(){return this.structure.rungBondStore},e.atomStore.get=function(){return this.structure.atomStore},e.residueStore.get=function(){return this.structure.residueStore},e.chainStore.get=function(){return this.structure.chainStore},e.modelStore.get=function(){return this.structure.modelStore},e.atomMap.get=function(){return this.structure.atomMap},e.residueMap.get=function(){return this.structure.residueMap},e.bondHash.get=function(){return this.structure.bondHash},e.spatialHash.get=function(){return this.structure.spatialHash},e._hasCoords.get=function(){return this.structure._hasCoords},e._hasCoords.set=function(t){this.structure._hasCoords=t},t.prototype.refresh=function(){de.Debug&&Yp.time("StructureView.refresh"),this.atomSetCache={};var t=this.structure;if(this.selection.isAllSelection()&&t!==this&&t.atomSet&&t.bondSet){for(var e in this.atomSet=t.atomSet.clone(),this.bondSet=t.bondSet.clone(),this.atomSetDict){var i=this.atomSetDict[e];this.atomSetCache["__"+e]=i.clone()}this.atomCount=t.atomCount,this.bondCount=t.bondCount,this.boundingBox.copy(t.boundingBox),this.center.copy(t.center)}else if(this.selection.isNoneSelection()&&t!==this&&t.atomSet&&t.bondSet){for(var r in this.atomSet=new tg(t.atomCount),this.bondSet=new tg(t.bondCount),this.atomSetDict)this.atomSetCache["__"+r]=new tg(t.atomCount);this.atomCount=0,this.bondCount=0,this.boundingBox.makeEmpty(),this.center.set(0,0,0)}else{for(var n in this.atomSet=this.getAtomSet(this.selection,!0),t.atomSet&&(this.atomSet=this.atomSet.intersection(t.atomSet)),this.bondSet=this.getBondSet(),this.atomSetDict){var o=this.atomSetDict[n];this.atomSetCache["__"+n]=o.makeIntersection(this.atomSet)}this.atomCount=this.atomSet.getSize(),this.bondCount=this.bondSet.getSize(),this.boundingBox=this.getBoundingBox(),this.center=this.boundingBox.getCenter(new ri)}de.Debug&&Yp.timeEnd("StructureView.refresh"),this.signals.refreshed.dispatch()},t.prototype.setSelection=function(t){this.selection=t,this.refresh()},t.prototype.getSelection=function(t){var e=[];t&&t.string&&e.push(t.string);var i=this.structure.getSelection();i&&i.string&&e.push(i.string),this.selection&&this.selection.string&&e.push(this.selection.string);var r="";return 0<e.length&&(r="( "+e.join(" ) AND ( ")+" )"),new Lp(r)},t.prototype.getStructure=function(){return this.structure.getStructure()},t.prototype.eachBond=function(t,e){this.structure.eachBond(t,this.getSelection(e))},t.prototype.eachAtom=function(e,t){var i=this.getAtomProxy(),r=this.getAtomSet(t),n=this.atomStore.count;if(r.getSize()<n)r.forEach(function(t){i.index=t,e(i)});else for(var o=0;o<n;++o)i.index=o,e(i)},t.prototype.eachResidue=function(t,e){this.structure.eachResidue(t,this.getSelection(e))},t.prototype.eachResidueN=function(t,e){console.error("StructureView.eachResidueN() not implemented")},t.prototype.eachChain=function(t,e){this.structure.eachChain(t,this.getSelection(e))},t.prototype.eachModel=function(t,e){this.structure.eachModel(t,this.getSelection(e))},t.prototype.getAtomSet=function(t,e){void 0===e&&(e=!1);var i=this.structure.getAtomSet(t);return!e&&this.atomSet&&(i=i.makeIntersection(this.atomSet)),i},t.prototype.getAtomIndices=function(t){return this.structure.getAtomIndices(this.getSelection(t))},t.prototype.refreshPosition=function(){return this.structure.refreshPosition()},t.prototype.dispose=function(){this.selection&&this.selection.signals.stringChanged.remove(this.refresh,this),this.structure.signals.refreshed.remove(this.refresh,this),delete this.structure,delete this.atomSet,delete this.bondSet,delete this.atomCount,delete this.bondCount},Object.defineProperties(t.prototype,e),t}(cx),d_=[[4,0,-2,-1,-2,0,-2,-1,-1,-1,-1,-2,-1,-1,-1,1,0,0,-3,-2],[0,9,-3,-4,-2,-3,-3,-1,-3,-1,-1,-3,-3,-3,-3,-1,-1,-1,-2,-2],[-2,-3,6,2,-3,-1,-1,-3,-1,-4,-3,1,-1,0,-2,0,-1,-3,-4,-3],[-1,-4,2,5,-3,-2,0,-3,1,-3,-2,0,-1,2,0,0,-1,-2,-3,-2],[-2,-2,-3,-3,6,-3,-1,0,-3,0,0,-3,-4,-3,-3,-2,-2,-1,1,3],[0,-3,-1,-2,-3,6,-2,-4,-2,-4,-3,0,-2,-2,-2,0,-2,-3,-2,-3],[-2,-3,-1,0,-1,-2,8,-3,-1,-3,-2,1,-2,0,0,-1,-2,-3,-2,2],[-1,-1,-3,-3,0,-4,-3,4,-3,2,1,-3,-3,-3,-3,-2,-1,3,-3,-1],[-1,-3,-1,1,-3,-2,-1,-3,5,-2,-1,0,-1,1,2,0,-1,-2,-3,-2],[-1,-1,-4,-3,0,-4,-3,2,-2,4,2,-3,-3,-2,-2,-2,-1,1,-2,-1],[-1,-1,-3,-2,0,-3,-2,1,-1,2,5,-2,-2,0,-1,-1,-1,1,-1,-1],[-2,-3,1,0,-3,0,1,-3,0,-3,-2,6,-2,0,0,1,0,-3,-4,-2],[-1,-3,-1,-1,-4,-2,-2,-3,-1,-3,-2,-2,7,-1,-2,-1,-1,-2,-4,-3],[-1,-3,0,2,-3,-2,0,-3,1,-2,0,0,-1,5,1,0,-1,-2,-2,-1],[-1,-3,-2,0,-3,-2,0,-3,2,-2,-1,0,-2,1,5,-1,-1,-3,-3,-2],[1,-1,0,0,-2,0,-1,-2,0,-2,-1,1,-1,0,-1,4,1,-2,-3,-2],[0,-1,-1,-1,-2,-2,-2,-1,-1,-1,-1,0,-1,-1,-1,1,5,0,-2,-2],[0,-1,-3,-2,-1,-3,-3,3,-2,1,1,-3,-2,-2,-3,-2,0,4,-3,-1],[-3,-2,-4,-3,1,-2,-2,-3,-3,-2,-1,-4,-4,-2,-3,-3,-2,-3,11,2],[-2,-2,-3,-2,3,-3,2,-1,-2,-1,-1,-2,-3,-1,-2,-2,-2,-1,2,7]];function f_(i,t){var r,n=0,o={};return t.forEach(function(t){r=0;var e={};t.forEach(function(t){e[i[r++]]=t}),o[i[n++]]=e}),o}var m_={blosum62:f_("ARNDCQEGHILKMFPSTWYVBZ?",[[4,-1,-2,-2,0,-1,-1,0,-2,-1,-1,-1,-1,-2,-1,1,0,-3,-2,0,-2,-1,0],[-1,5,0,-2,-3,1,0,-2,0,-3,-2,2,-1,-3,-2,-1,-1,-3,-2,-3,-1,0,-1],[-2,0,6,1,-3,0,0,0,1,-3,-3,0,-2,-3,-2,1,0,-4,-2,-3,3,0,-1],[-2,-2,1,6,-3,0,2,-1,-1,-3,-4,-1,-3,-3,-1,0,-1,-4,-3,-3,4,1,-1],[0,-3,-3,-3,9,-3,-4,-3,-3,-1,-1,-3,-1,-2,-3,-1,-1,-2,-2,-1,-3,-3,-2],[-1,1,0,0,-3,5,2,-2,0,-3,-2,1,0,-3,-1,0,-1,-2,-1,-2,0,3,-1],[-1,0,0,2,-4,2,5,-2,0,-3,-3,1,-2,-3,-1,0,-1,-3,-2,-2,1,4,-1],[0,-2,0,-1,-3,-2,-2,6,-2,-4,-4,-2,-3,-3,-2,0,-2,-2,-3,-3,-1,-2,-1],[-2,0,1,-1,-3,0,0,-2,8,-3,-3,-1,-2,-1,-2,-1,-2,-2,2,-3,0,0,-1],[-1,-3,-3,-3,-1,-3,-3,-4,-3,4,2,-3,1,0,-3,-2,-1,-3,-1,3,-3,-3,-1],[-1,-2,-3,-4,-1,-2,-3,-4,-3,2,4,-2,2,0,-3,-2,-1,-2,-1,1,-4,-3,-1],[-1,2,0,-1,-3,1,1,-2,-1,-3,-2,5,-1,-3,-1,0,-1,-3,-2,-2,0,1,-1],[-1,-1,-2,-3,-1,0,-2,-3,-2,1,2,-1,5,0,-2,-1,-1,-1,-1,1,-3,-1,-1],[-2,-3,-3,-3,-2,-3,-3,-3,-1,0,0,-3,0,6,-4,-2,-2,1,3,-1,-3,-3,-1],[-1,-2,-2,-1,-3,-1,-1,-2,-2,-3,-3,-1,-2,-4,7,-1,-1,-4,-3,-2,-2,-1,-2],[1,-1,1,0,-1,0,0,0,-1,-2,-2,0,-1,-2,-1,4,1,-3,-2,-2,0,0,0],[0,-1,0,-1,-1,-1,-1,-2,-2,-1,-1,-1,-1,-2,-1,1,5,-2,-2,0,-1,-1,0],[-3,-3,-4,-4,-2,-2,-3,-2,-2,-3,-2,-3,-1,1,-4,-3,-2,11,2,-3,-4,-3,-2],[-2,-2,-2,-3,-2,-1,-2,-3,2,-1,-1,-2,-1,3,-3,-2,-2,2,7,-1,-3,-2,-1],[0,-3,-3,-3,-1,-2,-2,-3,-3,3,1,-2,1,-1,-2,-2,0,-3,-1,4,-3,-2,-1],[-2,-1,3,4,-3,0,1,-1,0,-3,-4,0,-3,-3,-2,0,-1,-4,-3,-3,4,1,-1],[-1,0,0,1,-3,3,4,-2,0,-3,-3,1,-1,-3,-1,0,-1,-3,-2,-2,1,4,-1],[0,-1,-1,-1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,0,0,-2,-1,-1,-1,-1,-1]]),blosum62x:f_("ACDEFGHIKLMNPQRSTVWY",d_)},g_=function(t,e,i,r,n){void 0===i&&(i=-10),void 0===r&&(r=-1),void 0===n&&(n="blosum62"),this.seq1=t,this.seq2=e,this.gapPenalty=i,this.gapExtensionPenalty=r,n&&(this.substMatrix=m_[n])};function v_(t,e,i,r,n){var o,a,s,c,u;if(void 0===i&&(i=!1),void 0===r&&(r=""),void 0===n&&(n=""),i){var h=t,l=e;r&&n&&(h=t.getView(new Lp(r)),l=e.getView(new Lp(n)));var p,d,f=h.getSequence(),m=l.getSequence(),g=new g_(f.join(""),m.join(""));g.calc(),g.trace(),a=o=0,s=g.ali1.length;for(var v=[],y=[],b=0;b<s;++b){var x=g.ali1[b],_=g.ali2[b];d=p=0,"-"===x?y[a]=!1:(y[a]=!0,p=1),"-"===_?v[o]=!1:(v[o]=!0,d=1),o+=p,a+=d}var w=[],S=[],A=h.getAtomProxy(),M=l.getAtomProxy();o=0,h.eachResidue(function(t){void 0!==t.traceAtomIndex&&t.traceAtomIndex===t.getAtomIndexByName("CA")&&(v[o]&&(A.index=t.getAtomIndexByName("CA"),w.push(A.x,A.y,A.z)),o+=1)}),o=0,l.eachResidue(function(t){void 0!==t.traceAtomIndex&&t.traceAtomIndex===t.getAtomIndexByName("CA")&&(y[o]&&(M.index=t.getAtomIndexByName("CA"),S.push(M.x,M.y,M.z)),o+=1)}),c=new Float32Array(w),u=new Float32Array(S)}else{c=t.getView(new Lp(r+" and .CA")),u=e.getView(new Lp(n+" and .CA"))}var E=new r_(c,u).transform(t);return t.refreshPosition(),E}g_.prototype.initMatrices=function(){var t=this;this.n=this.seq1.length,this.m=this.seq2.length,this.score=void 0,this.ali="",this.S=[],this.V=[],this.H=[];for(var e=0;e<=this.n;++e){t.S[e]=[],t.V[e]=[],t.H[e]=[];for(var i=0;i<=this.m;++i)t.S[e][i]=0,t.V[e][i]=0,t.H[e][i]=0}for(var r=0;r<=this.n;++r)t.S[r][0]=t.gap(0),t.H[r][0]=-1/0;for(var n=0;n<=this.m;++n)t.S[0][n]=t.gap(0),t.V[0][n]=-1/0;this.S[0][0]=0},g_.prototype.gap=function(t){return this.gapPenalty+t*this.gapExtensionPenalty},g_.prototype.makeScoreFn=function(){var n=this.seq1,o=this.seq2,a=this.substMatrix;return a?function(t,e){var i=n[t],r=o[e];try{return a[i][r]}catch(t){return-4}}:(Yp.warn("Alignment: no subst matrix"),function(t,e){return n[t]===o[e]?5:-3})},g_.prototype.calc=function(){de.Debug&&Yp.time("Alignment.calc"),this.initMatrices();for(var t,e,i,r,n,o=this.gap(0),a=this.makeScoreFn(),s=this.gapExtensionPenalty,c=this.V,u=this.H,h=this.S,l=this.n,p=this.m,d=1;d<=l;++d){e=h[d-1],t=c[d-1],i=c[d],r=u[d],n=h[d];for(var f=1;f<=p;++f)i[f]=Math.max(e[f]+o,t[f]+s),r[f]=Math.max(n[f-1]+o,r[f-1]+s),n[f]=Math.max(e[f-1]+a(d-1,f-1),i[f],r[f])}de.Debug&&Yp.timeEnd("Alignment.calc"),de.Debug&&Yp.log(this.S,this.V,this.H)},g_.prototype.trace=function(){var t=this;de.Debug&&Yp.time("Alignment.trace"),this.ali1="",this.ali2="";var e,i=this.makeScoreFn(),r=this.n,n=this.m;for(this.S[r][n]>=this.V[r][n]?(e="S",this.score=this.S[r][n]):this.V[r][n]>=this.H[r][n]?(e="V",this.score=this.V[r][n]):(e="H",this.score=this.H[r][n]),de.Debug&&Yp.log("Alignment: SCORE",this.score),de.Debug&&Yp.log("Alignment: S, V, H",this.S[r][n],this.V[r][n],this.H[r][n]);0<r&&0<n;)"S"===e?t.S[r][n]===t.S[r-1][n-1]+i(r-1,n-1)?(t.ali1=t.seq1[r-1]+t.ali1,t.ali2=t.seq2[n-1]+t.ali2,--r,--n,e="S"):t.S[r][n]===t.V[r][n]?e="V":t.S[r][n]===t.H[r][n]?e="H":(--r,--n):"V"===e?t.V[r][n]===t.V[r-1][n]+t.gapExtensionPenalty?(t.ali1=t.seq1[r-1]+t.ali1,t.ali2="-"+t.ali2,--r,e="V"):t.V[r][n]===t.S[r-1][n]+t.gap(0)?(t.ali1=t.seq1[r-1]+t.ali1,t.ali2="-"+t.ali2,--r,e="S"):--r:"H"===e?t.H[r][n]===t.H[r][n-1]+t.gapExtensionPenalty?(t.ali1="-"+t.ali1,t.ali2=t.seq2[n-1]+t.ali2,--n,e="H"):t.H[r][n]===t.S[r][n-1]+t.gap(0)?(t.ali1="-"+t.ali1,t.ali2=t.seq2[n-1]+t.ali2,--n,e="S"):--n:Yp.error("Alignment: no matrix");for(;0<r;)t.ali1=t.seq1[r-1]+t.ali1,t.ali2="-"+t.ali2,--r;for(;0<n;)t.ali1="-"+t.ali1,t.ali2=t.seq2[n-1]+t.ali2,--n;de.Debug&&Yp.timeEnd("Alignment.trace"),de.Debug&&Yp.log([this.ali1,this.ali2])};var y_=Object.assign({sele:"",defaultAssembly:""},Xx),b_=function(c){function t(t,e,i){var r,n,o,a,s;void 0===i&&(i={}),c.call(this,t,e,Object.assign({name:e.name},i)),this.structure=e,this.trajList=[],this.signals=Object.assign(this.signals,{trajectoryAdded:new op,trajectoryRemoved:new op,defaultAssemblyChanged:new op}),this.initSelection(this.parameters.sele),this.pickBuffer=(r=4,o=n=0,a=[],{has:function(t){return-1!==a.indexOf(t)},get:function(t){return a[t]},push:function(t){a[n]=t,n=(r+n+1)%r,++o},get count(){return o},get data(){return a.slice(0,Math.min(o,r))},clear:function(){n=o=0,a.length=0}}),this.pickDict=(s={},{has:function(t){return void 0!==s[JSON.stringify(t)]},add:function(t,e){s[JSON.stringify(t)]=e},del:function(t){delete s[JSON.stringify(t)]},get values(){return Object.keys(s).map(function(t){return s[t]})}}),this.spacefillRepresentation=this.addRepresentation("spacefill",{sele:"none",opacity:Zp.opacity,color:Zp.color,disablePicking:!0,radiusType:"data"},!0),this.distanceRepresentation=this.addRepresentation("distance",Zp,!0),this.angleRepresentation=this.addRepresentation("angle",Zp,!0),this.dihedralRepresentation=this.addRepresentation("dihedral",Zp,!0),this.measureRepresentations=new Jx([this.spacefillRepresentation,this.distanceRepresentation,this.angleRepresentation,this.dihedralRepresentation]),this.setDefaultAssembly(this.parameters.defaultAssembly)}c&&(t.__proto__=c),(t.prototype=Object.create(c&&c.prototype)).constructor=t;var e={defaultParameters:{configurable:!0},type:{configurable:!0}};return e.defaultParameters.get=function(){return y_},e.type.get=function(){return"structure"},t.prototype.initSelection=function(t){var e=this;this.selection=new Lp(t),this.structureView=new p_(this.structure,this.selection),this.selection.signals.stringChanged.add(function(){e.structureView.setSelection(e.selection),e.rebuildRepresentations(),e.rebuildTrajectories()})},t.prototype.setSelection=function(t){return this.parameters.sele=t,this.selection.setString(t),this},t.prototype.setDefaultAssembly=function(t){if(void 0===this.structure.biomolDict[t]&&(t=""),this.parameters.defaultAssembly!==t){var e={defaultAssembly:t};this.reprList.forEach(function(t){return t.setParameters(e)}),this.measureRepresentations.setParameters(e),this.parameters.defaultAssembly=t,this.signals.defaultAssemblyChanged.dispatch(t)}return this},t.prototype.rebuildRepresentations=function(){this.reprList.forEach(function(t){t.build()}),this.measureRepresentations.build()},t.prototype.rebuildTrajectories=function(){var e=this;this.trajList.forEach(function(t){t.trajectory.setStructure(e.structureView)})},t.prototype.updateRepresentations=function(t){c.prototype.updateRepresentations.call(this,t),this.measureRepresentations.update(t)},t.prototype.addRepresentation=function(t,e,i){var r=this;void 0===e&&(e={}),void 0===i&&(i=!1),e.defaultAssembly=this.parameters.defaultAssembly;var n=this._addRepresentation(t,this.structureView,e,i);return i||n.signals.parametersChanged.add(function(){return r.measureUpdate()}),n},t.prototype.addTrajectory=function(t,e){var i=this;void 0===t&&(t=""),void 0===e&&(e={});var r,n,o,a=(r=t,n=this.structureView,o=e,r&&r instanceof e_?new u_(r,n,o):!r&&n.frames?new h_(r,n,o):new l_(r,n,o));a.signals.frameChanged.add(function(){i.updateRepresentations({position:!0})});var s=new t_(this.stage,a,e);return this.trajList.push(s),this.signals.trajectoryAdded.dispatch(s),s},t.prototype.removeTrajectory=function(t){var e=this.trajList.indexOf(t);-1!==e&&this.trajList.splice(e,1),t.dispose(),this.signals.trajectoryRemoved.dispatch(t)},t.prototype.dispose=function(){this.trajList.slice().forEach(function(t){return t.dispose()}),this.trajList.length=0,this.structure.dispose(),this.measureRepresentations.dispose(),c.prototype.dispose.call(this)},t.prototype.autoView=function(t,e){"number"==typeof t&&(e=t,t=""),this.stage.animationControls.zoomMove(this.getCenter(t),this.getZoom(t),bl(e,0))},t.prototype.getBoxUntransformed=function(t){return t?this.structureView.getBoundingBox(new Lp(t)):this.structureView.boundingBox},t.prototype.getCenterUntransformed=function(t){return t&&"string"==typeof t?this.structure.atomCenter(new Lp(t)):this.structure.center},t.prototype.superpose=function(t,e,i,r){return v_(this.structureView,t.structureView,e,i,r),this.updateRepresentations({position:!0}),this},t.prototype.getMaxRepresentationRadius=function(t){var i=0,r=this.structure.getAtomProxy(t);return this.eachRepresentation(function(t){if(t.getVisibility()){var e=t.repr;i=Math.max(e.getAtomRadius(r),i)}}),i},t.prototype.measurePick=function(t){var e=this.pickBuffer.count;if(this.lastPick===t.index&&1<=e){if(1<e){var i=this.pickBuffer.data,r=this.pickBuffer.data.sort();this.pickDict.has(r)?this.pickDict.del(r):this.pickDict.add(r,i),2===e?this.distanceRepresentation.setParameters({atomPair:this.pickDict.values.filter(function(t){return 2===t.length})}):3===e?this.angleRepresentation.setParameters({atomTriple:this.pickDict.values.filter(function(t){return 3===t.length})}):4===e&&this.dihedralRepresentation.setParameters({atomQuad:this.pickDict.values.filter(function(t){return 4===t.length})})}this.pickBuffer.clear(),this.lastPick=void 0}else this.pickBuffer.has(t.index)||this.pickBuffer.push(t.index),this.lastPick=t.index;this.measureUpdate()},t.prototype.measureClear=function(){this.pickBuffer.clear(),this.lastPick=void 0,this.spacefillRepresentation.setSelection("none")},t.prototype.measureBuild=function(){var t=this.measureData();this.distanceRepresentation.setParameters({atomPair:t.distance}),this.angleRepresentation.setParameters({atomTriple:t.angle}),this.dihedralRepresentation.setParameters({atomQuad:t.dihedral})},t.prototype.measureUpdate=function(){var i=this,t=this.pickBuffer.data,r={};t.forEach(function(t){var e=Math.max(.1,i.getMaxRepresentationRadius(t));r[t]=e*(2.3-Zl(.1,2,e))}),this.spacefillRepresentation.setSelection(t.length?"@"+t.join(","):"none"),this.spacefillRepresentation.setParameters({radiusData:r})},t.prototype.measureData=function(){var t=this.pickDict.values;return{distance:t.filter(function(t){return 2===t.length}),angle:t.filter(function(t){return 3===t.length}),dihedral:t.filter(function(t){return 4===t.length})}},t.prototype.removeAllMeasurements=function(t){var i=this.pickDict,r=i.values,e=function(e){r.filter(function(t){return t.length===e}).forEach(function(t){return i.del(t.slice().sort())})};(!t||1&t)&&e(2),(!t||2&t)&&e(3),(!t||4&t)&&e(4),this.measureBuild()},t.prototype.removeMeasurement=function(t){this.pickDict.del(t.slice().sort()),this.measureBuild()},t.prototype.addMeasurement=function(t){if(!(t.length<2||4<t.length)){var e=t.slice().sort();this.pickDict.has(e)||this.pickDict.add(e,t),this.measureBuild()}},Object.defineProperties(t.prototype,e),t}(qx);od.add("structure",b_),od.add("structureview",b_);var x_=function(r){function t(t,e,i){void 0===i&&(i={}),r.call(this,t,e,Object.assign({name:e.name},i)),this.surface=e}r&&(t.__proto__=r),(t.prototype=Object.create(r&&r.prototype)).constructor=t;var e={type:{configurable:!0}};return e.type.get=function(){return"surface"},t.prototype.addRepresentation=function(t,e){return void 0===e&&(e={}),this._addRepresentation(t,this.surface,e)},t.prototype.getBoxUntransformed=function(){return this.surface.boundingBox},t.prototype.getCenterUntransformed=function(){return this.surface.center},t.prototype.dispose=function(){this.surface.dispose(),r.prototype.dispose.call(this)},Object.defineProperties(t.prototype,e),t}(qx);od.add("surface",x_);var __=function(r){function t(t,e,i){void 0===i&&(i={}),r.call(this,t,e,Object.assign({name:e.name},i)),this.volume=e}r&&(t.__proto__=r),(t.prototype=Object.create(r&&r.prototype)).constructor=t;var e={type:{configurable:!0}};return e.type.get=function(){return"volume"},t.prototype.addRepresentation=function(t,e){return void 0===e&&(e={}),this._addRepresentation(t,this.volume,e)},t.prototype.getBoxUntransformed=function(){return this.volume.boundingBox},t.prototype.getCenterUntransformed=function(){return this.volume.center},t.prototype.dispose=function(){this.volume.dispose(),r.prototype.dispose.call(this)},Object.defineProperties(t.prototype,e),t}(qx);od.add("volume",__);var w_=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),((e.prototype=Object.create(t&&t.prototype)).constructor=e).prototype.addRepresentation=function(e,i){return this.forEach(function(t){return t.addRepresentation(e,i)})},e.prototype.autoView=function(e){return this.forEach(function(t){return t.autoView(e)})},e}(Zx);function S_(t,e){return t instanceof RegExp?null!==e.name.match(t):e.name===t}var A_=new ri,M_={impostor:!0,quality:"medium",workerDefault:!0,sampleLevel:0,backgroundColor:"black",rotateSpeed:2,zoomSpeed:1.2,panSpeed:1,clipNear:0,clipFar:100,clipDist:10,fogNear:50,fogFar:100,cameraFov:40,cameraEyeSep:.3,cameraType:"perspective",lightColor:14540253,lightIntensity:1,ambientColor:14540253,ambientIntensity:.2,hoverTimeout:0,tooltip:!0,mousePreset:"default"},E_=function(t,e){void 0===e&&(e={}),this.signals={parametersChanged:new op,fullscreenChanged:new op,componentAdded:new op,componentRemoved:new op,clicked:new op,hovered:new op},this.tasks=new Md,this.compList=[],this.defaultFileParams={},this.logList=[],this.viewer=new yf(t),this.viewer.renderer&&(this.tooltip=document.createElement("div"),Object.assign(this.tooltip.style,{display:"none",position:"fixed",zIndex:"1000000",pointerEvents:"none",backgroundColor:"rgba( 0, 0, 0, 0.6 )",color:"lightgrey",padding:"8px",fontFamily:"sans-serif"}),this.viewer.container.appendChild(this.tooltip),this.mouseObserver=new xf(this.viewer.renderer.domElement),this.viewerControls=new $f(this),this.trackballControls=new Of(this),this.pickingControls=new Bf(this),this.animationControls=new nm(this),this.mouseControls=new Ey(this),this.keyControls=new Cy(this),this.pickingBehavior=new Iy(this),this.mouseBehavior=new Oy(this),this.animationBehavior=new Ly(this),this.keyBehavior=new Dy(this),this.spinAnimation=this.animationControls.spin([0,1,0],.005),this.spinAnimation.pause(!0),this.rockAnimation=this.animationControls.rock([0,1,0],.005),this.rockAnimation.pause(!0),this.parameters=xl(e,M_),this.setParameters(this.parameters),this.viewer.animate())};E_.prototype.setParameters=function(t){void 0===t&&(t={}),_l(this.parameters,t);var e=t,i=this.parameters,r=this.viewer,n=this.trackballControls;return void 0!==e.quality&&this.setQuality(i.quality),void 0!==e.impostor&&this.setImpostor(i.impostor),void 0!==e.rotateSpeed&&(n.rotateSpeed=i.rotateSpeed),void 0!==e.zoomSpeed&&(n.zoomSpeed=i.zoomSpeed),void 0!==e.panSpeed&&(n.panSpeed=i.panSpeed),void 0!==e.mousePreset&&this.mouseControls.preset(i.mousePreset),this.mouseObserver.setParameters({hoverTimeout:i.hoverTimeout}),r.setClip(i.clipNear,i.clipFar,i.clipDist),r.setFog(void 0,i.fogNear,i.fogFar),r.setCamera(i.cameraType,i.cameraFov,i.cameraEyeSep),r.setSampling(i.sampleLevel),r.setBackground(i.backgroundColor),r.setLight(i.lightColor,i.lightIntensity,i.ambientColor,i.ambientIntensity),this.signals.parametersChanged.dispatch(this.getParameters()),this},E_.prototype.log=function(t){console.log("STAGE LOG",t),this.logList.push(t)},E_.prototype.getParameters=function(){return Object.assign({},this.parameters)},E_.prototype.defaultFileRepresentation=function(t){if(t instanceof b_){var e,i,r;t.setSelection("/0");var n=t.structure;if(n.biomolDict.BU1){var o=n.biomolDict.BU1;e=o.getAtomCount(n),i=o.getResidueCount(n),r=o.getInstanceCount(),t.setDefaultAssembly("BU1")}else e=n.getModelProxy(0).atomCount,i=n.getModelProxy(0).residueCount,r=1;var a=e;$p&&(a*=4);var s=n.atomStore.count/n.residueStore.count<2;s&&(a*=10);var c="chainname",u="RdYlBu",h=!1;if(1===n.getChainnameCount(new Lp("polymer and /0"))&&(c="residueindex",u="spectral",h=!0),de.Debug&&console.log(a,e,r,s),i/r<4)t.addRepresentation("ball+stick",{colorScheme:"element",radiusScale:2,aspectRatio:1.5,bondScale:.3,bondSpacing:.75,quality:"auto"});else if(5<r&&15e3<a||7e5<a){var l=Math.min(1.5,Math.max(.1,2e3/(a/r)));s&&(l=Math.min(l,.15)),t.addRepresentation("surface",{colorScheme:c,colorScale:u,colorReverse:h,sele:"polymer",surfaceType:"sas",probeRadius:1.4,scaleFactor:l,useWorker:!1})}else 25e4<a?t.addRepresentation("backbone",{colorScheme:c,colorScale:u,colorReverse:h,lineOnly:!0}):1e5<a?t.addRepresentation("backbone",{colorScheme:c,colorScale:u,colorReverse:h,quality:"low",disableImpostor:!0,radiusScale:2}):8e4<a?t.addRepresentation("backbone",{colorScheme:c,colorScale:u,colorReverse:h,radiusScale:2}):(t.addRepresentation("cartoon",{colorScheme:c,colorScale:u,colorReverse:h,radiusScale:.7,aspectRatio:5,quality:"auto"}),a<5e4&&t.addRepresentation("base",{colorScheme:c,colorScale:u,colorReverse:h,quality:"auto"}),t.addRepresentation("ball+stick",{sele:"ligand",colorScheme:"element",radiusScale:2,aspectRatio:1.5,bondScale:.3,bondSpacing:.75,quality:"auto"}));t.structure.frames.length&&t.addTrajectory()}else t instanceof x_?t.addRepresentation("surface"):t instanceof __&&t.addRepresentation("surface");this.tasks.onZeroOnce(this.autoView,this)},E_.prototype.loadFile=function(t,e){var i=this;void 0===e&&(e={});var r=Object.assign({},this.defaultFileParams,e),n=md(t).name;this.tasks.increment(),this.log("loading file '"+n+"'");var o=bl(r.ext,md(t).ext);return(id.isTrajectory(o)?Promise.reject(new Error("loadFile: ext '"+o+"' is a trajectory and must be loaded into a structure component")):vd(t,r)).then(function(t){i.log("loaded '"+n+"'");var e=i.addComponentFromObject(t,r);return r.defaultRepresentation&&i.defaultFileRepresentation(e),i.tasks.decrement(),e},function(t){i.tasks.decrement();var e="error loading file: '"+t+"'";throw i.log(e),e})},E_.prototype.loadScript=function(t){var i=this,r=md(t).name;return this.log("loading script '"+r+"'"),vd(t).then(function(t){i.tasks.increment(),i.log("running script '"+r+"'"),t.run(i).then(function(){i.tasks.decrement(),i.log("finished script '"+r+"'")}),i.log("called script '"+r+"'")},function(t){i.tasks.decrement();var e="errored script '"+r+"' \""+t+'"';throw i.log(e),e})},E_.prototype.addComponent=function(t){t?(this.compList.push(t),this.signals.componentAdded.dispatch(t)):Yp.warn("Stage.addComponent: no component given")},E_.prototype.addComponentFromObject=function(t,e){void 0===e&&(e={});var i=od.get(t.type);if(i){var r=new i(this,t,e);return this.addComponent(r),r}Yp.warn("no component for object type",t.type)},E_.prototype.removeComponent=function(t){var e=this.compList.indexOf(t);-1!==e&&(this.compList.splice(e,1),t.dispose(),this.signals.componentRemoved.dispatch(t))},E_.prototype.removeAllComponents=function(){var e=this;this.compList.slice().forEach(function(t){return e.removeComponent(t)})},E_.prototype.handleResize=function(){this.viewer.handleResize()},E_.prototype.setSize=function(t,e){var i=this.viewer.container;i!==document.body&&(void 0!==t&&(i.style.width=t),void 0!==e&&(i.style.height=e),this.handleResize())},E_.prototype.toggleFullscreen=function(t){if(document.fullscreenEnabled||document.mozFullScreenEnabled||document.webkitFullscreenEnabled||document.msFullscreenEnabled){var e=this;t=t||this.viewer.container,this.lastFullscreenElement=t,i()?document.exitFullscreen?document.exitFullscreen():document.msExitFullscreen?document.msExitFullscreen():document.mozCancelFullScreen?document.mozCancelFullScreen():document.webkitExitFullscreen&&document.webkitExitFullscreen():(t.dataset.normalWidth=t.style.width||"",t.dataset.normalHeight=t.style.height||"",t.style.width=window.screen.width+"px",t.style.height=window.screen.height+"px",t.requestFullscreen?t.requestFullscreen():t.msRequestFullscreen?t.msRequestFullscreen():t.mozRequestFullScreen?t.mozRequestFullScreen():t.webkitRequestFullscreen&&t.webkitRequestFullscreen(),document.addEventListener("fullscreenchange",r),document.addEventListener("mozfullscreenchange",r),document.addEventListener("webkitfullscreenchange",r),document.addEventListener("MSFullscreenChange",r),this.handleResize(),this.signals.fullscreenChanged.dispatch(!0),setTimeout(function(){e.handleResize()},100))}else Yp.log("fullscreen mode (currently) not possible");function i(){return document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement||document.msFullscreenElement}function r(){if(!i()&&e.lastFullscreenElement){var t=e.lastFullscreenElement;t.style.width=t.dataset.normalWidth||"",t.style.height=t.dataset.normalHeight||"",document.removeEventListener("fullscreenchange",r),document.removeEventListener("mozfullscreenchange",r),document.removeEventListener("webkitfullscreenchange",r),document.removeEventListener("MSFullscreenChange",r),e.handleResize(),e.signals.fullscreenChanged.dispatch(!1)}}},E_.prototype.setSpin=function(t){t?(this.spinAnimation.resume(!0),this.rockAnimation.pause(!0)):this.spinAnimation.pause(!0)},E_.prototype.setRock=function(t){t?(this.rockAnimation.resume(!0),this.spinAnimation.pause(!0)):this.rockAnimation.pause(!0)},E_.prototype.toggleSpin=function(){this.setSpin(this.spinAnimation.paused)},E_.prototype.toggleRock=function(){this.setRock(this.rockAnimation.paused)},E_.prototype.setFocus=function(t){var e=Wl(t/2,0,49.9),i=100-e,r=(i-e)/2;this.setParameters({clipNear:e,clipFar:i,fogNear:Xl(i-r),fogFar:Xl(i+r)})},E_.prototype.getZoomForBox=function(t){var e=t.getSize(A_),i=Math.max(e.x,e.y,e.z),r=Math.min(e.x,e.y,e.z),n=i+Math.sqrt(r),o=Gl(this.viewer.perspectiveCamera.fov),a=this.viewer.width,s=this.viewer.height,c=s<a?1:a/s;return n=Math.abs(.5*n/c/Math.sin(o/2)),-(n+=this.parameters.clipDist)},E_.prototype.getBox=function(){return this.viewer.boundingBox},E_.prototype.getZoom=function(){return this.getZoomForBox(this.getBox())},E_.prototype.getCenter=function(t){return this.getBox().getCenter(t||new ri)},E_.prototype.autoView=function(t){this.animationControls.zoomMove(this.getCenter(),this.getZoom(),bl(t,0))},E_.prototype.makeImage=function(t){var r=this;return void 0===t&&(t={}),new Promise(function(e,i){r.tasks.onZeroOnce(function(){r.tasks.increment(),r.viewer.makeImage(t).then(function(t){r.tasks.decrement(),e(t)}).catch(function(t){r.tasks.decrement(),i(t)})})})},E_.prototype.setImpostor=function(i){this.parameters.impostor=i;var r=["spacefill","ball+stick","licorice","hyperball","backbone","rocket","helixorient","contact","distance","dot"];this.eachRepresentation(function(t){if(r.includes(t.getType())){var e=t.getParameters();e.disableImpostor=!i,t.build(e)}})},E_.prototype.setQuality=function(i){this.parameters.quality=i;var r=["tube","cartoon","ribbon","trace","rope"],n=["spacefill","ball+stick","licorice","hyperball","backbone","rocket","helixorient","contact","distance","dot"];this.eachRepresentation(function(t){var e=t.getParameters();if(!r.includes(t.getType())){if(!n.includes(t.getType()))return;if(!e.disableImpostor)return void(t.repr.quality=i)}e.quality=i,t.build(e)})},E_.prototype.eachComponent=function(e,i){this.compList.slice().forEach(function(t){void 0!==i&&i!==t.type||e(t)})},E_.prototype.eachRepresentation=function(i,r){this.eachComponent(function(e){e.reprList.slice().forEach(function(t){void 0!==r&&r!==t.getType()||i(t,e)})})},E_.prototype.getComponentsByName=function(e){var i=[];return this.eachComponent(function(t){(void 0===e||S_(e,t))&&i.push(t)}),new w_(i)},E_.prototype.getComponentsByObject=function(e){var i=[];return this.eachComponent(function(t){t.object===e&&i.push(t)}),new w_(i)},E_.prototype.getRepresentationsByName=function(i){var r=[];return this.eachRepresentation(function(t,e){(void 0===i||S_(i,t))&&r.push(t)}),new Jx(r)},E_.prototype.measureClear=function(){this.eachComponent(function(t){return t.measureClear()},"structure")},E_.prototype.measureUpdate=function(){this.eachComponent(function(t){return t.measureUpdate()},"structure")},E_.prototype.dispose=function(){this.tasks.dispose(),this.viewer.dispose()};var P_=function(r){function t(t,e,i){void 0===i&&(i={}),r.call(this,t,e,Object.assign({name:e.name},i)),this.shape=e}r&&(t.__proto__=r),(t.prototype=Object.create(r&&r.prototype)).constructor=t;var e={type:{configurable:!0}};return e.type.get=function(){return"shape"},t.prototype.addRepresentation=function(t,e){return void 0===e&&(e={}),this._addRepresentation(t,this.shape,e)},t.prototype.getBoxUntransformed=function(){return this.shape.boundingBox},t.prototype.getCenterUntransformed=function(){return this.shape.center},t.prototype.dispose=function(){this.shape.dispose(),r.prototype.dispose.call(this)},Object.defineProperties(t.prototype,e),t}(qx);od.add("shape",P_);var T_=function(i){function t(t){var e=this;i.call(this,t),t.scale||(this.parameters.scale="rainbow",this.parameters.reverse=bl(t.reverse,!0)),this.scalePerModel={},t.structure.eachModel(function(t){e.parameters.domain=[t.atomOffset,t.atomEnd],e.scalePerModel[t.index]=e.getScale()})}return i&&(t.__proto__=i),((t.prototype=Object.create(i&&i.prototype)).constructor=t).prototype.atomColor=function(t){return this.scalePerModel[t.modelIndex](t.index)},t}(ip);Qp.add("atomindex",T_);var C_=function(n){function t(t){if(n.call(this,t),t.scale||(this.parameters.scale="OrRd"),!t.domain){var e,i=1/0,r=-1/0;t.sele&&(e=new Lp(t.sele)),t.structure.eachAtom(function(t){var e=t.bfactor;i=Math.min(i,e),r=Math.max(r,e)},e),this.parameters.domain=[i,r]}this.bfactorScale=this.getScale()}return n&&(t.__proto__=n),((t.prototype=Object.create(n&&n.prototype)).constructor=t).prototype.atomColor=function(t){return this.bfactorScale(t.bfactor)},t}(ip);Qp.add("bfactor",C_);var I_=function(e){function t(t){var r=this;e.call(this,t),this.chainidDictPerModel={},this.scalePerModel={},t.scale||(this.parameters.scale="Spectral"),t.structure.eachModel(function(t){var e=0,i={};t.eachChain(function(t){void 0===i[t.chainid]&&(i[t.chainid]=e,e+=1)}),r.parameters.domain=[0,e-1],r.chainidDictPerModel[t.index]=i,r.scalePerModel[t.index]=r.getScale()})}return e&&(t.__proto__=e),((t.prototype=Object.create(e&&e.prototype)).constructor=t).prototype.atomColor=function(t){var e=this.chainidDictPerModel[t.modelIndex];return this.scalePerModel[t.modelIndex](e[t.chainid])},t}(ip);Qp.add("chainid",I_);var O_=function(i){function t(t){var e=this;i.call(this,t),this.scalePerModel={},t.scale||(this.parameters.scale="Spectral"),t.structure.eachModel(function(t){e.parameters.domain=[t.chainOffset,t.chainEnd],e.scalePerModel[t.index]=e.getScale()})}return i&&(t.__proto__=i),((t.prototype=Object.create(i&&i.prototype)).constructor=t).prototype.atomColor=function(t){return this.scalePerModel[t.modelIndex](t.chainIndex)},t}(ip);Qp.add("chainindex",O_);var L_=function(e){function t(t){var r=this;e.call(this,t),this.chainnameDictPerModel={},this.scalePerModel={},t.scale||(this.parameters.scale="Spectral"),t.structure.eachModel(function(t){var e=0,i={};t.eachChain(function(t){void 0===i[t.chainname]&&(i[t.chainname]=e,e+=1)}),r.parameters.domain=[0,e-1],r.chainnameDictPerModel[t.index]=i,r.scalePerModel[t.index]=r.getScale()})}return e&&(t.__proto__=e),((t.prototype=Object.create(e&&e.prototype)).constructor=t).prototype.atomColor=function(t){var e=this.chainnameDictPerModel[t.modelIndex];return this.scalePerModel[t.modelIndex](e[t.chainname])},t}(ip);Qp.add("chainname",L_);var R_=function(i){function t(t){i.call(this,t),this.rsrzDict={},this.rsccDict={},t.scale||(this.parameters.scale="RdYlBu"),this.rsrzScale=this.getScale({domain:[2,0]}),this.rsccScale=this.getScale({domain:[.678,1]});var e=t.structure.validation;e&&(this.rsrzDict=e.rsrzDict,this.rsccDict=e.rsccDict)}return i&&(t.__proto__=i),((t.prototype=Object.create(i&&i.prototype)).constructor=t).prototype.atomColor=function(t){var e=t.resno+"";t.inscode&&(e+="^"+t.inscode),t.chainname&&(e+=":"+t.chainname),e+="/"+t.modelIndex;var i=this.rsrzDict[e];if(void 0!==i)return this.rsrzScale(i);var r=this.rsccDict[e];return void 0!==r?this.rsccScale(r):9474192},t}(ip);Qp.add("densityfit",R_);var D_={ARG:{CD:.1,CZ:.5,NE:-.1},ASN:{CG:.55,OD1:-.55},ASP:{CB:-.16,CG:.36,OD1:-.6,OD2:-.6},CYS:{CB:.19,SG:-.19},GLN:{CD:.55,OE1:-.55},GLU:{CD:.36,CG:-.16,OE1:-.6,OE2:-.6},HIS:{CB:.1,CD2:.2,CE1:.45,CG:.15,ND1:.05,NE2:.05},LYS:{CE:.25,NZ:.75},MET:{CE:.06,CG:.06,SD:-.12},PTR:{C:.55,CA:.1,CZ:.25,N:-.35,O:-.55,O1P:-.85,O2P:-.85,O3P:-.85,OG1:-1.1,P:1.4},SEP:{C:.55,CA:.1,CB:.25,N:-.35,O:-.55,O1P:-.85,O2P:-.85,O3P:-.85,OG1:-1.1,P:1.4},SER:{CB:.25,OG:-.25},THR:{CB:.25,OG1:-.25},TPO:{C:.55,CA:.1,CB:.25,N:-.35,O:-.55,OG1:-1.1,O1P:-.85,O2P:-.85,O3P:-.85,P:1.4},TRP:{CD1:.06,CD2:.1,CE2:-.04,CE3:-.03,CG:-.03,NE1:-.06},TYR:{CZ:.25,OH:-.25},backbone:{C:.55,O:-.55,N:-.35,CA:.1}},k_=1.04;var B_=function(i){function t(t){var r=this;i.call(this,t),this.delta=new ri,this.hCharges=[],t.scale||(this.parameters.scale="rwb"),t.domain||(this.parameters.domain=[-50,50]),this.scale=this.getScale(),this.charges=new Float32Array(t.structure.atomCount);var n=[];t.structure.eachAtom(function(t){var e;if(r.charges[t.index]=(null!==(e=t).partialCharge?e.partialCharge:e.isProtein()&&(D_[e.resname]&&D_[e.resname][e.atomname]||D_.backbone[e.atomname])||0)*t.occupancy,"N"===t.atomname){if(3<=t.bondCount)return;if(t.bondToElementCount(1))return;var i=function(t,e){void 0===e&&(e=new ri);var i=!1,r=!1,n=!1;return e.set(2*t.x,2*t.y,2*t.z),t.eachBondedAtom(function(t){if(!i)return"H"===t.atomname?(e.set(t.x,t.y,t.z),void(i=!0)):void(r||"CA"!==t.atomname?n||"C"!==t.atomname||(n=!0,e.sub(t)):(e.sub(t),r=!0))}),i?e:r&&n?(e.normalize(),e.multiplyScalar(k_),e.add(t),e):void 0}(t);void 0!==i&&(n.push(i),r.hCharges.push(.25*t.occupancy))}});var e=t.structure.getBoundingBox();e.expandByScalar(k_),this.hStore=function(t){for(var e=t.length,i=new Float32Array(e),r=new Float32Array(e),n=new Float32Array(e),o=0;o<t.length;o++){var a=t[o];i[o]=a.x,r[o]=a.y,n[o]=a.z}return{x:i,y:r,z:n,count:e}}(n),this.hHash=new Zm(this.hStore,e),this.hash=new Zm(t.structure.atomStore,e)}return i&&(t.__proto__=i),((t.prototype=Object.create(i&&i.prototype)).constructor=t).prototype.positionColor=function(t){var r=this.charges,n=this.hCharges,o=0;return this.hash.eachWithin(t.x,t.y,t.z,12,function(t,e){var i=r[t];0!==i&&(o+=i/e)}),this.hHash.eachWithin(t.x,t.y,t.z,12,function(t,e){var i=n[t];0!==i&&(o+=i/e)}),this.scale(332*o)},t}(ip);Qp.add("electrostatic",B_);var N_={H:16777215,HE:14286847,LI:13402367,BE:12779264,B:16758197,C:9474192,N:3166456,O:16715021,F:9494608,NE:11789301,NA:11230450,MG:9109248,AL:12560038,SI:1578e4,P:16744448,S:16777008,CL:2093087,AR:8442339,K:9388244,CA:4062976,SC:15132390,TI:12567239,V:10921643,CR:9083335,MN:10255047,FE:14706227,CO:15765664,NI:5296208,CU:13140019,ZN:8224944,GA:12750735,GE:6721423,AS:12419299,SE:16752896,BR:10889513,KR:6076625,RB:7351984,SR:65280,Y:9764863,ZR:9756896,NB:7586505,MO:5551541,TC:3907230,RU:2396047,RH:687500,PD:27013,AG:12632256,CD:16767375,IN:10909043,SN:6717568,SB:10380213,TE:13924864,I:9699476,XE:9699476,CS:5707663,BA:51456,LA:7394559,CE:16777159,PR:14286791,ND:13107143,PM:10747847,SM:9437127,EU:6422471,GD:4587463,TB:3211207,DY:2097095,HO:65436,ER:58997,TM:54354,YB:48952,LU:43812,HF:5096191,TA:5089023,W:2200790,RE:2522539,OS:2516630,IR:1528967,PT:13684960,AU:16765219,HG:12105936,TL:10900557,PB:5724513,BI:10375093,PO:11230208,AT:7688005,RN:4358806,FR:4325478,RA:32e3,AC:7384058,TH:47871,PA:41471,U:36863,NP:33023,PU:27647,AM:5528818,CM:7888099,BK:9064419,CF:10565332,ES:11739092,FM:11739066,MD:11734438,NO:12389767,LR:13041766,RF:13369433,DB:13697103,SG:14221381,BH:14680120,HS:15073326,MT:15400998,DS:16777215,RG:16777215,CN:16777215,UUT:16777215,FL:16777215,UUP:16777215,LV:16777215,UUH:16777215,D:16777152,T:16777120},F_=function(e){function t(t){t.value=bl(t.value,N_.C),e.call(this,t)}return e&&(t.__proto__=e),((t.prototype=Object.create(e&&e.prototype)).constructor=t).prototype.atomColor=function(t){var e=t.element;return"C"===e?this.parameters.value:N_[e]||16777215},t}(ip);Qp.add("element",F_);var z_=function(e){function t(t){e.call(this,t),t.scale||(this.parameters.scale="Spectral"),t.domain||(this.parameters.domain=[0,t.structure.entityList.length-1]),this.entityindexScale=this.getScale()}return e&&(t.__proto__=e),((t.prototype=Object.create(e&&e.prototype)).constructor=t).prototype.atomColor=function(t){return this.entityindexScale(t.entityIndex)},t}(ip);Qp.add("entityindex",z_);var U_=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),((e.prototype=Object.create(t&&t.prototype)).constructor=e).prototype.atomColor=function(t){var e=t.entity;switch(e?e.entityType:void 0){case 1:return 8374655;case 2:return 16629894;case 3:return 12496596;case 4:return 3697840;default:return 16777113}},e}(ip);Qp.add("entitytype",U_);var j_=function(i){function t(t){i.call(this,t),this.geoAtomDict={},this.geoDict={};var e=t.structure.validation;e&&(this.geoAtomDict=e.geoAtomDict,this.geoDict=e.geoDict)}return i&&(t.__proto__=i),((t.prototype=Object.create(i&&i.prototype)).constructor=t).prototype.atomColor=function(t){var e,i=t.resno+"";t.inscode&&(i+="^"+t.inscode),t.chainname&&(i+=":"+t.chainname),i+="/"+t.modelIndex;var r,n=this.geoAtomDict[i];if(void 0!==n){var o=n[t.atomname]||0;r=o,e=16843009*((r=(858993459&(r-=r>>1&1431655765))+(r>>2&858993459))+(r>>4)&252645135)>>24}else e=this.geoDict[i]||0;return 0===e?2188972:1===e?16703627:2===e?16018755:3<=e?10813478:9474192},t}(ip);Qp.add("geoquality",j_);var G_=function(a){function t(t){a.call(this,t),this.resHF={},t.scale||(this.parameters.scale="RdYlGn");for(var e in bg)this.resHF[e]=bg[e][0];if(this.defaultResidueHydrophobicity=xg[0],!t.domain){var i=1/0,r=-1/0;for(var n in this.resHF){var o=this.resHF[n];i=Math.min(i,o),r=Math.max(r,o)}this.parameters.domain=[i,0,r]}this.hfScale=this.getScale()}return a&&(t.__proto__=a),((t.prototype=Object.create(a&&a.prototype)).constructor=t).prototype.atomColor=function(t){return this.hfScale(this.resHF[t.resname]||this.defaultResidueHydrophobicity)},t}(ip);Qp.add("hydrophobicity",G_);var V_=function(e){function t(t){e.call(this,t),t.scale||(this.parameters.scale="rainbow"),t.domain||(this.parameters.domain=[0,t.structure.modelStore.count]),this.modelindexScale=this.getScale()}return e&&(t.__proto__=e),((t.prototype=Object.create(e&&e.prototype)).constructor=t).prototype.atomColor=function(t){return this.modelindexScale(t.modelIndex)},t}(ip);Qp.add("modelindex",V_);var H_=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),((e.prototype=Object.create(t&&t.prototype)).constructor=e).prototype.atomColor=function(t){switch(t.residueType.moleculeType){case 1:return 3697840;case 2:return 15729279;case 3:return 12496596;case 4:return 16629894;case 5:return 12540695;case 6:return 8374655;default:return 16777113}},e}(ip);Qp.add("moleculetype",H_);var $_=function(e){function t(t){e.call(this,t),t.scale||(this.parameters.scale="PuBu"),t.domain||(this.parameters.domain=[0,1]),this.occupancyScale=this.getScale()}return e&&(t.__proto__=e),((t.prototype=Object.create(e&&e.prototype)).constructor=t).prototype.atomColor=function(t){return this.occupancyScale(t.occupancy)},t}(ip);Qp.add("occupancy",$_);var W_=function(e){function t(t){e.call(this,t),t.scale||(this.parameters.scale="rwb"),t.domain||(this.parameters.domain=[-1,1]),this.partialchargeScale=this.getScale()}return e&&(t.__proto__=e),((t.prototype=Object.create(e&&e.prototype)).constructor=t).prototype.atomColor=function(t){return this.partialchargeScale(t.partialCharge||0)},t}(ip);function X_(){return 16777215*Math.random()}Qp.add("partialcharge",W_);var q_=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),((e.prototype=Object.create(t&&t.prototype)).constructor=e).prototype.atomColor=function(){return X_()},e.prototype.volumeColor=function(){return X_()},e.prototype.positionColor=function(){return X_()},e}(ip);Qp.add("random",q_);var Y_=function(i){function t(t){i.call(this,t),this.rciDict={},t.scale||(this.parameters.scale="RdYlBu"),this.rciScale=this.getScale({domain:[.6,0]});var e=t.structure.validation;e&&(this.rciDict=e.rciDict)}return i&&(t.__proto__=i),((t.prototype=Object.create(i&&i.prototype)).constructor=t).prototype.atomColor=function(t){var e="["+t.resname+"]"+t.resno;t.chainname&&(e+=":"+t.chainname);var i=this.rciDict[e];return void 0!==i?this.rciScale(i):9474192},t}(ip);Qp.add("randomcoilindex",Y_);var Z_=function(i){function t(t){var e=this;i.call(this,t),this.scalePerChain={},t.scale||(this.parameters.scale="rainbow",this.parameters.reverse=bl(t.reverse,!0)),t.structure.eachChain(function(t){e.parameters.domain=[t.residueOffset,t.residueEnd],e.scalePerChain[t.index]=e.getScale()})}return i&&(t.__proto__=i),((t.prototype=Object.create(i&&i.prototype)).constructor=t).prototype.atomColor=function(t){return this.scalePerChain[t.chainIndex](t.residueIndex)},t}(ip);Qp.add("residueindex",Z_);var K_={ALA:9240460,ARG:124,ASN:16743536,ASP:10485826,CYS:16777072,GLN:16731212,GLU:6684672,GLY:16777215,HIS:7368959,ILE:19456,LEU:4546117,LYS:4671416,MET:12099650,PHE:5459026,PRO:5395026,SER:16740418,THR:12078080,TRP:5195264,TYR:9203788,VAL:16747775,ASX:16711935,GLX:16711935,ASH:16711935,GLH:16711935,A:14423100,G:3329330,I:10145074,X:8190976,C:16766720,T:4286945,U:4251856,D:35723,DA:14423100,DG:3329330,DI:10145074,DX:8190976,DC:16766720,DT:4286945,DU:4251856,DD:35723},J_=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),((e.prototype=Object.create(t&&t.prototype)).constructor=e).prototype.atomColor=function(t){return K_[t.resname]||16711935},e}(ip);Qp.add("resname",J_);var Q_=16711808,tw=10485888,ew=6291584,iw=16762880,rw=6324479,nw=16777215,ow=11403518,aw=16580962,sw=10921722,cw=function(e){function t(t){e.call(this,t),this.residueProxy=t.structure.getResidueProxy()}return e&&(t.__proto__=e),((t.prototype=Object.create(e&&e.prototype)).constructor=t).prototype.atomColor=function(t){var e=t.sstruc,i=this.residueProxy;return"h"===e?Q_:"g"===e?tw:"i"===e?ew:"e"===e||"b"===e?iw:"t"===e?rw:(i.index=t.residueIndex,i.isDna()?ow:i.isRna()?aw:i.isSaccharide()?sw:i.isProtein()||"s"===e||"l"===e?nw:8421504)},t}(ip);Qp.add("sstruc",cw);var uw=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),((e.prototype=Object.create(t&&t.prototype)).constructor=e).prototype.atomColor=function(){return this.parameters.value},e.prototype.bondColor=function(){return this.parameters.value},e.prototype.valueColor=function(){return this.parameters.value},e.prototype.volumeColor=function(){return this.parameters.value},e}(ip);Qp.add("uniform",uw);var hw=function(e){function t(t){e.call(this,t),this.valueScale=this.getScale()}return e&&(t.__proto__=e),((t.prototype=Object.create(e&&e.prototype)).constructor=t).prototype.volumeColor=function(t){return this.valueScale(this.parameters.volume.data[t])},t}(ip);Qp.add("value",hw);var lw=function(e){function t(t){e.call(this,t),this.vec=new ri,this.valueScale=this.getScale()}return e&&(t.__proto__=e),((t.prototype=Object.create(e&&e.prototype)).constructor=t).prototype.positionColor=function(t){var e=this.parameters.volume;if(!e||!e.inverseMatrix)return this.parameters.value;var i=this.vec,r=e.data,n=e.nx,o=e.ny,a=n*o;i.copy(t),i.applyMatrix4(e.inverseMatrix);var s=Math.floor(i.x),c=Math.floor(i.y),u=Math.floor(i.z),h=(u*o+c)*n+s,l=h+1,p=h+n,d=h+a,f=p+1,m=d+1,g=p+a,v=g+1,y=r[h],b=r[l],x=r[p],_=r[d],w=r[f],S=r[m],A=r[g],M=r[v],E=i.x-s,P=i.y-c,T=i.z-u,C=ql(y,b,E),I=ql(_,S,E),O=ql(x,w,E),L=ql(A,M,E),R=ql(ql(C,O,P),ql(I,L,P),T);return this.valueScale(R)},t}(ip);Qp.add("volume",lw);var pw=function(o){function t(t,e,i){var r=i||{};if(o.call(this,t,e,r),this.type="structure",this.parameters=Object.assign({radiusType:{type:"select",options:Gy.types},radiusData:{type:"hidden"},radiusSize:{type:"number",precision:3,max:10,min:.001},radiusScale:{type:"number",precision:3,max:10,min:.001},assembly:null,defaultAssembly:{type:"hidden"}},this.parameters),this.selection=new Lp(r.sele),this.dataList=[],this.structure=t,this.structureView=this.structure.getView(this.selection),t.biomolDict){var n={default:"default","":t.unitcell?"AU":"FULL"};Object.keys(t.biomolDict).forEach(function(t){n[t]=t}),this.parameters.assembly={type:"select",options:n,rebuild:!0}}else this.parameters.assembly=null}o&&(t.__proto__=o),(t.prototype=Object.create(o&&o.prototype)).constructor=t;var e={defaultScale:{configurable:!0}};return e.defaultScale.get=function(){return{vdw:1,covalent:1,bfactor:.01,sstruc:1}},t.prototype.init=function(t){var e=this,i=t||{};i.colorScheme=bl(i.colorScheme,"element"),this.setRadius(i.radius,i),this.radiusType=bl(i.radiusType,"vdw"),this.radiusData=bl(i.radiusData,{}),this.radiusSize=bl(i.radiusSize,1),this.radiusScale=bl(i.radiusScale,1),this.assembly=bl(i.assembly,"default"),this.defaultAssembly=bl(i.defaultAssembly,""),"auto"===i.quality&&(i.quality=this.getQuality()),o.prototype.init.call(this,i),this.selection.signals.stringChanged.add(function(){e.build()}),this.build()},t.prototype.setRadius=function(t,e){var i=Object.keys(jy);return"string"==typeof t&&i.includes(t.toLowerCase())?e.radiusType=t:void 0!==t&&(e.radiusType="size",e.radiusSize=t),this},t.prototype.getAssembly=function(){var t="default"===this.assembly?this.defaultAssembly:this.assembly;return this.structure.biomolDict[t]},t.prototype.getQuality=function(){var t,e=this.structureView,i=this.getAssembly();return t=i?i.getAtomCount(e):e.atomCount,$p&&(t*=4),e.atomStore.count/e.residueStore.count<2&&(t*=10),t<15e3?"high":t<8e4?"medium":"low"},t.prototype.create=function(){var n=this;if(0!==this.structureView.atomCount)if(this.structureView.hasCoords()){this.needsBuild=!1;var t=this.getAssembly();if(t)t.partList.forEach(function(t,e){var i=t.getView(n.structureView);if(0!==i.atomCount){var r=n.createData(i,e);r&&(r.sview=i,r.instanceList=t.getInstanceList(),n.dataList.push(r))}});else{var e=this.createData(this.structureView,0);e&&(e.sview=this.structureView,this.dataList.push(e))}}else this.needsBuild=!0},t.prototype.update=function(e){var i=this;!this.lazy||this.visible?this.needsBuild?this.build():this.dataList.forEach(function(t){0<t.bufferList.length&&i.updateData(e,t)},this):Object.assign(this.lazyProps.what,e)},t.prototype.updateData=function(t,e){this.build()},t.prototype.getColorParams=function(){return Object.assign({},o.prototype.getColorParams.call(this),{structure:this.structure})},t.prototype.getRadiusParams=function(t){return{type:this.radiusType,scale:this.radiusScale,size:this.radiusSize,data:this.radiusData}},t.prototype.getAtomParams=function(t,e){return Object.assign({what:t,colorParams:this.getColorParams(),radiusParams:this.getRadiusParams()},e)},t.prototype.getBondParams=function(t,e){return Object.assign({what:t,colorParams:this.getColorParams(),radiusParams:this.getRadiusParams()},e)},t.prototype.getAtomRadius=function(t){return this.structureView.atomSet.isSet(t.index)?new Gy(this.getRadiusParams()).atomRadius(t):0},t.prototype.setSelection=function(t,e){return this.selection.setString(t,e),this},t.prototype.setParameters=function(t,e,i){void 0===e&&(e={}),void 0===i&&(i=!1);var r=t||{};return this.setRadius(r.radius,r),void 0===r.radiusType&&void 0===r.radiusData&&void 0===r.radiusSize&&void 0===r.radiusScale||(e.radius=!0,Xp&&!this.disableImpostor||(i=!0)),void 0!==r.defaultAssembly&&r.defaultAssembly!==this.defaultAssembly&&("default"===this.assembly&&void 0===r.assembly||"default"===r.assembly)&&(i=!0),o.prototype.setParameters.call(this,r,e,i),this},t.prototype.getParameters=function(){return Object.assign(o.prototype.getParameters.call(this),{sele:this.selection?this.selection.string:void 0,defaultAssembly:this.defaultAssembly})},t.prototype.attach=function(t){var i=this.viewer,r=this.bufferList;this.dataList.forEach(function(e){e.bufferList.forEach(function(t){r.push(t),i.add(t,e.instanceList)})}),this.setVisibility(this.visible),t()},t.prototype.clear=function(){this.dataList.length=0,o.prototype.clear.call(this)},t.prototype.dispose=function(){this.structureView.dispose(),delete this.structure,delete this.structureView,o.prototype.dispose.call(this)},Object.defineProperties(t.prototype,e),t}(sm),dw=function(r){function t(t,e,i){r.call(this,t,e,i),this.n=0,this.parameters=Object.assign({labelVisible:{type:"boolean"},labelSize:{type:"number",precision:3,max:10,min:.001},labelColor:{type:"color"},labelFontFamily:{type:"select",options:{"sans-serif":"sans-serif",monospace:"monospace",serif:"serif"},buffer:"fontFamily"},labelFontStyle:{type:"select",options:{normal:"normal",italic:"italic"},buffer:"fontStyle"},labelFontWeight:{type:"select",options:{normal:"normal",bold:"bold"},buffer:"fontWeight"},labelsdf:{type:"boolean",buffer:"sdf"},labelXOffset:{type:"number",precision:1,max:20,min:-20,buffer:"xOffset"},labelYOffset:{type:"number",precision:1,max:20,min:-20,buffer:"yOffset"},labelZOffset:{type:"number",precision:1,max:20,min:-20,buffer:"zOffset"},labelAttachment:{type:"select",options:{"bottom-left":"bottom-left","bottom-center":"bottom-center","bottom-right":"bottom-right","middle-left":"middle-left","middle-center":"middle-center","middle-right":"middle-right","top-left":"top-left","top-center":"top-center","top-right":"top-right"},rebuild:!0},labelBorder:{type:"boolean",buffer:"showBorder"},labelBorderColor:{type:"color",buffer:"borderColor"},labelBorderWidth:{type:"number",precision:2,max:.3,min:0,buffer:"borderWidth"},labelBackground:{type:"boolean",rebuild:!0},labelBackgroundColor:{type:"color",buffer:"backgroundColor"},labelBackgroundMargin:{type:"number",precision:2,max:2,min:0,rebuild:!0},labelBackgroundOpacity:{type:"range",step:.01,max:1,min:0,buffer:"backgroundOpacity"},labelFixedSize:{type:"boolean",buffer:"fixedSize"},lineOpacity:{type:"range",min:0,max:1,step:.01},linewidth:{type:"integer",max:50,min:1,buffer:!0}},this.parameters,{flatShaded:null})}return r&&(t.__proto__=r),((t.prototype=Object.create(r&&r.prototype)).constructor=t).prototype.init=function(t){var e=t||{};this.labelVisible=bl(e.labelVisible,!0),this.labelSize=bl(e.labelSize,2),this.labelColor=bl(e.labelColor,16777215),this.labelFontFamily=bl(e.labelFontFamily,"sans-serif"),this.labelFontStyle=bl(e.labelFontstyle,"normal"),this.labelFontWeight=bl(e.labelFontWeight,"bold"),this.labelsdf=bl(e.labelsdf,"Chrome"===Gp),this.labelXOffset=bl(e.labelXOffset,0),this.labelYOffset=bl(e.labelYOffset,0),this.labelZOffset=bl(e.labelZOffset,.5),this.labelAttachment=bl(e.labelAttachment,"bottom-left"),this.labelBorder=bl(e.labelBorder,!1),this.labelBorderColor=bl(e.labelBorderColor,"lightgrey"),this.labelBorderWidth=bl(e.labelBorderWidth,.15),this.labelBackground=bl(e.labelBackground,!1),this.labelBackgroundColor=bl(e.labelBackgroundColor,"lightgrey"),this.labelBackgroundMargin=bl(e.labelBackgroundMargin,.5),this.labelBackgroundOpacity=bl(e.labelBackgroundOpacity,1),this.labelFixedSize=bl(e.labelFixedSize,!1),this.lineOpacity=bl(e.lineOpacity,1),this.linewidth=bl(e.linewidth,2),r.prototype.init.call(this,e)},t.prototype.update=function(t){t.position?this.build():r.prototype.update.call(this,t)},t.prototype.updateData=function(t,e){var i={};if(t&&!t.labelSize||Object.assign(i,{size:Gd(this.n,this.labelSize)}),!t||t.labelColor){var r=new ki(this.labelColor);Object.assign(i,{color:Vd(this.n,r.r,r.g,r.b)})}this.textBuffer.setAttributes(i)},t.prototype.setParameters=function(t,e,i){return void 0===e&&(e={}),void 0===i&&(i=!1),t&&t.labelSize&&(e.labelSize=!0),t&&(t.labelColor||0===t.labelColor)&&(e.labelColor=!0),r.prototype.setParameters.call(this,t,e,i),t&&void 0!==t.opacity&&this.textBuffer.setParameters({opacity:1}),t&&void 0!==t.labelVisible&&this.setVisibility(this.visible),this},t.prototype.setVisibility=function(t,e){return r.prototype.setVisibility.call(this,t,!0),this.textBuffer&&this.textBuffer.setVisibility(this.labelVisible&&this.visible),e||this.viewer.requestRender(),this},t.prototype.getLabelBufferParams=function(t){return void 0===t&&(t={}),r.prototype.getBufferParams.call(this,Object.assign({fontFamily:this.labelFontFamily,fontStyle:this.labelFontStyle,fontWeight:this.labelFontWeight,sdf:this.labelsdf,xOffset:this.labelXOffset,yOffset:this.labelYOffset,zOffset:this.labelZOffset,attachment:this.labelAttachment,showBorder:this.labelBorder,borderColor:this.labelBorderColor,borderWidth:this.labelBorderWidth,showBackground:this.labelBackground,backgroundColor:this.labelBackgroundColor,backgroundMargin:this.labelBackgroundMargin,backgroundOpacity:this.labelBackgroundOpacity,fixedSize:this.labelFixedSize,disablePicking:!0,visible:this.labelVisible},t,{opacity:1}))},t.prototype.getAtomRadius=function(){return 0},t}(pw);function fw(a,t){var s=a.getAtomProxy(),c=new Lp,e=t.length;if(0===e)return new Float32Array(0);var u=t[0].length,h=a.getAtomSet(),l=new Float32Array(e*u*3),p=0;return t.forEach(function(t){for(var e=!1,i=0;i<u;i++){var r=t[i];if("number"==typeof r&&Number.isInteger(r)){if(!h.get(r)){e=!0;break}s.index=r}else{c.setString(r);var n=a.getAtomIndices(c);if(!n.length){e=!0;break}s.index=n[0]}var o=p+3*i;l[o++]=s.x,l[o++]=s.y,l[o++]=s.z}e||(p+=3*u)}),l.subarray(0,p)}function mw(t,e,i,r,n){var o=Math.cos(n),a=Math.sin(n);t[0]=e[0]+i[0]*o+r[0]*a,t[1]=e[1]+i[1]*o+r[1]*a,t[2]=e[2]+i[2]*o+r[2]*a}function gw(t,e,i,r,n,o,a){for(var s=0;s<e;s++){for(var c=0;c<i;c++)r[c]=t[c*e+s];vw(r,n,o,a,i);for(var u=0;u<i;u++)t[u*e+s]=n[u]}for(var h=0;h<i;h++){for(var l=0;l<e;l++)r[l]=t[h*e+l];vw(r,n,o,a,e);for(var p=0;p<e;p++)t[h*e+p]=Math.sqrt(n[p])}}function vw(t,e,i,r,n){r[i[0]=0]=Number.MIN_SAFE_INTEGER,r[1]=Number.MAX_SAFE_INTEGER;for(var o=1,a=0;o<n;o++){for(var s=(t[o]+o*o-(t[i[a]]+i[a]*i[a]))/(2*o-2*i[a]);s<=r[a];)a--,s=(t[o]+o*o-(t[i[a]]+i[a]*i[a]))/(2*o-2*i[a]);i[++a]=o,r[a]=s,r[a+1]=Number.MAX_SAFE_INTEGER}for(var c=0,u=0;c<n;c++){for(;r[u+1]<c;)u++;e[c]=(c-i[u])*(c-i[u])+t[i[u]]}}rd.add("shader/SDFFont.vert","uniform float clipNear;\nuniform float clipRadius;\nuniform vec3 clipCenter;\nuniform float xOffset;\nuniform float yOffset;\nuniform float zOffset;\nuniform bool ortho;\nuniform float canvasHeight;\nuniform float pixelRatio;\n#if defined( NEAR_CLIP ) || defined( RADIUS_CLIP ) || ( !defined( PICKING ) && !defined( NOLIGHT ) )\nvarying vec3 vViewPosition;\n#endif\nvarying vec2 texCoord;\n#if defined( RADIUS_CLIP )\nvarying vec3 vClipCenter;\n#endif\n#if defined( PICKING )\n#include unpack_color\nattribute float primitiveId;\nvarying vec3 vPickingColor;\n#else\n#include color_pars_vertex\n#endif\nattribute vec2 mapping;\nattribute vec2 inputTexCoord;\nattribute float inputSize;\n#include matrix_scale\n#include common\nvoid main(void){\n#if defined( PICKING )\nvPickingColor = unpackColor( primitiveId );\n#else\n#include color_vertex\n#endif\ntexCoord = inputTexCoord;\nfloat scale = matrixScale( modelViewMatrix );\nfloat _xOffset = xOffset * scale;\nfloat _yOffset = yOffset * scale;\nfloat _zOffset = zOffset * scale;\nif( texCoord.x == 10.0 ){\n_zOffset -= 0.001;\n}\nvec4 cameraPos = modelViewMatrix * vec4( position, 1.0 );\n#ifdef FIXED_SIZE\nif ( ortho ) {\nscale /= pixelRatio * (( canvasHeight / 2.0 ) / -cameraPosition.z) * 0.1;\n} else {\nscale /= pixelRatio * (( canvasHeight / 2.0 ) / -cameraPos.z) * 0.1;\n}\n#endif\nvec4 cameraCornerPos = vec4( cameraPos.xyz, 1.0 );\ncameraCornerPos.xy += mapping * inputSize * 0.01 * scale;\ncameraCornerPos.x += _xOffset;\ncameraCornerPos.y += _yOffset;\nif( ortho ){\ncameraCornerPos.xyz += normalize( -cameraPosition ) * _zOffset;\n} else {\ncameraCornerPos.xyz += normalize( -cameraCornerPos.xyz ) * _zOffset;\n}\ngl_Position = projectionMatrix * cameraCornerPos;\n#if defined( NEAR_CLIP ) || defined( RADIUS_CLIP ) || ( !defined( PICKING ) && !defined( NOLIGHT ) )\nvViewPosition = -cameraCornerPos.xyz;\n#endif\n#if defined( RADIUS_CLIP )\nvClipCenter = -( modelViewMatrix * vec4( clipCenter, 1.0 ) ).xyz;\n#endif\n#include nearclip_vertex\n#include radiusclip_vertex\n}"),rd.add("shader/SDFFont.frag","uniform sampler2D fontTexture;\nuniform float opacity;\nuniform bool showBorder;\nuniform vec3 borderColor;\nuniform float borderWidth;\nuniform vec3 backgroundColor;\nuniform float backgroundOpacity;\nuniform float clipNear;\nuniform float clipRadius;\nvarying vec3 vViewPosition;\nvarying vec2 texCoord;\n#if defined( RADIUS_CLIP )\nvarying vec3 vClipCenter;\n#endif\n#if defined( PICKING )\nuniform float objectId;\nvarying vec3 vPickingColor;\nconst vec3 vColor = vec3( 0.0 );\n#else\n#include common\n#include color_pars_fragment\n#include fog_pars_fragment\n#endif\nconst float gamma = 2.2 * 1.4142 / 128.0;\nconst float padding = 0.75;\nvoid main(){\n#include nearclip_fragment\n#include radiusclip_fragment\nif( texCoord.x > 1.0 ){\ngl_FragColor = vec4( backgroundColor, backgroundOpacity );\n}else{\nfloat sdf = texture2D( fontTexture, texCoord ).a;\nif( showBorder ) sdf += borderWidth;\nfloat a = smoothstep(padding - gamma, padding + gamma, sdf);\nif( a < 0.2 ) discard;\na *= opacity;\nvec3 outgoingLight = vColor;\nif( showBorder && sdf < ( padding + borderWidth ) ){\noutgoingLight = borderColor;\n}\ngl_FragColor = vec4( outgoingLight, a );\n}\n#if defined( PICKING )\nif( opacity < 0.3 )\ndiscard;\ngl_FragColor = vec4( vPickingColor, objectId );\n#else\n#include premultiplied_alpha_fragment\n#include tonemapping_fragment\n#include encodings_fragment\n#include fog_fragment\n#endif\n}");var yw={};var bw={font:"sans-serif",size:36,style:"normal",variant:"normal",weight:"normal",outline:3,width:1024,height:1024},xw=function(t){void 0===t&&(t={}),this.gamma=1,this.mapped={},this.scratchW=0,this.scratchH=0,this.currentX=0,this.currentY=0,this.cutoff=.25,this.parameters=xl(t,bw);var e=this.parameters;this.radius=e.size/8,this.padding=e.size/3;var i=this.lineHeight=e.size+2*e.outline+Math.round(e.size/4),r=this.maxWidth=e.width/4,n=this.canvas=document.createElement("canvas");n.width=r,n.height=i;var o=this.context=this.canvas.getContext("2d");o.font=e.style+" "+e.variant+" "+e.weight+" "+e.size+"px "+e.font,o.fillStyle="black",o.textAlign="left",o.textBaseline="bottom",o.lineJoin="round",this.gridOuter=new Float64Array(i*r),this.gridInner=new Float64Array(i*r),this.f=new Float64Array(Math.max(i,r)),this.d=new Float64Array(Math.max(i,r)),this.z=new Float64Array(Math.max(i,r)+1),this.v=new Int16Array(Math.max(i,r)),this.data=new Uint8Array(e.width*e.height*4),this.canvas2=document.createElement("canvas"),this.canvas2.width=e.width,this.canvas2.height=e.height,this.context2=this.canvas2.getContext("2d"),this.placeholder=this.map(String.fromCharCode(65533));for(var a=32;a<=126;++a)this.map(String.fromCharCode(a));this.map(String.fromCharCode(176)),this.map(String.fromCharCode(8491)),this.texture=new Va(this.canvas2),this.texture.flipY=!1,this.texture.needsUpdate=!0};xw.prototype.map=function(t){var e=this.parameters;return void 0===this.mapped[t]&&(this.draw(t),this.currentX+this.scratchW>e.width&&(this.currentX=0,this.currentY+=this.scratchH),this.currentY+this.scratchH>e.height&&console.warn("canvas to small"),this.mapped[t]={x:this.currentX,y:this.currentY,w:this.scratchW,h:this.scratchH},this.context2.drawImage(this.canvas,0,0,this.scratchW,this.scratchH,this.currentX,this.currentY,this.scratchW,this.scratchH),this.currentX+=this.scratchW),this.mapped[t]},xw.prototype.get=function(t){return this.mapped[t]||this.placeholder},xw.prototype.draw=function(t){var e=this.parameters,i=this.lineHeight,r=e.outline,n=this.context,o=this.maxWidth,a=r,s=i-e.outline,c=n.measureText(t),u=Math.min(o,Math.ceil(c.width+2*a+1)),h=u*i;n.clearRect(0,0,u,i),n.fillText(t,a,s);for(var l=n.getImageData(0,0,u,i),p=l.data,d=0;d<h;d++){var f=l.data[4*d+3]/255;this.gridOuter[d]=1===f?0:0===f?Number.MAX_SAFE_INTEGER:Math.pow(Math.max(0,.5-f),2),this.gridInner[d]=1===f?Number.MAX_SAFE_INTEGER:0===f?0:Math.pow(Math.max(0,f-.5),2)}gw(this.gridOuter,u,i,this.f,this.d,this.v,this.z),gw(this.gridInner,u,i,this.f,this.d,this.v,this.z);for(var m=0;m<h;m++){var g=this.gridOuter[m]-this.gridInner[m];p[4*m+3]=Math.max(0,Math.min(255,Math.round(255-255*(g/this.radius+this.cutoff))))}n.putImageData(l,0,0),this.scratchW=u,this.scratchH=i};var _w=Object.assign({fontFamily:"sans-serif",fontStyle:"normal",fontWeight:"bold",fontSize:36,xOffset:0,yOffset:0,zOffset:.5,attachment:"bottom-left",showBorder:!1,borderColor:"lightgrey",borderWidth:.15,showBackground:!1,backgroundColor:"lightgrey",backgroundMargin:.5,backgroundOpacity:1,forceTransparent:!0,fixedSize:!1},ly),ww=Object.assign({fontFamily:{uniform:!0},fontStyle:{uniform:!0},fontWeight:{uniform:!0},fontSize:{uniform:!0},xOffset:{uniform:!0},yOffset:{uniform:!0},zOffset:{uniform:!0},showBorder:{uniform:!0},borderColor:{uniform:!0},borderWidth:{uniform:!0},backgroundColor:{uniform:!0},backgroundOpacity:{uniform:!0},fixedSize:{updateShader:!0}},py);function Sw(t,e){for(var i=t.position.length/3,r=0,n=0;n<i;++n)r+=t.text[n].length;return e.showBackground&&(r+=i),r}var Aw=function(n){function t(t,e){void 0===e&&(e={}),n.call(this,{position:new Float32Array(3*Sw(t,e)),color:new Float32Array(3*Sw(t,e)),picking:new xv},e),this.parameterTypes=ww,this.alwaysTransparent=!0,this.hasWireframe=!1,this.isText=!0,this.vertexShader="SDFFont.vert",this.fragmentShader="SDFFont.frag",this.text=t.text,this.positionCount=t.position.length/3,this.addUniforms({fontTexture:{value:null},xOffset:{value:this.parameters.xOffset},yOffset:{value:this.parameters.yOffset},zOffset:{value:this.parameters.zOffset},ortho:{value:!1},showBorder:{value:this.parameters.showBorder},borderColor:{value:new ki(this.parameters.borderColor)},borderWidth:{value:this.parameters.borderWidth},backgroundColor:{value:new ki(this.parameters.backgroundColor)},backgroundOpacity:{value:this.parameters.backgroundOpacity},canvasHeight:{value:1},pixelRatio:{value:1}}),this.addAttributes({inputTexCoord:{type:"v2",value:null},inputSize:{type:"f",value:null}}),this.setAttributes(t),this.makeTexture(),this.makeMapping()}n&&(t.__proto__=n),(t.prototype=Object.create(n&&n.prototype)).constructor=t;var e={defaultParameters:{configurable:!0}};return e.defaultParameters.get=function(){return _w},t.prototype.makeMaterial=function(){n.prototype.makeMaterial.call(this);var t=this.texture,e=this.material;e.transparent=!0,e.extensions.derivatives=!0,e.lights=!1,e.uniforms.fontTexture.value=t,e.needsUpdate=!0;var i=this.wireframeMaterial;i.transparent=!0,i.extensions.derivatives=!0,i.lights=!1,i.uniforms.fontTexture.value=t,i.needsUpdate=!0;var r=this.pickingMaterial;r.extensions.derivatives=!0,r.lights=!1,r.uniforms.fontTexture.value=t,r.needsUpdate=!0},t.prototype.setAttributes=function(t){var e,i,r,n,o,a;void 0===t&&(t={});var s=this.text,c=this.geometry.attributes;t.position&&(e=t.position,n=c.position.array,c.position.needsUpdate=!0),t.size&&(i=t.size,o=c.inputSize.array,c.inputSize.needsUpdate=!0),t.color&&(r=t.color,a=c.color.array,c.color.needsUpdate=!0);for(var u,h,l,p,d=this.positionCount,f=0,m=0;m<d;++m)for(h=3*m,p=s[m].length,this.parameters.showBackground&&(p+=1),l=0;l<p;++l,++f)for(var g=0;g<4;g++)u=4*f*3+3*g,e&&(n[u]=e[h],n[u+1]=e[h+1],n[u+2]=e[h+2]),i&&(o[4*f+g]=i[m]),r&&(a[u]=r[h],a[u+1]=r[h+1],a[u+2]=r[h+2])},t.prototype.makeTexture=function(){var t,e;this.textAtlas=(t={font:this.parameters.fontFamily,style:this.parameters.fontStyle,weight:this.parameters.fontWeight,size:this.parameters.fontSize},e=JSON.stringify(t),void 0===yw[e]&&(yw[e]=new xw(t)),yw[e]),this.texture=this.textAtlas.texture},t.prototype.makeMapping=function(){for(var t,e,i,r,n,o,a,s,c=this.textAtlas,u=this.text,h=this.parameters.attachment,l=c.lineHeight*this.parameters.backgroundMargin*.1-10,p=this.geometry.attributes,d=p.inputTexCoord.array,f=p.mapping.array,m=this.positionCount,g=0,v=0;v<m;++v){for(r=0,o=(i=u[v]).length,n=0;n<o;++n)r+=(t=c.get(i[n])).w-2*c.parameters.outline;for(s=h.startsWith("top")?c.lineHeight/1.25:h.startsWith("middle")?c.lineHeight/2.5:0,a=h.endsWith("right")?r:h.endsWith("center")?r/2:0,a+=c.parameters.outline,s+=c.parameters.outline,this.parameters.showBackground&&(f[(e=2*g*4)+0]=-c.lineHeight/6-a-l,f[e+1]=c.lineHeight-s+l,f[e+2]=-c.lineHeight/6-a-l,f[e+3]=0-s-l,f[e+4]=r+c.lineHeight/6-a+2*c.parameters.outline+l,f[e+5]=c.lineHeight-s+l,f[e+6]=r+c.lineHeight/6-a+2*c.parameters.outline+l,f[e+7]=0-s-l,d[e+0]=10,d[e+2]=10,d[e+4]=10,d[e+6]=10,g+=1),n=r=0;n<o;++n,++g){t=c.get(i[n]),f[(e=2*g*4)+0]=r-a,f[e+1]=t.h-s,f[e+2]=r-a,f[e+3]=0-s,f[e+4]=r+t.w-a,f[e+5]=t.h-s,f[e+6]=r+t.w-a,f[e+7]=0-s;var y=c.parameters.width,b=c.parameters.height,x=[t.x/y,t.y/b,t.x/y,(t.y+t.h)/b,(t.x+t.w)/y,t.y/b,(t.x+t.w)/y,(t.y+t.h)/b];d.set(x,e),r+=t.w-2*c.parameters.outline}}p.inputTexCoord.needsUpdate=!0,p.mapping.needsUpdate=!0},t.prototype.getDefines=function(t){var e=n.prototype.getDefines.call(this,t);return this.parameters.fixedSize&&(e.FIXED_SIZE=1),e},t.prototype.setUniforms=function(t){!t||void 0===t.fontFamily&&void 0===t.fontStyle&&void 0===t.fontWeight&&void 0===t.fontSize||(this.makeTexture(),this.makeMapping(),this.texture.needsUpdate=!0,t.fontTexture=this.texture),n.prototype.setUniforms.call(this,t)},Object.defineProperties(t.prototype,e),t}(Mx);ad.add("text",Aw),rd.add("shader/WideLine.vert","\nuniform float clipNear;\nuniform vec3 clipCenter;\nuniform float linewidth;\nuniform vec2 resolution;\nuniform mat4 projectionMatrixInverse;\nattribute vec2 mapping;\nattribute vec3 position1;\nattribute vec3 position2;\n#ifdef PICKING\n#include unpack_color\nattribute float primitiveId;\nvarying vec3 vPickingColor;\n#else\nattribute vec3 color2;\nvarying vec3 vColor;\nvarying vec3 vColor2;\nvarying float flag;\nvarying vec3 vViewPosition;\n#endif\n#if defined( RADIUS_CLIP )\nvarying vec3 vClipCenter;\n#endif\nvoid trimSegment( const in vec4 start, inout vec4 end ) {\nfloat a = projectionMatrix[ 2 ][ 2 ]; float b = projectionMatrix[ 3 ][ 2 ]; float nearEstimate = - 0.5 * b / a;\nfloat alpha = ( nearEstimate - start.z ) / ( end.z - start.z );\nend.xyz = mix( start.xyz, end.xyz, alpha );\n}\nvoid main() {\nfloat aspect = resolution.x / resolution.y;\n#ifdef PICKING\nvPickingColor = unpackColor( primitiveId );\n#else\nflag = mapping.y;\nvColor = color;\nvColor2 = color2;\n#endif\nvec4 start = modelViewMatrix * vec4( position1, 1.0 );\nvec4 end = modelViewMatrix * vec4( position2, 1.0 );\nbool perspective = ( projectionMatrix[ 2 ][ 3 ] == -1.0 ); if ( perspective ) {\nif ( start.z < 0.0 && end.z >= 0.0 ) {\ntrimSegment( start, end );\n} else if ( end.z < 0.0 && start.z >= 0.0 ) {\ntrimSegment( end, start );\n}\n}\nvec4 clipStart = projectionMatrix * start;\nvec4 clipEnd = projectionMatrix * end;\nvec2 ndcStart = clipStart.xy / clipStart.w;\nvec2 ndcEnd = clipEnd.xy / clipEnd.w;\nvec2 dir = ndcEnd - ndcStart;\ndir.x *= aspect;\ndir = normalize( dir );\nvec2 offset = vec2( dir.y, - dir.x );\ndir.x /= aspect;\noffset.x /= aspect;\nif ( mapping.x < 0.0 ) offset *= - 1.0;\noffset *= linewidth;\noffset /= resolution.y;\nvec4 clip = ( mapping.y < 0.5 ) ? clipStart : clipEnd;\noffset *= clip.w;\nclip.xy += offset;\ngl_Position = clip;\n#ifndef PICKING\nvViewPosition = ( projectionMatrixInverse * clip ).xyz;\n#endif\n#if defined( RADIUS_CLIP )\nvClipCenter = -( modelViewMatrix * vec4( clipCenter, 1.0 ) ).xyz;\n#endif\n#include nearclip_vertex\n}"),rd.add("shader/WideLine.frag","uniform vec3 diffuse;\nuniform float opacity;\nuniform float clipNear;\nuniform float clipRadius;\n#if defined( RADIUS_CLIP )\nvarying vec3 vClipCenter;\n#endif\n#ifdef PICKING\nuniform float objectId;\nvarying vec3 vPickingColor;\n#else\n#include common\n#include fog_pars_fragment\nvarying vec3 vViewPosition;\nvarying vec3 vColor;\nvarying vec3 vColor2;\nvarying float flag;\n#endif\nvoid main() {\n#include nearclip_fragment\n#include radiusclip_fragment\n#if defined( PICKING )\nif( opacity < 0.3 )\ndiscard;\ngl_FragColor = vec4( vPickingColor, objectId );\n#else\nvec3 outgoingLight = vec3( 0.0 );\nvec4 diffuseColor = vec4( diffuse, 1.0 );\nif ( flag < 0.0 ) {\ndiffuseColor.rgb *= vColor;\n} else {\ndiffuseColor.rgb *= vColor2;\n}\n#include alphatest_fragment\noutgoingLight = diffuseColor.rgb;\ngl_FragColor = vec4( outgoingLight, diffuseColor.a * opacity );\n#include premultiplied_alpha_fragment\n#include tonemapping_fragment\n#include encodings_fragment\n#include fog_fragment\n#endif\n}");var Mw=Object.assign({linewidth:2},ly),Ew=Object.assign({linewidth:{uniform:!0}},py),Pw=function(i){function t(t,e){void 0===e&&(e={}),i.call(this,t,e),this.parameterTypes=Ew,this.vertexShader="WideLine.vert",this.fragmentShader="WideLine.frag",!t.color2&&t.color&&(t.color2=t.color),this.addUniforms({linewidth:{value:this.parameters.linewidth},resolution:{value:new ti},projectionMatrixInverse:{value:new ei}}),this.addAttributes({position1:{type:"v3",value:null},position2:{type:"v3",value:null},color2:{type:"c",value:null}}),this.setAttributes(t),this.makeMapping()}i&&(t.__proto__=i),(t.prototype=Object.create(i&&i.prototype)).constructor=t;var e={defaultParameters:{configurable:!0}};return e.defaultParameters.get=function(){return Mw},t.prototype.setParameters=function(t){i.prototype.setParameters.call(this,t)},Object.defineProperties(t.prototype,e),t}(Mx);ad.add("wideline",Pw);var Tw=function(a){function t(t,e,i){a.call(this,t,e,i),this.type="angle",this.parameters=Object.assign({atomTriple:{type:"hidden",rebuild:!0},vectorVisible:{type:"boolean",default:!0},arcVisible:{type:"boolean",default:!0},sectorVisible:{type:"boolean",default:!0}},this.parameters),this.init(i)}return a&&(t.__proto__=a),((t.prototype=Object.create(a&&a.prototype)).constructor=t).prototype.init=function(t){var e=t||{};e.side=bl(e.side,"double"),e.opacity=bl(e.opacity,.5),this.atomTriple=bl(e.atomTriple,[]),this.arcVisible=bl(e.arcVisible,!0),this.sectorVisible=bl(e.sectorVisible,!0),this.vectorVisible=bl(e.vectorVisible,!0),a.prototype.init.call(this,e)},t.prototype.createData=function(t){if(t.atomCount&&this.atomTriple.length){var e,i,r=function(d,t){void 0===t&&(t={});for(var f=bl(t.angleStep,Math.PI/90),e=d.length/9,m=new Float32Array(e),g=new Float32Array(3*e),v=new Array(e),y=new Float32Array(6*e),b=new Float32Array(6*e),x=new Array(e),_=new Array(e),w=new Array(e),S=0,A=gm(),M=gm(),E=gm(),P=gm(),T=gm(),C=gm(),I=gm(),O=gm(),L=gm(),i=function(t){var e=9*t;_m(A,d,e),_m(M,d,e+3),_m(E,d,e+6);var i=6*t;wm(A,y,i),wm(M,b,i),wm(M,y,i+3),wm(E,b,i+3),bm(P,A,M),bm(T,E,M),Em(P,P),Em(T,T),vm(C,P,T);var r=Sm(C),n=ym(P,T),o=m[t]=Math.atan2(r,n);v[t]=(Fd*o).toFixed(1)+String.fromCharCode(176),0===Sm(C)&&(C[0]=1,C[1]=0,C[2]=0),vm(I,C,P),Em(I,I),mw(O,M,P,I,o/2),wm(O,g,3*t);var a=Math.ceil(o/f),s=new Float32Array(9*a);w[t]=s;var c=new Float32Array(3*a),u=new Float32Array(3*a);x[t]=c,_[t]=u,xm(L,M,P);for(var h=function(t,e){var i=9*e,r=3*e;wm(M,s,i),wm(L,s,i+3),wm(L,c,r),mw(L,M,P,I,t),wm(L,s,i+6),wm(L,u,r)},l=0,p=f;p<o;p+=f)h(p,l),l++;h(o,l),S+=a},r=0;r<e;r++)i(r);for(var n=3*S,o=9*S,a=new Float32Array(n),s=new Float32Array(n),c=new Float32Array(o),u=0,h=0,l=0;l<e;l++){var p=x[l],R=_[l];Xd(p,a,0,h,p.length),Xd(R,s,0,h,R.length),h+=p.length;var D=w[l];Xd(D,c,0,u,D.length),u+=D.length}return{labelPosition:g,labelText:v,vectorPosition1:y,vectorPosition2:b,arcPosition1:a,arcPosition2:s,sectorPosition:c}}((e=t,i=this.atomTriple,function(e){for(var t=[],i=e.length/9,r=0;r<i;r++){for(var n=!0,o=r;o<r+3;o+=3)e[o]===e[o+3]&&e[o+1]===e[o+4]&&e[o+2]===e[o+5]&&(n=!1);n&&t.push(r)}var a=new Float32Array(9*t.length),s=0;return t.forEach(function(t){Xd(e,a,9*t,9*s,9),s++}),a}(fw(e,i)))),n=this.n=r.labelPosition.length/3,o=new ki(this.labelColor);this.textBuffer=new Aw({position:r.labelPosition,size:Gd(n,this.labelSize),color:Vd(n,o.r,o.g,o.b),text:r.labelText},this.getLabelBufferParams());var a=new ki(this.colorValue);return this.vectorBuffer=new Pw(Dm({position1:r.vectorPosition1,position2:r.vectorPosition2,color:Vd(2*n,a.r,a.g,a.b),color2:Vd(2*n,a.r,a.g,a.b)}),this.getBufferParams({linewidth:this.linewidth,visible:this.vectorVisible,opacity:this.lineOpacity})),this.arcLength=r.arcPosition1.length/3,this.arcBuffer=new Pw(Dm({position1:r.arcPosition1,position2:r.arcPosition2,color:Vd(this.arcLength,a.r,a.g,a.b),color2:Vd(this.arcLength,a.r,a.g,a.b)}),this.getBufferParams({linewidth:this.linewidth,visible:this.arcVisible,opacity:this.lineOpacity})),this.sectorLength=r.sectorPosition.length/3,this.sectorBuffer=new my({position:r.sectorPosition,color:Vd(this.sectorLength,a.r,a.g,a.b)},this.getBufferParams({visible:this.sectorVisible})),{bufferList:[this.textBuffer,this.vectorBuffer,this.arcBuffer,this.sectorBuffer]}}},t.prototype.updateData=function(t,e){a.prototype.updateData.call(this,t,e);var i={},r={},n={};if(t.color){var o=new ki(this.colorValue);Object.assign(i,{color:Vd(2*this.n,o.r,o.g,o.b),color2:Vd(2*this.n,o.r,o.g,o.b)}),Object.assign(r,{color:Vd(this.arcLength,o.r,o.g,o.b),color2:Vd(this.arcLength,o.r,o.g,o.b)}),Object.assign(n,{color:Vd(this.sectorLength,o.r,o.g,o.b)})}this.vectorBuffer.setAttributes(i),this.arcBuffer.setAttributes(r),this.sectorBuffer.setAttributes(n)},t.prototype.setParameters=function(t){return a.prototype.setParameters.call(this,t,{},!1),!t||void 0===t.vectorVisible&&void 0===t.arcVisible&&void 0===t.sectorVisible||this.setVisibility(this.visible),t&&t.lineOpacity&&(this.vectorBuffer.setParameters({opacity:t.lineOpacity}),this.arcBuffer.setParameters({opacity:t.lineOpacity})),t&&void 0!==t.opacity&&(this.vectorBuffer.setParameters({opacity:this.lineOpacity}),this.arcBuffer.setParameters({opacity:this.lineOpacity})),t&&t.linewidth&&(this.vectorBuffer.setParameters({linewidth:t.linewidth}),this.arcBuffer.setParameters({linewidth:t.linewidth})),this},t.prototype.setVisibility=function(t,e){return a.prototype.setVisibility.call(this,t,!0),this.vectorBuffer&&this.vectorBuffer.setVisibility(this.vectorVisible&&this.visible),this.arcBuffer&&this.arcBuffer.setVisibility(this.arcVisible&&this.visible),this.sectorBuffer&&this.sectorBuffer.setVisibility(this.sectorVisible&&this.visible),e||this.viewer.requestRender(),this},t}(dw);ed.add("angle",Tw);var Cw=new ri,Iw=new ri,Ow=new ri,Lw=new ri(0,1,0),Rw=Object.assign({radialSegments:1,openEnded:!0},ly);function Dw(t){void 0===t&&(t={});var e=bl(t.radialSegments,10),i=bl(t.openEnded,!0),r=(new ei).makeRotationX(Math.PI/2),n=new Ks(1,1,1,e,1,i);return n.applyMatrix(r),n}var kw=function(n){function t(t,e){void 0===e&&(e={}),n.call(this,function(t,e){void 0===e&&(e={});var i=Dw(e),r=t.position1.length,n=i.attributes.position.array.length/3,o=r/3,a=new Float32Array(2*o*n);return $d(o,n,0,a),$d(o,n,o*n,a),{position:new Float32Array(2*r),color:new Float32Array(2*r),primitiveId:a,picking:t.picking}}(t,e),e,Dw(e)),this.updateNormals=!0;var i=t.position1.length,r=t.radius.length;this.__center=new Float32Array(i),this._position=new Float32Array(2*i),this._color=new Float32Array(2*i),this._from=new Float32Array(2*i),this._to=new Float32Array(2*i),this._radius=new Float32Array(2*r),this.setAttributes(t,!0)}n&&(t.__proto__=n),(t.prototype=Object.create(n&&n.prototype)).constructor=t;var e={defaultParameters:{configurable:!0}};return e.defaultParameters.get=function(){return Rw},t.prototype.applyPositionTransform=function(t,e,i){Iw.fromArray(this._from,i),Ow.fromArray(this._to,i),t.lookAt(Iw,Ow,Lw);var r=this._radius[e];Cw.set(r,r,Iw.distanceTo(Ow)),t.scale(Cw)},t.prototype.setAttributes=function(t,e){void 0===t&&(t={});var i={};t.position1&&t.position2&&(Ud(t.position1,t.position2,this.__center),Ud(t.position1,this.__center,this._position),Ud(this.__center,t.position2,this._position,t.position1.length),this._from.set(t.position1),this._from.set(this.__center,t.position1.length),this._to.set(this.__center),this._to.set(t.position2,this.__center.length),i.position=this._position),t.color&&t.color2&&(this._color.set(t.color),this._color.set(t.color2,t.color.length),i.color=this._color),t.radius&&(this._radius.set(t.radius),this._radius.set(t.radius,t.radius.length),i.radius=this._radius),n.prototype.setAttributes.call(this,i,e)},Object.defineProperties(t.prototype,e),t}(yx);rd.add("shader/CylinderImpostor.vert","\nattribute vec3 mapping;\nattribute vec3 position1;\nattribute vec3 position2;\nattribute float radius;\nvarying vec3 axis;\nvarying vec4 base_radius;\nvarying vec4 end_b;\nvarying vec3 U;\nvarying vec3 V;\nvarying vec4 w;\n#ifdef PICKING\n#include unpack_color\nattribute float primitiveId;\nvarying vec3 vPickingColor;\n#else\nattribute vec3 color2;\nvarying vec3 vColor1;\nvarying vec3 vColor2;\n#endif\nuniform mat4 modelViewMatrixInverse;\nuniform float ortho;\n#include matrix_scale\nvoid main(){\n#ifdef PICKING\nvPickingColor = unpackColor( primitiveId );\n#else\nvColor1 = color;\nvColor2 = color2;\n#endif\nbase_radius.w = radius * matrixScale( modelViewMatrix );\nvec3 center = position;\nvec3 dir = normalize( position2 - position1 );\nfloat ext = length( position2 - position1 ) / 2.0;\nvec3 cam_dir;\nif( ortho == 0.0 ){\ncam_dir = ( modelViewMatrixInverse * vec4( 0, 0, 0, 1 ) ).xyz - center;\n}else{\ncam_dir = ( modelViewMatrixInverse * vec4( 0, 0, 1, 0 ) ).xyz;\n}\ncam_dir = normalize( cam_dir );\nvec3 ldir;\nfloat b = dot( cam_dir, dir );\nend_b.w = b;\nif( b < 0.0 )\nldir = -ext * dir;\nelse\nldir = ext * dir;\nvec3 left = normalize( cross( cam_dir, ldir ) );\nleft = radius * left;\nvec3 up = radius * normalize( cross( left, ldir ) );\naxis = normalize( normalMatrix * ldir );\nU = normalize( normalMatrix * up );\nV = normalize( normalMatrix * left );\nvec4 base4 = modelViewMatrix * vec4( center - ldir, 1.0 );\nbase_radius.xyz = base4.xyz / base4.w;\nvec4 top_position = modelViewMatrix * vec4( center + ldir, 1.0 );\nvec4 end4 = top_position;\nend_b.xyz = end4.xyz / end4.w;\nw = modelViewMatrix * vec4(\ncenter + mapping.x*ldir + mapping.y*left + mapping.z*up, 1.0\n);\ngl_Position = projectionMatrix * w;\ngl_Position.z = 0.99;\n}"),rd.add("shader/CylinderImpostor.frag","#define STANDARD\n#define IMPOSTOR\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 interiorColor;\nuniform float interiorDarkening;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\nuniform float clipNear;\nuniform mat4 projectionMatrix;\nuniform float ortho;\nvarying vec3 axis;\nvarying vec4 base_radius;\nvarying vec4 end_b;\nvarying vec3 U;\nvarying vec3 V;\nvarying vec4 w;\n#ifdef PICKING\nuniform float objectId;\nvarying vec3 vPickingColor;\n#else\nvarying vec3 vColor1;\nvarying vec3 vColor2;\n#include common\n#include fog_pars_fragment\n#include bsdfs\n#include lights_pars_begin\n#include lights_physical_pars_fragment\n#endif\nbool interior = false;\nfloat distSq3( vec3 v3a, vec3 v3b ){\nreturn (\n( v3a.x - v3b.x ) * ( v3a.x - v3b.x ) +\n( v3a.y - v3b.y ) * ( v3a.y - v3b.y ) +\n( v3a.z - v3b.z ) * ( v3a.z - v3b.z )\n);\n}\nfloat calcDepth( in vec3 cameraPos ){\nvec2 clipZW = cameraPos.z * projectionMatrix[2].zw + projectionMatrix[3].zw;\nreturn 0.5 + 0.5 * clipZW.x / clipZW.y;\n}\nfloat calcClip( vec3 cameraPos ){\nreturn dot( vec4( cameraPos, 1.0 ), vec4( 0.0, 0.0, 1.0, clipNear - 0.5 ) );\n}\nvoid main(){\nvec3 point = w.xyz / w.w;\nvec3 base = base_radius.xyz;\nfloat vRadius = base_radius.w;\nvec3 end = end_b.xyz;\nfloat b = end_b.w;\nvec3 end_cyl = end;\nvec3 surface_point = point;\nvec3 ray_target = surface_point;\nvec3 ray_origin = vec3(0.0);\nvec3 ray_direction = mix(normalize(ray_origin - ray_target), vec3(0.0, 0.0, 1.0), ortho);\nmat3 basis = mat3( U, V, axis );\nvec3 diff = ray_target - 0.5 * (base + end_cyl);\nvec3 P = diff * basis;\nfloat dz = dot( axis, ray_direction );\nfloat radius2 = vRadius*vRadius;\nvec3 D = vec3(dot(U, ray_direction),\ndot(V, ray_direction),\ndz);\nfloat a0 = P.x*P.x + P.y*P.y - radius2;\nfloat a1 = P.x*D.x + P.y*D.y;\nfloat a2 = D.x*D.x + D.y*D.y;\nfloat d = a1*a1 - a0*a2;\nif (d < 0.0)\ndiscard;\nfloat dist = (-a1 + sqrt(d)) / a2;\nvec3 new_point = ray_target + dist * ray_direction;\nvec3 tmp_point = new_point - base;\nvec3 _normal = normalize( tmp_point - axis * dot(tmp_point, axis) );\nray_origin = mix( ray_origin, surface_point, ortho );\nfloat front_cap_test = dot( tmp_point, axis );\nfloat end_cap_test = dot((new_point - end_cyl), axis);\n#ifndef CAP\nvec3 new_point2 = ray_target + ( (-a1 - sqrt(d)) / a2 ) * ray_direction;\nvec3 tmp_point2 = new_point2 - base;\n#endif\nif (front_cap_test < 0.0)\n{\nfloat dNV = dot(-axis, ray_direction);\nif (dNV < 0.0)\ndiscard;\nfloat near = dot(-axis, (base)) / dNV;\nvec3 front_point = ray_direction * near + ray_origin;\nif (dot(front_point - base, front_point-base) > radius2)\ndiscard;\n#ifdef CAP\nnew_point = front_point;\n_normal = axis;\n#else\nnew_point = ray_target + ( (-a1 - sqrt(d)) / a2 ) * ray_direction;\ndNV = dot(-axis, ray_direction);\nnear = dot(axis, end_cyl) / dNV;\nnew_point2 = ray_direction * near + ray_origin;\nif (dot(new_point2 - end_cyl, new_point2-base) < radius2)\ndiscard;\ninterior = true;\n#endif\n}\nif( end_cap_test > 0.0 )\n{\nfloat dNV = dot(axis, ray_direction);\nif (dNV < 0.0)\ndiscard;\nfloat near = dot(axis, end_cyl) / dNV;\nvec3 end_point = ray_direction * near + ray_origin;\nif( dot(end_point - end_cyl, end_point-base) > radius2 )\ndiscard;\n#ifdef CAP\nnew_point = end_point;\n_normal = axis;\n#else\nnew_point = ray_target + ( (-a1 - sqrt(d)) / a2 ) * ray_direction;\ndNV = dot(-axis, ray_direction);\nnear = dot(-axis, (base)) / dNV;\nnew_point2 = ray_direction * near + ray_origin;\nif (dot(new_point2 - base, new_point2-base) < radius2)\ndiscard;\ninterior = true;\n#endif\n}\ngl_FragDepthEXT = calcDepth( new_point );\n#ifdef NEAR_CLIP\nif( calcClip( new_point ) > 0.0 ){\ndist = (-a1 - sqrt(d)) / a2;\nnew_point = ray_target + dist * ray_direction;\nif( calcClip( new_point ) > 0.0 )\ndiscard;\ninterior = true;\ngl_FragDepthEXT = calcDepth( new_point );\nif( gl_FragDepthEXT >= 0.0 ){\ngl_FragDepthEXT = max( 0.0, calcDepth( vec3( - ( clipNear - 0.5 ) ) ) + ( 0.0000001 / vRadius ) );\n}\n}else if( gl_FragDepthEXT <= 0.0 ){\ndist = (-a1 - sqrt(d)) / a2;\nnew_point = ray_target + dist * ray_direction;\ninterior = true;\ngl_FragDepthEXT = calcDepth( new_point );\nif( gl_FragDepthEXT >= 0.0 ){\ngl_FragDepthEXT = 0.0 + ( 0.0000001 / vRadius );\n}\n}\n#else\nif( gl_FragDepthEXT <= 0.0 ){\ndist = (-a1 - sqrt(d)) / a2;\nnew_point = ray_target + dist * ray_direction;\ninterior = true;\ngl_FragDepthEXT = calcDepth( new_point );\nif( gl_FragDepthEXT >= 0.0 ){\ngl_FragDepthEXT = 0.0 + ( 0.0000001 / vRadius );\n}\n}\n#endif\nif (gl_FragDepthEXT < 0.0)\ndiscard;\nif (gl_FragDepthEXT > 1.0)\ndiscard;\n#ifdef PICKING\nif( opacity < 0.3 )\ndiscard;\ngl_FragColor = vec4( vPickingColor, objectId );\n#else\nvec3 vViewPosition = -new_point;\nvec3 vNormal = _normal;\nvec3 vColor;\nif( distSq3( new_point, end_cyl ) < distSq3( new_point, base ) ){\nif( b < 0.0 ){\nvColor = vColor1;\n}else{\nvColor = vColor2;\n}\n}else{\nif( b > 0.0 ){\nvColor = vColor1;\n}else{\nvColor = vColor2;\n}\n}\nvec4 diffuseColor = vec4( diffuse, opacity );\nReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\nvec3 totalEmissiveLight = emissive;\n#include color_fragment\n#include roughnessmap_fragment\n#include metalnessmap_fragment\nvec3 normal = normalize( vNormal );\n#include lights_physical_fragment\n#include lights_fragment_begin\n#include lights_fragment_end\nvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveLight;\nif( interior ){\n#ifdef USE_INTERIOR_COLOR\noutgoingLight.xyz = interiorColor;\n#else\n#ifdef DIFFUSE_INTERIOR\noutgoingLight.xyz = vColor;\n#endif\n#endif\noutgoingLight.xyz *= 1.0 - interiorDarkening;\n}\ngl_FragColor = vec4( outgoingLight, diffuseColor.a );\n#include premultiplied_alpha_fragment\n#include tonemapping_fragment\n#include encodings_fragment\n#include fog_fragment\n#endif\n}");var Bw=new Float32Array([-1,1,-1,-1,-1,-1,1,1,-1,1,1,1,1,-1,-1,1,-1,1]),Nw=new Uint16Array([0,1,2,1,4,2,2,4,3,4,5,3]),Fw=function(i){function t(t,e){void 0===e&&(e={}),i.call(this,"v3",t,e)}i&&(t.__proto__=i),(t.prototype=Object.create(i&&i.prototype)).constructor=t;var e={mapping:{configurable:!0},mappingIndices:{configurable:!0},mappingIndicesSize:{configurable:!0},mappingSize:{configurable:!0},mappingItemSize:{configurable:!0}};return e.mapping.get=function(){return Bw},e.mappingIndices.get=function(){return Nw},e.mappingIndicesSize.get=function(){return 12},e.mappingSize.get=function(){return 6},e.mappingItemSize.get=function(){return 3},Object.defineProperties(t.prototype,e),t}(wx),zw=Object.assign({openEnded:!1},ly),Uw=Object.assign({openEnded:{updateShader:!0}},py),jw=function(i){function t(t,e){void 0===e&&(e={}),i.call(this,t,e),this.parameterTypes=Uw,this.isImpostor=!0,this.vertexShader="CylinderImpostor.vert",this.fragmentShader="CylinderImpostor.frag",this.addUniforms({modelViewMatrixInverse:{value:new ei},ortho:{value:0}}),this.addAttributes({position1:{type:"v3",value:null},position2:{type:"v3",value:null},color2:{type:"c",value:null},radius:{type:"f",value:null}}),this.setAttributes(t),this.makeMapping()}i&&(t.__proto__=i),(t.prototype=Object.create(i&&i.prototype)).constructor=t;var e={defaultParameters:{configurable:!0}};return e.defaultParameters.get=function(){return zw},t.prototype.getDefines=function(t){var e=i.prototype.getDefines.call(this,t);return this.parameters.openEnded||(e.CAP=1),e},Object.defineProperties(t.prototype,e),t}(Fw),Gw=(Object.assign({disableImpostor:!1},Rw,zw),function(t,e){return void 0===e&&(e={}),!t.color2&&t.color&&(t.color2=t.color),!Xp||e&&e.disableImpostor?new kw(t,e):new jw(t,e)});ad.add("cylinder",Gw);var Vw=function(r){function t(t,e,i){r.call(this,t,e,i),this.type="axes",this.parameters=Object.assign({radiusSize:{type:"number",precision:3,max:10,min:.001},sphereDetail:!0,radialSegments:!0,disableImpostor:!0,showAxes:{type:"boolean",rebuild:!0},showBox:{type:"boolean",rebuild:!0}},this.parameters,{assembly:null}),this.init(i)}return r&&(t.__proto__=r),((t.prototype=Object.create(r&&r.prototype)).constructor=t).prototype.init=function(t){var e=t||{};e.radiusSize=bl(e.radiusSize,.5),e.colorValue=bl(e.colorValue,"lightgreen"),e.useInteriorColor=bl(e.useInteriorColor,!0),this.showAxes=bl(e.showAxes,!0),this.showBox=bl(e.showBox,!1),r.prototype.init.call(this,e)},t.prototype.getPrincipalAxes=function(){var t,e=this.getAssembly();return e&&(t=e.partList[0].getSelection()),this.structureView.getPrincipalAxes(t)},t.prototype.getAxesData=function(t){var r=this.getPrincipalAxes(),e=new ki(this.colorValue),i=0,n=0;this.showAxes&&(i+=6,n+=3),this.showBox&&(i+=8,n+=12);var o=new Float32Array(3*i),a=Vd(i,e.r,e.g,e.b),s=Gd(i,this.radiusSize),c=new Float32Array(3*n),u=new Float32Array(3*n),h=Vd(n,e.r,e.g,e.b),l=Gd(n,this.radiusSize),p=0;if(this.showAxes){var d=function(t,e){t.toArray(o,2*p),e.toArray(o,2*p+3),t.toArray(c,p),e.toArray(u,p),p+=3};d(r.begA,r.endA),d(r.begB,r.endB),d(r.begC,r.endC)}if(this.showBox){var f=new ri,m=r.getProjectedScaleForAtoms(t),g=m.d1a,v=m.d2a,y=m.d3a,b=m.d1b,x=m.d2b,_=m.d3b,w=2*p,S=function(t,e,i){f.copy(r.center).addScaledVector(r.normVecA,t).addScaledVector(r.normVecB,e).addScaledVector(r.normVecC,i),f.toArray(o,w),w+=3};S(g,v,y),S(g,v,_),S(g,x,_),S(g,x,y),S(b,x,_),S(b,x,y),S(b,v,y),S(b,v,_);var A=p,M=function(t,e){f.fromArray(o,2*p+3*t).toArray(c,A),f.fromArray(o,2*p+3*e).toArray(u,A),A+=3};M(0,1),M(0,3),M(0,6),M(1,2),M(1,7),M(2,3),M(2,4),M(3,5),M(4,5),M(4,7),M(5,6),M(6,7)}var E=new lv(r);return{vertex:{position:o,color:a,radius:s,picking:E},edge:{position1:c,position2:u,color:h,color2:h,radius:l,picking:E}}},t.prototype.create=function(){var t=this.getAxesData(this.structureView);this.sphereBuffer=new Px(t.vertex,this.getBufferParams({sphereDetail:this.sphereDetail,disableImpostor:this.disableImpostor,dullInterior:!0})),this.cylinderBuffer=new Gw(t.edge,this.getBufferParams({openEnded:!0,radialSegments:this.radialSegments,disableImpostor:this.disableImpostor,dullInterior:!0})),this.dataList.push({sview:this.structureView,bufferList:[this.sphereBuffer,this.cylinderBuffer]})},t.prototype.createData=function(t){},t.prototype.updateData=function(t,e){var i=this.getAxesData(e.sview),r={},n={};t&&!t.position||(Object.assign(r,{position:i.vertex.position}),Object.assign(n,{position1:i.edge.position1,position2:i.edge.position2})),t&&!t.color||(Object.assign(r,{color:i.vertex.color}),Object.assign(n,{color:i.edge.color,color2:i.edge.color})),t&&!t.radius||(Object.assign(r,{radius:i.vertex.radius}),Object.assign(n,{radius:i.edge.radius})),this.sphereBuffer.setAttributes(r),this.cylinderBuffer.setAttributes(n)},t}(pw);ed.add("axes",Vw);var Hw=function(r){function t(t,e,i){r.call(this,t,e,i),this.type="ball+stick",this.parameters=Object.assign({sphereDetail:!0,radialSegments:!0,openEnded:!0,disableImpostor:!0,aspectRatio:{type:"number",precision:1,max:10,min:1},lineOnly:{type:"boolean",rebuild:!0},cylinderOnly:{type:"boolean",rebuild:!0},multipleBond:{type:"select",rebuild:!0,options:{off:"off",symmetric:"symmetric",offset:"offset"}},bondScale:{type:"number",precision:2,max:1,min:.01},bondSpacing:{type:"number",precision:2,max:2,min:.5},linewidth:{type:"integer",max:50,min:1,buffer:!0}},this.parameters),this.init(i)}return r&&(t.__proto__=r),((t.prototype=Object.create(r&&r.prototype)).constructor=t).prototype.init=function(t){var e=t||{};e.radiusType=bl(e.radiusType,"size"),e.radiusSize=bl(e.radiusSize,.15),e.useInteriorColor=bl(e.useInteriorColor,!0),this.aspectRatio=bl(e.aspectRatio,2),this.lineOnly=bl(e.lineOnly,!1),this.cylinderOnly=bl(e.cylinderOnly,!1),this.multipleBond=bl(e.multipleBond,"off"),this.bondSpacing=bl(e.bondSpacing,1),this.bondScale=bl(e.bondScale,.4),this.linewidth=bl(e.linewidth,2),r.prototype.init.call(this,e)},t.prototype.getAtomRadius=function(t){return this.aspectRatio*r.prototype.getAtomRadius.call(this,t)},t.prototype.getAtomParams=function(t,e){var i=r.prototype.getAtomParams.call(this,t,e);return i.radiusParams.scale*=this.aspectRatio,i},t.prototype.getAtomData=function(t,e,i){return t.getAtomData(this.getAtomParams(e,i))},t.prototype.getBondParams=function(t,e){return e=Object.assign({multipleBond:this.multipleBond,bondSpacing:this.bondSpacing,bondScale:this.bondScale},e),r.prototype.getBondParams.call(this,t,e)},t.prototype.getBondData=function(t,e,i){return t.getBondData(this.getBondParams(e,i))},t.prototype.createData=function(t){var e=[];if(this.lineOnly)this.lineBuffer=new Pw(this.getBondData(t,{position:!0,color:!0,picking:!0}),this.getBufferParams({linewidth:this.linewidth})),e.push(this.lineBuffer);else{var i=new Gw(this.getBondData(t),this.getBufferParams({openEnded:this.openEnded,radialSegments:this.radialSegments,disableImpostor:this.disableImpostor,dullInterior:!0}));if(e.push(i),!this.cylinderOnly){var r=new Px(this.getAtomData(t),this.getBufferParams({sphereDetail:this.sphereDetail,disableImpostor:this.disableImpostor,dullInterior:!0}));e.push(r)}}return{bufferList:e}},t.prototype.updateData=function(t,e){"off"!==this.multipleBond&&t&&t.radius&&(t.position=!0);var i=this.getBondData(e.sview,t);if(this.lineOnly){var r={};t&&!t.position||Object.assign(r,{position1:i.position1,position2:i.position2}),t&&!t.color||Object.assign(r,{color:i.color,color2:i.color2}),e.bufferList[0].setAttributes(r)}else{var n={};if(t&&!t.position||Object.assign(n,{position1:i.position1,position2:i.position2}),t&&!t.color||Object.assign(n,{color:i.color,color2:i.color2}),t&&!t.radius||Object.assign(n,{radius:i.radius}),e.bufferList[0].setAttributes(n),!this.cylinderOnly){var o=this.getAtomData(e.sview,t),a={};t&&!t.position||Object.assign(a,{position:o.position}),t&&!t.color||Object.assign(a,{color:o.color}),t&&!t.radius||Object.assign(a,{radius:o.radius}),e.bufferList[1].setAttributes(a)}}},t.prototype.setParameters=function(t){void 0===t&&(t={});var e=!1,i={};return(t.aspectRatio||t.bondSpacing||t.bondScale)&&(Object.assign(i,{radius:!0}),Xp&&!this.disableImpostor||(e=!0)),r.prototype.setParameters.call(this,t,i,e),this},t}(pw);ed.add("ball+stick",Hw);var $w=function(r){function t(t,e,i){r.call(this,t,e,i),this.type="backbone",this.parameters=Object.assign({},this.parameters,{multipleBond:null,bondSpacing:null}),this.init(i)}return r&&(t.__proto__=r),((t.prototype=Object.create(r&&r.prototype)).constructor=t).prototype.init=function(t){var e=t||{};e.aspectRatio=bl(e.aspectRatio,1),e.radiusSize=bl(e.radiusSize,.25),r.prototype.init.call(this,e)},t.prototype.getAtomRadius=function(t){return t.isTrace()?r.prototype.getAtomRadius.call(this,t):0},t.prototype.getAtomData=function(t,e,i){return t.getBackboneAtomData(this.getAtomParams(e,i))},t.prototype.getBondData=function(t,e,i){return t.getBackboneBondData(this.getBondParams(e,i))},t}(Hw);ed.add("backbone",$w);var Ww=function(r){function t(t,e,i){r.call(this,t,e,i),this.type="base",this.parameters=Object.assign({},this.parameters,{multipleBond:null,bondSpacing:null})}return r&&(t.__proto__=r),((t.prototype=Object.create(r&&r.prototype)).constructor=t).prototype.init=function(t){var e=t||{};e.aspectRatio=bl(e.aspectRatio,1),e.radiusSize=bl(e.radiusSize,.3),r.prototype.init.call(this,e)},t.prototype.getAtomData=function(t,e,i){return t.getRungAtomData(this.getAtomParams(e,i))},t.prototype.getBondData=function(t,e,i){var r=this.getBondParams(e,i);return Object.assign(r.colorParams,{rung:!0}),t.getRungBondData(r)},t}(Hw);ed.add("base",Ww);var Xw=function(t,e){this.m=t,this.tension=e,this.dt=1/this.m,this.delta=1e-4,this.vec1=new ri,this.vec2=new ri,this.vDir=new ri,this.vTan=new ri,this.vNorm=new ri,this.vBin=new ri,this.m2=Math.ceil(this.m/2)};Xw.prototype.interpolateToArr=function(t,e,i,r,n,o,a){o[a+0]=Yl(t.x,e.x,i.x,r.x,n,this.tension),o[a+1]=Yl(t.y,e.y,i.y,r.y,n,this.tension),o[a+2]=Yl(t.z,e.z,i.z,r.z,n,this.tension)},Xw.prototype.interpolateToVec=function(t,e,i,r,n,o){o.x=Yl(t.x,e.x,i.x,r.x,n,this.tension),o.y=Yl(t.y,e.y,i.y,r.y,n,this.tension),o.z=Yl(t.z,e.z,i.z,r.z,n,this.tension)},Xw.prototype.interpolatePosition=function(t,e,i,r,n,o){for(var a=0;a<this.m;++a){var s=o+3*a,c=this.dt*a;this.interpolateToArr(t,e,i,r,c,n,s)}},Xw.prototype.interpolateTangent=function(t,e,i,r,n,o){for(var a=this,s=0;s<this.m;++s){var c=a.dt*s,u=c-a.delta,h=c+a.delta,l=o+3*s;u<0&&(u=0),1<h&&(h=1),a.interpolateToVec(t,e,i,r,u,a.vec1),a.interpolateToVec(t,e,i,r,h,a.vec2),a.vec2.sub(a.vec1).normalize(),a.vec2.toArray(n,l)}},Xw.prototype.vectorSubdivide=function(t,e,i,r,n){for(var o,a=e.next(),s=e.next(),c=e.next(),u=e.size,h=u-1,l=r||0,p=0;p<h;++p)o=a,a=s,s=c,c=e.next(),t.apply(this,[o,a,s,c,i,l]),l+=3*this.m;n&&(o=e.get(u-2),a=e.get(u-1),s=e.get(0),c=e.get(1),t.apply(this,[o,a,s,c,i,l]),l+=3*this.m)},Xw.prototype.getPosition=function(t,e,i,r){t.reset(),this.vectorSubdivide(this.interpolatePosition,t,e,i,r);var n=t.size-1,o=n*this.m*3;r&&(o+=3*this.m);var a=t.get(r?0:n);e[o]=a.x,e[o+1]=a.y,e[o+2]=a.z},Xw.prototype.getTangent=function(t,e,i,r){t.reset(),this.vectorSubdivide(this.interpolateTangent,t,e,i,r);var n=(t.size-1)*this.m*3;r&&(n+=3*this.m),Xd(e,e,n-3,n,3)},Xw.prototype.interpolateNormalDir=function(t,e,i,r,n,o,a,s,c,u,h,l,p){for(var d=this,f=0;f<this.m;++f){var m=l+3*f;p&&(m+=3*d.m2);var g=d.dt*f;d.interpolateToVec(t,e,i,r,g,d.vec1),d.interpolateToVec(n,o,a,s,g,d.vec2),d.vDir.subVectors(d.vec2,d.vec1).normalize(),d.vTan.fromArray(c,m),d.vBin.crossVectors(d.vDir,d.vTan).normalize(),d.vBin.toArray(h,m),d.vNorm.crossVectors(d.vTan,d.vBin).normalize(),d.vNorm.toArray(u,m)}},Xw.prototype.interpolateNormal=function(t,e,i,r,n){for(var o=0;o<this.m;++o){var a=n+3*o;t.copy(this.vNorm),this.vTan.fromArray(e,a),this.vBin.crossVectors(t,this.vTan).normalize(),this.vBin.toArray(r,a),this.vNorm.crossVectors(this.vTan,this.vBin).normalize(),this.vNorm.toArray(i,a)}},Xw.prototype.getNormal=function(t,e,i,r,n,o){this.vNorm.set(0,0,1);for(var a=t-1,s=n||0,c=0;c<a;++c)this.interpolateNormal(this.vDir,e,i,r,s),s+=3*this.m;o&&(this.interpolateNormal(this.vDir,e,i,r,s),s+=3*this.m),this.vBin.toArray(r,s),this.vNorm.toArray(i,s)},Xw.prototype.getNormalDir=function(t,e,i,r,n,o,a,s){t.reset(),e.reset();var c=new ri,u=new ri,h=new ri,l=new ri,p=new ri,d=(new ri).copy(t.next()),f=(new ri).copy(t.next()),m=(new ri).copy(t.next()),g=new ri,v=(new ri).copy(e.next()),y=(new ri).copy(e.next()),b=(new ri).copy(e.next());this.vNorm.set(0,0,1);for(var x=t.size,_=x-1,w=o||0,S=0;S<_;++S)p.copy(d),d.copy(f),f.copy(m),m.copy(t.next()),g.copy(v),v.copy(y),y.copy(b),b.copy(e.next()),0===S?(c.subVectors(g,p),u.subVectors(v,d),c.dot(u)<0&&(u.multiplyScalar(-1),v.addVectors(d,u)),h.subVectors(y,f),u.dot(h)<0&&(h.multiplyScalar(-1),y.addVectors(f,h))):h.copy(l),l.subVectors(b,m),h.dot(l)<0&&(l.multiplyScalar(-1),b.addVectors(m,l)),this.interpolateNormalDir(p,d,f,m,g,v,y,b,i,r,n,w,s),w+=3*this.m;if(a&&(p.copy(t.get(x-2)),d.copy(t.get(x-1)),f.copy(t.get(0)),m.copy(t.get(1)),g.copy(e.get(x-2)),v.copy(e.get(x-1)),y.copy(e.get(0)),b.copy(e.get(1)),h.copy(l),l.subVectors(b,m),h.dot(l)<0&&(l.multiplyScalar(-1),b.addVectors(m,l)),this.interpolateNormalDir(p,d,f,m,g,v,y,b,i,r,n,w,s),w+=3*this.m),s){this.vBin.fromArray(n,3*this.m2),this.vNorm.fromArray(r,3*this.m2);for(var A=0;A<this.m2;++A)this.vBin.toArray(n,3*A),this.vNorm.toArray(r,3*A)}else this.vBin.toArray(n,w),this.vNorm.toArray(r,w)},Xw.prototype.interpolateColor=function(t,e,i,r,n){var o,a;for(o=0;o<this.m2;++o)a=n+3*o,i.apply(this,[t,r,a]);for(o=this.m2;o<this.m;++o)a=n+3*o,i.apply(this,[e,r,a])},Xw.prototype.getColor=function(t,e,i,r,n){var o;t.reset(),t.next();for(var a=t.next(),s=t.size,c=s-1,u=r||0,h=0;h<c;++h)o=a,a=t.next(),this.interpolateColor(o,a,e,i,u),u+=3*this.m;n&&(o=t.get(s-1),a=t.get(0),this.interpolateColor(o,a,e,i,u),u+=3*this.m),i[u]=i[u-3],i[u+1]=i[u-2],i[u+2]=i[u-1]},Xw.prototype.interpolatePicking=function(t,e,i,r,n){var o;for(o=0;o<this.m2;++o)r[n+o]=i.apply(this,[t]);for(o=this.m2;o<this.m;++o)r[n+o]=i.apply(this,[e])},Xw.prototype.getPicking=function(t,e,i,r,n){var o;t.reset(),t.next();for(var a=t.next(),s=t.size,c=s-1,u=r||0,h=0;h<c;++h)o=a,a=t.next(),this.interpolatePicking(o,a,e,i,u),u+=this.m;n&&(o=t.get(s-1),a=t.get(0),this.interpolatePicking(o,a,e,i,u),u+=this.m),i[u]=i[u-1]},Xw.prototype.interpolateSize=function(t,e,i,r,n){for(var o=i.apply(this,[t]),a=i.apply(this,[e]),s=0;s<this.m;++s){var c=s/this.m;r[n+s]=(1-c)*o+c*a}},Xw.prototype.getSize=function(t,e,i,r,n){var o;t.reset(),t.next();for(var a=t.next(),s=t.size,c=s-1,u=r||0,h=0;h<c;++h)o=a,a=t.next(),this.interpolateSize(o,a,e,i,u),u+=this.m;n&&(o=t.get(s-1),a=t.get(0),this.interpolateSize(o,a,e,i,u),u+=this.m),i[u]=i[u-1]};var qw=function(t,e){this.polymer=t,this.size=t.residueCount;var i=e||{};this.directional=i.directional||!1,this.positionIterator=i.positionIterator||!1,this.subdiv=i.subdiv||1,this.smoothSheet=i.smoothSheet||!1,i.tension?this.tension=i.tension:this.tension=this.polymer.isNucleic()?.5:.9,this.interpolator=new Xw(this.subdiv,this.tension)};qw.prototype.getAtomIterator=function(r,n){var o=this.polymer,t=o.structure,a=o.residueCount,s=0,e=-1,c=[t.getAtomProxy(),t.getAtomProxy(),t.getAtomProxy(),t.getAtomProxy()],u=[new ri,new ri,new ri,new ri];var h=t.getAtomProxy(),l=t.getAtomProxy();function i(t){var e=c[s%4];if(e.index=o.getAtomIndexByType(t,r),n&&0<t&&t<a&&"e"===e.sstruc){var i=u[s%4];return h.index=o.getAtomIndexByType(t+1,r),l.index=o.getAtomIndexByType(t-1,r),i.addVectors(h,l).add(e).add(e).multiplyScalar(.25),s+=1,i}return s+=1,e}return{size:a,next:function(){var t=i(e);return e+=1,t},get:i,reset:function(){s=0,e=-1}}},qw.prototype.getSubdividedColor=function(t){var e=this.subdiv,i=this.polymer,r=(i.residueCount-1)*e*3+3;i.isCyclic&&(r+=3*e);var n=new Float32Array(r),o=this.getAtomIterator("trace"),a=t||{};a.structure=i.structure;var s=Qp.getScheme(a);return this.interpolator.getColor(o,function(t,e,i){s.atomColorToArray(t,e,i)},n,0,i.isCyclic),{color:n}},qw.prototype.getSubdividedPicking=function(){var t=this.subdiv,e=this.polymer,i=(e.residueCount-1)*t+1;e.isCyclic&&(i+=t);var r=e.structure,n=this.getAtomIterator("trace"),o=new Float32Array(i);return this.interpolator.getPicking(n,function(t){return t.index},o,0,e.isCyclic),{picking:new hv(o,r)}},qw.prototype.getSubdividedPosition=function(){return{position:this.getPosition()}},qw.prototype.getSubdividedOrientation=function(){var t=this.getTangent(),e=this.getNormals(t);return{tangent:t,normal:e.normal,binormal:e.binormal}},qw.prototype.getSubdividedSize=function(t){var e=this.subdiv,i=this.polymer,r=(i.residueCount-1)*e+1;i.isCyclic&&(r+=e);var n=new Float32Array(r),o=this.getAtomIterator("trace"),a=new Gy(t);return this.interpolator.getSize(o,function(t){return a.atomRadius(t)},n,0,i.isCyclic),{size:n}},qw.prototype.getPosition=function(){var t=this.subdiv,e=this.polymer,i=(e.residueCount-1)*t*3+3;e.isCyclic&&(i+=3*t);var r=new Float32Array(i),n=this.positionIterator||this.getAtomIterator("trace",this.smoothSheet);return this.interpolator.getPosition(n,r,0,e.isCyclic),r},qw.prototype.getTangent=function(){var t=this.subdiv,e=this.polymer,i=(this.size-1)*t*3+3;e.isCyclic&&(i+=3*t);var r=new Float32Array(i),n=this.positionIterator||this.getAtomIterator("trace",this.smoothSheet);return this.interpolator.getTangent(n,r,0,e.isCyclic),r},qw.prototype.getNormals=function(t){var e=this.subdiv,i=this.polymer,r=i.isProtein(),n=this.size,o=(n-1)*e*3+3;i.isCyclic&&(o+=3*e);var a=new Float32Array(o),s=new Float32Array(o);if(this.directional&&!this.polymer.isCg()){var c=this.getAtomIterator("direction1"),u=this.getAtomIterator("direction2");this.interpolator.getNormalDir(c,u,t,a,s,0,i.isCyclic,r)}else this.interpolator.getNormal(n,t,a,s,0,i.isCyclic);return{normal:a,binormal:s}};var Yw=new ri,Zw=new ri,Kw=Object.assign({radialSegments:4,capped:!1,aspectRatio:1},ly);var Jw=function(i){function t(t,e){void 0===e&&(e={}),i.call(this,function(t,e){void 0===e&&(e={});var i=bl(e.radialSegments,4),r=bl(e.capped,!1),n=r?i:0,o=r?i-2:0,a=t.position.length/3,s=a*i*3+2*n*3,c=2*(a-1)*i*3+2*o*3;return{position:new Float32Array(s),color:new Float32Array(s),index:Ll(c,s/3),normal:new Float32Array(s),picking:t.picking}}(t,e),e),this.capVertices=this.parameters.capped?this.parameters.radialSegments:0,this.capTriangles=this.parameters.capped?this.parameters.radialSegments-2:0,this.size2=t.position.length/3,t.primitiveId=Hd(this.size2),this.setAttributes(t),this.makeIndex()}i&&(t.__proto__=i),(t.prototype=Object.create(i&&i.prototype)).constructor=t;var e={defaultParameters:{configurable:!0}};return e.defaultParameters.get=function(){return Kw},t.prototype.setAttributes=function(t){void 0===t&&(t={});var e,i,r,n,o,a,s,c,u,h,l,p,d,f=this.parameters.aspectRatio,m=this.size2,g=m-1,v=this.parameters.radialSegments,y=this.geometry.attributes;t.position&&(e=t.position,i=t.normal,r=t.binormal,n=t.tangent,a=t.size,c=y.position.array,h=y.normal.array,y.position.needsUpdate=!0,y.normal.needsUpdate=!0),t.color&&(o=t.color,u=y.color.array,y.color.needsUpdate=!0),t.primitiveId&&(s=t.primitiveId,l=y.primitiveId.array,y.primitiveId.needsUpdate=!0);var b=0,x=0,_=0,w=0,S=0,A=0,M=0,E=0,P=0,T=0,C=[],I=[],O=[],L=[],R=[],D=[];if(e)for(var k=0;k<v;++k){var B=k/v*2*Math.PI;C[k]=f*Math.cos(B),I[k]=Math.sin(B),O[k]=f*Math.cos(B-.01),L[k]=Math.sin(B-.01),R[k]=f*Math.cos(B+.01),D[k]=Math.sin(B+.01)}for(var N=0;N<m;++N){d=(p=3*N)*v,e&&n&&i&&r&&a&&(Yw.set(n[p],n[p+1],n[p+2]),x=i[p],_=i[p+1],w=i[p+2],S=r[p],A=r[p+1],M=r[p+2],E=e[p],P=e[p+1],T=e[p+2],b=a[N]);for(var F=0;F<v;++F){var z=d+3*F;if(e){var U=-b*C[F],j=b*I[F],G=-b*O[F],V=b*L[F],H=-b*R[F],$=b*D[F];c[z]=E+U*x+j*S,c[z+1]=P+U*_+j*A,c[z+2]=T+U*w+j*M,Zw.set(H*x+$*S-(G*x+V*S),H*_+$*A-(G*_+V*A),H*w+$*M-(G*w+V*M)).cross(Yw),h[z]=Zw.x,h[z+1]=Zw.y,h[z+2]=Zw.z}o&&(u[z]=o[p],u[z+1]=o[p+1],u[z+2]=o[p+2]),s&&(l[N*v+F]=s[N])}}d=3*m*v;for(var W=p=0;W<v;++W){var X=p+3*W,q=d+3*W;e&&n&&(c[q]=c[X],c[q+1]=c[X+1],c[q+2]=c[X+2],h[q]=n[p],h[q+1]=n[p+1],h[q+2]=n[p+2]),o&&(u[q]=u[X],u[q+1]=u[X+1],u[q+2]=u[X+2]),s&&(l[m*v+W]=l[0+W])}p=3*(m-1)*v,d=3*(m+1)*v;for(var Y=0;Y<v;++Y){var Z=p+3*Y,K=d+3*Y;e&&n&&(c[K]=c[Z],c[K+1]=c[Z+1],c[K+2]=c[Z+2],h[K]=n[3*g],h[K+1]=n[3*g+1],h[K+2]=n[3*g+2]),o&&(u[K]=u[Z],u[K+1]=u[Z+1],u[K+2]=u[Z+2]),s&&(l[(m+1)*v+Y]=l[(m-1)*v+Y])}},t.prototype.makeIndex=function(){for(var t,e,i=this.geometry.getIndex().array,r=this.size2,n=r-1,o=this.capTriangles,a=this.parameters.radialSegments,s=this.parameters.radialSegments+1,c=0;c<n;++c)for(var u=c*a*3*2,h=c*a,l=(c+1)*a,p=0;p<a;++p)i[e=u+3*p*2]=h+p,i[e+1]=h+(p+1)%a,i[e+2]=l+p,i[e+3]=l+p,i[e+4]=h+(p+1)%a,i[e+5]=l+(p+1)%a;for(var d=[0],f=1;f<s/2;++f)d.push(f),a-f!==f&&d.push(a-f);e=n*a*3*2,t=r*a;for(var m=0;m<d.length-2;++m)m%2==0?(i[e+3*m+0]=t+d[m+0],i[e+3*m+1]=t+d[m+1],i[e+3*m+2]=t+d[m+2]):(i[e+3*m+0]=t+d[m+2],i[e+3*m+1]=t+d[m+1],i[e+3*m+2]=t+d[m+0]);e=n*a*3*2+3*o,t=r*a+a;for(var g=0;g<d.length-2;++g)g%2==0?(i[e+3*g+0]=t+d[g+0],i[e+3*g+1]=t+d[g+1],i[e+3*g+2]=t+d[g+2]):(i[e+3*g+0]=t+d[g+2],i[e+3*g+1]=t+d[g+1],i[e+3*g+2]=t+d[g+0])},Object.defineProperties(t.prototype,e),t}(my),Qw=function(r){function t(t,e,i){r.call(this,t,e,i),this.type="cartoon",this.parameters=Object.assign({aspectRatio:{type:"number",precision:1,max:10,min:1,rebuild:!0},subdiv:{type:"integer",max:50,min:1,rebuild:!0},radialSegments:{type:"integer",max:50,min:1,rebuild:!0},tension:{type:"number",precision:1,max:1,min:.1},capped:{type:"boolean",rebuild:!0},smoothSheet:{type:"boolean",rebuild:!0}},this.parameters),this.init(i)}return r&&(t.__proto__=r),((t.prototype=Object.create(r&&r.prototype)).constructor=t).prototype.init=function(t){var e=t||{};e.colorScheme=bl(e.colorScheme,"chainname"),e.colorScale=bl(e.colorScale,"RdYlBu"),e.radiusType=bl(e.radiusType,"sstruc"),e.radiusScale=bl(e.radiusScale,.7),e.useInteriorColor=bl(e.useInteriorColor,!0),this.aspectRatio=bl(e.aspectRatio,5),this.tension=bl(e.tension,NaN),this.capped=bl(e.capped,!0),this.smoothSheet=bl(e.smoothSheet,!1),"low"===e.quality?(this.subdiv=3,this.radialSegments=6):"medium"===e.quality?this.subdiv=6:"high"===e.quality?this.subdiv=12:this.subdiv=bl(e.subdiv,6),r.prototype.init.call(this,e)},t.prototype.getSplineParams=function(t){return Object.assign({subdiv:this.subdiv,tension:this.tension,directional:1!==this.aspectRatio,smoothSheet:this.smoothSheet},t)},t.prototype.getSpline=function(t){return new qw(t,this.getSplineParams())},t.prototype.getAspectRatio=function(t){return t.isCg()?1:this.aspectRatio},t.prototype.getAtomRadius=function(t){return t.isTrace()?r.prototype.getAtomRadius.call(this,t):0},t.prototype.createData=function(t){var c=this,u=[],h=[];return this.structure.eachPolymer(function(t){if(!(t.residueCount<4)){h.push(t);var e=c.getSpline(t),i=c.getAspectRatio(t),r=e.getSubdividedPosition(),n=e.getSubdividedOrientation(),o=e.getSubdividedColor(c.getColorParams()),a=e.getSubdividedPicking(),s=e.getSubdividedSize(c.getRadiusParams());u.push(new Jw(Object.assign({},r,n,o,a,s),c.getBufferParams({radialSegments:c.radialSegments,aspectRatio:i,capped:c.capped})))}},t.getSelection()),{bufferList:u,polymerList:h}},t.prototype.updateData=function(t,e){de.Debug&&Yp.time(this.type+" repr update"),t=t||{};for(var i=0,r=e.polymerList.length;i<r;++i){var n={},o=e.polymerList[i],a=this.getSpline(o),s=this.getAspectRatio(o);if(Object.assign(e.bufferList[i],{aspectRatio:s}),t.position||t.radius){var c=a.getSubdividedPosition(),u=a.getSubdividedOrientation(),h=a.getSubdividedSize(this.getRadiusParams(s));n.position=c.position,n.normal=u.normal,n.binormal=u.binormal,n.tangent=u.tangent,n.size=h.size}if(t.color){var l=a.getSubdividedColor(this.getColorParams());n.color=l.color}if(t.picking){var p=a.getSubdividedPicking();n.picking=p.picking}e.bufferList[i].setAttributes(n)}de.Debug&&Yp.timeEnd(this.type+" repr update")},t.prototype.setParameters=function(t){var e={};return t&&t.aspectRatio&&(e.radius=!0),t&&t.tension&&(e.position=!0),r.prototype.setParameters.call(this,t,e,!1),this},t}(pw);ed.add("cartoon",Qw);var tS=function(r){function t(t,e,i){r.call(this,t,e,i),this.type="contact",this.parameters=Object.assign({hydrogenBond:{type:"boolean",rebuild:!0},weakHydrogenBond:{type:"boolean",rebuild:!0},waterHydrogenBond:{type:"boolean",rebuild:!0},backboneHydrogenBond:{type:"boolean",rebuild:!0},hydrophobic:{type:"boolean",rebuild:!0},halogenBond:{type:"boolean",rebuild:!0},ionicInteraction:{type:"boolean",rebuild:!0},metalCoordination:{type:"boolean",rebuild:!0},cationPi:{type:"boolean",rebuild:!0},piStacking:{type:"boolean",rebuild:!0},filterSele:{type:"text",rebuild:!0},labelVisible:{type:"boolean",rebuild:!0},labelFixedSize:{type:"boolean",buffer:"fixedSize"},labelSize:{type:"number",precision:3,max:10,min:.001,rebuild:!0},labelUnit:{type:"select",rebuild:!0,options:{"":"",angstrom:"angstrom",nm:"nm"}},maxHydrophobicDist:{type:"number",precision:1,max:10,min:.1,rebuild:!0},maxHbondDist:{type:"number",precision:1,max:10,min:.1,rebuild:!0},maxHbondSulfurDist:{type:"number",precision:1,max:10,min:.1,rebuild:!0},maxHbondAccAngle:{type:"integer",max:180,min:0,rebuild:!0},maxHbondDonAngle:{type:"integer",max:180,min:0,rebuild:!0},maxHbondAccPlaneAngle:{type:"integer",max:90,min:0,rebuild:!0},maxHbondDonPlaneAngle:{type:"integer",max:90,min:0,rebuild:!0},maxPiStackingDist:{type:"number",precision:1,max:10,min:.1,rebuild:!0},maxPiStackingOffset:{type:"number",precision:1,max:10,min:.1,rebuild:!0},maxPiStackingAngle:{type:"integer",max:180,min:0,rebuild:!0},maxCationPiDist:{type:"number",precision:1,max:10,min:.1,rebuild:!0},maxCationPiOffset:{type:"number",precision:1,max:10,min:.1,rebuild:!0},maxIonicDist:{type:"number",precision:1,max:10,min:.1,rebuild:!0},maxHalogenBondDist:{type:"number",precision:1,max:10,min:.1,rebuild:!0},maxHalogenBondAngle:{type:"integer",max:180,min:0,rebuild:!0},maxMetalDist:{type:"number",precision:1,max:10,min:.1,rebuild:!0},refineSaltBridges:{type:"boolean",rebuild:!0},masterModelIndex:{type:"integer",max:1e3,min:-1,rebuild:!0},lineOfSightDistFactor:{type:"number",precision:1,max:10,min:0,rebuild:!0},radialSegments:!0,disableImpostor:!0},this.parameters),this.init(i)}return r&&(t.__proto__=r),((t.prototype=Object.create(r&&r.prototype)).constructor=t).prototype.init=function(t){var e=t||{};e.radiusSize=bl(e.radiusSize,.05),e.useInteriorColor=bl(e.useInteriorColor,!0),this.hydrogenBond=bl(e.hydrogenBond,!0),this.weakHydrogenBond=bl(e.weakHydrogenBond,!1),this.waterHydrogenBond=bl(e.waterHydrogenBond,!1),this.backboneHydrogenBond=bl(e.backboneHydrogenBond,!1),this.hydrophobic=bl(e.hydrophobic,!1),this.halogenBond=bl(e.halogenBond,!0),this.ionicInteraction=bl(e.ionicInteraction,!0),this.metalCoordination=bl(e.metalCoordination,!0),this.cationPi=bl(e.cationPi,!0),this.piStacking=bl(e.piStacking,!0),this.filterSele=bl(e.filterSele,""),this.labelVisible=bl(e.labelVisible,!1),this.labelFixedSize=bl(e.labelFixedSize,!1),this.labelSize=bl(e.labelSize,2),this.labelUnit=bl(e.labelUnit,""),this.maxHydrophobicDist=bl(e.maxHydrophobicDist,4),this.maxHbondDist=bl(e.maxHbondDist,3.5),this.maxHbondSulfurDist=bl(e.maxHbondSulfurDist,4.1),this.maxHbondAccAngle=bl(e.maxHbondAccAngle,45),this.maxHbondDonAngle=bl(e.maxHbondDonAngle,45),this.maxHbondAccPlaneAngle=bl(e.maxHbondAccPlaneAngle,90),this.maxHbondDonPlaneAngle=bl(e.maxHbondDonPlaneAngle,30),this.maxPiStackingDist=bl(e.maxPiStackingDist,5.5),this.maxPiStackingOffset=bl(e.maxPiStackingOffset,2),this.maxPiStackingAngle=bl(e.maxPiStackingAngle,30),this.maxCationPiDist=bl(e.maxCationPiDist,6),this.maxCationPiOffset=bl(e.maxCationPiOffset,2),this.maxIonicDist=bl(e.maxIonicDist,5),this.maxHalogenBondDist=bl(e.maxHalogenBondDist,3.5),this.maxHalogenBondAngle=bl(e.maxHalogenBondAngle,30),this.maxMetalDist=bl(e.maxMetalDist,3),this.refineSaltBridges=bl(e.refineSaltBridges,!0),this.masterModelIndex=bl(e.masterModelIndex,-1),this.lineOfSightDistFactor=bl(e.lineOfSightDistFactor,1),r.prototype.init.call(this,e)},t.prototype.getAtomRadius=function(){return 0},t.prototype.getContactData=function(t){var e={maxHydrophobicDist:this.maxHydrophobicDist,maxHbondDist:this.maxHbondDist,maxHbondSulfurDist:this.maxHbondSulfurDist,maxHbondAccAngle:this.maxHbondAccAngle,maxHbondDonAngle:this.maxHbondDonAngle,maxHbondAccPlaneAngle:this.maxHbondAccPlaneAngle,maxHbondDonPlaneAngle:this.maxHbondDonPlaneAngle,maxPiStackingDist:this.maxPiStackingDist,maxPiStackingOffset:this.maxPiStackingOffset,maxPiStackingAngle:this.maxPiStackingAngle,maxCationPiDist:this.maxCationPiDist,maxCationPiOffset:this.maxCationPiOffset,maxIonicDist:this.maxIonicDist,maxHalogenBondDist:this.maxHalogenBondDist,maxHalogenBondAngle:this.maxHalogenBondAngle,maxMetalDist:this.maxMetalDist,refineSaltBridges:this.refineSaltBridges,masterModelIndex:this.masterModelIndex,lineOfSightDistFactor:this.lineOfSightDistFactor},i={hydrogenBond:this.hydrogenBond,weakHydrogenBond:this.weakHydrogenBond,waterHydrogenBond:this.waterHydrogenBond,backboneHydrogenBond:this.backboneHydrogenBond,hydrophobic:this.hydrophobic,halogenBond:this.halogenBond,ionicInteraction:this.ionicInteraction,metalCoordination:this.metalCoordination,cationPi:this.cationPi,piStacking:this.piStacking,radius:this.radiusSize*this.radiusScale,filterSele:this.filterSele};return nv(ev(t,e),t,i)},t.prototype.createData=function(t){var e=this.getContactData(t),i=[new Gw(Lm(e),this.getBufferParams({sphereDetail:1,dullInterior:!0,disableImpostor:this.disableImpostor}))];if(this.labelVisible){var r={size:this.labelSize,unit:this.labelUnit};i.push(new Aw(function(t,e){for(var i=Ud(t.position1,t.position2),r=[],n=jd(t.position1,t.position2),o=n.length/3,a=0;a<o;a++){var s=3*a,c=Math.sqrt(Math.pow(n[s],2)+Math.pow(n[s+1],2)+Math.pow(n[s+2],2));switch(e.unit){case"angstrom":r[a]=c.toFixed(2)+" "+String.fromCharCode(8491);break;case"nm":r[a]=(c/10).toFixed(2)+" nm";break;default:r[a]=c.toFixed(2)}}return{position:i,size:Gd(i.length/3,e.size),color:t.color,text:r}}(e,r),{fixedSize:this.labelFixedSize}))}return{bufferList:i}},t}(pw);ed.add("contact",tS);var eS=function(a){function t(t,e,i){a.call(this,t,e,i),this.type="dihedral",this.parameters=Object.assign({atomQuad:{type:"hidden",rebuild:!0},extendLine:{type:"boolean",rebuild:!0,default:!0},lineVisible:{type:"boolean",default:!0},planeVisible:{type:"boolean",default:!0},sectorVisible:{type:"boolean",default:!0}},this.parameters),this.init(i)}return a&&(t.__proto__=a),((t.prototype=Object.create(a&&a.prototype)).constructor=t).prototype.init=function(t){var e=t||{};e.side=bl(e.side,"double"),e.opacity=bl(e.opacity,.5),this.atomQuad=bl(e.atomQuad,[]),this.extendLine=bl(e.extendLine,!0),this.lineVisible=bl(e.lineVisible,!0),this.planeVisible=bl(e.planeVisible,!0),this.sectorVisible=bl(e.sectorVisible,!0),a.prototype.init.call(this,e)},t.prototype.createData=function(t){if(t.atomCount&&this.atomQuad.length){var e=function(m,g){void 0===g&&(g={});for(var v=bl(g.angleStep,Math.PI/90),t=m.length,e=m.length/12,y=new Float32Array(e),b=new Float32Array(3*e),x=new Array(e),_=new Array(e),w=new Array(e),S=new Array(e),A=new Array(e),M=0,E=0,P=0,T=gm(),C=gm(),I=gm(),O=gm(),L=gm(),R=gm(),D=gm(),k=gm(),B=gm(),N=gm(),F=gm(),z=gm(),U=gm(),j=gm(),G=gm(),V=0,i=function(t){if(_m(T,m,t),_m(C,m,t+3),_m(I,m,t+6),_m(O,m,t+9),bm(L,T,C),bm(R,I,C),0!==Sm(R)){bm(D,O,I),Mm(k,R,.5),xm(B,C,k),Em(L,L),Em(R,R),Em(D,D),bm(k,T,B);var e=0<ym(k,R);bm(k,O,B);var i=ym(k,R)<0;if(Mm(k,R,ym(R,L)),bm(N,L,k),Mm(k,R,ym(R,D)),bm(F,D,k),0!==Sm(N)&&0!==Sm(F)){Em(N,N),Em(F,F);var r=y[V]=Math.acos(ym(N,F));x[V]=(Fd*r).toFixed(1)+String.fromCharCode(176),vm(j,N,R),Em(j,j),ym(j,F)<0&&Om(j,j),mw(k,B,N,j,r/2),wm(k,b,3*V);var n=Math.ceil(r/v),o=n+(g.extendLine?4:2),a=g.extendLine?36:0,s=new Float32Array(3*o),c=new Float32Array(3*o),u=new Float32Array(9*n),h=new Float32Array(a);_[V]=s,w[V]=c,S[V]=u,A[V]=h,g.extendLine&&(e?(bm(k,T,I),Em(k,k),Mm(z,k,1/ym(N,k)),xm(z,z,I)):(Mm(z,L,1/ym(N,L)),xm(z,z,C)),i?(bm(k,O,C),Em(k,k),Mm(U,k,1/ym(F,k)),xm(U,U,C)):(Mm(U,D,1/ym(F,D)),xm(U,U,I))),xm(G,B,N);var l=0;g.extendLine?(wm(T,s,l),wm(z,c,l),wm(z,s,l+=3),wm(G,c,l),l+=3,wm(z,h,0),wm(G,h,3),wm(e?I:C,h,6),wm(e?I:C,h,9),wm(G,h,12),wm(B,h,15)):(wm(B,s,l),wm(G,c,l),l+=3);for(var p=function(t,e){var i=9*e;wm(B,u,i),wm(G,u,i+3),wm(G,s,l),mw(G,B,N,j,t),wm(G,u,i+6),wm(G,c,l),l+=3},d=0,f=v;f<r;f+=v)p(f,d++);p(r,d++),g.extendLine?(wm(G,s,3*(o-2)),wm(U,c,3*(o-2)),wm(U,s,3*(o-1)),wm(O,c,3*(o-1)),wm(U,h,18),wm(G,h,21),wm(i?C:I,h,24),wm(i?C:I,h,27),wm(G,h,30),wm(B,h,33)):(wm(G,s,l),wm(B,c,l),l+=3),M+=3*o,E+=9*n,P+=a,V+=1}}},r=0;r<t;r+=12)i(r);for(var n=V,o=new Float32Array(M),a=new Float32Array(M),s=new Float32Array(E),c=new Float32Array(P),u=0,h=0,l=0,p=0;p<n;p++){var d=_[p],f=w[p],H=S[p],$=A[p];Xd(d,o,0,u,d.length),Xd(f,a,0,u,f.length),Xd(H,s,0,h,H.length),Xd($,c,0,l,$.length),u+=d.length,h+=H.length,l+=$.length}return{labelPosition:b.subarray(0,3*n),labelText:x.slice(0,n),linePosition1:o,linePosition2:a,planePosition:c,sectorPosition:s}}(fw(t,this.atomQuad),{extendLine:this.extendLine}),i=this.n=e.labelText.length,r=new ki(this.labelColor);this.textBuffer=new Aw({position:e.labelPosition,size:Gd(i,this.labelSize),color:Vd(i,r.r,r.g,r.b),text:e.labelText},this.getLabelBufferParams());var n=new ki(this.colorValue);this.lineLength=e.linePosition1.length/3;var o=Vd(this.lineLength,n.r,n.g,n.b);return this.lineBuffer=new Pw(Dm({position1:e.linePosition1,position2:e.linePosition2,color:o,color2:o}),this.getBufferParams({linewidth:this.linewidth,visible:this.lineVisible,opacity:this.lineOpacity})),this.planeLength=e.planePosition.length/3,this.planeBuffer=new my({position:e.planePosition,color:Vd(this.planeLength,n.r,n.g,n.b)},this.getBufferParams({visible:this.planeVisible})),this.sectorLength=e.sectorPosition.length/3,this.sectorBuffer=new my({position:e.sectorPosition,color:Vd(this.sectorLength,n.r,n.g,n.b)},this.getBufferParams({visible:this.sectorVisible})),{bufferList:[this.textBuffer,this.lineBuffer,this.planeBuffer,this.sectorBuffer]}}},t.prototype.updateData=function(t,e){a.prototype.updateData.call(this,t,e);var i={},r={},n={};if(t.color){var o=new ki(this.colorValue);Object.assign(i,{color:Vd(this.lineLength,o.r,o.g,o.b),color2:Vd(this.lineLength,o.r,o.g,o.b)}),Object.assign(r,{color:Vd(this.planeLength,o.r,o.g,o.b)}),Object.assign(n,{color:Vd(this.sectorLength,o.r,o.g,o.b)})}this.lineBuffer.setAttributes(i),this.planeBuffer.setAttributes(r),this.sectorBuffer.setAttributes(n)},t.prototype.setParameters=function(t){return a.prototype.setParameters.call(this,t,{},!1),!t||void 0===t.lineVisible&&void 0===t.sectorVisible&&void 0===t.planeVisible||this.setVisibility(this.visible),t&&t.lineOpacity&&this.lineBuffer.setParameters({opacity:t.lineOpacity}),t&&void 0!==t.opacity&&this.lineBuffer.setParameters({opacity:this.lineOpacity}),t&&t.linewidth&&this.lineBuffer.setParameters({linewidth:t.linewidth}),this},t.prototype.setVisibility=function(t,e){return a.prototype.setVisibility.call(this,t,!0),this.lineBuffer&&this.lineBuffer.setVisibility(this.lineVisible&&this.visible),this.planeBuffer&&this.planeBuffer.setVisibility(this.planeVisible&&this.visible),this.sectorBuffer&&this.sectorBuffer.setVisibility(this.sectorVisible&&this.visible),e||this.viewer.requestRender(),this},t}(dw);ed.add("dihedral",eS);var iS=function(o){function t(t,e,i){o.call(this,t,e,i),this.type="distance",this.parameters=Object.assign({radialSegments:!0,openEnded:!0,disableImpostor:!0,labelUnit:{type:"select",rebuild:!0,options:{"":"",angstrom:"angstrom",nm:"nm"}},useCylinder:{type:"boolean",rebuild:!0},atomPair:{type:"hidden",rebuild:!0}},this.parameters),this.init(i)}return o&&(t.__proto__=o),((t.prototype=Object.create(o&&o.prototype)).constructor=t).prototype.init=function(t){var e=t||{};e.linewidth=bl(e.linewidth,5),e.radiusType=bl(e.radiusType,"size"),e.radiusSize=bl(e.radiusSize,.2),this.labelUnit=bl(e.labelUnit,""),this.useCylinder=bl(e.useCylinder,!1),this.atomPair=bl(e.atomPair,[]),o.prototype.init.call(this,e)},t.prototype.getDistanceData=function(c,t){var u=this,e=t.length,h=new Array(e),l=new Float32Array(3*e),p=new Lp,d=new Lp,f=new Yy,m=c.getAtomProxy(),g=c.getAtomProxy(),v=0,y=c.getAtomSet();t.forEach(function(t,e){var i=t[0],r=t[1];if("number"==typeof i&&Number.isInteger(i)&&"number"==typeof r&&Number.isInteger(r)){if(!y.get(i)||!y.get(r))return void(v+=1);m.index=i,g.index=r}else{p.setString(i),d.setString(r);var n=c.getAtomIndices(p),o=c.getAtomIndices(d);if(!n.length||!o.length)return void(v+=1);m.index=n[0],g.index=o[0]}f.addBond(m,g,1),e-=v;var a=m.distanceTo(g);switch(u.labelUnit){case"angstrom":h[e]=a.toFixed(2)+" "+String.fromCharCode(8491);break;case"nm":h[e]=(a/10).toFixed(2)+" nm";break;default:h[e]=a.toFixed(2)}var s=3*e;l[s+0]=(m.x+g.x)/2,l[s+1]=(m.y+g.y)/2,l[s+2]=(m.z+g.z)/2}),0<v&&(e-=v,l=l.subarray(0,3*e));var i=new tg(f.count,!0);return{text:h,position:l,bondSet:i,bondStore:f}},t.prototype.getBondData=function(t,e,i){var r=t.getBondData(this.getBondParams(e,i));return r.picking&&(r.picking=new gv(r.picking.array,r.picking.structure,i.bondStore)),r},t.prototype.createData=function(t){if(t.atomCount&&this.atomPair.length){var e=this.atomPair.length,i=new ki(this.labelColor),r=this.getDistanceData(t,this.atomPair);this.textBuffer=new Aw({position:r.position,size:Gd(e,this.labelSize),color:Vd(e,i.r,i.g,i.b),text:r.text},this.getLabelBufferParams());var n={bondSet:r.bondSet,bondStore:r.bondStore},o=this.getBondData(t,{position:!0,color:!0,picking:!0,radius:this.useCylinder},n);return this.useCylinder?this.distanceBuffer=new Gw(o,this.getBufferParams({openEnded:this.openEnded,radialSegments:this.radialSegments,disableImpostor:this.disableImpostor,dullInterior:!0})):this.distanceBuffer=new Pw(Rm(o),this.getBufferParams({linewidth:this.linewidth,visible:this.lineVisible,opacity:this.lineOpacity})),{bondSet:r.bondSet,bondStore:r.bondStore,position:r.position,bufferList:[this.textBuffer,this.distanceBuffer]}}},t.prototype.updateData=function(t,e){o.prototype.updateData.call(this,t,e);var i={bondSet:e.bondSet,bondStore:e.bondStore},r=this.getBondData(e.sview,t,i),n={};t&&!t.color||Object.assign(n,{color:r.color,color2:r.color2}),t&&!t.radius||Object.assign(n,{radius:r.radius}),this.distanceBuffer.setAttributes(n)},t.prototype.setParameters=function(t){return o.prototype.setParameters.call(this,t,{},!1),this.useCylinder||(t&&t.lineOpacity&&this.distanceBuffer.setParameters({opacity:t.lineOpacity}),t&&void 0!==t.opacity&&this.distanceBuffer.setParameters({opacity:this.lineOpacity}),t&&t.linewidth&&this.distanceBuffer.setParameters({linewidth:t.linewidth})),this},t}(dw);function rS(t){return 2*(t.position.length/3)*3}ed.add("distance",iS);var nS=Object.assign({scale:1,color:"grey"},ly),oS=function(n){function t(t,e){void 0===e&&(e={}),n.call(this,{position:new Float32Array(rS(t)),color:new Float32Array(rS(t))},e),this.isLine=!0,this.vertexShader="Line.vert",this.fragmentShader="Line.frag";var i=new ki(this.parameters.color),r=this.geometry.attributes;Vd(rS(t)/3,i.r,i.g,i.b,r.color.array),this.setAttributes(t)}n&&(t.__proto__=n),(t.prototype=Object.create(n&&n.prototype)).constructor=t;var e={defaultParameters:{configurable:!0}};return e.defaultParameters.get=function(){return nS},t.prototype.setAttributes=function(t){void 0===t&&(t={});var e,i,r,n=this.geometry.attributes;t.position&&t.vector&&(e=t.position,i=t.vector,r=n.position.array,n.position.needsUpdate=!0);var o=this.size/2,a=this.parameters.scale;if(e&&i)for(var s=0;s<o;s++){var c=2*s*3,u=3*s;r[c+0]=e[u+0],r[c+1]=e[u+1],r[c+2]=e[u+2],r[c+3]=e[u+0]+i[u+0]*a,r[c+4]=e[u+1]+i[u+1]*a,r[c+5]=e[u+2]+i[u+2]*a}},Object.defineProperties(t.prototype,e),t}(dy),aS=function(r){function t(t,e,i){r.call(this,t,e,i),this.type="helixorient",this.parameters=Object.assign({sphereDetail:!0,disableImpostor:!0},this.parameters),this.init(i)}return r&&(t.__proto__=r),((t.prototype=Object.create(r&&r.prototype)).constructor=t).prototype.init=function(t){var e=t||{};e.colorScheme=bl(e.colorScheme,"sstruc"),e.radiusType=bl(e.radiusType,"size"),e.radiusSize=bl(e.radiusSize,.15),e.radiusScale=bl(e.radiusScale,1),e.useInteriorColor=bl(e.useInteriorColor,!0),r.prototype.init.call(this,e)},t.prototype.createData=function(t){var a=this,s=[],c=[];return this.structure.eachPolymer(function(t){if(!(t.residueCount<4)){c.push(t);var e=new tb(t),i=e.getPosition(),r=e.getColor(a.getColorParams()),n=e.getSize(a.getRadiusParams()),o=e.getPicking();s.push(new Px({position:i.center,color:r.color,radius:n.size,picking:o.picking},a.getBufferParams({sphereDetail:a.sphereDetail,disableImpostor:a.disableImpostor,dullInterior:!0})),new oS({position:i.center,vector:i.axis},a.getBufferParams({color:"skyblue",scale:1})),new oS({position:i.center,vector:i.resdir},a.getBufferParams({color:"lightgreen",scale:1})))}},t.getSelection()),{bufferList:s,polymerList:c}},t.prototype.updateData=function(t,e){de.Debug&&Yp.time(this.type+" repr update"),t=t||{};for(var i=0,r=e.polymerList.length;i<r;++i){var n=3*i,o={},a=e.polymerList[i],s=new tb(a);if(t.position){var c=s.getPosition();Object.assign(o,{position:c.center}),e.bufferList[n+1].setAttributes({position:c.center,vector:c.axis}),e.bufferList[n+2].setAttributes({position:c.center,vector:c.resdir})}e.bufferList[n].setAttributes(o)}de.Debug&&Yp.timeEnd(this.type+" repr update")},t}(pw);ed.add("helixorient",aS);var sS=function(r){function t(t,e,i){r.call(this,t,e,i),this.type="licorice",this.parameters=Object.assign({},this.parameters,{aspectRatio:null})}return r&&(t.__proto__=r),((t.prototype=Object.create(r&&r.prototype)).constructor=t).prototype.init=function(t){var e=t||{};e.aspectRatio=1,r.prototype.init.call(this,e)},t}(Hw);ed.add("licorice",sS),rd.add("shader/HyperballStickImpostor.vert","\nattribute vec3 mapping;\nattribute float radius;\nattribute float radius2;\nattribute vec3 position1;\nattribute vec3 position2;\nvarying mat4 matrix_near;\nvarying vec4 prime1;\nvarying vec4 prime2;\nvarying float vRadius;\nvarying float vRadius2;\n#ifdef PICKING\n#include unpack_color\nattribute float primitiveId;\nvarying vec3 vPickingColor;\n#else\nattribute vec3 color2;\nvarying vec3 vColor1;\nvarying vec3 vColor2;\n#endif\nuniform float shrink;\nuniform mat4 modelViewProjectionMatrix;\nuniform mat4 modelViewProjectionMatrixInverse;\nvoid main(){\nvRadius = radius;\nvRadius2 = radius2;\nvec4 spaceposition;\nvec3 position_atom1;\nvec3 position_atom2;\nvec4 vertex_position;\n#ifdef PICKING\nvPickingColor = unpackColor( primitiveId );\n#else\nvColor1 = color;\nvColor2 = color2;\n#endif\nfloat radius1 = radius;\nposition_atom1 = position1;\nposition_atom2 = position2;\nfloat distance = distance( position_atom1, position_atom2 );\nspaceposition.z = mapping.z * distance;\nif (radius1 > radius2) {\nspaceposition.y = mapping.y * 1.5 * radius1;\nspaceposition.x = mapping.x * 1.5 * radius1;\n} else {\nspaceposition.y = mapping.y * 1.5 * radius2;\nspaceposition.x = mapping.x * 1.5 * radius2;\n}\nspaceposition.w = 1.0;\nvec4 e3 = vec4( 1.0 );\nvec3 e1, e1_temp, e2, e2_temp;\ne3.xyz = normalize(position_atom1-position_atom2);\nif (e3.z == 0.0) { e3.z = 0.0000000000001;}\nif ( (position_atom1.x - position_atom2.x) == 0.0) { position_atom1.x += 0.001;}\nif ( (position_atom1.y - position_atom2.y) == 0.0) { position_atom1.y += 0.001;}\nif ( (position_atom1.z - position_atom2.z) == 0.0) { position_atom1.z += 0.001;}\nvec4 focus = vec4( 1.0 );\nfocus.x = ( position_atom1.x*position_atom1.x - position_atom2.x*position_atom2.x +\n( radius2*radius2 - radius1*radius1 )*e3.x*e3.x/shrink )/(2.0*(position_atom1.x - position_atom2.x));\nfocus.y = ( position_atom1.y*position_atom1.y - position_atom2.y*position_atom2.y +\n( radius2*radius2 - radius1*radius1 )*e3.y*e3.y/shrink )/(2.0*(position_atom1.y - position_atom2.y));\nfocus.z = ( position_atom1.z*position_atom1.z - position_atom2.z*position_atom2.z +\n( radius2*radius2 - radius1*radius1 )*e3.z*e3.z/shrink )/(2.0*(position_atom1.z - position_atom2.z));\ne1.x = 1.0;\ne1.y = 1.0;\ne1.z = ( (e3.x*focus.x + e3.y*focus.y + e3.z*focus.z) - e1.x*e3.x - e1.y*e3.y)/e3.z;\ne1_temp = e1 - focus.xyz;\ne1 = normalize(e1_temp);\ne2_temp = e1.yzx * e3.zxy - e1.zxy * e3.yzx;\ne2 = normalize(e2_temp);\nmat3 R= mat3( e1.xyz, e2.xyz, e3.xyz );\nvertex_position.xyz = R * spaceposition.xyz;\nvertex_position.w = 1.0;\nvertex_position.x += (position_atom1.x+position_atom2.x) / 2.0;\nvertex_position.y += (position_atom1.y+position_atom2.y) / 2.0;\nvertex_position.z += (position_atom1.z+position_atom2.z) / 2.0;\ngl_Position = modelViewProjectionMatrix * vertex_position;\nvec4 i_near, i_far;\nvec4 near = gl_Position;\nnear.z = 0.0 ;\nnear = modelViewProjectionMatrixInverse * near;\ni_near = near;\nvec4 far = gl_Position;\nfar.z = far.w ;\ni_far = modelViewProjectionMatrixInverse * far;\nprime1 = vec4( position_atom1 - (position_atom1 - focus.xyz)*shrink, 1.0 );\nprime2 = vec4( position_atom2 - (position_atom2 - focus.xyz)*shrink, 1.0 );\nfloat Rsquare = (radius1*radius1/shrink) - (\n(position_atom1.x - focus.x)*(position_atom1.x - focus.x) +\n(position_atom1.y - focus.y)*(position_atom1.y - focus.y) +\n(position_atom1.z - focus.z)*(position_atom1.z - focus.z)\n);\nfocus.w = Rsquare;\nmatrix_near = mat4( i_near, i_far, focus, e3 );\ngl_Position.z = 1.0;\n}"),rd.add("shader/HyperballStickImpostor.frag","#define STANDARD\n#define IMPOSTOR\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 interiorColor;\nuniform float interiorDarkening;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\nuniform float clipNear;\nuniform float shrink;\nuniform mat4 modelViewMatrix;\nuniform mat4 modelViewProjectionMatrix;\nuniform mat4 modelViewMatrixInverseTranspose;\nuniform mat4 projectionMatrix;\nvarying mat4 matrix_near;\nvarying vec4 prime1;\nvarying vec4 prime2;\nvarying float vRadius;\nvarying float vRadius2;\n#ifdef PICKING\nuniform float objectId;\nvarying vec3 vPickingColor;\n#else\nvarying vec3 vColor1;\nvarying vec3 vColor2;\n#include common\n#include fog_pars_fragment\n#include bsdfs\n#include lights_pars_begin\n#include lights_physical_pars_fragment\n#endif\nbool interior = false;\nfloat calcClip( vec4 cameraPos ){\nreturn dot( cameraPos, vec4( 0.0, 0.0, 1.0, clipNear - 0.5 ) );\n}\nfloat calcClip( vec3 cameraPos ){\nreturn calcClip( vec4( cameraPos, 1.0 ) );\n}\nfloat calcDepth( in vec3 cameraPos ){\nvec2 clipZW = cameraPos.z * projectionMatrix[2].zw + projectionMatrix[3].zw;\nreturn 0.5 + 0.5 * clipZW.x / clipZW.y;\n}\nstruct Ray {\nvec3 origin ;\nvec3 direction ;\n};\nbool cutoff_plane (vec3 M, vec3 cutoff, vec3 x3){\nfloat a = x3.x;\nfloat b = x3.y;\nfloat c = x3.z;\nfloat d = -x3.x*cutoff.x-x3.y*cutoff.y-x3.z*cutoff.z;\nfloat l = a*M.x+b*M.y+c*M.z+d;\nif (l<0.0) {return true;}\nelse{return false;}\n}\nvec3 isect_surf(Ray r, mat4 matrix_coef){\nvec4 direction = vec4(r.direction, 0.0);\nvec4 origin = vec4(r.origin, 1.0);\nfloat a = dot(direction,(matrix_coef*direction));\nfloat b = dot(origin,(matrix_coef*direction));\nfloat c = dot(origin,(matrix_coef*origin));\nfloat delta =b*b-a*c;\ngl_FragColor.a = 1.0;\nif (delta<0.0){\ndiscard;\n}\nfloat t1 =(-b-sqrt(delta))/a;\nreturn r.origin+t1*r.direction;\n}\nvec3 isect_surf2(Ray r, mat4 matrix_coef){\nvec4 direction = vec4(r.direction, 0.0);\nvec4 origin = vec4(r.origin, 1.0);\nfloat a = dot(direction,(matrix_coef*direction));\nfloat b = dot(origin,(matrix_coef*direction));\nfloat c = dot(origin,(matrix_coef*origin));\nfloat delta =b*b-a*c;\ngl_FragColor.a = 1.0;\nif (delta<0.0){\ndiscard;\n}\nfloat t2 =(-b+sqrt(delta))/a;\nreturn r.origin+t2*r.direction;\n}\nRay primary_ray(vec4 near1, vec4 far1){\nvec3 near=near1.xyz/near1.w;\nvec3 far=far1.xyz/far1.w;\nreturn Ray(near,far-near);\n}\nfloat update_z_buffer(vec3 M, mat4 ModelViewP){\nfloat depth1;\nvec4 Ms=(ModelViewP*vec4(M,1.0));\nreturn depth1=(1.0+Ms.z/Ms.w)/2.0;\n}\nvoid main(){\nfloat radius = max( vRadius, vRadius2 );\nvec4 i_near, i_far, focus;\nvec3 e3, e1, e1_temp, e2;\ni_near = vec4(matrix_near[0][0],matrix_near[0][1],matrix_near[0][2],matrix_near[0][3]);\ni_far = vec4(matrix_near[1][0],matrix_near[1][1],matrix_near[1][2],matrix_near[1][3]);\nfocus = vec4(matrix_near[2][0],matrix_near[2][1],matrix_near[2][2],matrix_near[2][3]);\ne3 = vec3(matrix_near[3][0],matrix_near[3][1],matrix_near[3][2]);\ne1.x = 1.0;\ne1.y = 1.0;\ne1.z = ( (e3.x*focus.x + e3.y*focus.y + e3.z*focus.z) - e1.x*e3.x - e1.y*e3.y)/e3.z;\ne1_temp = e1 - focus.xyz;\ne1 = normalize(e1_temp);\ne2 = normalize(cross(e1,e3));\nvec4 equation = focus;\nfloat shrinkfactor = shrink;\nfloat t1 = -1.0/(1.0-shrinkfactor);\nfloat t2 = 1.0/(shrinkfactor);\nvec4 colonne1, colonne2, colonne3, colonne4;\nmat4 mat;\nvec3 equation1 = vec3(t2,t2,t1);\nfloat A1 = - e1.x*equation.x - e1.y*equation.y - e1.z*equation.z;\nfloat A2 = - e2.x*equation.x - e2.y*equation.y - e2.z*equation.z;\nfloat A3 = - e3.x*equation.x - e3.y*equation.y - e3.z*equation.z;\nfloat A11 = equation1.x*e1.x*e1.x + equation1.y*e2.x*e2.x + equation1.z*e3.x*e3.x;\nfloat A21 = equation1.x*e1.x*e1.y + equation1.y*e2.x*e2.y + equation1.z*e3.x*e3.y;\nfloat A31 = equation1.x*e1.x*e1.z + equation1.y*e2.x*e2.z + equation1.z*e3.x*e3.z;\nfloat A41 = equation1.x*e1.x*A1 + equation1.y*e2.x*A2 + equation1.z*e3.x*A3;\nfloat A22 = equation1.x*e1.y*e1.y + equation1.y*e2.y*e2.y + equation1.z*e3.y*e3.y;\nfloat A32 = equation1.x*e1.y*e1.z + equation1.y*e2.y*e2.z + equation1.z*e3.y*e3.z;\nfloat A42 = equation1.x*e1.y*A1 + equation1.y*e2.y*A2 + equation1.z*e3.y*A3;\nfloat A33 = equation1.x*e1.z*e1.z + equation1.y*e2.z*e2.z + equation1.z*e3.z*e3.z;\nfloat A43 = equation1.x*e1.z*A1 + equation1.y*e2.z*A2 + equation1.z*e3.z*A3;\nfloat A44 = equation1.x*A1*A1 + equation1.y*A2*A2 + equation1.z*A3*A3 - equation.w;\ncolonne1 = vec4(A11,A21,A31,A41);\ncolonne2 = vec4(A21,A22,A32,A42);\ncolonne3 = vec4(A31,A32,A33,A43);\ncolonne4 = vec4(A41,A42,A43,A44);\nmat = mat4(colonne1,colonne2,colonne3,colonne4);\nRay ray = primary_ray(i_near,i_far) ;\nvec3 M;\nM = isect_surf(ray, mat);\nif (cutoff_plane(M, prime1.xyz, -e3) || cutoff_plane(M, prime2.xyz, e3)){ discard; }\nvec4 M1 = vec4(M,1.0);\nvec4 M2 = mat*M1;\nvec3 _normal = ( modelViewMatrixInverseTranspose * M2 ).xyz;\ngl_FragDepthEXT = update_z_buffer(M, modelViewProjectionMatrix) ;\n#ifdef NEAR_CLIP\nif( calcClip( modelViewMatrix * vec4( M, 1.0 ) ) > 0.0 ){\nM = isect_surf2(ray, mat);\nif( calcClip( modelViewMatrix * vec4( M, 1.0 ) ) > 0.0 )\ndiscard;\ninterior = true;\ngl_FragDepthEXT = update_z_buffer(M, modelViewProjectionMatrix) ;\nif( gl_FragDepthEXT >= 0.0 ){\ngl_FragDepthEXT = max( 0.0, calcDepth( vec3( - ( clipNear - 0.5 ) ) ) + ( 0.0000001 / radius ) );\n}\n}else if( gl_FragDepthEXT <= 0.0 ){\nM = isect_surf2(ray, mat);\ninterior = true;\ngl_FragDepthEXT = update_z_buffer(M, modelViewProjectionMatrix);\nif( gl_FragDepthEXT >= 0.0 ){\ngl_FragDepthEXT = 0.0 + ( 0.0000001 / radius );\n}\n}\n#else\nif( gl_FragDepthEXT <= 0.0 ){\nM = isect_surf2(ray, mat);\ninterior = true;\ngl_FragDepthEXT = update_z_buffer(M, modelViewProjectionMatrix) ;\nif( gl_FragDepthEXT >= 0.0 ){\ngl_FragDepthEXT = 0.0 + ( 0.0000001 / radius );\n}\n}\n#endif\nif (cutoff_plane(M, prime1.xyz, -e3) || cutoff_plane(M, prime2.xyz, e3)){ discard; }\nif (gl_FragDepthEXT < 0.0)\ndiscard;\nif (gl_FragDepthEXT > 1.0)\ndiscard;\nfloat distance_ratio = ((M.x-prime2.x)*e3.x + (M.y-prime2.y)*e3.y +(M.z-prime2.z)*e3.z) /\ndistance(prime2.xyz,prime1.xyz);\n#ifdef PICKING\nif( opacity < 0.3 )\ndiscard;\ngl_FragColor = vec4( vPickingColor, objectId );\n#else\nvec3 vViewPosition = -( modelViewMatrix * vec4( M, 1.0 ) ).xyz;\nvec3 vNormal = _normal;\nvec3 vColor;\nif( distance_ratio>0.5 ){\nvColor = vColor1;\n}else{\nvColor = vColor2;\n}\nvec4 diffuseColor = vec4( diffuse, opacity );\nReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\nvec3 totalEmissiveLight = emissive;\n#include color_fragment\n#include roughnessmap_fragment\n#include metalnessmap_fragment\nvec3 normal = normalize( vNormal );\n#include lights_physical_fragment\n#include lights_fragment_begin\n#include lights_fragment_end\nvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveLight;\nif( interior ){\n#ifdef USE_INTERIOR_COLOR\noutgoingLight.xyz = interiorColor;\n#else\n#ifdef DIFFUSE_INTERIOR\noutgoingLight.xyz = vColor;\n#endif\n#endif\noutgoingLight.xyz *= 1.0 - interiorDarkening;\n}\ngl_FragColor = vec4( outgoingLight, diffuseColor.a );\n#include premultiplied_alpha_fragment\n#include tonemapping_fragment\n#include encodings_fragment\n#include fog_fragment\n#endif\n}");var cS=new Float32Array([-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,1,1,1,-1,1,1]),uS=new Uint16Array([0,1,2,0,2,3,1,5,6,1,6,2,4,6,5,4,7,6,0,7,4,0,3,7,0,5,1,0,4,5,3,2,6,3,6,7]),hS=function(i){function t(t,e){void 0===e&&(e={}),i.call(this,"v3",t,e)}i&&(t.__proto__=i),(t.prototype=Object.create(i&&i.prototype)).constructor=t;var e={mapping:{configurable:!0},mappingIndices:{configurable:!0},mappingIndicesSize:{configurable:!0},mappingSize:{configurable:!0},mappingItemSize:{configurable:!0}};return e.mapping.get=function(){return cS},e.mappingIndices.get=function(){return uS},e.mappingIndicesSize.get=function(){return 36},e.mappingSize.get=function(){return 8},e.mappingItemSize.get=function(){return 3},Object.defineProperties(t.prototype,e),t}(wx),lS=Object.assign({shrink:.14},ly),pS=Object.assign({shrink:{uniform:!0}},py),dS=function(i){function t(t,e){void 0===e&&(e={}),i.call(this,t,e),this.parameterTypes=pS,this.isImpostor=!0,this.vertexShader="HyperballStickImpostor.vert",this.fragmentShader="HyperballStickImpostor.frag",this.addUniforms({modelViewProjectionMatrix:{value:new ei},modelViewProjectionMatrixInverse:{value:new ei},modelViewMatrixInverseTranspose:{value:new ei},shrink:{value:this.parameters.shrink}}),this.addAttributes({position1:{type:"v3",value:null},position2:{type:"v3",value:null},color2:{type:"c",value:null},radius:{type:"f",value:null},radius2:{type:"f",value:null}}),this.setAttributes(t),this.makeMapping()}i&&(t.__proto__=i),(t.prototype=Object.create(i&&i.prototype)).constructor=t;var e={defaultParameters:{configurable:!0}};return e.defaultParameters.get=function(){return lS},Object.defineProperties(t.prototype,e),t}(hS),fS=(Object.assign({disableImpostor:!1},Rw,lS),function(t,e){return void 0===e&&(e={}),!Xp||e&&e.disableImpostor?(t.radius=function(t,e){for(var i=t.length,r=new Float32Array(i),n=0;n<i;n++)r[n]=Math.min(t[n],e[n]);return r}(t.radius,t.radius2),new kw(t,e)):new dS(t,e)}),mS=function(r){function t(t,e,i){r.call(this,t,e,i),this.type="hyperball",this.parameters=Object.assign({shrink:{type:"number",precision:3,max:1,min:.001,buffer:!0}},this.parameters,{multipleBond:null,bondSpacing:null})}return r&&(t.__proto__=r),((t.prototype=Object.create(r&&r.prototype)).constructor=t).prototype.init=function(t){var e=t||{};e.radiusScale=bl(e.radiusScale,.2),e.radiusType=bl(e.radiusType,"vdw"),e.useInteriorColor=bl(e.useInteriorColor,!0),this.shrink=bl(e.shrink,.12),r.prototype.init.call(this,e)},t.prototype.getBondParams=function(t,e){return t&&!t.radius||(e=Object.assign({radius2:!0},e)),r.prototype.getBondParams.call(this,t,e)},t.prototype.createData=function(t){var e=new Px(t.getAtomData(this.getAtomParams()),this.getBufferParams({sphereDetail:this.sphereDetail,disableImpostor:this.disableImpostor,dullInterior:!0}));return this.__center=new Float32Array(3*t.bondCount),{bufferList:[e,new fS(t.getBondData(this.getBondParams()),this.getBufferParams({shrink:this.shrink,radialSegments:this.radialSegments,disableImpostor:this.disableImpostor,dullInterior:!0}))]}},t.prototype.updateData=function(t,e){var i=e.sview.getAtomData(this.getAtomParams()),r=e.sview.getBondData(this.getBondParams()),n={},o={};if(!t||t.position){Object.assign(n,{position:i.position});var a=r.position1,s=r.position2;Object.assign(o,{position:Ud(a,s,this.__center),position1:a,position2:s})}t&&!t.color||(Object.assign(n,{color:i.color}),Object.assign(o,{color:r.color,color2:r.color2})),t&&!t.radius||(Object.assign(n,{radius:i.radius}),Object.assign(o,{radius:r.radius,radius2:r.radius2})),e.bufferList[0].setAttributes(n),e.bufferList[1].setAttributes(o)},t}(sS);ed.add("hyperball",mS);var gS=function(t,e,i){void 0===e&&(e={}),void 0===i&&(i=""),this.type=t,this.text=e,this.format=i};gS.prototype.atomLabel=function(t){var e;switch(this.type){case"atomname":e=t.atomname;break;case"atomindex":e=""+t.index;break;case"occupancy":e=t.occupancy.toFixed(2);break;case"bfactor":e=t.bfactor.toFixed(2);break;case"serial":e=""+t.serial;break;case"element":e=t.element;break;case"atom":e=t.atomname+"|"+t.index;break;case"resname":e=t.resname;break;case"resno":e=""+t.resno;break;case"res":e=""+(_g[t.resname.toUpperCase()]||t.resname)+t.resno;break;case"residue":var i=_g[t.resname.toUpperCase()];e=i&&!t.inscode?""+i+t.resno:"["+t.resname+"]"+t.resno+t.inscode;break;case"text":e=this.text[t.index];break;case"format":e=yd(this.format,t);break;default:e=t.qualifiedName()}return void 0===e?"":e},gS.types={"":"",atomname:"atom name",atomindex:"atom index",occupancy:"occupancy",bfactor:"b-factor",serial:"serial",element:"element",atom:"atom name + index",resname:"residue name",resno:"residue no",res:"one letter code + no",residue:"[residue name] + no + inscode",text:"text",format:"format",qualified:"qualified name"};var vS=function(r){function t(t,e,i){r.call(this,t,e,i),this.type="label",this.parameters=Object.assign({labelType:{type:"select",options:gS.types,rebuild:!0},labelText:{type:"hidden",rebuild:!0},labelFormat:{type:"text",rebuild:!0},labelGrouping:{type:"select",options:{atom:"atom",residue:"residue"},rebuild:!0},fontFamily:{type:"select",options:{"sans-serif":"sans-serif",monospace:"monospace",serif:"serif"},buffer:!0},fontStyle:{type:"select",options:{normal:"normal",italic:"italic"},buffer:!0},fontWeight:{type:"select",options:{normal:"normal",bold:"bold"},buffer:!0},xOffset:{type:"number",precision:1,max:20,min:-20,buffer:!0},yOffset:{type:"number",precision:1,max:20,min:-20,buffer:!0},zOffset:{type:"number",precision:1,max:20,min:-20,buffer:!0},attachment:{type:"select",options:{"bottom-left":"bottom-left","bottom-center":"bottom-center","bottom-right":"bottom-right","middle-left":"middle-left","middle-center":"middle-center","middle-right":"middle-right","top-left":"top-left","top-center":"top-center","top-right":"top-right"},rebuild:!0},showBorder:{type:"boolean",buffer:!0},borderColor:{type:"color",buffer:!0},borderWidth:{type:"number",precision:2,max:.3,min:0,buffer:!0},showBackground:{type:"boolean",rebuild:!0},backgroundColor:{type:"color",buffer:!0},backgroundMargin:{type:"number",precision:2,max:2,min:0,rebuild:!0},backgroundOpacity:{type:"range",step:.01,max:1,min:0,buffer:!0},fixedSize:{type:"boolean",buffer:!0}},this.parameters,{side:null,flatShaded:null,wireframe:null,linewidth:null,roughness:null,metalness:null,diffuse:null}),this.init(i)}return r&&(t.__proto__=r),((t.prototype=Object.create(r&&r.prototype)).constructor=t).prototype.init=function(t){var e=t||{};this.labelType=bl(e.labelType,"res"),this.labelText=bl(e.labelText,{}),this.labelFormat=bl(e.labelFormat,""),this.labelGrouping=bl(e.labelGrouping,"atom"),this.fontFamily=bl(e.fontFamily,"sans-serif"),this.fontStyle=bl(e.fontStyle,"normal"),this.fontWeight=bl(e.fontWeight,"bold"),this.xOffset=bl(e.xOffset,0),this.yOffset=bl(e.yOffset,0),this.zOffset=bl(e.zOffset,.5),this.attachment=bl(e.attachment,"bottom-left"),this.showBorder=bl(e.showBorder,!1),this.borderColor=bl(e.borderColor,"lightgrey"),this.borderWidth=bl(e.borderWidth,.15),this.showBackground=bl(e.showBackground,!1),this.backgroundColor=bl(e.backgroundColor,"lightgrey"),this.backgroundMargin=bl(e.backgroundMargin,.5),this.backgroundOpacity=bl(e.backgroundOpacity,1),this.fixedSize=bl(e.fixedSize,!1),r.prototype.init.call(this,e)},t.prototype.getTextData=function(t,i){var e,r,n,o,a,s,c,u=this.getAtomParams(i),h=new gS(this.labelType,this.labelText,this.labelFormat);if("atom"===this.labelGrouping){var l=t.getAtomData(u);e=l.position,r=l.radius,n=l.color,i&&!i.text||(o=[],t.eachAtom(function(t){return o.push(h.atomLabel(t))}))}else if("residue"===this.labelGrouping){i&&!i.position||(a=[]),i&&!i.color||(c=[]),i&&!i.radius||(s=[]),i&&!i.text||(o=[]),u.colorParams&&(u.colorParams.structure=t.getStructure());var p=Qp.getScheme(u.colorParams),d=new Gy(u.radiusParams),f=t.getAtomProxy(),m=0;t.eachResidue(function(t){var e=3*m;t.isProtein()||t.isNucleic()?(f.index=t.traceAtomIndex,i&&!i.position||f.positionToArray(a,e)):(f.index=t.atomOffset,i&&!i.position||t.positionToArray(a,e)),i&&!i.color||p.atomColorToArray(f,c,e),i&&!i.radius||(s[m]=d.atomRadius(f)),i&&!i.text||o.push(h.atomLabel(f)),++m}),i&&!i.position||(e=new Float32Array(a)),i&&!i.color||(n=new Float32Array(c)),i&&!i.radius||(r=new Float32Array(s))}return{position:e,size:r,color:n,text:o}},t.prototype.createData=function(t){return{bufferList:[new Aw(this.getTextData(t,{position:!0,color:!0,radius:!0,text:!0}),this.getBufferParams({fontFamily:this.fontFamily,fontStyle:this.fontStyle,fontWeight:this.fontWeight,xOffset:this.xOffset,yOffset:this.yOffset,zOffset:this.zOffset,attachment:this.attachment,showBorder:this.showBorder,borderColor:this.borderColor,borderWidth:this.borderWidth,showBackground:this.showBackground,backgroundColor:this.backgroundColor,backgroundMargin:this.backgroundMargin,backgroundOpacity:this.backgroundOpacity,fixedSize:this.fixedSize}))]}},t.prototype.updateData=function(t,e){e.bufferList[0].setAttributes(this.getTextData(e.sview,t))},t.prototype.getAtomRadius=function(){return 0},t}(pw);ed.add("label",vS);var yS=function(r){function t(t,e,i){r.call(this,t,e,i),this.type="line",this.parameters=Object.assign({multipleBond:{type:"select",rebuild:!0,options:{off:"off",symmetric:"symmetric",offset:"offset"}},bondSpacing:{type:"number",precision:2,max:2,min:.5},linewidth:{type:"integer",max:50,min:1,buffer:!0},lines:{type:"boolean",rebuild:!0},crosses:{type:"select",rebuild:!0,options:{off:"off",lone:"lone",all:"all"}},crossSize:{type:"number",precision:2,max:2,min:.1}},this.parameters,{flatShaded:null,side:null,wireframe:null,roughness:null,metalness:null}),this.init(i)}return r&&(t.__proto__=r),((t.prototype=Object.create(r&&r.prototype)).constructor=t).prototype.init=function(t){var e=t||{};this.multipleBond=bl(e.multipleBond,"off"),this.bondSpacing=bl(e.bondSpacing,1),this.linewidth=bl(e.linewidth,2),this.lines=bl(e.lines,!0),this.crosses=bl(e.crosses,"lone"),this.crossSize=bl(e.crossSize,.4),r.prototype.init.call(this,e)},t.prototype.getAtomRadius=function(t){return.1},t.prototype.getBondParams=function(t,e){return e=Object.assign({multipleBond:this.multipleBond,bondSpacing:this.bondSpacing,radiusParams:{type:"size",size:.1,scale:1}},e),r.prototype.getBondParams.call(this,t,e)},t.prototype._crossData=function(t,e){if(!t||t.position||t.color){var i,r,n,o,a={};"lone"===this.crosses&&Object.assign(a,{atomSet:(i=e,r=i.getAtomSet(),n=i.getBondSet(),o=i.getBondProxy(),n.forEach(function(t){o.index=t,r.clear(o.atomIndex1),r.clear(o.atomIndex2)}),r)});var s,c=e.getAtomData(this.getAtomParams(t,a)),u={},h=c.position,l=c.color,p=c.picking,d=(h||l).length,f=3*d,m=new Float32Array(0),g=new Float32Array(0),v=new Float32Array(0),y=new Float32Array(0),b=new Float32Array(0);t&&!t.position||(m=u.position1=new Float32Array(f),g=u.position2=new Float32Array(f),s=this.crossSize/2),t&&!t.color||(v=u.color=new Float32Array(f),y=u.color2=new Float32Array(f)),t&&!t.picking||(b=new Float32Array(3*c.picking.array.length));for(var x=0;x<d;x++){var _=3*x,w=3*_;if(!t||t.position){var S=h[_],A=h[_+1],M=h[_+2];m[w]=S-s,m[w+1]=A,m[w+2]=M,g[w]=S+s,g[w+1]=A,g[w+2]=M,m[w+3]=S,m[w+4]=A-s,m[w+5]=M,g[w+3]=S,g[w+4]=A+s,g[w+5]=M,m[w+6]=S,m[w+7]=A,m[w+8]=M-s,g[w+6]=S,g[w+7]=A,g[w+8]=M+s}if(!t||t.color)for(var E=w+9,P=w;P<E;P+=3)v[P]=y[P]=l[_],v[P+1]=y[P+1]=l[_+1],v[P+2]=y[P+2]=l[_+2];t&&!t.picking||(b[_]=b[_+1]=b[_+2]=p.array[x])}return t&&!t.picking||(u.picking=new hv(b,p.structure)),u}},t.prototype.createData=function(t){var e={position:!0,color:!0,picking:!0},i=[];if(this.lines){var r=t.getBondData(this.getBondParams(e)),n=new Pw(r,this.getBufferParams({linewidth:this.linewidth}));i.push(n)}if("off"!==this.crosses){var o=new Pw(this._crossData(e,t),this.getBufferParams({linewidth:this.linewidth}));i.push(o)}return{bufferList:i}},t.prototype.updateData=function(t,e){var i=0;if(this.lines){var r=e.sview.getBondData(this.getBondParams(t)),n={};t&&!t.position||Object.assign(n,{position1:r.position1,position2:r.position2}),t&&!t.color||Object.assign(n,{color:r.color,color2:r.color2}),e.bufferList[i++].setAttributes(n)}if("off"!==this.crosses){var o=this._crossData(t,e.sview),a={};t&&!t.position||Object.assign(a,{position1:o.position1,position2:o.position2}),t&&!t.color||Object.assign(a,{color:o.color,color2:o.color2}),e.bufferList[i++].setAttributes(a)}},t.prototype.setParameters=function(t){var e={};return t&&(t.bondSpacing||t.crossSize)&&Object.assign(e,{position:!0}),r.prototype.setParameters.call(this,t,e,!1),this},t}(pw);function bS(t,r,n,e,s){var c=new(e=e||Int32Array)(t*r*n*(s=s||1));function u(t,e,i){return((t*r+e)*n+i)*s}return{data:c,index:u,set:function(t,e,i){for(var r=[],n=arguments.length-3;0<n--;)r[n]=arguments[n+3];for(var o=u(t,e,i),a=0;a<s;++a)c[o+a]=r[a]},toArray:function(t,e,i,r,n){void 0===r&&(r=[]),void 0===n&&(n=0);for(var o=u(t,e,i),a=0;a<s;++a)r[n+a]=c[o+a]},fromArray:function(t,e,i,r,n){void 0===n&&(n=0);for(var o=u(t,e,i),a=0;a<s;++a)c[o+a]=r[n+a]},copy:function(t){c.set(t.data)}}}function xS(C,I,c){var p=ey(I),t=pm(C);0===C.length&&(t[0].set([0,0,0]),t[1].set([0,0,0]));var d,O,g,L,R,D,u,k,B,N,v,F,z,w,U,h=t[0],l=t[1];var j=1,P=2,S=4,A=[new Int32Array([1,0,0]),new Int32Array([-1,0,0]),new Int32Array([0,1,0]),new Int32Array([0,-1,0]),new Int32Array([0,0,1]),new Int32Array([0,0,-1]),new Int32Array([1,1,0]),new Int32Array([1,-1,0]),new Int32Array([-1,1,0]),new Int32Array([-1,-1,0]),new Int32Array([1,0,1]),new Int32Array([1,0,-1]),new Int32Array([-1,0,1]),new Int32Array([-1,0,-1]),new Int32Array([0,1,1]),new Int32Array([0,1,-1]),new Int32Array([0,-1,1]),new Int32Array([0,-1,-1]),new Int32Array([1,1,1]),new Int32Array([1,1,-1]),new Int32Array([1,-1,1]),new Int32Array([-1,1,1]),new Int32Array([1,-1,-1]),new Int32Array([-1,-1,1]),new Int32Array([-1,1,-1]),new Int32Array([-1,-1,-1])];function f(t){var e,i,r,n,o,a,s,c,u,h;for(var l in p)if(e=parseFloat(l),!B[l]){for(a=(s=t?(e+d)*O+.5:e*O+.5)*s,c=Math.floor(s)+1,u=new Int32Array(c*c),i=h=0;i<c;++i)for(r=0;r<c;++r)a<(n=i*i+r*r)?u[h]=-1:(o=Math.sqrt(a-n),u[h]=Math.floor(o)),++h;N[l]=c,B[l]=u}}function m(t){var e,i,r,n,o,a,s,c,u,h,l,p,d,f,m,g,v,y,b=3*t,x=t;e=Math.floor(.5+O*(C[b]+k[0])),i=Math.floor(.5+O*(C[b+1]+k[1])),r=Math.floor(.5+O*(C[b+2]+k[2]));var _,w=I[x],S=B[w],A=0,M=R*D,E=N[w];for(h=0;h<E;++h)for(l=0;l<E;++l){if(-1!==(_=S[A]))for(g=-1;g<2;++g)for(v=-1;v<2;++v)for(y=-1;y<2;++y)if(0!==g&&0!==v&&0!==y)for(s=g*h,u=y*l,p=0;p<=_;++p)if(f=i+(c=p*v),m=r+u,!((d=e+s)<0||f<0||m<0||L<=d||R<=f||D<=m)){var P=d*M+f*D+m;if(F)if(z[P]&j){if(z[P]&j){var T=U[P];T!==b&&s*s+c*c+u*u<(n=e+s-Math.floor(.5+O*(C[T]+k[0])))*n+(o=i+c-Math.floor(.5+O*(C[T+1]+k[1])))*o+(a=r+u-Math.floor(.5+O*(C[T+2]+k[2])))*a&&(U[P]=t)}}else z[P]|=j,U[P]=t;else z[P]|=j}A++}}function y(t){var e,i,r,n,o,a,s,c,u,h,l,p,d,f,m,g,v,y,b,x=3*t,_=t,w=0;e=Math.floor(.5+O*(C[x]+k[0])),i=Math.floor(.5+O*(C[x+1]+k[1])),r=Math.floor(.5+O*(C[x+2]+k[2]));var S=I[_],A=R*D;for(d=0,b=N[S];d<b;++d)for(f=0;f<b;++f){if(-1!==B[S][w])for(g=-1;g<2;++g)for(v=-1;v<2;++v)for(y=-1;y<2;++y)if(0!==g&&0!==v&&0!==y)for(s=g*d,u=y*f,m=0;m<=B[S][w];++m)if(l=i+(c=m*v),p=r+u,!((h=e+s)<0||l<0||p<0||L<=h||R<=l||D<=p)){var M=h*A+l*D+p;if(z[M]&P){if(F){var E=U[M];s*s+c*c+u*u<(n=Math.floor(.5+O*(C[E]+k[0])))*n+(o=Math.floor(.5+O*(C[E+1]+k[1])))*o+(a=Math.floor(.5+O*(C[E+2]+k[2])))*a&&(U[M]=t)}}else z[M]|=P,F&&(U[M]=t)}w++}}function b(t,e,i,r){var n,o,a,s,c,u,h,l,p,d,f,m,g=new Uint16Array(3),v=0;if(0===i)return v;var y=-1,b=-1,x=-1,_=R*D;for(h=0,p=i;h<p;h+=3)for(n=t[h],o=t[h+1],a=t[h+2],e.toArray(n,o,a,g),l=0;l<6;++l)y=n+(m=A[l])[0],b=o+m[1],x=a+m[2],y<L&&-1<y&&b<R&&-1<b&&x<D&&-1<x&&(z[f=y*_+D*b+x]&j&&!(z[f]&P)?(e.fromArray(y,b,x,g),d=(s=y-g[0])*s+(c=b-g[1])*c+(u=x-g[2])*u,w[f]=d,z[f]|=P,z[f]|=S,r[v]=y,r[v+1]=b,r[v+2]=x,v+=3):z[f]&j&&z[f]&P&&(d=(s=y-g[0])*s+(c=b-g[1])*c+(u=x-g[2])*u)<w[f]&&(e.fromArray(y,b,x,g),w[f]=d,z[f]&S||(z[f]|=S,r[v]=y,r[v+1]=b,r[v+2]=x,v+=3)));for(h=0,p=i;h<p;h+=3)for(n=t[h],o=t[h+1],a=t[h+2],e.toArray(n,o,a,g),l=6;l<18;l++)y=n+(m=A[l])[0],b=o+m[1],x=a+m[2],y<L&&-1<y&&b<R&&-1<b&&x<D&&-1<x&&(z[f=y*_+D*b+x]&j&&!(z[f]&P)?(e.fromArray(y,b,x,g),d=(s=y-g[0])*s+(c=b-g[1])*c+(u=x-g[2])*u,w[f]=d,z[f]|=P,z[f]|=S,r[v]=y,r[v+1]=b,r[v+2]=x,v+=3):z[f]&j&&z[f]&P&&(d=(s=y-g[0])*s+(c=b-g[1])*c+(u=x-g[2])*u)<w[f]&&(e.fromArray(y,b,x,g),w[f]=d,z[f]&S||(z[f]|=S,r[v]=y,r[v+1]=b,r[v+2]=x,v+=3)));for(h=0,p=i;h<p;h+=3)for(n=t[h],o=t[h+1],a=t[h+2],e.toArray(n,o,a,g),l=18;l<26;l++)y=n+(m=A[l])[0],b=o+m[1],x=a+m[2],y<L&&-1<y&&b<R&&-1<b&&x<D&&-1<x&&(z[f=y*_+D*b+x]&j&&!(z[f]&P)?(e.fromArray(y,b,x,g),d=(s=y-g[0])*s+(c=b-g[1])*c+(u=x-g[2])*u,w[f]=d,z[f]|=P,z[f]|=S,r[v]=y,r[v+1]=b,r[v+2]=x,v+=3):z[f]&j&&z[f]&P&&(d=(s=y-g[0])*s+(c=b-g[1])*c+(u=x-g[2])*u)<w[f]&&(e.fromArray(y,b,x,g),w[f]=d,z[f]&S||(z[f]|=S,r[v]=y,r[v+1]=b,r[v+2]=x,v+=3)));return v}this.getVolume=function(t,e,i,r,n){console.time("EDTSurface.getVolume");var o="vws"!==t;!function(t,e,i,r,n){d=e||1.4,O=i||2,F=n||!0;var o=0;for(var a in p)o=Math.max(o,a);var s=iy(h,l,o,O,t?d:0);L=s.dim[0],R=s.dim[1],D=s.dim[2],u=s.matrix,k=s.tran,O=s.scaleFactor,B={},N={},f(t),v=d*O,g=r||d/O,z=new Uint8Array(L*R*D),t&&(w=new Float64Array(L*R*D)),F&&(U=new Int32Array(L*R*D))}(o,e,i,r,n),function(t){var e,i;for(console.time("EDTSurface fillvoxels"),e=0,i=z.length;e<i;++e)z[e]=0,t&&(w[e]=-1),F&&(U[e]=-1);for(e=0,i=C.length/3;e<i;++e)m(e);for(e=0,i=z.length;e<i;++e)z[e]&j&&(z[e]|=P);console.timeEnd("EDTSurface fillvoxels")}(o),function(){var t,e,i,r=R*D;for(t=0;t<L;++t)for(e=0;e<D;++e)for(i=0;i<R;++i){var n=t*r+i*D+e;if(z[n]&j)for(var o=0;o<26;){var a=t+A[o][0],s=e+A[o][2],c=i+A[o][1];if(-1<a&&a<L&&-1<c&&c<R&&-1<s&&s<D&&!(z[a*r+c*D+s]&j)){z[n]|=S;break}o++}}}(),"ms"!==t&&"ses"!==t||function(){var t,e,i,r;console.time("EDTSurface fastdistancemap");var n,o=bS(L,R,D,Uint16Array,3),a=R*D,s=v*v,c=0;for(t=0;t<L;++t)for(e=0;e<R;++e)for(i=0;i<D;++i)z[n=t*a+e*D+i]&=~P,z[n]&j&&z[n]&S&&(o.set(t,e,i,t,e,i),w[n]=0,z[n]|=P,c+=1);var u=new Int32Array(3*c),h=0,l=new Int32Array(3*c),p=0;for(t=0;t<L;++t)for(e=0;e<R;++e)for(i=0;i<D;++i)z[n=t*a+e*D+i]&S&&(u[h]=t,u[h+1]=e,u[h+2]=i,h+=3,z[n]&=~S);do{for(p=b(u,o,h,l),t=h=0,r=p;t<r;t+=3)n=a*l[t]+D*l[t+1]+l[t+2],z[n]&=~S,w[n]<=1.0404*s&&(u[h]=l[t],u[h+1]=l[t+1],u[h+2]=l[t+2],h+=3)}while(0<h);var d,f=g*g,m=new Uint16Array(3);for(t=0;t<L;++t)for(e=0;e<R;++e)for(i=0;i<D;++i)z[n=t*a+e*D+i]&=~S,z[n]&j&&(z[n]&P&&!(z[n]&P&&w[n]>=f)||(z[n]|=S,F&&z[n]&P&&(o.toArray(t,e,i,m),d=m[0]*a+m[1]*D+m[2],U[n]=U[d])));console.timeEnd("EDTSurface fastdistancemap")}(),"ses"===t&&(f(!1),function(){var t,e;for(t=0,e=z.length;t<e;++t)z[t]&=~P;for(t=0,e=C.length/3;t<e;++t)y(t)}()),function(t){var e,i=z.length;if("vws"===t)for(e=0;e<i;++e)z[e]&=~S,z[e]=z[e]&P?1:0;else if("ms"===t)for(e=0;e<i;++e)z[e]&=~P,z[e]&S&&(z[e]|=P),z[e]&=~S,z[e]=z[e]&P?1:0;else if("ses"===t)for(e=0;e<i;++e)z[e]&S&&z[e]&P?z[e]&=~S:z[e]&S&&!(z[e]&P)&&(z[e]|=P),z[e]=z[e]&P?1:0;else if("sas"===t)for(e=0;e<i;++e)z[e]&=~S,z[e]=z[e]&P?1:0}(t);for(var a=0,s=U.length;a<s;++a)U[a]=c[U[a]];return console.timeEnd("EDTSurface.getVolume"),{data:z,nx:D,ny:R,nz:L,atomindex:U}},this.getSurface=function(t,e,i,r,n,o,a){var s=this.getVolume(t,e,i,r,n);return new oy(s.data,s.nx,s.ny,s.nz,s.atomindex).getSurface(1,o,void 0,u,a)}}function _S(C,I,O,L,t,e,i){var r=C.length,R=t[0],D=t[1],k=t[2],n=e[0],o=e[1],a=e[2];function B(t,e){return Math.floor((t-e)/i)}for(var s,c,u,N=B(n,R)+1,F=B(o,D)+1,z=B(a,k)+1,h=N*F*z,U=F*z,l=[],p=0;p<r;p++){var d=(s=C[p],c=I[p],u=O[p],(B(s,R)*F+B(c,D))*z+B(u,k));void 0===l[d]?l[d]=[p]:l[d].push(p)}var j=new Uint32Array(h),G=new Uint16Array(h),V=new Uint32Array(r),f=0,m=0;for(p=0;p<h;p++){var g=j[p]=f,v=l[p];if(void 0!==v)for(var y=0;y<v.length;y++)V[f]=v[y],f++;var b=f-g;m<(G[p]=b)&&(m=b)}return{neighbourListLength:27*m+1,withinRadii:function(t,e,i,r,n){for(var o=0,a=B(t,R),s=B(e,D),c=B(i,k),u=Math.max(0,a-1),h=Math.max(0,s-1),l=Math.max(0,c-1),p=Math.min(N,a+2),d=Math.min(F,s+2),f=Math.min(z,c+2),m=u;m<p;++m)for(var g=m*U,v=h;v<d;++v)for(var y=v*z,b=l;b<f;++b)for(var x=g+y+b,_=j[x],w=_+G[x],S=_;S<w;S++){var A=V[S],M=C[A]-t,E=I[A]-e,P=O[A]-i,T=L[A]+r;M*M+E*E+P*P<=T*T&&(n[o++]=V[S])}n[o]=-1}}}function wS(u,c,r){for(var R=c.length,F=new Float32Array(R),z=new Float32Array(R),U=new Float32Array(R),t=0;t<R;t++){var e=3*t;F[t]=u[e],z[t]=u[e+1],U[t]=u[e+2]}var i=pm(u);0===u.length&&(i[0].set([0,0,0]),i[1].set([0,0,0]));var j,D,h,l,G,V,H,$,p,W,X,q,Y,Z,K,J,k,B,Q,tt=i[0],d=i[1],et=-1,it=new Float32Array([0,0,0]),rt=new Float32Array([0,0,0]),nt=new Float32Array([0,0,0]),ot=new Float32Array([0,0,0]);function n(t,e,i,r){l=bl(t,1.4),G=bl(e,2),V=bl(i,!0),H=bl(r,30),j=new Float32Array(R),D=new Float32Array(R);for(var n=0;n<j.length;++n){var o=c[n]+l;j[n]=o,D[n]=o*o}for(var a=h=0;a<j.length;++a)j[a]>h&&(h=j[a]);var s;s=iy(tt,d,h,G,0),G=s.scaleFactor,$=s.dim,p=s.matrix,Q=Math.max(5,2+Math.floor(l*G)),W=Gd($[0]*$[1]*$[2],-1001),X=new Int32Array(W.length),q=new Float32Array($[0]),Y=new Float32Array($[1]),Z=new Float32Array($[2]),f(q,tt[0],1/G),f(Y,tt[1],1/G),f(Z,tt[2],1/G),function(){var t=0,e=2*Math.PI/H;J=new Float32Array(H),K=new Float32Array(H);for(var i=0;i<H;i++)J[i]=Math.cos(t),K[i]=Math.sin(t),t+=e}(),k=_S(F,z,U,j,tt,d,2.01*h),B=new Int32Array(k.neighbourListLength),et=-1}function f(t,e,i){for(var r=0;r<t.length;r++)t[r]=e+i*r}function at(t,e,i,r,n){var o;if(-1!==et){if((o=et)!==r&&o!==n&&s(o,t,e,i))return o;et=-1}var a=0;for(o=B[a];0<=o;){if(o!==r&&o!==n&&s(o,t,e,i))return et=o;o=B[++a]}return et=-1}function s(t,e,i,r){var n=3*t,o=D[t],a=u[n]-e,s=u[n+1]-i,c=u[n+2]-r;return a*a+s*s+c*c<o}function o(t,e){var i,r,n=j[t],o=j[e],a=it[0]=F[e]-F[t],s=it[1]=z[e]-z[t],c=it[2]=U[e]-U[t],u=a*a+s*s+c*c,h=Math.sqrt(u),l=n*((n*n+h*h-o*o)/(2*n*h));Em(it,it),r=it,(i=nt)[0]=i[1]=i[2]=1,0!==r[0]?i[0]=(r[1]+r[2])/-r[0]:0!==r[1]?i[1]=(r[0]+r[2])/-r[1]:0!==r[2]&&(i[2]=(r[0]+r[1])/-r[2]),Em(nt,nt),vm(ot,it,nt),Em(ot,ot);var p=Math.sqrt(n*n-l*l);Mm(nt,nt,p),Mm(ot,ot,p),Mm(it,it,l),rt[0]=it[0]+F[t],rt[1]=it[1]+z[t],rt[2]=it[2]+U[t],et=-1;for(var d=Q,f=0;f<H;f++){var m=J[f],g=K[f],v=rt[0]+m*nt[0]+g*ot[0],y=rt[1]+m*nt[1]+g*ot[1],b=rt[2]+m*nt[2]+g*ot[2];if(-1===at(v,y,b,t,e))for(var x=Math.floor(G*(v-tt[0])),_=Math.floor(G*(y-tt[1])),w=Math.floor(G*(b-tt[2])),S=Math.max(0,x-d),A=Math.max(0,_-d),M=Math.max(0,w-d),E=Math.min($[0],x+d+2),P=Math.min($[1],_+d+2),T=Math.min($[2],w+d+2),C=S;C<E;C++){a=v-q[C];for(var I=$[1]*$[2]*C,O=A;O<P;O++)for(var L=a*a+(s=y-Y[O])*s,R=I+$[2]*O,D=M;D<T;D++){u=L+(c=b-Z[D])*c;var k=D+R,B=W[k];if(0<B&&u<B*B&&(W[k]=Math.sqrt(u),V)){var N=a*it[0]+s*it[1]+c*it[2];X[k]=N<0?e:t}}}}}function m(t,e,i){console.time("AVSurface.getVolume"),console.time("AVSurface.init"),n(t,e,i),console.timeEnd("AVSurface.init"),console.time("AVSurface.projectPoints"),function(){for(var t=0;t<R;t++){var e=F[t],i=z[t],r=U[t],n=j[t],o=D[t];k.withinRadii(e,i,r,n,B);for(var a=Math.ceil(n*G),s=Math.floor(G*(e-tt[0])),c=Math.floor(G*(i-tt[1])),u=Math.floor(G*(r-tt[2])),h=Math.max(0,s-a),l=Math.max(0,c-a),p=Math.max(0,u-a),d=Math.min($[0],s+a+2),f=Math.min($[1],c+a+2),m=Math.min($[2],u+a+2),g=h;g<d;g++)for(var v=q[g]-e,y=$[1]*$[2]*g,b=l;b<f;b++)for(var x=Y[b]-i,_=v*v+x*x,w=y+$[2]*b,S=p;S<m;S++){var A=Z[S]-r,M=_+A*A;if(M<o){var E=S+w;W[E]<0&&(W[E]=-W[E]);var P=Math.sqrt(M),T=n/P,C=v*T,I=x*T,O=A*T;if(-1===at(C+=e,I+=i,O+=r,t,-1)){var L=n-P;L<W[E]&&(W[E]=L,V&&(X[E]=t))}}}}}(),console.timeEnd("AVSurface.projectPoints"),console.time("AVSurface.projectTorii"),function(){for(var t=0;t<R;t++){k.withinRadii(F[t],z[t],U[t],j[t],B);for(var e=0,i=B[e];0<=i;)t<i&&o(t,i),i=B[++e]}}(),console.timeEnd("AVSurface.projectTorii"),function(){for(var t=0;t<W.length;t++)W[t]<0&&(W[t]=0)}(),function(){for(var t=0;t<X.length;t++)X[t]=r[X[t]]}(),console.timeEnd("AVSurface.getVolume")}this.getSurface=function(t,e,i,r,n,o,a){return m(e,i,n),new oy(W,$[2],$[1],$[0],X).getSurface(e,!1,void 0,p,a)}}ed.add("line",yS),Object.assign(xS,{__deps:[iy,ey,oy,pm,bS]}),Object.assign(wS,{__deps:[iy,oy,Gd,pm,Mm,vm,Em,_S,bl]}),Jp.add("molsurf",function(t,e){var i=t.data.args,r=t.data.params;if(i&&r){var n=new("av"===r.type?wS:xS)(i.coordList,i.radiusList,i.indexList).getSurface(r.type,r.probeRadius,r.scaleFactor,r.cutoff,!0,r.smooth,r.contour),o=[n.position.buffer,n.index.buffer];n.normal&&o.push(n.normal.buffer),n.atomindex&&o.push(n.atomindex.buffer),e({sd:n,p:r},o)}},[xS,wS]);var SS=function(t){this.structure=t};SS.prototype._getAtomData=function(t){return this.structure.getAtomData({what:{position:!0,radius:!0,index:!0},radiusParams:bl(t.radiusParams,{type:"vdw",scale:1})})},SS.prototype._makeSurface=function(t,e){var i=new ry(e.name,"",t);return i.info.type=e.type,i.info.probeRadius=e.probeRadius,i.info.scaleFactor=e.scaleFactor,i.info.smooth=e.smooth,i.info.cutoff=e.cutoff,i},SS.prototype.getSurface=function(t){var e=t||{},i=this._getAtomData(t),r=i.position,n=i.radius,o=i.index,a=new("av"===e.type?wS:xS)(r,n,o).getSurface(e.type,e.probeRadius,e.scaleFactor,e.cutoff,!0,e.smooth,e.contour);return this._makeSurface(a,e)},SS.prototype.getSurfaceWorker=function(t,i){var r=this,n=Object.assign({},t);if(window.hasOwnProperty("Worker")){void 0===this.worker&&(this.worker=new cm("molsurf"));var e=this._getAtomData(t),o=e.position,a=e.radius,s=e.index,c={args:{coordList:o,radiusList:a,indexList:s},params:n},u=[o.buffer,a.buffer,s.buffer];this.worker.post(c,u,function(t){i(r._makeSurface(t.data.sd,n))},function(t){console.warn("MolecularSurface.getSurfaceWorker error - trying without worker",t),r.worker.terminate(),r.worker=void 0;var e=r.getSurface(n);i(e)})}else{var h=this.getSurface(n);i(h)}},SS.prototype.dispose=function(){this.worker&&this.worker.terminate()};var AS=function(n){function t(t,e,i){var r=this;n.call(this,t,e,i),this.type="surface",this.parameters=Object.assign({surfaceType:{type:"select",rebuild:!0,options:{vws:"vws",sas:"sas",ms:"ms",ses:"ses",av:"av"}},probeRadius:{type:"number",precision:1,max:20,min:0,rebuild:!0},smooth:{type:"integer",precision:1,max:10,min:0,rebuild:!0},scaleFactor:{type:"number",precision:1,max:5,min:0,rebuild:!0},cutoff:{type:"number",precision:2,max:50,min:0,rebuild:!0},contour:{type:"boolean",rebuild:!0},background:{type:"boolean",rebuild:!0},opaqueBack:{type:"boolean",buffer:!0},filterSele:{type:"text",rebuild:!0},colorVolume:{type:"hidden"},useWorker:{type:"boolean",rebuild:!0}},this.parameters,{radius:null,scale:null}),this.__infoList=[],this.structure.signals.refreshed.add(function(){r.__forceNewMolsurf=!0}),this.toBePrepared=!0,this.init(i)}return n&&(t.__proto__=n),((t.prototype=Object.create(n&&n.prototype)).constructor=t).prototype.init=function(t){var e=t||{};e.colorScheme=bl(e.colorScheme,"uniform"),e.colorValue=bl(e.colorValue,14540253),e.disablePicking=bl(e.disablePicking,!0),this.surfaceType=bl(e.surfaceType,"ms"),this.probeRadius=bl(e.probeRadius,1.4),this.smooth=bl(e.smooth,2),this.scaleFactor=bl(e.scaleFactor,2),this.cutoff=bl(e.cutoff,0),this.contour=bl(e.contour,!1),this.background=bl(e.background,!1),this.opaqueBack=bl(e.opaqueBack,!0),this.filterSele=bl(e.filterSele,""),this.colorVolume=bl(e.colorVolume,void 0),this.useWorker=bl(e.useWorker,!0),n.prototype.init.call(this,t)},t.prototype.prepareData=function(t,e,i){var r=this.__infoList[e];if(r||(r={},this.__infoList[e]=r),r.molsurf&&r.sele===t.selection.string)i(e);else{if(this.filterSele){var n=t.structure.getView(new Lp(this.filterSele)),o=n.boundingBox.getSize(new ri),a=Math.max(o.x,o.y,o.z),s=t.getAtomSetWithinPoint(n.center,a/2+6);t=t.getView(new Lp(t.getAtomSetWithinSelection(s,3).toSeleString()))}r.sele=t.selection.string,r.molsurf=new SS(t);var c=this.getSurfaceParams(),u=function(t){r.surface=t,i(e)};this.useWorker?r.molsurf.getSurfaceWorker(c,u):u(r.molsurf.getSurface(c))}},t.prototype.prepare=function(t){var r=this;if((this.__forceNewMolsurf||this.__sele!==this.selection.string||this.__surfaceParams!==JSON.stringify(this.getSurfaceParams()))&&(this.__infoList.forEach(function(t){t.molsurf.dispose()}),this.__infoList.length=0),0!==this.structureView.atomCount){var n=function(){r.__sele=r.selection.string,r.__surfaceParams=JSON.stringify(r.getSurfaceParams()),r.__forceNewMolsurf=!1,t()},e="default"===this.assembly?this.defaultAssembly:this.assembly,o=this.structure.biomolDict[e];o?o.partList.forEach(function(t,e){var i=t.getView(r.structureView);r.prepareData(i,e,function(t){t===o.partList.length-1&&n()})}):this.prepareData(this.structureView,0,n)}else t()},t.prototype.createData=function(t,e){var i=this.__infoList[e],r=i.surface,n={position:r.getPosition(),color:r.getColor(this.getColorParams()),index:r.getFilteredIndex(this.filterSele,t)},o=[];if(r.contour){var a=new _y(n,this.getBufferParams({wireframe:!1}));o.push(a)}else{Object.assign(n,{normal:r.getNormal(),picking:r.getPicking(t.getStructure())});var s=new gy(n,this.getBufferParams({background:this.background,opaqueBack:this.opaqueBack,dullInterior:!1})),c=new by(s);o.push(c)}return{bufferList:o,info:i}},t.prototype.updateData=function(t,e){var i={};if(t.position||t.radius)return this.__forceNewMolsurf=!0,void this.build();t.color&&(i.color=e.info.surface.getColor(this.getColorParams())),t.index&&(i.index=e.info.surface.getFilteredIndex(this.filterSele,e.sview)),e.bufferList[0].setAttributes(i)},t.prototype.setParameters=function(t,e,i){return void 0===e&&(e={}),t&&t.filterSele&&(e.index=!0),t&&void 0!==t.colorVolume&&(e.color=!0),t&&t.wireframe&&(t.contour||void 0===t.contour&&this.contour)&&(t.wireframe=!1),n.prototype.setParameters.call(this,t,e,i),this},t.prototype.getSurfaceParams=function(t){return void 0===t&&(t={}),Object.assign({type:this.surfaceType,probeRadius:this.probeRadius,scaleFactor:this.scaleFactor,smooth:this.smooth&&!this.contour,cutoff:this.cutoff,contour:this.contour,useWorker:this.useWorker,radiusParams:this.getRadiusParams()},t)},t.prototype.getColorParams=function(){var t=n.prototype.getColorParams.call(this);return t.volume=this.colorVolume,t},t.prototype.getAtomRadius=function(){return 0},t.prototype.clear=function(){n.prototype.clear.call(this)},t.prototype.dispose=function(){this.__infoList.forEach(function(t){t.molsurf.dispose()}),this.__infoList.length=0,n.prototype.dispose.call(this)},t}(pw);ed.add("surface",AS);var MS=function(r){function t(t,e,i){r.call(this,t,e,i),this.type="point",this.parameters=Object.assign({pointSize:{type:"number",precision:1,max:100,min:0,buffer:!0},sizeAttenuation:{type:"boolean",buffer:!0},sortParticles:{type:"boolean",rebuild:!0},useTexture:{type:"boolean",buffer:!0},alphaTest:{type:"range",step:.001,max:1,min:0,buffer:!0},forceTransparent:{type:"boolean",buffer:!0},edgeBleach:{type:"range",step:.001,max:1,min:0,buffer:!0}},this.parameters,{flatShaded:null,wireframe:null,linewidth:null,side:null,roughness:null,metalness:null}),this.init(i)}return r&&(t.__proto__=r),((t.prototype=Object.create(r&&r.prototype)).constructor=t).prototype.init=function(t){var e=t||{};this.pointSize=bl(e.pointSize,1),this.sizeAttenuation=bl(e.sizeAttenuation,!0),this.sortParticles=bl(e.sortParticles,!1),this.useTexture=bl(e.useTexture,!1),this.alphaTest=bl(e.alphaTest,.5),this.forceTransparent=bl(e.forceTransparent,!1),this.edgeBleach=bl(e.edgeBleach,0),r.prototype.init.call(this,e)},t.prototype.createData=function(t){var e=t.getAtomData(this.getAtomParams({position:!0,color:!0,picking:!0}));return{bufferList:[new Ix(e,this.getBufferParams({pointSize:this.pointSize,sizeAttenuation:this.sizeAttenuation,sortParticles:this.sortParticles,useTexture:this.useTexture,alphaTest:this.alphaTest,forceTransparent:this.forceTransparent,edgeBleach:this.edgeBleach}))]}},t.prototype.updateData=function(t,e){var i=e.sview.getAtomData(this.getAtomParams(t)),r={};t&&!t.position||Object.assign(r,{position:i.position}),t&&!t.color||Object.assign(r,{color:i.color}),e.bufferList[0].setAttributes(r)},t.prototype.getAtomRadius=function(){return.1},t}(pw);ed.add("point",MS),rd.add("shader/Ribbon.vert","#define STANDARD\nuniform float clipNear;\nuniform vec3 clipCenter;\n#if defined( NEAR_CLIP ) || defined( RADIUS_CLIP ) || !defined( PICKING )\nvarying vec3 vViewPosition;\n#endif\n#if defined( RADIUS_CLIP )\nvarying vec3 vClipCenter;\n#endif\nattribute vec3 dir;\nattribute float size;\n#ifdef PICKING\n#include unpack_color\nattribute float primitiveId;\nvarying vec3 vPickingColor;\n#else\n#include color_pars_vertex\n#ifndef FLAT_SHADED\nvarying vec3 vNormal;\n#endif\n#endif\n#include common\nvoid main(void){\n#ifdef PICKING\nvPickingColor = unpackColor( primitiveId );\n#else\n#include color_vertex\n#include beginnormal_vertex\n#include defaultnormal_vertex\n#ifndef FLAT_SHADED\nvNormal = normalize( transformedNormal );\n#endif\n#endif\n#include begin_vertex\ntransformed += normalize( dir ) * size;\n#include project_vertex\n#if defined( NEAR_CLIP ) || defined( RADIUS_CLIP ) || !defined( PICKING )\nvViewPosition = -mvPosition.xyz;\n#endif\n#if defined( RADIUS_CLIP )\nvClipCenter = -( modelViewMatrix * vec4( clipCenter, 1.0 ) ).xyz;\n#endif\n#include nearclip_vertex\n}");var ES=new Uint16Array([0,1,2,1,3,2]);function PS(t){return 3*(4*(t.position.length/3-1))}var TS=function(o){function t(t,e){void 0===e&&(e={}),o.call(this,{position:new Float32Array(PS(t)),color:new Float32Array(PS(t)),index:Ll(PS(t),PS(t)/3),normal:new Float32Array(PS(t)),picking:t.picking},e),this.vertexShader="Ribbon.vert";var i=t.position.length/3-1,r=4*i,n=3*r;this.addAttributes({dir:{type:"v3",value:new Float32Array(n)}}),this.addAttributes({size:{type:"f",value:new Float32Array(r)}}),t.primitiveId=Hd(i),this.setAttributes(t),this.makeIndex()}return o&&(t.__proto__=o),((t.prototype=Object.create(o&&o.prototype)).constructor=t).prototype.setAttributes=function(t){void 0===t&&(t={});var e,i,r,n,o,a,s,c,u,h,l,p,d,f,m,g,v,y,b,x=this.size/4,_=this.geometry.attributes;t.position&&(e=t.position,s=_.position.array,_.position.needsUpdate=!0),t.normal&&(i=t.normal,c=_.normal.array,_.normal.needsUpdate=!0),t.size&&(r=t.size,u=_.size.array,_.size.needsUpdate=!0),t.dir&&(n=t.dir,h=_.dir.array,_.dir.needsUpdate=!0),t.color&&(o=t.color,l=_.color.array,_.color.needsUpdate=!0),t.primitiveId&&(a=t.primitiveId,p=_.primitiveId.array,_.primitiveId.needsUpdate=!0);var w=r?r[0]:null;for(d=0;d<x;++d){for(m=(y=3*d)*4,v=4*d,e&&(s[m]=s[m+3]=e[y],s[m+1]=s[m+4]=e[y+1],s[m+2]=s[m+5]=e[y+2],s[m+6]=s[m+9]=e[y+3],s[m+7]=s[m+10]=e[y+4],s[m+8]=s[m+11]=e[y+5]),i&&(c[m]=c[m+3]=-i[y],c[m+1]=c[m+4]=-i[y+1],c[m+2]=c[m+5]=-i[y+2],c[m+6]=c[m+9]=-i[y+3],c[m+7]=c[m+10]=-i[y+4],c[m+8]=c[m+11]=-i[y+5]),f=0;f<4;++f)g=m+3*f,o&&(l[g]=o[y],l[g+1]=o[y+1],l[g+2]=o[y+2]),a&&(p[v+f]=a[d]);r&&(b=r[d],w!==r[d]?(u[v]=w,u[v+1]=w):(u[v]=b,u[v+1]=b),u[v+2]=b,w=u[v+3]=b),n&&(h[m]=n[y],h[m+1]=n[y+1],h[m+2]=n[y+2],h[m+3]=-n[y],h[m+4]=-n[y+1],h[m+5]=-n[y+2],h[m+6]=n[y+3],h[m+7]=n[y+4],h[m+8]=n[y+5],h[m+9]=-n[y+3],h[m+10]=-n[y+4],h[m+11]=-n[y+5])}},t.prototype.makeIndex=function(){for(var t=this.geometry.getIndex().array,e=t.length/4/3,i=0;i<e;++i){var r=6*i,n=4*i;t.set(ES,r);for(var o=0;o<6;++o)t[r+o]+=n}},t}(my),CS=function(r){function t(t,e,i){r.call(this,t,e,i),this.type="ribbon",this.parameters=Object.assign({subdiv:{type:"integer",max:50,min:1,rebuild:!0},tension:{type:"number",precision:1,max:1,min:.1},smoothSheet:{type:"boolean",rebuild:!0}},this.parameters,{side:null,wireframe:null,linewidth:null}),this.init(i)}return r&&(t.__proto__=r),((t.prototype=Object.create(r&&r.prototype)).constructor=t).prototype.init=function(t){var e=t||{};e.colorScheme=bl(e.colorScheme,"chainname"),e.colorScale=bl(e.colorScale,"RdYlBu"),e.radiusType=bl(e.radiusType,"sstruc"),e.radiusScale=bl(e.radiusScale,4),"low"===e.quality?this.subdiv=3:"medium"===e.quality?this.subdiv=6:"high"===e.quality?this.subdiv=12:this.subdiv=bl(e.subdiv,6),this.tension=bl(e.tension,NaN),this.smoothSheet=bl(e.smoothSheet,!1),r.prototype.init.call(this,e)},t.prototype.getSplineParams=function(t){return Object.assign({subdiv:this.subdiv,tension:this.tension,directional:!0,smoothSheet:this.smoothSheet},t)},t.prototype.getAtomRadius=function(t){return t.isTrace()?r.prototype.getAtomRadius.call(this,t):0},t.prototype.createData=function(t){var s=this,c=[],u=[];return this.structure.eachPolymer(function(t){if(!(t.residueCount<4)){u.push(t);var e=new qw(t,s.getSplineParams()),i=e.getSubdividedPosition(),r=e.getSubdividedOrientation(),n=e.getSubdividedColor(s.getColorParams()),o=e.getSubdividedPicking(),a=e.getSubdividedSize(s.getRadiusParams());c.push(new TS({position:i.position,normal:r.binormal,dir:r.normal,color:n.color,size:a.size,picking:o.picking},s.getBufferParams()))}},t.getSelection()),{bufferList:c,polymerList:u}},t.prototype.updateData=function(t,e){t=t||{};var i=0,r=e.polymerList.length;for(i=0;i<r;++i){var n={},o=new qw(e.polymerList[i],this.getSplineParams());if(t.position){var a=o.getSubdividedPosition(),s=o.getSubdividedOrientation();Object.assign(n,{position:a.position,normal:s.binormal,dir:s.normal})}if(t.radius||t.scale){var c=o.getSubdividedSize(this.getRadiusParams());Object.assign(n,{size:c.size})}if(t.color){var u=o.getSubdividedColor(this.getColorParams());Object.assign(n,{color:u.color})}e.bufferList[i].setAttributes(n)}},t.prototype.setParameters=function(t){var e={};return t&&t.tension&&Object.assign(e,{position:!0}),r.prototype.setParameters.call(this,t,e,!1),this},t}(pw);ed.add("ribbon",CS);var IS=function(r){function t(t,e,i){r.call(this,t,e,i),this.type="rocket",this.parameters=Object.assign({localAngle:{type:"integer",max:180,min:0,rebuild:!0},centerDist:{type:"number",precision:1,max:10,min:0,rebuild:!0},ssBorder:{type:"boolean",rebuild:!0},radialSegments:!0,openEnded:!0,disableImpostor:!0},this.parameters),this.init(i)}return r&&(t.__proto__=r),((t.prototype=Object.create(r&&r.prototype)).constructor=t).prototype.init=function(t){var e=t||{};e.colorScheme=bl(e.colorScheme,"sstruc"),e.radiusSize=bl(e.radiusSize,1.5),e.radiusScale=bl(e.radiusScale,1),e.openEnded=bl(e.openEnded,!1),e.useInteriorColor=bl(e.useInteriorColor,!0),this.localAngle=bl(e.localAngle,30),this.centerDist=bl(e.centerDist,2.5),this.ssBorder=bl(e.ssBorder,!1),r.prototype.init.call(this,e)},t.prototype.createData=function(t){var r=this,n=0,o=[],a=[];this.structure.eachPolymer(function(t){if(!(t.residueCount<4||t.isNucleic())){var e=new eb(t),i=e.getAxis(r.localAngle,r.centerDist,r.ssBorder,r.getColorParams(),r.getRadiusParams());n+=i.size.length,o.push(i),a.push(e)}},t.getSelection());var e={begin:new Float32Array(3*n),end:new Float32Array(3*n),size:new Float32Array(n),color:new Float32Array(3*n),picking:{}},i=new Float32Array(n),s=0;return o.forEach(function(t){e.begin.set(t.begin,3*s),e.end.set(t.end,3*s),e.size.set(t.size,s),e.color.set(t.color,3*s),i.set(t.picking.array,s),s+=t.size.length}),n&&(e.picking=new hv(i,t.getStructure())),{bufferList:[new Gw({position1:e.begin,position2:e.end,color:e.color,color2:e.color,radius:e.size,picking:e.picking},this.getBufferParams({openEnded:this.openEnded,radialSegments:this.radialSegments,disableImpostor:this.disableImpostor,dullInterior:!0}))],axisList:o,helixbundleList:a,axisData:e}},t.prototype.updateData=function(i,r){var n=this;if((i=i||{}).position)this.build();else{var t={};if(i.color||i.radius){var o=0;r.helixbundleList.forEach(function(t){var e=t.getAxis(n.localAngle,n.centerDist,n.ssBorder,n.getColorParams(),n.getRadiusParams());i.color&&r.axisData.color.set(e.color,3*o),(i.radius||i.scale)&&r.axisData.size.set(e.size,o),o+=e.size.length}),i.color&&Object.assign(t,{color:r.axisData.color,color2:r.axisData.color}),(i.radius||i.scale)&&Object.assign(t,{radius:r.axisData.size})}r.bufferList[0].setAttributes(t)}},t}(pw);ed.add("rocket",IS);var OS=function(r){function t(t,e,i){r.call(this,t,e,i),this.type="rope",this.parameters=Object.assign({smooth:{type:"integer",max:15,min:0,rebuild:!0}},this.parameters,{aspectRatio:null,smoothSheet:null})}return r&&(t.__proto__=r),((t.prototype=Object.create(r&&r.prototype)).constructor=t).prototype.init=function(t){var e=t||{};e.aspectRatio=1,e.tension=bl(e.tension,.5),e.radiusScale=bl(e.radiusScale,5),e.smoothSheet=!1,this.smooth=bl(e.smooth,2),r.prototype.init.call(this,e)},t.prototype.getSpline=function(t){var e=new tb(t);return new qw(t,this.getSplineParams({directional:!1,positionIterator:e.getCenterIterator(this.smooth)}))},t}(Qw);ed.add("rope",OS);var LS=function(r){function t(t,e,i){r.call(this,t,e,i),this.type="spacefill",this.parameters=Object.assign({sphereDetail:!0,disableImpostor:!0},this.parameters),this.init(i)}return r&&(t.__proto__=r),((t.prototype=Object.create(r&&r.prototype)).constructor=t).prototype.init=function(t){var e=t||{};e.useInteriorColor=bl(e.useInteriorColor,!0),r.prototype.init.call(this,e)},t.prototype.createData=function(t){return{bufferList:[new Px(t.getAtomData(this.getAtomParams()),this.getBufferParams({sphereDetail:this.sphereDetail,dullInterior:!0,disableImpostor:this.disableImpostor}))]}},t.prototype.updateData=function(t,e){var i=e.sview.getAtomData(this.getAtomParams(t)),r={};t&&!t.position||Object.assign(r,{position:i.position}),t&&!t.color||Object.assign(r,{color:i.color}),t&&!t.radius||Object.assign(r,{radius:i.radius}),e.bufferList[0].setAttributes(r)},t}(pw);function RS(t){return 3*(t.position.length/3-1)*2}ed.add("spacefill",LS);var DS=function(i){function t(t,e){void 0===e&&(e={}),i.call(this,{position:new Float32Array(RS(t)),color:new Float32Array(RS(t))},e),this.isLine=!0,this.vertexShader="Line.vert",this.fragmentShader="Line.frag",this.setAttributes(t)}return i&&(t.__proto__=i),((t.prototype=Object.create(i&&i.prototype)).constructor=t).prototype.setAttributes=function(t){var e,i,r,n,o=this.geometry.attributes;if(t.position&&(e=t.position,r=o.position.array,o.position.needsUpdate=!0),t.color&&(i=t.color,n=o.color.array,o.color.needsUpdate=!0),e||i)for(var a,s,c=this.size-1,u=0;u<c;++u)s=(a=3*u)*2,e&&(r[s]=e[a],r[s+1]=e[a+1],r[s+2]=e[a+2],r[s+3]=e[a+3],r[s+4]=e[a+4],r[s+5]=e[a+5]),i&&(n[s]=i[a],n[s+1]=i[a+1],n[s+2]=i[a+2],n[s+3]=i[a+3],n[s+4]=i[a+4],n[s+5]=i[a+5]);else Yp.warn("TraceBuffer.prototype.setAttributes no data")},t}(dy),kS=function(r){function t(t,e,i){r.call(this,t,e,i),this.type="trace",this.parameters=Object.assign({subdiv:{type:"integer",max:50,min:1,rebuild:!0},tension:{type:"number",precision:1,max:1,min:.1},smoothSheet:{type:"boolean",rebuild:!0}},this.parameters,{flatShaded:null,side:null,wireframe:null}),this.init(i)}return r&&(t.__proto__=r),((t.prototype=Object.create(r&&r.prototype)).constructor=t).prototype.init=function(t){var e=t||{};e.colorScheme=bl(e.colorScheme,"chainname"),e.colorScale=bl(e.colorScale,"RdYlBu"),"low"===e.quality?this.subdiv=3:"medium"===e.quality?this.subdiv=6:"high"===e.quality?this.subdiv=12:this.subdiv=bl(e.subdiv,6),this.tension=bl(e.tension,NaN),this.smoothSheet=bl(e.smoothSheet,!1),r.prototype.init.call(this,e)},t.prototype.getSplineParams=function(t){return Object.assign({subdiv:this.subdiv,tension:this.tension,directional:!1,smoothSheet:this.smoothSheet},t)},t.prototype.getAtomRadius=function(t){return t.isTrace()?.1:0},t.prototype.createData=function(t){var n=this,o=[],a=[];return this.structure.eachPolymer(function(t){if(!(t.residueCount<4)){a.push(t);var e=new qw(t,n.getSplineParams()),i=e.getSubdividedPosition(),r=e.getSubdividedColor(n.getColorParams());o.push(new DS(Object.assign({},i,r),n.getBufferParams()))}},t.getSelection()),{bufferList:o,polymerList:a}},t.prototype.updateData=function(t,e){t=t||{};var i=0,r=e.polymerList.length;for(i=0;i<r;++i){var n={},o=new qw(e.polymerList[i],this.getSplineParams());if(t.position){var a=o.getSubdividedPosition();Object.assign(n,{position:a.position})}if(t.color){var s=o.getSubdividedColor(this.getColorParams());Object.assign(n,{color:s.color})}e.bufferList[i].setAttributes(n)}},t.prototype.setParameters=function(t){var e={};return t&&t.tension&&Object.assign(e,{position:!0}),r.prototype.setParameters.call(this,t,e,!1),this},t}(pw);ed.add("trace",kS);var BS=function(r){function t(t,e,i){r.call(this,t,e,i),this.type="tube",this.parameters=Object.assign({},this.parameters,{aspectRatio:null})}return r&&(t.__proto__=r),((t.prototype=Object.create(r&&r.prototype)).constructor=t).prototype.init=function(t){var e=t||{};e.aspectRatio=1,e.radiusScale=bl(e.radiusScale,2),"low"===e.quality&&(this.radialSegments=5),r.prototype.init.call(this,e)},t.prototype.getSplineParams=function(){return r.prototype.getSplineParams.call(this,{directional:!1})},t}(Qw);ed.add("tube",BS);var NS=function(r){function t(t,e,i){r.call(this,t,e,i),this.type="unitcell",this.parameters=Object.assign({radiusSize:{type:"number",precision:3,max:10,min:.001},sphereDetail:!0,radialSegments:!0,disableImpostor:!0},this.parameters,{assembly:null}),this.init(i)}return r&&(t.__proto__=r),((t.prototype=Object.create(r&&r.prototype)).constructor=t).prototype.init=function(t){var e=t||{},i=.5;this.structure.unitcell&&(i=Math.cbrt(this.structure.unitcell.volume)/200),e.radiusSize=bl(e.radiusSize,i),e.colorValue=bl(e.colorValue,"orange"),e.useInteriorColor=bl(e.useInteriorColor,!0),r.prototype.init.call(this,e)},t.prototype.getUnitcellData=function(t){return t.unitcell.getData(t)},t.prototype.create=function(){var t=this.structureView.getStructure();if(t.unitcell){var e=this.getUnitcellData(t);this.sphereBuffer=new Px(e.vertex,this.getBufferParams({sphereDetail:this.sphereDetail,disableImpostor:this.disableImpostor,dullInterior:!0})),this.cylinderBuffer=new Gw(e.edge,this.getBufferParams({openEnded:!0,radialSegments:this.radialSegments,disableImpostor:this.disableImpostor,dullInterior:!0})),this.dataList.push({sview:this.structureView,bufferList:[this.sphereBuffer,this.cylinderBuffer]})}},t.prototype.createData=function(t){},t.prototype.updateData=function(t,e){var i=e.sview.getStructure();if(i.unitcell){var r=this.getUnitcellData(i),n={},o={};t&&!t.position||(Object.assign(n,{position:r.vertex.position}),Object.assign(o,{position1:r.edge.position1,position2:r.edge.position2})),t&&!t.color||(Object.assign(n,{color:r.vertex.color}),Object.assign(o,{color:r.edge.color,color2:r.edge.color2})),t&&!t.radius||(Object.assign(n,{radius:r.vertex.radius}),Object.assign(o,{radius:r.edge.radius})),this.sphereBuffer.setAttributes(n),this.cylinderBuffer.setAttributes(o)}},t}(pw);ed.add("unitcell",NS);var FS=function(r){function t(t,e,i){r.call(this,t,e,i),this.type="validation",this.parameters=Object.assign({},this.parameters,{radiusType:null,radiusSize:null,radiusScale:null}),this.init(i)}return r&&(t.__proto__=r),((t.prototype=Object.create(r&&r.prototype)).constructor=t).prototype.init=function(t){var e=t||{};e.colorValue=bl(e.colorValue,"#f0027f"),e.useInteriorColor=bl(e.useInteriorColor,!0),r.prototype.init.call(this,e)},t.prototype.createData=function(t){if(t.validation){var e=t.validation.getClashData({structure:t,color:this.colorValue});return{bufferList:[new Gw(e,this.getBufferParams({openEnded:!1}))]}}},t}(pw);ed.add("validation",FS);var zS=new ri,US=new ri,jS=new ri,GS=new ri(0,1,0);var VS=Object.assign({radialSegments:60,openEnded:!1},ly),HS=function(i){function t(t,e){void 0===e&&(e={}),i.call(this,{position:new Float32Array(t.position1.length),color:t.color,picking:t.picking},e,function(t){void 0===t&&(t={});var e=new Qs(1,1,bl(t.radialSegments,60),1,bl(t.openEnded,!1));return e.applyMatrix((new ei).makeRotationX(-Math.PI/2)),e}(e)),this.updateNormals=!0,this._position=new Float32Array(t.position1.length),this.setAttributes(t,!0)}i&&(t.__proto__=i),(t.prototype=Object.create(i&&i.prototype)).constructor=t;var e={defaultParameters:{configurable:!0}};return e.defaultParameters.get=function(){return VS},t.prototype.applyPositionTransform=function(t,e,i){US.fromArray(this._position1,i),jS.fromArray(this._position2,i),t.lookAt(US,jS,GS);var r=this._radius[e];zS.set(r,r,US.distanceTo(jS)),t.scale(zS)},t.prototype.setAttributes=function(t,e){void 0===t&&(t={}),t.position1&&t.position2&&(Ud(t.position1,t.position2,this._position),this._position1=t.position1,this._position2=t.position2,t.position=this._position),t.radius&&(this._radius=t.radius),i.prototype.setAttributes.call(this,t,e)},Object.defineProperties(t.prototype,e),t}(yx);ad.add("cone",HS);var $S=function(t){void 0===t&&(t=[]),this.geometryList=t};$S.prototype.computeBoundingBox=function(){var e=this;this.boundingBox?this.boundingBox.empty():this.boundingBox=new Pi,this.geometryList.forEach(function(t){t.boundingBox||t.computeBoundingBox(),e.boundingBox.union(t.boundingBox)})};var WS=Object.assign({aspectRatio:1.5,radialSegments:50,openEnded:!1,disableImpostor:!1},ly),XS=function(t,e){void 0===e&&(e={}),this.group=new ya,this.wireframeGroup=new ya,this.pickingGroup=new ya,this.visible=!0,this.parameters=xl(e,this.defaultParameters),this.splitPosition=new Float32Array(t.position1.length),this.cylinderRadius=new Float32Array(t.radius.length);var i=this.makeAttributes(t),r={radialSegments:this.parameters.radialSegments,openEnded:this.parameters.openEnded,disableImpostor:this.parameters.disableImpostor};this.cylinderBuffer=new Gw(i.cylinder,r),this.coneBuffer=new HS(i.cone,r),this.geometry=new $S([this.cylinderBuffer.geometry,this.coneBuffer.geometry]),this.matrix=bl(e.matrix,new ei),this.picking=t.picking},qS={defaultParameters:{configurable:!0},matrix:{configurable:!0},pickable:{configurable:!0}};qS.defaultParameters.get=function(){return WS},qS.matrix.set=function(t){dy.prototype.setMatrix.call(this,t)},qS.matrix.get=function(){return this.group.matrix.clone()},qS.pickable.get=function(){return!!this.picking},XS.prototype.makeAttributes=function(t){void 0===t&&(t={});var e,i,r=this.splitPosition,n=this.cylinderRadius,o=this.parameters.aspectRatio,a={},s={};if(t.radius){for(e=0,i=n.length;e<i;++e)n[e]=t.radius[e]/o;a.radius=n,s.radius=t.radius}if(t.position1&&t.position2){var c=new ri,u=new ri,h=new ri,l=new ri;for(e=0,i=r.length;e<i;e+=3){c.fromArray(t.position1,e),u.fromArray(t.position2,e),h.subVectors(c,u);var p=h.length(),d=n[e/3]*o*2,f=Math.min(p,d);h.setLength(f),l.copy(u).add(h),l.toArray(r,e)}a.position1=t.position1,a.position2=r,s.position1=r,s.position2=t.position2}return t.color&&(a.color=t.color,a.color2=t.color,s.color=t.color),{cylinder:a,cone:s}},XS.prototype.getMesh=function(){return(new ya).add(this.cylinderBuffer.getMesh(),this.coneBuffer.getMesh())},XS.prototype.getWireframeMesh=function(){return(new ya).add(this.cylinderBuffer.getWireframeMesh(),this.coneBuffer.getWireframeMesh())},XS.prototype.getPickingMesh=function(){return(new ya).add(this.cylinderBuffer.getPickingMesh(),this.coneBuffer.getPickingMesh())},XS.prototype.setAttributes=function(t){void 0===t&&(t={});var e=this.makeAttributes(t);this.cylinderBuffer.setAttributes(e.cylinder),this.coneBuffer.setAttributes(e.cone)},XS.prototype.setParameters=function(t){void 0===t&&(t={}),(t=Object.assign({},t))&&void 0!==t.matrix&&(this.matrix=t.matrix),delete t.matrix,t&&void 0!==t.wireframe&&(this.parameters.wireframe=t.wireframe,this.setVisibility(this.visible)),this.cylinderBuffer.setParameters(t),this.coneBuffer.setParameters(t)},XS.prototype.setVisibility=function(t){dy.prototype.setVisibility.call(this,t)},XS.prototype.dispose=function(){this.cylinderBuffer.dispose(),this.coneBuffer.dispose()},Object.defineProperties(XS.prototype,qS),ad.add("arrow",XS);var YS=new ri,ZS=new ri,KS=new ri,JS=new ri(0,0,0),QS=function(i){function t(t,e){void 0===e&&(e={}),i.call(this,t,e,new Xr(1,1,1)),this.updateNormals=!0,this.setAttributes(t,!0)}return i&&(t.__proto__=i),((t.prototype=Object.create(i&&i.prototype)).constructor=t).prototype.applyPositionTransform=function(t,e,i){ZS.fromArray(this._heightAxis,i),KS.fromArray(this._depthAxis,i),t.lookAt(JS,ZS,KS),YS.set(this._size[e],KS.length(),ZS.length()),t.scale(YS)},t.prototype.setAttributes=function(t,e){void 0===t&&(t={}),t.size&&(this._size=t.size),t.heightAxis&&(this._heightAxis=t.heightAxis),t.depthAxis&&(this._depthAxis=t.depthAxis),i.prototype.setAttributes.call(this,t,e)},t}(yx);ad.add("box",QS);var tA=new ri,eA=new ri,iA=new ri,rA=new ri(0,0,0),nA=Object.assign({sphereDetail:2},ly),oA=function(i){function t(t,e){void 0===e&&(e={}),i.call(this,t,e,new es(1,bl(e.sphereDetail,2))),this.updateNormals=!0,this.setAttributes(t,!0)}i&&(t.__proto__=i),(t.prototype=Object.create(i&&i.prototype)).constructor=t;var e={defaultParameters:{configurable:!0}};return e.defaultParameters.get=function(){return nA},t.prototype.applyPositionTransform=function(t,e,i){eA.fromArray(this._majorAxis,i),iA.fromArray(this._minorAxis,i),t.lookAt(rA,eA,iA),tA.set(this._radius[e],iA.length(),eA.length()),t.scale(tA)},t.prototype.setAttributes=function(t,e){void 0===t&&(t={}),t.radius&&(this._radius=t.radius),t.majorAxis&&(this._majorAxis=t.majorAxis),t.minorAxis&&(this._minorAxis=t.minorAxis),i.prototype.setAttributes.call(this,t,e)},Object.defineProperties(t.prototype,e),t}(yx);ad.add("ellipsoid",oA);var aA=new ri,sA=new ri,cA=new ri,uA=new ri(0,0,0),hA=function(i){function t(t,e){void 0===e&&(e={}),i.call(this,t,e,new Qa(1,0)),this.updateNormals=!0,this.setAttributes(t,!0)}return i&&(t.__proto__=i),((t.prototype=Object.create(i&&i.prototype)).constructor=t).prototype.applyPositionTransform=function(t,e,i){sA.fromArray(this._heightAxis,i),cA.fromArray(this._depthAxis,i),t.lookAt(uA,sA,cA),aA.set(this._size[e],cA.length(),sA.length()),t.scale(aA)},t.prototype.setAttributes=function(t,e){void 0===t&&(t={}),t.size&&(this._size=t.size),t.heightAxis&&(this._heightAxis=t.heightAxis),t.depthAxis&&(this._depthAxis=t.depthAxis),i.prototype.setAttributes.call(this,t,e)},t}(yx);ad.add("octahedron",hA);var lA=new ri,pA=new ri,dA=new ri,fA=new ri(0,0,0),mA=function(i){function t(t,e){void 0===e&&(e={}),i.call(this,t,e,new Ka(1,0)),this.updateNormals=!0,this.setAttributes(t,!0)}return i&&(t.__proto__=i),((t.prototype=Object.create(i&&i.prototype)).constructor=t).prototype.applyPositionTransform=function(t,e,i){pA.fromArray(this._heightAxis,i),dA.fromArray(this._depthAxis,i),t.lookAt(fA,pA,dA),lA.set(this._size[e],dA.length(),pA.length()),t.scale(lA)},t.prototype.setAttributes=function(t,e){void 0===t&&(t={}),t.size&&(this._size=t.size),t.heightAxis&&(this._heightAxis=t.heightAxis),t.depthAxis&&(this._depthAxis=t.depthAxis),i.prototype.setAttributes.call(this,t,e)},t}(yx);ad.add("tetrahedron",mA);var gA=new ri,vA=new ri,yA=new ri,bA=new ri(0,0,0),xA=Object.assign({radiusRatio:.2,radialSegments:16,tubularSegments:32},ly),_A=function(i){function t(t,e){void 0===e&&(e={}),i.call(this,t,e,new us(1,bl(e.radiusRatio,.2),bl(e.radialSegments,16),bl(e.tubularSegments,32))),this.updateNormals=!0,this.setAttributes(t,!0)}i&&(t.__proto__=i),(t.prototype=Object.create(i&&i.prototype)).constructor=t;var e={defaultParameters:{configurable:!0}};return e.defaultParameters.get=function(){return xA},t.prototype.applyPositionTransform=function(t,e,i){vA.fromArray(this._majorAxis,i),yA.fromArray(this._minorAxis,i),t.lookAt(bA,vA,yA);var r=this._radius[e];gA.set(r,r,r),t.scale(gA)},t.prototype.setAttributes=function(t,e){void 0===t&&(t={}),t.radius&&(this._radius=t.radius),t.majorAxis&&(this._majorAxis=t.majorAxis),t.minorAxis&&(this._minorAxis=t.minorAxis),i.prototype.setAttributes.call(this,t,e)},Object.defineProperties(t.prototype,e),t}(yx);ad.add("torus",_A);var wA=function(t,e){var i=e||{};this.streamer=t,this.name=bl(i.name,""),this.path=bl(i.path,"")},SA={type:{configurable:!0},__objName:{configurable:!0},isBinary:{configurable:!0},isJson:{configurable:!0},isXml:{configurable:!0}};SA.type.get=function(){return""},SA.__objName.get=function(){return""},SA.isBinary.get=function(){return!1},SA.isJson.get=function(){return!1},SA.isXml.get=function(){return!1},wA.prototype.parse=function(){var t=this;return this.streamer.read().then(function(){return t._beforeParse(),t._parse(),t._afterParse(),t[t.__objName]})},wA.prototype._parse=function(){},wA.prototype._beforeParse=function(){},wA.prototype._afterParse=function(){de.Debug&&Yp.log(this[this.__objName])},Object.defineProperties(wA.prototype,SA);var AA=function(r){function t(t,e){var i=e||{};r.call(this,t,i),this.firstModelOnly=bl(i.firstModelOnly,!1),this.asTrajectory=bl(i.asTrajectory,!1),this.cAlphaOnly=bl(i.cAlphaOnly,!1),this.structure=new cx(this.name,this.path),this.structureBuilder=new yb(this.structure)}r&&(t.__proto__=r),(t.prototype=Object.create(r&&r.prototype)).constructor=t;var e={type:{configurable:!0},__objName:{configurable:!0}};return e.type.get=function(){return"structure"},e.__objName.get=function(){return"structure"},Object.defineProperties(t.prototype,e),t}(wA);var MA=function(e,i,t,r,n){void 0===t&&(t=""),void 0===n&&(n=[]),this.structure=e,this.index=i,this.description=t,this.entityType=function(t){switch(t=t.toLowerCase()){case"polymer":return 1;case"non-polymer":return 2;case"macrolide":return 3;case"water":return 4;default:return 0}}(r||""),(this.chainIndexList=n).forEach(function(t){e.chainStore.entityIndex[t]=i})},EA={type:{configurable:!0}};EA.type.get=function(){return function(t){switch(t){case 1:return"polymer";case 2:return"non-polymer";case 3:return"macrolide";case 4:return"water";default:return}}(this.entityType)},MA.prototype.getEntityType=function(){return this.entityType},MA.prototype.isPolymer=function(){return 1===this.entityType},MA.prototype.isNonPolymer=function(){return 2===this.entityType},MA.prototype.isMacrolide=function(){return 3===this.entityType},MA.prototype.isWater=function(){return 4===this.entityType},MA.prototype.eachChain=function(e){var i=this.structure.getChainProxy();this.chainIndexList.forEach(function(t){i.index=t,e(i)})},Object.defineProperties(MA.prototype,EA);var PA={a:1,b:1,c:1,alpha:90,beta:90,gamma:90,spacegroup:"P 1"},TA=function(t){void 0===t&&(t=PA),this.cartToFrac=new ei,this.fracToCart=new ei,this.a=t.a,this.b=t.b,this.c=t.c,this.alpha=t.alpha,this.beta=t.beta,this.gamma=t.gamma,this.spacegroup=t.spacegroup;var e=Gl(this.alpha),i=Gl(this.beta),r=Gl(this.gamma),n=Math.cos(e),o=Math.cos(i),a=Math.cos(r),s=Math.sin(i),c=Math.sin(r);if(this.volume=this.a*this.b*this.c*Math.sqrt(1-n*n-o*o-a*a+2*n*o*a),void 0===t.cartToFrac){var u=this.a*this.b*c/this.volume,h=(o*a-n)/(s*c);this.fracToCart.set(this.a,0,0,0,this.b*a,this.b*c,0,0,this.c*o,-this.c*s*h,1/u,0,0,0,0,1).transpose(),this.cartToFrac.getInverse(this.fracToCart)}else this.cartToFrac.copy(t.cartToFrac),this.fracToCart.getInverse(this.cartToFrac)};TA.prototype.getPosition=function(t){var r=new Float32Array(24);if(t.unitcell){var n=t.unitcell,o=t.center.clone().applyMatrix4(n.cartToFrac).floor(),a=new ri,s=0,e=function(t,e,i){a.set(t,e,i).add(o).applyMatrix4(n.fracToCart).toArray(r,s),s+=3};e(0,0,0),e(1,0,0),e(0,1,0),e(0,0,1),e(1,1,0),e(1,0,1),e(0,1,1),e(1,1,1)}return r},TA.prototype.getCenter=function(t){return function(t,e){void 0===e&&(e=new ri);for(var i=t.length,r=0;r<i;r+=3)e.x+=t[r],e.y+=t[r+1],e.z+=t[r+2];return e.divideScalar(i/3),e}(this.getPosition(t))},TA.prototype.getData=function(t,e){void 0===e&&(e={});var i=bl(e.colorValue,"orange"),r=bl(e.radius,Math.cbrt(this.volume)/200),n=new ki(i),o=new ri,a=this.getPosition(t),s=Vd(8,n.r,n.g,n.b),c=Gd(8,r),u=new Float32Array(36),h=new Float32Array(36),l=Vd(12,n.r,n.g,n.b),p=Gd(12,r),d=0;function f(t,e){o.fromArray(a,3*t).toArray(u,d),o.fromArray(a,3*e).toArray(h,d),d+=3}f(0,1),f(0,2),f(0,3),f(1,4),f(1,5),f(2,6),f(3,5),f(4,7),f(5,7),f(2,4),f(7,6),f(3,6);var m=new Ev(this,t);return{vertex:{position:a,color:s,radius:c,picking:m},edge:{position1:u,position2:h,color:l,color2:l,radius:p,picking:m}}};var CA={1:"h",2:"h",3:"i",4:"h",5:"g",6:"h",7:"h",8:"h",9:"h",10:"h",0:"h"},IA=["DAL","DAR","DSG","DAS","DCY","DGL","DGN","DHI","DIL","DLE","DLY","MED","DPN","DPR","DSN","DTH","DTR","DTY","DVA","DNE"],OA=["MOL_ID","MOLECULE","CHAIN","FRAGMENT","SYNONYM","EC","ENGINEERED","MUTATION","OTHER_DETAILS"],LA=/\s+/;function RA(t,e,i){var r=""+t;return e&&(r+=":"+e),i&&(r+="^"+i),r}var DA=function(r){function t(t,e){var i=e||{};r.call(this,t,i),this.hex=bl(i.hex,!1)}r&&(t.__proto__=r),(t.prototype=Object.create(r&&r.prototype)).constructor=t;var e={type:{configurable:!0}};return e.type.get=function(){return"pdb"},t.prototype._parse=function(){de.Debug&&Yp.time("PdbParser._parse "+this.name);var it=!1,t=this.streamer.peekLines(1)[0],e=t.substr(62,4),i=t.substr(72,4);e===i&&i.trim()&&(it=!0);var rt,nt,ot,at,st,ct,ut,ht,lt,pt,dt,ft,mt,gt,vt,yt,bt,xt,_t,wt,St,At,Mt,Et,Pt,Tt,Ct,It,Ot,Lt,Rt,Dt,kt,Bt="pqr"===this.type,Nt="pdbqt"===this.type,Ft=this.structure,zt=this.structureBuilder,Ut=this.hex,jt=10,Gt=10,Vt=this.firstModelOnly,Ht=this.asTrajectory,$t=this.cAlphaOnly,Wt=Ft.frames,Xt=Ft.boxes,qt=!1,Yt=Ft.biomolDict,Zt={},Kt={},Jt={},Qt=[],te={},ee={},ie={},re={},r={helices:[],sheets:[]},ne=r.helices,oe=r.sheets,ae=Ft.atomMap,se=Ft.atomStore;se.resize(Math.round(this.streamer.data.length/80)),(Bt||Nt)&&se.addField("partialCharge",1,"float32"),Bt&&se.addField("radius",1,"float32");var ce=Ft.getAtomProxy(),ue=Ft.getAtomProxy(),he=0,le=0,pe=!0;this.streamer.eachChunkOfLines(function(t){!function(t,e,i){for(var r,n=t;n<e;++n)if(ct=i[n],"ATOM  "===(ut=ct.substr(0,6))||"HETATM"===ut){if(pe&&(Ht?(qt?(rt=new Float32Array(3*se.count),Wt.push(rt)):rt=[],nt=0):Vt||(Zt={}),Ct=(Tt=1).toString(),pe=!(It=!0)),Vt&&0<le)continue;var o=void 0,a=void 0,s=void 0,c=void 0,u=void 0;if(Bt){if(u=10===(c=ct.split(LA)).length?1:0,gt=c[2],$t&&"CA"!==gt)continue;o=parseFloat(c[6-u]),a=parseFloat(c[7-u]),s=parseFloat(c[8-u])}else{if(gt=ct.substr(12,4).trim(),$t&&"CA"!==gt)continue;o=parseFloat(ct.substr(30,8)),a=parseFloat(ct.substr(38,8)),s=parseFloat(ct.substr(46,8))}if(Ht){var h=3*nt;if(rt[h+0]=o,rt[h+1]=a,rt[h+2]=s,nt+=1,qt)continue}var l=void 0;Bt?(ht=parseInt(c[1]),l="",vt="H"===ct[0]?1:0,lt=u?"":c[4],pt=parseInt(c[5-u]),mt="",dt=c[3],bt="",ft=1):(ht=parseInt(ct.substr(6,5),jt),Ut&&99999===ht&&(jt=16),vt="H"===ct[0]?1:0,lt=ct[21].trim(),pt=parseInt(ct.substr(22,4),Gt),Ut&&9999===pt&&(Gt=16),mt=ct[26].trim(),dt=ct.substr(17,4).trim()||"MOL",yt=parseFloat(ct.substr(60,6)),bt=ct[16].trim(),ft=parseFloat(ct.substr(54,6)),it||(Nt?l=ct.substr(12,2).trim():(l=ct.substr(76,2).trim(),lt||(lt=ct.substr(72,4).trim())))),se.growIfFull(),se.atomTypeId[he]=ae.add(gt,l),se.x[he]=o,se.y[he]=a,se.z[he]=s,se.serial[he]=ht,se.altloc[he]=bt.charCodeAt(0),se.occupancy[he]=isNaN(ft)?0:ft,Bt?(se.partialCharge[he]=parseFloat(c[9-u]),se.radius[he]=parseFloat(c[10-u])):(se.bfactor[he]=isNaN(yt)?0:yt,Nt&&(se.partialCharge[he]=parseFloat(ct.substr(70,6))));var p=RA(pt,lt,mt);!vt||ee[p]||IA.includes(dt)?It||Ot===lt||(Ct=(Tt+=1).toString()):Ot===lt&&Rt===dt&&(Pg.includes(dt)||Lt===pt&&Dt===mt)||(Ct=(Tt+=1).toString(),Lt=pt,Rt=dt,Dt=mt),zt.addAtom(le,lt,Ct,dt,pt,vt,void 0,mt),Zt[ht]=he,he+=1,It=!1,Ot=lt}else if("CONECT"===ut){var d=Zt[parseInt(ct.substr(6,5))],f=[11,16,21,26],m={};if(void 0===d)continue;for(var g=0;g<4;++g){var v=parseInt(ct.substr(f[g],5));if(!Number.isNaN(v)&&void 0!==(v=Zt[v]))if(d<v?(ce.index=d,ue.index=v):(ce.index=v,ue.index=d),void 0!==m[v])Ft.bondStore.bondOrder[m[v]]+=1;else{var y=ce.index+"|"+ue.index;void 0===Jt[y]&&(Jt[y]=!0,m[v]=Ft.bondStore.count,Ft.bondStore.addBond(ce,ue,1))}}}else if("HELIX "===ut){xt=ct[19].trim(),_t=parseInt(ct.substr(21,4)),wt=ct[25].trim(),St=ct[31].trim(),At=parseInt(ct.substr(33,4)),Mt=ct[37].trim();var b=parseInt(ct.substr(39,1));b=(CA[b]||CA[0]).charCodeAt(0),ne.push([xt,_t,wt,St,At,Mt,b])}else if("SHEET "===ut)xt=ct[21].trim(),_t=parseInt(ct.substr(22,4)),wt=ct[26].trim(),St=ct[32].trim(),At=parseInt(ct.substr(33,4)),Mt=ct[37].trim(),oe.push([xt,_t,wt,St,At,Mt]);else if("HETNAM"===ut)te[ct.substr(11,3)]=ct.substr(15).trim();else if("SEQRES"===ut){var x=ct[11].trim();x!==kt&&(re[x]=[],kt=x),(r=re[x]).push.apply(r,ct.substr(19).trim().split(LA))}else if("MODRES"===ut){var _=ct.substr(12,3).trim(),w=ct[16].trim(),S=ct[22].trim(),A=parseInt(ct.substr(18,4).trim()),M=RA(A,w,S);ee[M]={resname:_,chainname:w,inscode:S,resno:A}}else if("COMPND"===ut){var E=ct.substr(10,70).trim(),P=E.indexOf(":"),T=E.substring(0,P),C=void 0;OA.includes(T)?(Pt=T,C=E.substring(P+2)):C=E,C=C.replace(/;$/,""),"MOL_ID"===Pt?(Et={chainList:[],name:""},Qt.push(Et)):"MOLECULE"===Pt?(Et.name&&(Et.name+=" "),Et.name+=C):"CHAIN"===Pt&&Array.prototype.push.apply(Et.chainList,C.split(/\s*,\s*/))}else if(ct.startsWith("TER")){var I=Ft.getChainProxy(Ft.chainStore.count-1);ie[I.chainname]=I.index,Ct=(Tt+=1).toString(),It=!0}else if("REMARK"===ut&&"350"===ct.substr(7,3)){if("BIOMOLECULE:"===ct.substr(11,12)){var O=ct.substr(23).trim();/^(0|[1-9][0-9]*)$/.test(O)&&(O="BU"+O),ot=new fb(O),Yt[O]=ot}else if("BIOMT"===ct.substr(13,5)){var L=ct.split(/\s+/),R=parseInt(ct[18])-1;0===R&&(st=new ei,at.matrixList.push(st));var D=st.elements;D[0+R]=parseFloat(L[4]),D[4+R]=parseFloat(L[5]),D[8+R]=parseFloat(L[6]),D[12+R]=parseFloat(L[7])}else if("APPLY THE FOLLOWING TO CHAINS:"===ct.substr(11,30)||"                   AND CHAINS:"===ct.substr(11,30)){"APPLY"===ct.substr(11,5)&&(at=ot.addPart());for(var k=ct.substr(41,30).split(","),B=0,N=k.length;B<N;++B){var F=k[B].trim();F&&at.chainList.push(F)}}}else if("HEADER"===ut)Ft.id=ct.substr(62,4);else if("TITLE "===ut)Ft.title+=(Ft.title?" ":"")+ct.substr(10,70).trim();else if("MODEL "===ut)pe=!0;else if("ENDMDL"===ut||"END"===ct.trim()){if(pe)continue;Ht&&!qt&&(Wt.push(new Float32Array(rt)),qt=!0),le+=1,pe=!0}else if("MTRIX"===ct.substr(0,5)){if("1"===ct[59])continue;ot&&"NCS"===ot.name||(ot=new fb("NCS"),Yt.NCS=ot,at=ot.addPart());var z=ct.split(/\s+/),U=parseInt(ct[5])-1;0===U&&(st=new ei,at.matrixList.push(st));var j=st.elements;j[0+U]=parseFloat(z[2]),j[4+U]=parseFloat(z[3]),j[8+U]=parseFloat(z[4]),j[12+U]=parseFloat(z[5])}else if("ORIGX"===ct.substr(0,5)){Kt.origx||(Kt.origx=new ei);var G=ct.split(/\s+/),V=parseInt(ct[5])-1,H=Kt.origx.elements;H[0+V]=parseFloat(G[1]),H[4+V]=parseFloat(G[2]),H[8+V]=parseFloat(G[3]),H[12+V]=parseFloat(G[4])}else if("SCALE"===ct.substr(0,5)){Kt.scale||(Kt.scale=new ei);var $=ct.split(/\s+/),W=parseInt(ct[5])-1,X=Kt.scale.elements;X[0+W]=parseFloat($[1]),X[4+W]=parseFloat($[2]),X[8+W]=parseFloat($[3]),X[12+W]=parseFloat($[4])}else if("CRYST1"===ut){var q=parseFloat(ct.substr(6,9)),Y=parseFloat(ct.substr(15,9)),Z=parseFloat(ct.substr(24,9)),K=parseFloat(ct.substr(33,7)),J=parseFloat(ct.substr(40,7)),Q=parseFloat(ct.substr(47,7)),tt=ct.substr(55,11).trim(),et=new Float32Array(9);et[0]=q,et[4]=Y,et[8]=Z,Xt.push(et),0===le&&(Kt.a=q,Kt.b=Y,Kt.c=Z,Kt.alpha=K,Kt.beta=J,Kt.gamma=Q,Kt.spacegroup=tt)}}(0,t.length,t)}),zt.finalize();var n=Qt.length;if(n){Ft.eachChain(function(t){t.entityIndex=n}),Qt.forEach(function(t,e){var i=t.chainList.map(function(t){return ie[t]});Ft.entityList.push(new MA(Ft,e,t.name,"polymer",i))});var o=Qt.length,a=Ft.getResidueProxy(),s={};Ft.eachChain(function(t){t.entityIndex===n&&(a.index=t.residueOffset,s[a.resname]||(s[a.resname]=[]),s[a.resname].push(t.index))}),Object.keys(s).forEach(function(t){var e=s[t],i="non-polymer",r=te[t]||t;Pg.includes(t)&&(i=r="water"),Ft.entityList.push(new MA(Ft,o,r,i,e)),o+=1})}void 0!==Kt.a?Ft.unitcell=new TA(Kt):Ft.unitcell=void 0,(ne.length||oe.length)&&bb(Ft,r),Ft.finalizeAtoms(),it||Ab(Ft),Mb(Ft),Ft.finalizeBonds(),ne.length||oe.length||_b(Ft),Ib(Ft),de.Debug&&Yp.timeEnd("PdbParser._parse "+this.name)},Object.defineProperties(t.prototype,e),t}(AA);id.add("pdb",DA),id.add("pdb1",DA),id.add("ent",DA);var kA=/\s+/,BA=/'((?:(?!'\s).)*)'|"((?:(?!"\s).)*)"|(\S+)/g,NA=/"/g,FA=/^['"]+|['"]+$/g;function zA(t){return!t||t[0]!==t[t.length-1]||"'"!==t[0]&&'"'!==t[0]?t:t.substring(1,t.length-1)}function UA(e,t){Array.isArray(e[t])||Object.keys(e).forEach(function(t){e[t]=[e[t]]})}function jA(t){return"?"!==t}function GA(t,e){return jA(t)?t:e}function VA(t){switch(t.toLowerCase()){case"?":case"sing":return 1;case"doub":return 2;case"trip":return 3;case"quad":return 4}return 0}var HA=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),(e.prototype=Object.create(t&&t.prototype)).constructor=e;var i={type:{configurable:!0}};return i.type.get=function(){return"cif"},e.prototype._parse=function(){Yp.time("CifParser._parse "+this.name);var R,D,k,B,N,F,z,U,j,G,V,H,$,W,X,q,Y,Z,K,J,Q,tt=this.structure,et=this.structureBuilder,it=this.firstModelOnly,rt=this.asTrajectory,nt=this.cAlphaOnly,ot=tt.frames,at={},st={},ct={},ut=!1,ht=null,lt=!1,pt=!1,dt=!1,ft=[],mt=null,gt=null,vt=null,yt=null,bt=[],xt=tt.atomMap,_t=tt.atomStore;_t.resize(this.streamer.data.length/100);var wt,St=0,At=0;if(this.streamer.eachChunkOfLines(function(t){!function(t,e,i){for(var r=t;r<e;++r)if(k=i[r],((B=k.trim())||ut||pt)&&"#"!==B[0])if("data_"===B.substring(0,5))at.data=B.substring(5).trim();else if(";"===B[0])ut?(pt?(mt===ft.length&&(mt=0),ft[mt].push(ht),mt+=1):!1===vt?at[gt]=ht:at[gt][vt]=ht,ut=!1,ht=null):(ut=!0,ht=B.substring(1));else if("loop_"===B)dt=pt=!0,ft.length=0,bt.length=0,mt=0;else if("_"===B[0]){var n,o,a;if(pt&&!dt&&(pt=!1),pt)o=(n=B.split("."))[0].substring(1),a=n[1],1===n.length?(a=!1,at[o]||(at[o]=[]),ft.push(at[o])):(at[o]||(at[o]={}),at[o][a]?de.Debug&&Yp.warn(o,a,"already exists"):(at[o][a]=[],ft.push(at[o][a]),bt.push(a))),gt=o,vt=a,yt=!0;else{var s=B.match(BA),c=s[0],u=s[1];o=(n=c.split("."))[0].substring(1),a=n[1],1===n.length?(a=!1,at[o]=u):(at[o]||(at[o]={}),at[o][a]?de.Debug&&Yp.warn(o,a,"already exists"):at[o][a]=u),u||(lt=!0),gt=o,vt=a}}else if(ut)ht+=k;else if(pt){if(!B)continue;if("atom_site"===gt){var h=B.split(kA);yt&&(N=bt.indexOf("auth_asym_id"),F=bt.indexOf("auth_seq_id"),z=bt.indexOf("label_atom_id"),U=bt.indexOf("label_comp_id"),j=bt.indexOf("label_asym_id"),G=bt.indexOf("label_entity_id"),V=bt.indexOf("label_alt_id"),Y=bt.indexOf("Cartn_x"),Z=bt.indexOf("Cartn_y"),K=bt.indexOf("Cartn_z"),$=bt.indexOf("id"),W=bt.indexOf("type_symbol"),H=bt.indexOf("group_PDB"),J=bt.indexOf("B_iso_or_equiv"),X=bt.indexOf("pdbx_PDB_model_num"),q=bt.indexOf("pdbx_PDB_ins_code"),Q=bt.indexOf("occupancy"),yt=!1,wt=parseInt(h[X]),rt&&(R=[],D=0));var l=parseInt(h[X]);if(wt!==l&&(rt&&(0===At&&ot.push(new Float32Array(R)),R=new Float32Array(3*_t.count),ot.push(R),D=0),At+=1),wt=l,it&&0<At)continue;var p=h[z].replace(NA,"");if(nt&&"CA"!==p)continue;var d=parseFloat(h[Y]),f=parseFloat(h[Z]),m=parseFloat(h[K]);if(rt){var g=3*D;if(R[g+0]=d,R[g+1]=f,R[g+2]=m,D+=1,0<At)continue}var v=h[U],y=parseInt(h[F]),b=h[q];b="?"===b?"":b;var x=h[N],_=h[j],w="H"===h[H][0]?1:0,S=h[W],A=parseFloat(h[J]),M=parseFloat(h[Q]),E=h[V];if(E="."===E?"":E,_t.growIfFull(),_t.atomTypeId[St]=xt.add(p,S),_t.x[St]=d,_t.y[St]=f,_t.z[St]=m,_t.serial[St]=parseInt(h[$]),_t.bfactor[St]=isNaN(A)?0:A,_t.occupancy[St]=isNaN(M)?0:M,_t.altloc[St]=E.charCodeAt(0),et.addAtom(At,x,_,v,y,w,void 0,b),de.Debug){var P=st[_];void 0!==P&&P!==x&&de.Debug&&Yp.warn(P,x)}st[_]=x;var T=h[G];ct[T]||(ct[T]=new Set),ct[T].add(tt.chainStore.count-1),St+=1}else{var C=B.match(BA),I=C.length;mt===ft.length&&(mt=0);for(var O=0;O<I;++O)ft[mt+O].push(C[O]);mt+=I}dt=!1}else if("'"===B[0]&&"'"===B[B.length-1]){var L=B.substring(1,B.length-1);!1===vt?at[gt]=L:at[gt][vt]=L}else lt?!1===vt?at[gt]=B:at[gt][vt]=B:de.Debug&&Yp.log("CifParser._parse: unknown state",B);else lt=pt=ut=!1,ft.length=0,yt=vt=gt=mt=null,bt.length=0}(0,t.length,t)}),at.chem_comp&&at.chem_comp_atom)!function(t,e,i){var r,n,o=e.atomStore,a=e.atomMap,s=t.chem_comp,c=t.chem_comp_atom,u=t.chem_comp_bond;s&&(s.name&&(e.title=s.name.trim().replace(FA,"")),s.id&&(e.id=s.id.trim().replace(FA,"")));var h={};if(c){var l,p,d,f;for(UA(c,"comp_id"),n=c.comp_id.length,r=0;r<n;++r)o.growIfFull(),l=c.atom_id[r].replace(NA,""),p=c.type_symbol[r],h[l]=r,o.atomTypeId[r]=a.add(l,p),o.x[r]=c.model_Cartn_x[r],o.y[r]=c.model_Cartn_y[r],o.z[r]=c.model_Cartn_z[r],o.serial[r]=r,d=c.pdbx_component_comp_id[r],f=c.pdbx_residue_numbering?c.pdbx_residue_numbering[r]:1,i.addAtom(0,"","",d,f,!0);for(r=0;r<n;++r){var m=r+n;o.growIfFull(),l=c.atom_id[r].replace(NA,""),p=c.type_symbol[r],o.atomTypeId[m]=a.add(l,p),o.x[m]=c.pdbx_model_Cartn_x_ideal[r],o.y[m]=c.pdbx_model_Cartn_y_ideal[r],o.z[m]=c.pdbx_model_Cartn_z_ideal[r],o.serial[m]=m,d=c.pdbx_component_comp_id[r],f=c.pdbx_residue_numbering?c.pdbx_residue_numbering[r]:1,i.addAtom(1,"","",d,f,!0)}}if(c&&u){var g,v,y;UA(u,"comp_id"),n=u.comp_id.length;var b=c.comp_id.length,x=e.getAtomProxy(),_=e.getAtomProxy();for(r=0;r<n;++r)g=u.atom_id_1[r].replace(NA,""),v=u.atom_id_2[r].replace(NA,""),y=VA(u.value_order[r]),x.index=h[g],_.index=h[v],e.bondStore.growIfFull(),e.bondStore.addBond(x,_,y),x.index+=b,_.index+=b,e.bondStore.growIfFull(),e.bondStore.addBond(x,_,y)}}(at,tt,et),et.finalize(),tt.finalizeAtoms(),tt.finalizeBonds(),Db(tt);else if(at.atom_site_type_symbol&&at.atom_site_label&&at.atom_site_fract_x)!function(t,e,c){var u=e.atomStore,i=e.atomMap;t.data&&(e.id=t.data,e.name=t.data),e.unitcell=new TA({a:parseFloat(t.cell_length_a),b:parseFloat(t.cell_length_b),c:parseFloat(t.cell_length_c),alpha:parseFloat(t.cell_angle_alpha),beta:parseFloat(t.cell_angle_beta),gamma:parseFloat(t.cell_angle_gamma),spacegroup:zA(t["symmetry_space_group_name_H-M"])});for(var h=new ri,r=new ri,l=t.atom_site_type_symbol.length,n=0;n<l;++n){u.growIfFull();var o=t.atom_site_label[n],a=t.atom_site_type_symbol[n];u.atomTypeId[n]=i.add(o,a),h.set(t.atom_site_fract_x[n],t.atom_site_fract_y[n],t.atom_site_fract_z[n]),h.applyMatrix4(e.unitcell.fracToCart),r.add(h),u.x[n]=h.x,u.y[n]=h.y,u.z[n]=h.z,t.atom_site_occupancy&&(u.occupancy[n]=parseFloat(t.atom_site_occupancy[n])),u.serial[n]=n,c.addAtom(0,"","","HET",1,!0)}r.divideScalar(l),e.center=r,Ib(e);var p=new ri,d=new ri,f=e.biomolDict.SUPERCELL.partList[0].matrixList,m=l;function g(t){return i.get(u.atomTypeId[t]).covalent}for(var v=new ei,s=function(a){var s=g(a);h.set(u.x[a],u.y[a],u.z[a]),f.forEach(function(t){if(!v.equals(t)){p.copy(h),p.applyMatrix4(t);for(var e=0;e<l;++e){d.set(u.x[e],u.y[e],u.z[e]);var i=p.distanceToSquared(d),r=g(e)+s,n=r+.3,o=r-.5;if(i<n*n&&o*o<i)return u.growIfFull(),u.atomTypeId[m]=u.atomTypeId[a],u.x[m]=p.x,u.y[m]=p.y,u.z[m]=p.z,u.occupancy[m]=u.occupancy[a],u.serial[m]=m,u.altloc[m]="A".charCodeAt(0),c.addAtom(0,"","","HET",1,!0),void(m+=1)}}})},y=0;y<l;++y)s(y)}(at,tt,et),et.finalize(),tt.finalizeAtoms(),Mb(tt),tt.finalizeBonds();else{var t=function(t,e,i){var r,n,o,a,s=[],c=[],u=t.struct_conf;if(u)for(UA(u,"id"),r=0,n=u.beg_auth_seq_id.length;r<n;++r){var h=parseInt(u.pdbx_PDB_helix_class[r]);Number.isNaN(h)||(o=u.pdbx_beg_PDB_ins_code[r],a=u.pdbx_end_PDB_ins_code[r],s.push([i[u.beg_label_asym_id[r]],parseInt(u.beg_auth_seq_id[r]),GA(o,""),i[u.end_label_asym_id[r]],parseInt(u.end_auth_seq_id[r]),GA(a,""),(CA[h]||CA[0]).charCodeAt(0)]))}var l=t.struct_sheet_range;if(l)for(UA(l,"id"),r=0,n=l.beg_auth_seq_id.length;r<n;++r)o=l.pdbx_beg_PDB_ins_code[r],a=l.pdbx_end_PDB_ins_code[r],c.push([i[l.beg_label_asym_id[r]],parseInt(l.beg_auth_seq_id[r]),GA(o,""),i[l.end_label_asym_id[r]],parseInt(l.end_auth_seq_id[r]),GA(a,"")]);return!(!u&&!l)&&{helices:s,sheets:c}}(at,0,st);if(function(t,e,p){var o={},d=e.biomolDict;if(t.pdbx_struct_oper_list){var n=t.pdbx_struct_oper_list;UA(n,"id"),n.id.forEach(function(t,e){var i=new ei,r=i.elements;r[0]=parseFloat(n["matrix[1][1]"][e]),r[1]=parseFloat(n["matrix[1][2]"][e]),r[2]=parseFloat(n["matrix[1][3]"][e]),r[4]=parseFloat(n["matrix[2][1]"][e]),r[5]=parseFloat(n["matrix[2][2]"][e]),r[6]=parseFloat(n["matrix[2][3]"][e]),r[8]=parseFloat(n["matrix[3][1]"][e]),r[9]=parseFloat(n["matrix[3][2]"][e]),r[10]=parseFloat(n["matrix[3][3]"][e]),r[3]=parseFloat(n["vector[1]"][e]),r[7]=parseFloat(n["vector[2]"][e]),r[11]=parseFloat(n["vector[3]"][e]),i.transpose(),o[t]=i})}if(t.pdbx_struct_assembly_gen){var f=t.pdbx_struct_assembly_gen;UA(f,"assembly_id");var m=function(t){var n={};return t.replace(/[()']/g,"").split(",").forEach(function(t){if(t.includes("-"))for(var e=t.split("-"),i=parseInt(e[0]),r=parseInt(e[1]);i<=r;++i)n[i]=o[i];else n[t]=o[t]}),n};f.assembly_id.forEach(function(t,e){var r={},i=f.oper_expression[e].replace(/['"]\(|['"]/g,"");if(i.includes(")(")||0<i.indexOf("(")){i=i.split("(");var n=m(i[0]),o=m(i[1]);Object.keys(n).forEach(function(i){Object.keys(o).forEach(function(t){var e=new ei;e.multiplyMatrices(n[i],o[t]),r[i+"x"+t]=e})})}else r=m(i);var a=[];for(var s in r)a.push(r[s]);var c=t;/^(0|[1-9][0-9]*)$/.test(c)&&(c="BU"+c);for(var u=f.asym_id_list[e].split(","),h=0,l=u.length;h<l;++h)u[h]=p[u[h]];void 0===d[c]&&(d[c]=new fb(c)),d[c].addPart(a,u)})}if(t.struct_ncs_oper){var a=t.struct_ncs_oper;UA(a,"id"),d.NCS=new fb("NCS");var s=d.NCS.addPart();a.id.forEach(function(t,e){if("given"!==a.code[e]){var i=new ei,r=i.elements;r[0]=parseFloat(a["matrix[1][1]"][e]),r[1]=parseFloat(a["matrix[1][2]"][e]),r[2]=parseFloat(a["matrix[1][3]"][e]),r[4]=parseFloat(a["matrix[2][1]"][e]),r[5]=parseFloat(a["matrix[2][2]"][e]),r[6]=parseFloat(a["matrix[2][3]"][e]),r[8]=parseFloat(a["matrix[3][1]"][e]),r[9]=parseFloat(a["matrix[3][2]"][e]),r[10]=parseFloat(a["matrix[3][3]"][e]),r[3]=parseFloat(a["vector[1]"][e]),r[7]=parseFloat(a["vector[2]"][e]),r[11]=parseFloat(a["vector[3]"][e]),i.transpose(),s.matrixList.push(i)}}),0===s.matrixList.length&&delete d.NCS}var i={};if(t.cell){var r=t.cell,c=parseFloat(r.length_a),u=parseFloat(r.length_b),h=parseFloat(r.length_c),l=new Float32Array(9);l[0]=c,l[4]=u,l[8]=h,e.boxes.push(l),i.a=c,i.b=u,i.c=h,i.alpha=parseFloat(r.angle_alpha),i.beta=parseFloat(r.angle_beta),i.gamma=parseFloat(r.angle_gamma)}t.symmetry&&(i.spacegroup=zA(t.symmetry["space_group_name_H-M"]));var g=new ei;if(t.database_PDB_matrix){var v=t.database_PDB_matrix,y=g.elements;y[0]=parseFloat(v["origx[1][1]"]),y[1]=parseFloat(v["origx[1][2]"]),y[2]=parseFloat(v["origx[1][3]"]),y[4]=parseFloat(v["origx[2][1]"]),y[5]=parseFloat(v["origx[2][2]"]),y[6]=parseFloat(v["origx[2][3]"]),y[8]=parseFloat(v["origx[3][1]"]),y[9]=parseFloat(v["origx[3][2]"]),y[10]=parseFloat(v["origx[3][3]"]),y[3]=parseFloat(v["origx_vector[1]"]),y[7]=parseFloat(v["origx_vector[2]"]),y[11]=parseFloat(v["origx_vector[3]"]),g.transpose(),i.origx=g}var b=new ei;if(t.atom_sites){var x=t.atom_sites,_=b.elements;_[0]=parseFloat(x["fract_transf_matrix[1][1]"]),_[1]=parseFloat(x["fract_transf_matrix[1][2]"]),_[2]=parseFloat(x["fract_transf_matrix[1][3]"]),_[4]=parseFloat(x["fract_transf_matrix[2][1]"]),_[5]=parseFloat(x["fract_transf_matrix[2][2]"]),_[6]=parseFloat(x["fract_transf_matrix[2][3]"]),_[8]=parseFloat(x["fract_transf_matrix[3][1]"]),_[9]=parseFloat(x["fract_transf_matrix[3][2]"]),_[10]=parseFloat(x["fract_transf_matrix[3][3]"]),_[3]=parseFloat(x["fract_transf_vector[1]"]),_[7]=parseFloat(x["fract_transf_vector[2]"]),_[11]=parseFloat(x["fract_transf_vector[3]"]),b.transpose(),i.scale=b}void 0!==i.a?e.unitcell=new TA(i):e.unitcell=void 0}(at,tt,st),function(t,e,i){var r=t.struct_conn;if(r){UA(r,"id");for(var n=/"/g,o=e.getAtomProxy(),a=e.getAtomProxy(),s={},c=0,u=r.id.length;c<u;++c){var h=r.conn_type_id[c];if("hydrog"!==h&&"mismat"!==h&&"saltbr"!==h&&"1_555"===r.ptnr1_symmetry[c]&&"1_555"===r.ptnr2_symmetry[c]){var l=r.pdbx_ptnr1_PDB_ins_code[c],p=r.pdbx_ptnr1_label_alt_id[c],d=r.ptnr1_auth_seq_id[c]+(jA(l)?"^"+l:"")+":"+i[r.ptnr1_label_asym_id[c]]+"."+r.ptnr1_label_atom_id[c].replace(n,"")+(jA(p)?"%"+p:""),f=s[d];if(!f){var m=new Lp(d);if(m.selection.error){de.Debug&&Yp.warn("invalid selection for connection",d);continue}f=e.getAtomIndices(m),s[d]=f}var g=r.pdbx_ptnr2_PDB_ins_code[c],v=r.pdbx_ptnr2_label_alt_id[c],y=r.ptnr2_auth_seq_id[c]+(jA(g)?"^"+g:"")+":"+i[r.ptnr2_label_asym_id[c]]+"."+r.ptnr2_label_atom_id[c].replace(n,"")+(jA(v)?"%"+v:""),b=s[y];if(!b){var x=new Lp(y);if(x.selection.error){de.Debug&&Yp.warn("invalid selection for connection",y);continue}b=e.getAtomIndices(x),s[y]=b}var _=f.length,w=b.length;if(w<_){var S=_;_=w,w=S;var A=f;f=b,b=A}if(0!==_&&0!==w)for(var M=0;M<w;++M)o.index=f[M%_],a.index=b[M],o&&a?e.bondStore.addBond(o,a,VA(r.pdbx_value_order[c])):Yp.log("atoms for connection not found");else de.Debug&&Yp.warn("no atoms found for",d,y)}}}}(at,tt,st),function(t,e,i){if(t.entity){UA(t.entity,"id");for(var r=t.entity,n=r.id.length,o=0;o<n;++o){var a=r.pdbx_description[o],s=r.type[o],c=Array.from(i[r.id[o]]);e.entityList[o]=new MA(e,o,a,s,c)}}}(at,tt,ct),at.struct&&at.struct.title&&(tt.title=at.struct.title.trim().replace(FA,"")),at.entry&&at.entry.id&&(tt.id=at.entry.id.trim().replace(FA,"")),at.pdbx_audit_revision_history){if(at.pdbx_audit_revision_history.revision_date){UA(at.pdbx_audit_revision_history,"revision_date");var e=at.pdbx_audit_revision_history.revision_date.filter(jA);e.length&&(tt.header.releaseDate=e[0])}if(at.pdbx_database_status.recvd_initial_deposition_date){UA(at.pdbx_database_status,"recvd_initial_deposition_date");var i=at.pdbx_database_status.recvd_initial_deposition_date.filter(jA);i.length&&(tt.header.depositionDate=i[0])}}else if(at.database_PDB_rev){if(at.database_PDB_rev.date){UA(at.database_PDB_rev,"date");var r=at.database_PDB_rev.date.filter(jA);r.length&&(tt.header.releaseDate=r[0])}if(at.database_PDB_rev.date_original){UA(at.database_PDB_rev,"date_original");var n=at.database_PDB_rev.date_original.filter(jA);n.length&&(tt.header.depositionDate=n[0])}}at.reflns&&at.reflns.d_resolution_high?jA(at.reflns.d_resolution_high)&&(tt.header.resolution=parseFloat(at.reflns.d_resolution_high)):at.refine&&at.refine.ls_d_res_high&&jA(at.refine.ls_d_res_high)&&(tt.header.resolution=parseFloat(at.refine.ls_d_res_high)),at.refine&&at.refine.ls_R_factor_R_free&&jA(at.refine.ls_R_factor_R_free)&&(tt.header.rFree=parseFloat(at.refine.ls_R_factor_R_free)),at.refine&&at.refine.ls_R_factor_R_work&&jA(at.refine.ls_R_factor_R_work)&&(tt.header.rWork=parseFloat(at.refine.ls_R_factor_R_work)),at.exptl&&at.exptl.method&&(UA(at.exptl,"method"),tt.header.experimentalMethods=at.exptl.method.map(function(t){return t.replace(FA,"")})),et.finalize(),tt.finalizeAtoms(),Mb(tt),tt.finalizeBonds(),t?bb(tt,t):_b(tt),Ib(tt),tt.extraData.cif=at}de.Debug&&Yp.timeEnd("CifParser._parse "+this.name)},Object.defineProperties(e.prototype,i),e}(AA);id.add("cif",HA),id.add("mcif",HA),id.add("mmcif",HA);var $A=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),(e.prototype=Object.create(t&&t.prototype)).constructor=e;var i={type:{configurable:!0}};return i.type.get=function(){return"gro"},e.prototype._parse=function(){de.Debug&&Yp.time("GroParser._parse "+this.name);var p,d,t=this.structure,f=this.structureBuilder,m=this.firstModelOnly,g=this.asTrajectory,v=this.cAlphaOnly,y=t.frames,b=t.boxes,e=this.streamer.peekLines(3);t.title=e[0].trim();var x,_,w,S,A=5+(e[2].length-e[2].lastIndexOf(".")-1),M=20,E=20+A,P=20+2*A,T=parseInt(e[1]),C=T+3,I=t.atomMap,O=t.atomStore;O.resize(T);var L=0,R=0,D=0;this.streamer.eachChunkOfLines(function(t){!function(t,e,i){for(var r=t;r<e;++r){var n=++D-1,o=i[r];if(o)if(n%C==0)g&&(p=new Float32Array(3*T),y.push(p),d=0);else if(n%C==1);else if(n%C==C-1){var a=o.trim().split(/\s+/),s=new Float32Array(9);if(s[0]=10*parseFloat(a[0]),s[4]=10*parseFloat(a[1]),s[8]=10*parseFloat(a[2]),b.push(s),m)return;R+=1}else{if(x=o.substr(10,5).trim(),v&&"CA"!==x)continue;var c=10*parseFloat(o.substr(M,A)),u=10*parseFloat(o.substr(E,A)),h=10*parseFloat(o.substr(P,A));if(g){var l=3*d;if(p[l+0]=c,p[l+1]=u,p[l+2]=h,d+=1,C<n)continue}_=o.substr(5,5).trim(),w=parseInt(o.substr(0,5)),S=parseInt(o.substr(15,5)),O.growIfFull(),O.atomTypeId[L]=I.add(x),O.x[L]=c,O.y[L]=u,O.z[L]=h,O.serial[L]=S,f.addAtom(R,"","",_,w,0,"l"),L+=1}}}(0,t.length,t)}),f.finalize(),t.finalizeAtoms(),Ab(t),Mb(t),t.finalizeBonds(),_b(t),de.Debug&&Yp.timeEnd("GroParser._parse "+this.name)},Object.defineProperties(e.prototype,i),e}(AA);id.add("gro",$A);var WA=["mmtfVersion","mmtfProducer","unitCell","spaceGroup","structureId","title","depositionDate","releaseDate","experimentalMethods","resolution","rFree","rWork","bioAssemblyList","ncsOperatorList","entityList","groupList","numBonds","numAtoms","numGroups","numChains","numModels","groupsPerChain","chainsPerModel"].concat(["xCoordList","yCoordList","zCoordList","groupIdList","groupTypeList","chainIdList","bFactorList","atomIdList","altLocList","occupancyList","secStructList","insCodeList","sequenceIndexList","chainNameList","bondAtomList","bondOrderList"]);function XA(t,e,i){return e?new t(e.buffer,e.byteOffset,e.byteLength/(i||1)):void 0}function qA(t){return XA(DataView,t)}function YA(t){return XA(Int8Array,t)}function ZA(t){return XA(Int32Array,t,4)}function KA(t,e){var i=t.length/2;e||(e=new Int16Array(i));for(var r=0,n=0;r<i;++r,n+=2)e[r]=t[n]<<8^t[n+1]<<0;return e}function JA(t,e){var i=t.length/4;e||(e=new Int32Array(i));for(var r=0,n=0;r<i;++r,n+=4)e[r]=t[n]<<24^t[n+1]<<16^t[n+2]<<8^t[n+3]<<0;return e}function QA(t,e,i){var r=t.length,n=1/e;i||(i=new Float32Array(r));for(var o=0;o<r;++o)i[o]=t[o]*n;return i}function tM(t,e){var i,r;if(!e){var n=0;for(i=0,r=t.length;i<r;i+=2)n+=t[i+1];e=new t.constructor(n)}var o=0;for(i=0,r=t.length;i<r;i+=2)for(var a=t[i],s=t[i+1],c=0;c<s;++c)e[o]=a,++o;return e}function eM(t,e){var i=t.length;e||(e=new t.constructor(i)),i&&(e[0]=t[0]);for(var r=1;r<i;++r)e[r]=t[r]+e[r-1];return e}function iM(t,e){var i,r,n=t instanceof Int8Array?127:32767,o=-n-1,a=t.length;if(!e){var s=0;for(i=0;i<a;++i)t[i]<n&&t[i]>o&&++s;e=new Int32Array(s)}for(r=i=0;i<a;){for(var c=0;t[i]===n||t[i]===o;)c+=t[i],++i;c+=t[i],++i,e[r]=c,++r}return e}function rM(t,e,i){return QA(iM(t,ZA(i)),e,i)}function nM(t,e,i){var r,n,o,a=iM(t,ZA(i));return n=e,o=XA(Float32Array,r=a,4),QA(eM(r,ZA(o)),n,o)}function oM(n){var o=0,r=new DataView(n.buffer);function a(t){for(var e={},i=0;i<t;i++){e[h()]=h()}return e}function s(t){var e=n.subarray(o,o+t);return o+=t,e}function c(t){var e=n.subarray(o,o+t);o+=t;if(65535<t){for(var i=[],r=0;r<e.length;r+=65535)i.push(String.fromCharCode.apply(null,e.subarray(r,r+65535)));return i.join("")}return String.fromCharCode.apply(null,e)}function u(t){for(var e=new Array(t),i=0;i<t;i++)e[i]=h();return e}function h(){var t,e,i=n[o];if(0==(128&i))return o++,i;if(128==(240&i))return o++,a(e=15&i);if(144==(240&i))return o++,u(e=15&i);if(160==(224&i))return o++,c(e=31&i);if(224==(224&i))return t=r.getInt8(o),o++,t;switch(i){case 192:return o++,null;case 194:return o++,!1;case 195:return o++,!0;case 196:return e=r.getUint8(o+1),o+=2,s(e);case 197:return e=r.getUint16(o+1),o+=3,s(e);case 198:return e=r.getUint32(o+1),o+=5,s(e);case 202:return t=r.getFloat32(o+1),o+=5,t;case 203:return t=r.getFloat64(o+1),o+=9,t;case 204:return t=n[o+1],o+=2,t;case 205:return t=r.getUint16(o+1),o+=3,t;case 206:return t=r.getUint32(o+1),o+=5,t;case 208:return t=r.getInt8(o+1),o+=2,t;case 209:return t=r.getInt16(o+1),o+=3,t;case 210:return t=r.getInt32(o+1),o+=5,t;case 217:return e=r.getUint8(o+1),o+=2,c(e);case 218:return e=r.getUint16(o+1),o+=3,c(e);case 219:return e=r.getUint32(o+1),o+=5,c(e);case 220:return e=r.getUint16(o+1),o+=3,u(e);case 221:return e=r.getUint32(o+1),o+=5,u(e);case 222:return e=r.getUint16(o+1),o+=3,a(e);case 223:return e=r.getUint32(o+1),o+=5,a(e)}throw new Error("Unknown type 0x"+i.toString(16))}return h()}function aM(t,e,i,r){switch(t){case 1:return function(t,e){var i=t.length;e||(e=new Float32Array(i/4));for(var r=qA(e),n=qA(t),o=0,a=0,s=i/4;o<s;++o,a+=4)r.setFloat32(a,n.getFloat32(a),!0);return e}(e);case 2:return YA(e);case 3:return KA(e);case 4:return JA(e);case 5:return XA(Uint8Array,e);case 6:return tM(JA(e),new Uint8Array(i));case 7:return tM(JA(e));case 8:return eM(tM(JA(e)),s);case 9:return n=JA(e),o=JA(r)[0],QA(tM(n,ZA(a)),o,a);case 10:return nM(KA(e),JA(r)[0]);case 11:return QA(KA(e),JA(r)[0]);case 12:return rM(KA(e),JA(r)[0]);case 13:return rM(YA(e),JA(r)[0]);case 14:return iM(KA(e));case 15:return iM(YA(e))}var n,o,a,s}function sM(c,t){var u=(t=t||{}).ignoreFields,h={};return WA.forEach(function(t){var e,i,r,n,o,a=!!u&&-1!==u.indexOf(t),s=c[t];a||void 0===s||(s instanceof Uint8Array?h[t]=aM.apply(null,(i=qA(e=s),r=i.getInt32(0),n=i.getInt32(4),o=e.subarray(8,12),[r,e=e.subarray(12),n,o])):h[t]=s)}),h}var cM={0:"i".charCodeAt(0),1:"s".charCodeAt(0),2:"h".charCodeAt(0),3:"e".charCodeAt(0),4:"g".charCodeAt(0),5:"b".charCodeAt(0),6:"t".charCodeAt(0),7:"l".charCodeAt(0),"-1":"".charCodeAt(0)},uM=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),(e.prototype=Object.create(t&&t.prototype)).constructor=e;var i={type:{configurable:!0},isBinary:{configurable:!0}};return i.type.get=function(){return"mmtf"},i.isBinary.get=function(){return!0},e.prototype._parse=function(){var t,e,i,r,n;de.Debug&&Yp.time("MmtfParser._parse "+this.name);var o,a,s,c,u,h,l=this.structure,p=sM(oM(this.streamer.data));if(["depositionDate","releaseDate","resolution","rFree","rWork","experimentalMethods"].forEach(function(t){void 0!==p[t]&&(l.header[t]=p[t])}),l.id=p.structureId,l.title=p.title,l.atomStore.addField("formalCharge",1,"int8"),this.firstModelOnly||this.asTrajectory){for(u=1,t=s=0,e=c=p.chainsPerModel[0];t<e;++t)s+=p.groupsPerChain[t];for(t=a=0,e=s;t<e;++t)a+=(n=p.groupList[p.groupTypeList[t]]).atomNameList.length;o=p.numBonds,h=[c]}else o=p.numBonds,a=p.numAtoms,s=p.numGroups,c=p.numChains,u=p.numModels,h=p.chainsPerModel;if(o+=s,this.asTrajectory)for(t=0,e=p.numModels;t<e;++t){var d=new Float32Array(3*a),f=a*t;for(i=0;i<a;++i){var m=3*i,g=i+f;d[m]=p.xCoordList[g],d[m+1]=p.yCoordList[g],d[m+2]=p.zCoordList[g]}l.frames.push(d)}var v=new Uint32Array(o),y=new Uint32Array(o),b=new Uint8Array(o),x=new Uint32Array(a),_=new Int8Array(a),w=new Uint32Array(s),S=new Uint32Array(s),A=new Uint16Array(s),M=new Uint16Array(c),E=new Uint32Array(c),P=new Uint32Array(c),T=new Uint32Array(u),C=new Uint32Array(u),I=0;for(t=0,e=u;t<e;++t){var O=h[t];for(T[t]=I,C[t]=O,i=0;i<O;++i)M[i+I]=t;I+=O}var L=p.groupsPerChain,R=0;for(t=0,e=c;t<e;++t){var D=L[t];for(E[t]=R,P[t]=D,i=0;i<D;++i)w[i+R]=t;R+=D}var k=0,B=0;for(t=0,e=s;t<e;++t){var N=(n=p.groupList[p.groupTypeList[t]]).atomNameList.length,F=n.formalChargeList,z=n.bondAtomList,U=n.bondOrderList;for(i=0,r=U.length;i<r;++i)v[B]=k+z[2*i],y[B]=k+z[2*i+1],b[B]=U[i],B+=1;for(S[t]=k,A[t]=N,i=0;i<N;++i)x[k]=t,_[k]=F[i],k+=1}var j=p.bondAtomList;if(j)for(p.bondOrderList&&b.set(p.bondOrderList,B),t=0,e=j.length;t<e;t+=2){var G=j[t],V=j[t+1];G<a&&V<a&&(v[B]=G,y[B]=V,B+=1)}l.bondStore.length=b.length,l.bondStore.count=B,l.bondStore.atomIndex1=v,l.bondStore.atomIndex2=y,l.bondStore.bondOrder=b,l.atomStore.length=a,l.atomStore.count=a,l.atomStore.residueIndex=x,l.atomStore.atomTypeId=new Uint16Array(a),l.atomStore.x=p.xCoordList.subarray(0,a),l.atomStore.y=p.yCoordList.subarray(0,a),l.atomStore.z=p.zCoordList.subarray(0,a),l.atomStore.serial=p.atomIdList.subarray(0,a),l.atomStore.bfactor=p.bFactorList.subarray(0,a),l.atomStore.altloc=p.altLocList.subarray(0,a),l.atomStore.occupancy=p.occupancyList.subarray(0,a),l.atomStore.formalCharge=_,l.residueStore.length=s,l.residueStore.count=s,l.residueStore.chainIndex=w,l.residueStore.residueTypeId=p.groupTypeList,l.residueStore.atomOffset=S,l.residueStore.atomCount=A,l.residueStore.resno=p.groupIdList.subarray(0,s),l.residueStore.sstruc=p.secStructList.subarray(0,s),l.residueStore.inscode=p.insCodeList.subarray(0,s),l.chainStore.length=c,l.chainStore.count=c,l.chainStore.entityIndex=new Uint16Array(c),l.chainStore.modelIndex=M,l.chainStore.residueOffset=E,l.chainStore.residueCount=P,l.chainStore.chainname=p.chainNameList.subarray(0,4*c),l.chainStore.chainid=p.chainIdList.subarray(0,4*c),l.modelStore.length=u,l.modelStore.count=u,l.modelStore.chainOffset=T,l.modelStore.chainCount=C;var H={};for(t=0,e=p.groupList.length;t<e;++t){var $=p.groupList[t],W=[];for(i=0,r=$.atomNameList.length;i<r;++i){var X=$.elementList[i].toUpperCase(),q=$.atomNameList[i];W.push(l.atomMap.add(q,X))}var Y=$.chemCompType.toUpperCase(),Z=hg.includes(Y),K=$.bondOrderList.length,J=new Array(K),Q=new Array(K);for(i=0;i<K;++i)J[i]=$.bondAtomList[2*i],Q[i]=$.bondAtomList[2*i+1];var tt={atomIndices1:J,atomIndices2:Q,bondOrders:$.bondOrderList};H[t]=l.residueMap.add($.groupName,W,Z,Y,tt)}for(t=0,e=s;t<e;++t)l.residueStore.residueTypeId[t]=H[l.residueStore.residueTypeId[t]];for(t=0,e=l.atomStore.count;t<e;++t){var et=l.atomStore.residueIndex[t],it=l.residueMap.list[l.residueStore.residueTypeId[et]],rt=l.residueStore.atomOffset[et];l.atomStore.atomTypeId[t]=it.atomTypeIdList[t-rt]}if(p.secStructList){var nt=p.secStructList.length;for(t=0,e=l.residueStore.count;t<e;++t){var ot=cM[l.residueStore.sstruc[t%nt]];void 0!==ot&&(l.residueStore.sstruc[t]=ot)}}if(p.entityList&&p.entityList.forEach(function(t,e){l.entityList[e]=new MA(l,e,t.description,t.type,t.chainIndexList)}),p.bioAssemblyList&&p.bioAssemblyList.forEach(function(t,e){var i=e+1,n=new fb(""+i);l.biomolDict["BU"+i]=n;var o={};t.transformList.forEach(function(t){var e=(new ei).fromArray(t.matrix).transpose(),i=t.chainIndexList.map(function(t){for(var e="",i=0;i<4;++i){var r=p.chainNameList[4*t+i];if(!r)break;e+=String.fromCharCode(r)}return e}),r=o[i.toString()];r?r.matrixList.push(e):o[i.toString()]=n.addPart([e],i)})}),p.ncsOperatorList){var at=new fb("NCS"),st=at.addPart();p.ncsOperatorList.forEach(function(t){var e=(new ei).fromArray(t).transpose();st.matrixList.push(e)}),0<st.matrixList.length&&(l.biomolDict.NCS=at)}var ct=p.unitCell;ct&&Array.isArray(ct)&&ct[0]?l.unitcell=new TA({a:ct[0],b:ct[1],c:ct[2],alpha:ct[3],beta:ct[4],gamma:ct[5],spacegroup:p.spaceGroup}):l.unitcell=void 0,Cb(l,!0),Tb(l,!0),l.finalizeAtoms(),l.finalizeBonds(),Ib(l),de.Debug&&Yp.timeEnd("MmtfParser._parse "+this.name)},Object.defineProperties(e.prototype,i),e}(AA);id.add("mmtf",uM);var hM=/\s+/,lM={1:1,2:2,3:3,am:1,ar:1,du:1,un:1,nc:0},pM=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),(e.prototype=Object.create(t&&t.prototype)).constructor=e;var i={type:{configurable:!0}};return i.type.get=function(){return"mol2"},e.prototype._parse=function(){de.Debug&&Yp.time("Mol2Parser._parse "+this.name);var b,x,_=this.structure,w=this.structureBuilder,S=this.firstModelOnly,A=this.asTrajectory,M=_.frames,E=!1,P=_.atomMap,T=_.atomStore;T.resize(Math.round(this.streamer.data.length/60)),T.addField("partialCharge",1,"float32");var C=0,I=0,O=0,L=-1,R=0,D=0,k=1,B=2,N=3,F=_.getAtomProxy(),z=_.getAtomProxy();this.streamer.eachChunkOfLines(function(t){!function(t,e,i){for(var r=t;r<e;++r){var n=i[r].trim();if(""!==n&&"#"!==n[0])if("@"===n[0])"@<TRIPOS>MOLECULE"===n?(D=k,I=0,++L):"@<TRIPOS>ATOM"===n?(D=B,O=T.count,A&&(x=0,b=new Float32Array(3*R),M.push(b),0<L&&(E=!0))):D="@<TRIPOS>BOND"===n?N:0;else if(D===k){if(0===I)_.title=n,_.id=n;else if(1===I){var o=n.split(hM);R=parseInt(o[0])}++I}else if(D===B){var a=n.split(hM);if(S&&0<L)continue;var s=parseFloat(a[2]),c=parseFloat(a[3]),u=parseFloat(a[4]);if(A){var h=3*x;if(b[h+0]=s,b[h+1]=c,b[h+2]=u,x+=1,E)continue}var l=a[0],p=a[1],d=a[5].split(".")[0],f=a[6]?parseInt(a[6]):1,m=a[7]?a[7]:"",g=a[8]?parseFloat(a[8]):0;T.growIfFull(),T.atomTypeId[C]=P.add(p,d),T.x[C]=s,T.y[C]=c,T.z[C]=u,T.serial[C]=l,T.partialCharge[C]=g,w.addAtom(L,"","",m,f,1),C+=1}else if(D===N){if(S&&0<L)continue;if(A&&0<L)continue;var v=n.split(hM);F.index=parseInt(v[1])-1+O,z.index=parseInt(v[2])-1+O;var y=lM[v[3]];_.bondStore.addBond(F,z,y)}}}(0,t.length,t)}),w.finalize(),_.finalizeAtoms(),Ab(_),Tb(_,!0),Cb(_,!0),_.finalizeBonds(),Db(_),_b(_),de.Debug&&Yp.timeEnd("Mol2Parser._parse "+this.name)},Object.defineProperties(e.prototype,i),e}(AA);id.add("mol2",pM);var dM=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),(e.prototype=Object.create(t&&t.prototype)).constructor=e;var i={type:{configurable:!0}};return i.type.get=function(){return"pdbqt"},Object.defineProperties(e.prototype,i),e}(DA);id.add("pdbqt",dM);var fM=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),(e.prototype=Object.create(t&&t.prototype)).constructor=e;var i={type:{configurable:!0}};return i.type.get=function(){return"pqr"},Object.defineProperties(e.prototype,i),e}(DA);id.add("pqr",fM);var mM=/> <(.+)>/,gM=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),(e.prototype=Object.create(t&&t.prototype)).constructor=e;var i={type:{configurable:!0}};return i.type.get=function(){return"sdf"},e.prototype._parse=function(){de.Debug&&Yp.time("SdfParser._parse "+this.name);var v=this.structure,y=this.structureBuilder,b=this.firstModelOnly,x=this.asTrajectory,t=this.streamer.peekLines(2);v.id=t[0].trim(),v.title=t[1].trim();var _,w,S=v.frames,A=!1,M=v.atomMap,E=v.atomStore;E.resize(Math.round(this.streamer.data.length/50)),E.addField("formalCharge",1,"int8");var P,T,C,I,O,L,R,D=v.getAtomProxy(),k=v.getAtomProxy(),B=0,N=0,F=0,z=0,U=[],j=!1,G={};v.extraData.sdf=U,this.streamer.eachChunkOfLines(function(t){!function(t,e,i){for(var r=t;r<e;++r){var n=i[r];if("$$$$"===n.substr(0,4))N=-1,++F,z=E.count,U.push(G),j=!(G={});else if(3===N)T=parseInt(n.substr(0,3)),C=parseInt(n.substr(3,3)),R=(L=O=(I=4)+T)+C,x&&(w=0,_=new Float32Array(3*T),S.push(_),0<F&&(A=!0));else if(I<=N&&N<O){if(b&&0<F)continue;var o=parseFloat(n.substr(0,10)),a=parseFloat(n.substr(10,10)),s=parseFloat(n.substr(20,10));if(x){var c=3*w;if(_[c+0]=o,_[c+1]=a,_[c+2]=s,w+=1,A)continue}var u=n.substr(31,3).trim(),h=u+(B+1);E.growIfFull(),E.atomTypeId[B]=M.add(h,u),E.x[B]=o,E.y[B]=a,E.z[B]=s,E.serial[B]=B,E.formalCharge[B]=0,y.addAtom(F,"","","HET",1,1),B+=1}else if(L<=N&&N<R){if(b&&0<F)continue;if(x&&0<F)continue;D.index=parseInt(n.substr(0,3))-1+z,k.index=parseInt(n.substr(3,3))-1+z;var l=parseInt(n.substr(6,3));v.bondStore.addBond(D,k,l)}else if(n.match(/M {2}CHG/))for(var p=parseInt(n.substr(6,3)),d=0,f=10;d<p;++d,f+=8){var m=parseInt(n.substr(f,3))-1+z,g=parseInt(n.substr(f+4,3));E.formalCharge[m]=g}else(P=n.match(mM))?(j=P[1],G[j]=[]):!1!==j&&n&&G[j].push(n);++N}}(0,t.length,t)}),y.finalize(),v.finalizeAtoms(),v.finalizeBonds(),Db(v),de.Debug&&Yp.timeEnd("SdfParser._parse "+this.name)},e.prototype._postProcess=function(){Db(this.structure)},Object.defineProperties(e.prototype,i),e}(AA);id.add("sdf",gM),id.add("sd",gM),id.add("mol",gM);function vM(t,e,i){return parseInt(t.substr(e,i).trim())}var yM=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),(e.prototype=Object.create(t&&t.prototype)).constructor=e;var i={type:{configurable:!0}};return i.type.get=function(){return"prmtop"},e.prototype._parse=function(){de.Debug&&Yp.time("PrmtopParser._parse "+this.name);var t=this.structure,e=this.structureBuilder,i=t.atomMap,E=t.atomStore;E.addField("partialCharge",1,"float32"),E.addField("radius",1,"float32");var P,T,C,I,O,L,R,D,k,B,N,F=[],z={},U=["NATOM","NTYPES","NBONH","MBONA","NTHETH","MTHETA","NPHIH","MPHIA","NHPARM","NPARM","NNB","NRES","NBONA","NTHETA","NPHIA","NUMBND","NUMANG","NPTRA","NATYP","NPHB","IFPERT","NBPER","NGPER","NDPER","MBPER","MGPER","MDPER","IFBOX","NMXRS","IFCAP","NUMEXTRA","NCOPY"];U.forEach(function(t){z[t]=0}),this.streamer.eachChunkOfLines(function(t){!function(t,e,i){for(var r=t;r<e;++r){var n=i[r],o=n.trim();if(o)if(n.startsWith("%FORMAT"));else if(n.startsWith("%FLAG")){var a=n.substr(5).trim();B=0,"TITLE"===a?k=0:"POINTERS"===a?k=1:"ATOM_NAME"===a?k=2:"CHARGE"===a?k=3:"MASS"===a?k=4:"RESIDUE_LABEL"===a?k=5:"RESIDUE_POINTER"===a?k=6:"BONDS_INC_HYDROGEN"===a?(N=0,k=7):"BONDS_WITHOUT_HYDROGEN"===a?(N=z.NBONH,k=8):k="RADII"===a?9:void 0}else if(0===k)F.push(o);else if(1===k){for(var s=Math.min(B+10,32),c=0;B<s;++c,++B)z[U[B]]=parseInt(n.substr(8*c,8).trim());P=new Array(z.NATOM),T=new Float32Array(z.NATOM),C=new Float32Array(z.NATOM),E.resize(z.NATOM);var u=z.NBONH+z.MBONA;I=new Uint32Array(u),O=new Uint32Array(u),L=new Uint8Array(u),R=new Array(z.NRES),D=new Uint32Array(z.NRES)}else if(2===k)for(var h=Math.min(B+20,z.NATOM),l=0;B<h;++l,++B)P[B]=n.substr(4*l,4).trim();else if(3===k)for(var p=Math.min(B+5,z.NATOM),d=0;B<p;++d,++B)T[B]=parseFloat(n.substr(16*d,16))/18.2223;else if(4===k);else if(5===k)for(var f=Math.min(B+20,z.NRES),m=0;B<f;++m,++B)R[B]=n.substr(4*m,4).trim();else if(6===k)for(var g=Math.min(B+10,z.NRES),v=0;B<g;++v,++B)D[B]=vM(n,8*v,8);else if(7===k)for(var y=Math.min(B+10,3*z.NBONH),b=0;B<y;++b,++B){var x=B%3;0===x&&(I[N]=vM(n,8*b,8)/3),1===x&&(O[N]=vM(n,8*b,8)/3,L[N]=1,++N)}else if(8===k)for(var _=Math.min(B+10,3*z.MBONA),w=0;B<_;++w,++B){var S=B%3;0===S&&(I[N]=vM(n,8*w,8)/3),1===S&&(O[N]=vM(n,8*w,8)/3,L[N]=1,++N)}else if(9===k)for(var A=Math.min(B+5,z.NATOM),M=0;B<A;++M,++B)C[B]=parseFloat(n.substr(16*M,16))}}(0,t.length,t)}),t.title=F.join(" ");for(var r=z.NATOM,n=0,o=R[0],a=1,s=0;s<r;++s)s+1===D[n+1]&&(o=R[++n],a=n+1),E.atomTypeId[s]=i.add(P[s]),E.serial[s]=s+1,e.addAtom(0,"","",o,a);E.partialCharge.set(T),E.radius.set(C),t.bondStore.length=L.length,t.bondStore.count=L.length,t.bondStore.atomIndex1=I,t.bondStore.atomIndex2=O,t.bondStore.bondOrder=L,e.finalize(),t.finalizeAtoms(),t.finalizeBonds(),Tb(t,!0),Cb(t,!0,!0),Ab(t,!0),Db(t),de.Debug&&Yp.timeEnd("PrmtopParser._parse "+this.name)},Object.defineProperties(e.prototype,i),e}(AA);id.add("prmtop",yM),id.add("parm7",yM);var bM=/\s+/,xM=/(^\*|REMARK)*/,_M=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),(e.prototype=Object.create(t&&t.prototype)).constructor=e;var i={type:{configurable:!0}};return i.type.get=function(){return"psf"},e.prototype._parse=function(){de.Debug&&Yp.time("PsfParser._parse "+this.name);var t=this.structure,v=this.structureBuilder,y=t.atomMap,b=t.atomStore;b.addField("partialCharge",1,"float32");var x,_,w,S,A,M,E=[],P=0,T=0,C=0;this.streamer.eachChunkOfLines(function(t){!function(t,e,i){for(var r=t;r<e;++r){var n=i[r].trim();if(n)if(2===x){var o=n.split(bM),a=parseInt(o[0]),s=o[1],c=parseInt(o[2]),u=o[3],h=o[4],l=parseFloat(o[6]);s!==w&&(_=Sb(T),++T),b.growIfFull(),b.atomTypeId[P]=y.add(h),b.serial[P]=a,b.partialCharge[P]=l,v.addAtom(0,_,_,u,c),P+=1,w=s}else if(3===x)for(var p=n.split(bM),d=0,f=p.length;d<f;d+=2)S[C]=parseInt(p[d])-1,A[C]=parseInt(p[d+1])-1,M[C]=1,C+=1;else if(1===x)E.push(n.replace(xM,"").trim());else if(4===x);else if(5===x);else if(6===x);else if(n.includes("!NATOM")){x=2;var m=parseInt(n.split(bM)[0]);b.resize(m)}else if(n.includes("!NBOND")){x=3;var g=parseInt(n.split(bM)[0]);S=new Uint32Array(g),A=new Uint32Array(g),M=new Uint8Array(g)}else n.includes("!NTITLE")?x=1:n.includes("!NTHETA")?x=4:n.includes("!NPHI")?x=5:n.includes("!NIMPHI")&&(x=6);else x=void 0}}(0,t.length,t)}),t.title=E.join(" "),t.bondStore.length=M.length,t.bondStore.count=C,t.bondStore.atomIndex1=S,t.bondStore.atomIndex2=A,t.bondStore.bondOrder=M,v.finalize(),t.finalizeAtoms(),t.finalizeBonds(),Tb(t,!0),Cb(t,!0,!0),Db(t),de.Debug&&Yp.timeEnd("PsfParser._parse "+this.name)},Object.defineProperties(e.prototype,i),e}(AA);id.add("psf",_M);var wM=/\[ (.+) \]/,SM=/\s+/,AM=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),(e.prototype=Object.create(t&&t.prototype)).constructor=e;var i={type:{configurable:!0}};return i.type.get=function(){return"top"},e.prototype._parse=function(){de.Debug&&Yp.time("TopParser._parse "+this.name);var d=this.structure,s=this.structureBuilder,c=d.atomMap,u=d.bondStore,h=d.atomStore;h.addField("partialCharge",1,"float32");var f,m,g=[],v={};this.streamer.eachChunkOfLines(function(t){!function(t,e,i){for(var r=t;r<e;++r){var n=i[r],o=n.trim();if(o&&"*"!==o[0]&&";"!==o[0]){if(o.startsWith("#include"))throw new Error("TopParser: #include statements not allowed");var a=n.match(wM);if(null===a){var s=o.indexOf(";");if(-1!==s&&(o=o.substring(0,s).trim()),2===m){var c=o.split(SM)[0];v[c]=f}else if(3===m){var u=o.split(SM);f.atoms.push([parseInt(u[2]),u[3],u[4],parseFloat(u[6])])}else if(4===m){var h=o.split(SM);f.bonds.push([parseInt(h[0]),parseInt(h[1])])}else if(0===m)d.title=o;else if(1===m){var l=o.split(SM);g.push([l[0],parseInt(l[1])])}}else{var p=a[1];"moleculetype"===p?(m=2,f={atoms:[],bonds:[]}):m="atoms"===p?3:"bonds"===p?4:"system"===p?0:"molecules"===p?1:void 0}}}}(0,t.length,t)});var n=0,o=0;g.forEach(function(t){var e=t[0],i=t[1],r=v[e];n+=i*r.atoms.length,o+=i*r.bonds.length}),h.resize(n),u.resize(o);var l,p=0,y=0,b=0,x=0,_=0,w=0;g.forEach(function(t){for(var e=t[0],i=t[1],r=v[e],a=Sb(x),n=function(t){l=-1;var o=Pg.includes(e)?a:Sb(b);r.atoms.forEach(function(t){var e=t[0],i=t[1],r=t[2],n=t[3];e!==l&&++y,h.atomTypeId[p]=c.add(r),h.serial[p]=p+1,h.partialCharge[p]=n,s.addAtom(0,a,o,i,y+1),++p,l=e}),r.bonds.forEach(function(t){u.atomIndex1[_]=w+t[0]-1,u.atomIndex2[_]=w+t[1]-1,++_}),++b,w+=r.atoms.length},o=0;o<i;++o)n();++x}),u.count=o,s.finalize(),d.finalizeAtoms(),d.finalizeBonds(),Tb(d,!0),Cb(d,!0,!0),Db(d),de.Debug&&Yp.timeEnd("TopParser._parse "+this.name)},Object.defineProperties(e.prototype,i),e}(AA);id.add("top",AM);var MM=function(i){function t(t,e){i.call(this,t,e),this.frames=new e_(this.name,this.path)}i&&(t.__proto__=i),(t.prototype=Object.create(i&&i.prototype)).constructor=t;var e={type:{configurable:!0},__objName:{configurable:!0}};return e.type.get=function(){return"trajectory"},e.__objName.get=function(){return"frames"},Object.defineProperties(t.prototype,e),t}(wA),EM=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),(e.prototype=Object.create(t&&t.prototype)).constructor=e;var i={type:{configurable:!0},isBinary:{configurable:!0}};return i.type.get=function(){return"dcd"},i.isBinary.get=function(){return!0},e.prototype._parse=function(){de.Debug&&Yp.time("DcdParser._parse "+this.name);var t=Rl(this.streamer.data),e=new DataView(t),i=this.frames,r=i.coordinates,n=i.boxes,o={},a=0,s=new Int32Array(t,0,23),c=s[0]!==e.getInt32(0);if(84!==s[0])for(var u=t.byteLength,h=0;h<u;h+=4)e.setFloat32(h,e.getFloat32(h),!0);84!==s[0]&&Yp.error("dcd bad format, header block start"),"CORD"!==String.fromCharCode(e.getUint8(4),e.getUint8(5),e.getUint8(6),e.getUint8(7))&&Yp.error("dcd bad format, format string");var l=!1,p=!1,d=!1;0!==s[22]&&(l=!0,0!==s[12]&&(p=!0),1===s[13]&&(d=!0)),o.NSET=s[2],o.ISTART=s[3],o.NSAVC=s[4],o.NAMNF=s[10],o.DELTA=l?e.getFloat32(44,c):e.getFloat64(44,c),84!==s[22]&&Yp.error("dcd bad format, header block end"),a=a+84+8;var f=e.getInt32(a,c),m=a+1;if((f-4)%80!=0&&Yp.error("dcd bad format, title block start"),o.TITLE=Il(new Uint8Array(t,m,f)),e.getInt32(m+f+4-1,c)!==f&&Yp.error("dcd bad format, title block end"),a=a+f+8,4!==e.getInt32(a,c)&&Yp.error("dcd bad format, natom block start"),o.NATOM=e.getInt32(a+4,c),4!==e.getInt32(a+8,c)&&Yp.error("dcd bad format, natom block end"),a=a+4+8,0<o.NAMNF)Yp.error("dcd format with fixed atoms unsupported, aborting");else{for(var g=o.NATOM,v=4*g,y=0,b=o.NSET;y<b;++y){if(p){a+=4;var x=new Float32Array(9);x[0]=e.getFloat64(a,c),x[4]=e.getFloat64(a+16,c),x[8]=e.getFloat64(a+40,c),n.push(x),a+=48,a+=4}for(var _=new Float32Array(3*g),w=0;w<3;++w){e.getInt32(a,c)!==v&&Yp.error("dcd bad format, coord block start",y,w),a+=4;for(var S=new Float32Array(t,a,g),A=0;A<g;++A)_[3*A+w]=S[A];a+=v,e.getInt32(a,c)!==v&&Yp.error("dcd bad format, coord block end",y,w),a+=4}if(r.push(_),d)a+=4+e.getInt32(a,c)+4}o.DELTA&&(i.deltaTime=20.45482949774598*o.DELTA),1<=o.ISTART&&(i.timeOffset=(o.ISTART-1)*i.deltaTime),de.Debug&&Yp.timeEnd("DcdParser._parse "+this.name)}},Object.defineProperties(e.prototype,i),e}(MM);function PM(t,e){if(t)throw new TypeError("Not a valid NetCDF v3.x file: "+e)}function TM(t){t.offset%4!=0&&t.skip(4-t.offset%4)}function CM(t){var e=t.readUint32(),i=t.readChars(e);return TM(t),i}id.add("dcd",EM);var IM={BYTE:1,CHAR:2,SHORT:3,INT:4,FLOAT:5,DOUBLE:6};function OM(t){switch(Number(t)){case IM.BYTE:return"byte";case IM.CHAR:return"char";case IM.SHORT:return"short";case IM.INT:return"int";case IM.FLOAT:return"float";case IM.DOUBLE:return"double";default:return"undefined"}}function LM(t){switch(Number(t)){case IM.BYTE:case IM.CHAR:return 1;case IM.SHORT:return 2;case IM.INT:case IM.FLOAT:return 4;case IM.DOUBLE:return 8;default:return-1}}function RM(t){switch(String(t)){case"byte":return IM.BYTE;case"char":return IM.CHAR;case"short":return IM.SHORT;case"int":return IM.INT;case"float":return IM.FLOAT;case"double":return IM.DOUBLE;default:return-1}}function DM(t,e){if(1!==t){for(var i=new Array(t),r=0;r<t;r++)i[r]=e();return i}return e()}function kM(t,e,i){switch(e){case IM.BYTE:return t.readBytes(i);case IM.CHAR:return function(t){if(0===t.charCodeAt(t.length-1))return t.substring(0,t.length-1);return t}(t.readChars(i));case IM.SHORT:return DM(i,t.readInt16.bind(t));case IM.INT:return DM(i,t.readInt32.bind(t));case IM.FLOAT:return DM(i,t.readFloat32.bind(t));case IM.DOUBLE:return DM(i,t.readFloat64.bind(t));default:return void PM(!0,"non valid type "+e)}}var BM=0,NM=10,FM=11,zM=12;function UM(t,e){var i={recordDimension:{length:t.readUint32()}};i.version=e;var r=function(t){var e,i,r,n=t.readUint32();{if(n===BM)return PM(t.readUint32()!==BM,"wrong empty tag for list of dimensions"),[];PM(n!==NM,"wrong tag for list of dimensions");var o=t.readUint32();e=new Array(o);for(var a=0;a<o;a++){var s=CM(t),c=t.readUint32();0===c&&(i=a,r=s),e[a]={name:s,size:c}}return{dimensions:e,recordId:i,recordName:r}}}(t);i.recordDimension.id=r.recordId,i.recordDimension.name=r.recordName,i.dimensions=r.dimensions,i.globalAttributes=jM(t);var n=function(t,e,i){var r,n=t.readUint32(),o=0;{if(n===BM)return PM(t.readUint32()!==BM,"wrong empty tag for list of variables"),[];PM(n!==FM,"wrong tag for list of variables");var a=t.readUint32();r=new Array(a);for(var s=0;s<a;s++){for(var c=CM(t),u=t.readUint32(),h=new Array(u),l=0;l<u;l++)h[l]=t.readUint32();var p=jM(t),d=t.readUint32();PM(d<1&&6<d,"non valid type "+d);var f=t.readUint32(),m=t.readUint32();2===i&&(PM(0<m,"offsets larger than 4GB not supported"),m=t.readUint32()),h[0]===e&&(o+=f),r[s]={name:c,dimensions:h,attributes:p,type:OM(d),size:f,offset:m,record:h[0]===e}}}return{variables:r,recordStep:o}}(t,r.recordId,e);return i.variables=n.variables,i.recordDimension.recordStep=n.recordStep,i}function jM(t){var e,i=t.readUint32();if(i===BM)return PM(t.readUint32()!==BM,"wrong empty tag for list of attributes"),[];PM(i!==zM,"wrong tag for list of attributes");var r=t.readUint32();e=new Array(r);for(var n=0;n<r;n++){var o=CM(t),a=t.readUint32();PM(a<1||6<a,"non valid type "+a);var s=kM(t,a,t.readUint32());TM(t),e[n]={name:o,type:OM(a),value:s}}return e}var GM=function(t){var e=new Sd(t);e.setBigEndian(),PM("CDF"!==e.readChars(3),"should start with CDF");var i=e.readByte();PM(2<i,"unknown version"),this.header=UM(e,i),this.buffer=e},VM={version:{configurable:!0},recordDimension:{configurable:!0},dimensions:{configurable:!0},globalAttributes:{configurable:!0},variables:{configurable:!0}};VM.version.get=function(){return 1===this.header.version?"classic format":"64-bit offset format"},VM.recordDimension.get=function(){return this.header.recordDimension},VM.dimensions.get=function(){return this.header.dimensions},VM.globalAttributes.get=function(){return this.header.globalAttributes},VM.variables.get=function(){return this.header.variables},GM.prototype.hasDataVariable=function(e){return-1!==this.header.variables.findIndex(function(t){return t.name===e})},GM.prototype.getDataVariable=function(e){var t;return PM(void 0===(t="string"==typeof e?this.header.variables.find(function(t){return t.name===e}):e),"variable not found"),this.buffer.seek(t.offset),t.record?function(t,e,i){for(var r=RM(e.type),n=e.size?e.size/LM(r):1,o=i.length,a=new Array(o),s=i.recordStep,c=0;c<o;c++){var u=t.offset;a[c]=kM(t,r,n),t.seek(u+s)}return a}(this.buffer,t,this.header.recordDimension):function(t,e){for(var i=RM(e.type),r=e.size/LM(i),n=new Array(r),o=0;o<r;o++)n[o]=kM(t,i,1);return n}(this.buffer,t)},Object.defineProperties(GM.prototype,VM);var HM=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),(e.prototype=Object.create(t&&t.prototype)).constructor=e;var i={type:{configurable:!0},isBinary:{configurable:!0}};return i.type.get=function(){return"nctraj"},i.isBinary.get=function(){return!0},e.prototype._parse=function(){de.Debug&&Yp.time("NctrajParser._parse "+this.name);var t=new GM(this.streamer.data),e=this.frames,i=e.coordinates,r=e.boxes,n=e.times;t.getDataVariable("coordinates").forEach(function(t){i.push(new Float32Array(t))}),t.hasDataVariable("cell_lengths")&&t.getDataVariable("cell_lengths").forEach(function(t){r.push(new Float32Array(t))}),t.hasDataVariable("time")&&t.getDataVariable("time").forEach(function(t){n.push(t)}),1<=n.length&&(e.timeOffset=n[0]),2<=n.length&&(e.deltaTime=n[1]-n[0]),de.Debug&&Yp.timeEnd("NctrajParser._parse "+this.name)},Object.defineProperties(e.prototype,i),e}(MM);id.add("nctraj",HM),id.add("ncdf",HM),id.add("nc",HM);var $M=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),(e.prototype=Object.create(t&&t.prototype)).constructor=e;var i={type:{configurable:!0},isBinary:{configurable:!0}};return i.type.get=function(){return"trr"},i.isBinary.get=function(){return!0},e.prototype._parse=function(){de.Debug&&Yp.time("TrrParser._parse "+this.name);for(var t=Rl(this.streamer.data),e=new DataView(t),i=this.frames,r=i.coordinates,n=i.boxes,o=i.times,a=0;;){a+=8;var s=e.getInt32(a);a+=4,a+=s;var c=e.getInt32(a+8),u=e.getInt32(a+12),h=e.getInt32(a+16),l=e.getInt32(a+28),p=e.getInt32(a+32),d=e.getInt32(a+36),f=e.getInt32(a+40);a+=52;var m=c/9,g=3*f;if(8===m?o.push(e.getFloat64(a)):o.push(e.getFloat32(a)),a+=2*m,c){var v=new Float32Array(9);if(8===m)for(var y=0;y<9;++y)v[y]=10*e.getFloat64(a),a+=8;else for(var b=0;b<9;++b)v[b]=10*e.getFloat32(a),a+=4;n.push(v)}if(a+=u,a+=h,l){var x=void 0;if(8===m){x=new Float32Array(g);for(var _=0;_<g;++_)x[_]=10*e.getFloat64(a),a+=8}else{for(var w=new Uint32Array(t,a,g),S=0;S<g;++S){var A=w[S];w[S]=(255&A)<<24|(65280&A)<<8|A>>8&65280|A>>24&255}x=new Float32Array(t,a,g);for(var M=0;M<g;++M)x[M]*=10,a+=4}r.push(x)}if(a+=p,(a+=d)>=t.byteLength)break}1<=o.length&&(i.timeOffset=o[0]),2<=o.length&&(i.deltaTime=o[1]-o[0]),de.Debug&&Yp.timeEnd("TrrParser._parse "+this.name)},Object.defineProperties(e.prototype,i),e}(MM);id.add("trr",$M);var WM=new Uint32Array([0,0,0,0,0,0,0,0,0,8,10,12,16,20,25,32,40,50,64,80,101,128,161,203,256,322,406,512,645,812,1024,1290,1625,2048,2580,3250,4096,5060,6501,8192,10321,13003,16384,20642,26007,32768,41285,52015,65536,82570,104031,131072,165140,208063,262144,330280,416127,524287,660561,832255,1048576,1321122,1664510,2097152,2642245,3329021,4194304,5284491,6658042,8388607,10568983,13316085,16777216]);function XM(t){for(var e=1,i=0;e<=t&&i<32;)i++,e<<=1;return i}var qM=new Uint8Array(32);function YM(t,e){var i=1,r=0;qM[0]=1;for(var n=0;n<t;n++){var o=void 0,a=0;for(o=0;o<i;o++)a+=qM[o]*e[n],qM[o]=255&a,a>>=8;for(;0!==a;)qM[o++]=255&a,a>>=8;i=o}var s=1;for(i--;qM[i]>=s;)r++,s*=2;return r+8*i}function ZM(t,e,i,r){for(var n=(1<<i)-1,o=r[1],a=r[2],s=t[0],c=0;8<=i;)c|=(a=a<<8|e[s++])>>o<<i-8,i-=8;return 0<i&&(o<i&&(o+=8,a=a<<8|e[s++]),c|=a>>(o-=i)&(1<<i)-1),c&=n,t[0]=s,t[1]=o,t[2]=a,c}var KM=new Int32Array(32);function JM(t,e,i,r,n,o,a){var s=0;for(KM[1]=0,KM[2]=0,KM[3]=0;8<r;)KM[s++]=ZM(t,e,8,a),r-=8;0<r&&(KM[s++]=ZM(t,e,r,a));for(var c=i-1;0<c;c--){for(var u=0,h=s-1;0<=h;h--){var l=(u=u<<8|KM[h])/n[c]|0;u-=(KM[h]=l)*n[c]}o[c]=u}o[0]=KM[0]|KM[1]<<8|KM[2]<<16|KM[3]<<24}var QM=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),(e.prototype=Object.create(t&&t.prototype)).constructor=e;var i={type:{configurable:!0},isBinary:{configurable:!0}};return i.type.get=function(){return"xtc"},i.isBinary.get=function(){return!0},e.prototype._parse=function(){de.Debug&&Yp.time("XtcParser._parse "+this.name);for(var t=Rl(this.streamer.data),e=new DataView(t),i=this.frames,r=i.coordinates,n=i.boxes,o=i.times,a=new Int32Array(6),s=new Int32Array(3),c=new Int32Array(3),u=new Uint32Array(3),h=new Float32Array(3),l=new Float32Array(3),p=0,d=new Int32Array(3),f=new Uint32Array(d.buffer);;){var m=void 0,g=e.getInt32(p+4);p+=12;var v=3*g;o.push(e.getFloat32(p)),p+=4;for(var y=new Float32Array(9),b=0;b<9;++b)y[b]=10*e.getFloat32(p),p+=4;if(n.push(y),g<=9){m=new Float32Array(g);for(var x=0;x<g;++x)m[x]=e.getFloat32(p),p+=4}else{d[0]=d[1]=d[2]=0,s[0]=s[1]=s[2]=0,u[0]=u[1]=u[2]=0,c[0]=c[1]=c[2]=0,h[0]=h[1]=h[2]=0,l[0]=l[1]=l[2]=0,m=new Float32Array(v);var _=0,w=e.getInt32(p);p+=4;var S=e.getFloat32(p);p+=4,a[0]=e.getInt32(p),a[1]=e.getInt32(p+4),a[2]=e.getInt32(p+8),a[3]=e.getInt32(p+12),a[4]=e.getInt32(p+16),a[5]=e.getInt32(p+20),s[0]=a[3]-a[0]+1,s[1]=a[4]-a[1]+1,s[2]=a[5]-a[2]+1,p+=24;var A=void 0;16777215<(s[0]|s[1]|s[2])?(c[0]=XM(s[0]),c[1]=XM(s[1]),c[2]=XM(s[2]),A=0):A=YM(3,s);var M=e.getInt32(p);p+=4;var E=M-1,P=WM[E=E<9?9:E]/2|0,T=WM[M]/2|0;u[0]=u[1]=u[2]=WM[M];var C=4*Math.ceil(e.getInt32(p)/4);p+=4;var I=1/S,O=0,L=0,R=new Uint8Array(t,p);for(h[0]=h[1]=h[2]=0;L<w;){0===A?(h[0]=ZM(d,R,c[0],f),h[1]=ZM(d,R,c[1],f),h[2]=ZM(d,R,c[2],f)):JM(d,R,3,A,s,h,f),L++,h[0]+=a[0],h[1]+=a[1],h[2]+=a[2],l[0]=h[0],l[1]=h[1],l[2]=h[2];var D=0;if(1===ZM(d,R,1,f)&&(O=ZM(d,R,5,f),O-=D=O%3,D--),0<O){h[0]=h[1]=h[2]=0;for(var k=0;k<O;k+=3){if(JM(d,R,3,M,u,h,f),L++,h[0]+=l[0]-T,h[1]+=l[1]-T,h[2]+=l[2]-T,0===k){var B=h[0];h[0]=l[0],l[0]=B,B=h[1],h[1]=l[1],l[1]=B,B=h[2],h[2]=l[2],l[2]=B,m[_++]=l[0]*I,m[_++]=l[1]*I,m[_++]=l[2]*I}else l[0]=h[0],l[1]=h[1],l[2]=h[2];m[_++]=h[0]*I,m[_++]=h[1]*I,m[_++]=h[2]*I}}else m[_++]=h[0]*I,m[_++]=h[1]*I,m[_++]=h[2]*I;if(M+=D,D<0?(T=P,P=9<M?WM[M-1]/2|0:0):0<D&&(P=T,T=WM[M]/2|0),u[0]=u[1]=u[2]=WM[M],0===u[0]||0===u[1]||0===u[2])return void console.error("(xdrfile error) Undefined error.")}p+=C}for(var N=0;N<v;N++)m[N]*=10;if(r.push(m),p>=t.byteLength)break}1<=o.length&&(i.timeOffset=o[0]),2<=o.length&&(i.deltaTime=o[1]-o[0]),de.Debug&&Yp.timeEnd("XtcParser._parse "+this.name)},Object.defineProperties(e.prototype,i),e}(MM);id.add("xtc",QM);var tE=function(r){function t(t,e){var i=e||{};r.call(this,t,i),this.volume=new ay(this.name,this.path),this.voxelSize=bl(i.voxelSize,1)}r&&(t.__proto__=r),(t.prototype=Object.create(r&&r.prototype)).constructor=t;var e={type:{configurable:!0},__objName:{configurable:!0}};return e.type.get=function(){return"volume"},e.__objName.get=function(){return"volume"},t.prototype._afterParse=function(){this.volume.setMatrix(this.getMatrix()),r.prototype._afterParse.call(this)},t.prototype.getMatrix=function(){return new ei},Object.defineProperties(t.prototype,e),t}(wA),eE=/\s+/,iE=/-?\d+(?:\.\d*)?(?:[eE][+-]?\d+)?/g,rE=.529177210859,nE=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),(e.prototype=Object.create(t&&t.prototype)).constructor=e;var i={type:{configurable:!0}};return i.type.get=function(){return"cube"},e.prototype._parse=function(){de.Debug&&Yp.time("CubeParser._parse "+this.name);var t=this.volume,r=this.streamer.peekLines(6),c={},e=rE*this.voxelSize;function i(t,e){var i=r[t].trim().split(eE)[e];return parseFloat(i)}c.atomCount=Math.abs(i(2,0)),c.originX=i(2,1)*rE,c.originY=i(2,2)*rE,c.originZ=i(2,3)*rE,c.NVX=i(3,0),c.NVY=i(4,0),c.NVZ=i(5,0),c.basisX=new ri(i(3,1),i(3,2),i(3,3)).multiplyScalar(e),c.basisY=new ri(i(4,1),i(4,2),i(4,3)).multiplyScalar(e),c.basisZ=new ri(i(5,1),i(5,2),i(5,3)).multiplyScalar(e);var u=new Float32Array(c.NVX*c.NVY*c.NVZ),h=0,l=0,p=0<i(2,0)?0:1;this.streamer.eachChunkOfLines(function(t){!function(t,e,i){for(var r=t;r<e;++r){var n=i[r].trim();if(""!==n&&l>=c.atomCount+6+p)for(var o=n.match(iE),a=0,s=o.length;a<s;++a)u[h]=parseFloat(o[a]),++h;++l}}(0,t.length,t)}),t.header=c,t.setData(u,c.NVZ,c.NVY,c.NVX),de.Debug&&Yp.timeEnd("CubeParser._parse "+this.name)},e.prototype.getMatrix=function(){var t=this.volume.header,e=new ei;return e.multiply((new ei).makeTranslation(t.originX,t.originY,t.originZ)),e.multiply((new ei).makeBasis(t.basisZ,t.basisY,t.basisX)),e},Object.defineProperties(e.prototype,i),e}(tE);id.add("cub",nE),id.add("cube",nE);var oE=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),(e.prototype=Object.create(t&&t.prototype)).constructor=e;var i={type:{configurable:!0},isBinary:{configurable:!0}};return i.type.get=function(){return"dsn6"},i.isBinary.get=function(){return!0},e.prototype._parse=function(){de.Debug&&Yp.time("Dsn6Parser._parse "+this.name);var t,e,i=this.volume,r={},n=Rl(this.streamer.data),o=new Int16Array(n),a=new Uint8Array(n),s=String.fromCharCode.apply(null,a.subarray(0,512));if(s.startsWith(":-)"))r.xStart=parseInt(s.substr(10,5)),r.yStart=parseInt(s.substr(15,5)),r.zStart=parseInt(s.substr(20,5)),r.xExtent=parseInt(s.substr(32,5)),r.yExtent=parseInt(s.substr(38,5)),r.zExtent=parseInt(s.substr(42,5)),r.xRate=parseInt(s.substr(52,5)),r.yRate=parseInt(s.substr(58,5)),r.zRate=parseInt(s.substr(62,5)),r.xlen=parseFloat(s.substr(73,10))*this.voxelSize,r.ylen=parseFloat(s.substr(83,10))*this.voxelSize,r.zlen=parseFloat(s.substr(93,10))*this.voxelSize,r.alpha=parseFloat(s.substr(103,10)),r.beta=parseFloat(s.substr(113,10)),r.gamma=parseFloat(s.substr(123,10)),t=parseFloat(s.substr(138,12))/100,e=parseInt(s.substr(155,8)),r.sigma=100*parseFloat(s.substr(170,12));else{if(100!==o[18])for(var c=0,u=o.length;c<u;++c){var h=o[c];o[c]=(255&h)<<8|h>>8&255}r.xStart=o[0],r.yStart=o[1],r.zStart=o[2],r.xExtent=o[3],r.yExtent=o[4],r.zExtent=o[5],r.xRate=o[6],r.yRate=o[7],r.zRate=o[8];var l=1/o[17],p=l*this.voxelSize;r.xlen=o[9]*p,r.ylen=o[10]*p,r.zlen=o[11]*p,r.alpha=o[12]*l,r.beta=o[13]*l,r.gamma=o[14]*l,t=o[15]/100,e=o[16],r.gamma=o[14]*l}i.header=r,de.Debug&&Yp.log(r,t,e);for(var d=new Float32Array(r.xExtent*r.yExtent*r.zExtent),f=512,m=Math.ceil(r.xExtent/8),g=Math.ceil(r.yExtent/8),v=Math.ceil(r.zExtent/8),y=0;y<v;++y)for(var b=0;b<g;++b)for(var x=0;x<m;++x)for(var _=0;_<8;++_)for(var w=8*y+_,S=0;S<8;++S)for(var A=8*b+S,M=0;M<8;++M){var E=8*x+M;if(!(E<r.xExtent&&A<r.yExtent&&w<r.zExtent)){f+=8-M;break}d[(E*r.yExtent+A)*r.zExtent+w]=(a[f]-e)/t,++f}i.setData(d,r.zExtent,r.yExtent,r.xExtent),r.sigma&&i.setStats(void 0,void 0,void 0,r.sigma),de.Debug&&Yp.timeEnd("Dsn6Parser._parse "+this.name)},e.prototype.getMatrix=function(){var t=this.volume.header,e=[t.xlen,0,0],i=[t.ylen*Math.cos(Math.PI/180*t.gamma),t.ylen*Math.sin(Math.PI/180*t.gamma),0],r=[t.zlen*Math.cos(Math.PI/180*t.beta),t.zlen*(Math.cos(Math.PI/180*t.alpha)-Math.cos(Math.PI/180*t.gamma)*Math.cos(Math.PI/180*t.beta))/Math.sin(Math.PI/180*t.gamma),0];r[2]=Math.sqrt(t.zlen*t.zlen*Math.sin(Math.PI/180*t.beta)*Math.sin(Math.PI/180*t.beta)-r[1]*r[1]);var n=[[],e,i,r],o=[0,t.xRate,t.yRate,t.zRate],a=[0,1,2,3],s=new ei;return s.set(n[a[1]][0]/o[a[1]],n[a[2]][0]/o[a[2]],n[a[3]][0]/o[a[3]],0,n[a[1]][1]/o[a[1]],n[a[2]][1]/o[a[2]],n[a[3]][1]/o[a[3]],0,n[a[1]][2]/o[a[1]],n[a[2]][2]/o[a[2]],n[a[3]][2]/o[a[3]],0,0,0,0,1),s.multiply((new ei).makeRotationY(Gl(90))),s.multiply((new ei).makeTranslation(-t.zStart,t.yStart,t.xStart)),s.multiply((new ei).makeScale(-1,1,1)),s},Object.defineProperties(e.prototype,i),e}(tE);id.add("dsn6",oE),id.add("brix",oE);var aE=/\s+/,sE=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),(e.prototype=Object.create(t&&t.prototype)).constructor=e;var i={type:{configurable:!0}};return i.type.get=function(){return"dx"},e.prototype._parse=function(){de.Debug&&Yp.time("DxParser._parse "+this.name);var t=this.volume,e=this.streamer.peekLines(30),i=this.parseHeaderLines(e),r=this.volume.header,c=i.dataLineStart,u=r.nx*r.ny*r.nz,h=new Float32Array(u),l=0,p=0;this.streamer.eachChunkOfLines(function(t){!function(t,e,i){for(var r=t;r<e;++r){if(l<u&&c<p){var n=i[r].trim();if(""!==n)for(var o=n.split(aE),a=0,s=o.length;a<s;++a)h[l]=parseFloat(o[a]),++l}++p}}(0,t.length,t)}),t.setData(h,r.nz,r.ny,r.nx),de.Debug&&Yp.timeEnd("DxParser._parse "+this.name)},e.prototype.parseHeaderLines=function(t){for(var e={},i=t.length,r=0,n=0,o=0,a=0;a<i;++a){var s=void 0,c=t[a];if(c.startsWith("object 1"))s=c.split(aE),e.nx=parseInt(s[5]),e.ny=parseInt(s[6]),e.nz=parseInt(s[7]);else if(c.startsWith("origin"))s=c.split(aE),e.xmin=parseFloat(s[1]),e.ymin=parseFloat(s[2]),e.zmin=parseFloat(s[3]);else if(c.startsWith("delta"))s=c.split(aE),0===o?e.hx=parseFloat(s[1])*this.voxelSize:1===o?e.hy=parseFloat(s[2])*this.voxelSize:2===o&&(e.hz=parseFloat(s[3])*this.voxelSize),o+=1;else if(c.startsWith("object 3")){r=a,n+=c.length+1;break}n+=c.length+1}return this.volume.header=e,{dataLineStart:r,headerByteCount:n}},e.prototype.getMatrix=function(){var t=this.volume.header,e=new ei;return e.multiply((new ei).makeRotationY(Gl(90))),e.multiply((new ei).makeTranslation(-t.zmin,t.ymin,t.xmin)),e.multiply((new ei).makeScale(-t.hz,t.hy,t.hx)),e},Object.defineProperties(e.prototype,i),e}(tE);id.add("dx",sE);var cE=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),(e.prototype=Object.create(t&&t.prototype)).constructor=e;var i={type:{configurable:!0},isBinary:{configurable:!0}};return i.type.get=function(){return"dxbin"},i.isBinary.get=function(){return!0},e.prototype._parse=function(){de.Debug&&Yp.time("DxbinParser._parse "+this.name);for(var t=Rl(this.streamer.data),e=function(t,e,i){void 0===e&&(e=10485760),void 0===i&&(i="\n");for(var r="",n=[],o=0;o<t.length;o+=e){var a=Il(t.subarray(o,o+e)),s=a.lastIndexOf(i);if(-1===s)r+=a;else{var c=r+a.substr(0,s);n=n.concat(c.split(i)),r=s===a.length-i.length?"":a.substr(s+i.length)}}return""!==r&&n.push(r),n}(new Uint8Array(t,0,1e3)),i=this.parseHeaderLines(e),r=this.volume.header,n=i.headerByteCount,o=r.nx*r.ny*r.nz,a=new DataView(t),s=new Float32Array(o),c=0;c<o;++c)s[c]=a.getFloat64(8*c+n,!0);this.volume.setData(s,r.nz,r.ny,r.nx),de.Debug&&Yp.timeEnd("DxbinParser._parse "+this.name)},Object.defineProperties(e.prototype,i),e}(sE);id.add("dxbin",cE);var uE=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),(e.prototype=Object.create(t&&t.prototype)).constructor=e;var i={type:{configurable:!0},isBinary:{configurable:!0}};return i.type.get=function(){return"mrc"},i.isBinary.get=function(){return!0},e.prototype._parse=function(){de.Debug&&Yp.time("MrcParser._parse "+this.name);var t,e=this.volume,i={},r=Rl(this.streamer.data),n=new Int32Array(r,0,56),o=new Float32Array(r,0,56),a=new DataView(r);if(i.MAP=String.fromCharCode(a.getUint8(208),a.getUint8(209),a.getUint8(210),a.getUint8(211)),i.MACHST=[a.getUint8(212),a.getUint8(213)],17===i.MACHST[0]&&17===i.MACHST[1])for(var s=r.byteLength,c=0;c<s;c+=4)a.setFloat32(c,a.getFloat32(c),!0);if(i.NX=n[0],i.NY=n[1],i.NZ=n[2],i.MODE=n[3],i.NXSTART=n[4],i.NYSTART=n[5],i.NZSTART=n[6],i.MX=n[7],i.MY=n[8],i.MZ=n[9],i.xlen=o[10]*this.voxelSize,i.ylen=o[11]*this.voxelSize,i.zlen=o[12]*this.voxelSize,i.alpha=o[13],i.beta=o[14],i.gamma=o[15],i.MAPC=n[16],i.MAPR=n[17],i.MAPS=n[18],i.DMIN=o[19],i.DMAX=o[20],i.DMEAN=o[21],i.ISPG=n[22],i.NSYMBT=n[23],i.LSKFLG=n[24],i.originX=o[49],i.originY=o[50],i.originZ=o[51],i.ARMS=o[54],2===(e.header=i).MODE)t=new Float32Array(r,1024+i.NSYMBT,i.NX*i.NY*i.NZ);else if(0===i.MODE){if(t=new Float32Array(new Int8Array(r,1024+i.NSYMBT,i.NX*i.NY*i.NZ)),-128===n[39]&&127===n[40])for(var u=(i.DMAX-i.DMIN)/255,h=.5*(i.DMIN+i.DMAX+u),l=0,p=t.length;l<p;++l)t[l]=u*t[l]+h}else Yp.error("MrcParser unknown mode",i.MODE);e.setData(t,i.NX,i.NY,i.NZ),0!==i.ARMS&&e.setStats(i.DMIN,i.DMAX,i.DMEAN,i.ARMS),de.Debug&&Yp.timeEnd("MrcParser._parse "+this.name)},e.prototype.getMatrix=function(){var t=this.volume.header,e=[t.xlen,0,0],i=[t.ylen*Math.cos(Math.PI/180*t.gamma),t.ylen*Math.sin(Math.PI/180*t.gamma),0],r=[t.zlen*Math.cos(Math.PI/180*t.beta),t.zlen*(Math.cos(Math.PI/180*t.alpha)-Math.cos(Math.PI/180*t.gamma)*Math.cos(Math.PI/180*t.beta))/Math.sin(Math.PI/180*t.gamma),0];r[2]=Math.sqrt(t.zlen*t.zlen*Math.sin(Math.PI/180*t.beta)*Math.sin(Math.PI/180*t.beta)-r[1]*r[1]);var n=[[],e,i,r],o=[0,t.MX,t.MY,t.MZ],a=[0,t.MAPC,t.MAPR,t.MAPS],s=new ei;return s.set(n[a[1]][0]/o[a[1]],n[a[2]][0]/o[a[2]],n[a[3]][0]/o[a[3]],0,n[a[1]][1]/o[a[1]],n[a[2]][1]/o[a[2]],n[a[3]][1]/o[a[3]],0,n[a[1]][2]/o[a[1]],n[a[2]][2]/o[a[2]],n[a[3]][2]/o[a[3]],0,0,0,0,1),s.setPosition(new ri(t.originX,t.originY,t.originZ)),s.multiply((new ei).makeTranslation(t.NXSTART,t.NYSTART,t.NZSTART)),s},Object.defineProperties(e.prototype,i),e}(tE);id.add("mrc",uE),id.add("ccp4",uE),id.add("map",uE);var hE=/\s+/;function lE(t){return t.trim().split(hE).map(parseFloat)}var pE=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),(e.prototype=Object.create(t&&t.prototype)).constructor=e;var i={type:{configurable:!0}};return i.type.get=function(){return"xplor"},e.prototype._parse=function(){de.Debug&&Yp.time("XplorParser._parse "+this.name);var t,e=this.volume,i=this.streamer.peekLines(8),u={},h=(t=i[2].startsWith("REMARKS")?parseInt(i[1].substring(0,8))+2:5)+3,r=lE(i[t]);u.NA=r[0],u.AMIN=r[1],u.AMAX=r[2],u.NB=r[3],u.BMIN=r[4],u.BMAX=r[5],u.NC=r[6],u.CMIN=r[7],u.CMAX=r[8];var n=lE(i[t+1]);u.a=n[0]*this.voxelSize,u.b=n[1]*this.voxelSize,u.c=n[2]*this.voxelSize,u.alpha=n[3],u.beta=n[4],u.gamma=n[5];var o=u.AMAX-u.AMIN+1,a=u.BMAX-u.BMIN+1,s=u.CMAX-u.CMIN+1,l=o*a*s,p=new Float32Array(l),d=Math.ceil(1+o*a/6),f=0,m=0;this.streamer.eachChunkOfLines(function(t){!function(t,e,i){for(var r=t;r<e;++r){var n=i[r];if(h<=m&&(m-h)%d!=0&&f<l)for(var o=0;o<6;++o){var a=parseFloat(n.substr(12*o,12));if(isNaN(a))break;p[f++]=a}else if(f===l){var s=n.trim();if(s&&"-9999"!==s){var c=lE(n);u.RAVE=c[0],u.RSIGMA=c[1]}}++m}}(0,t.length,t)}),e.header=u,e.setData(p,o,a,s),0!==u.RAVE&&1!==u.RSIGMA&&e.setStats(void 0,void 0,u.RAVE,u.RSIGMA),de.Debug&&Yp.timeEnd("XplorParser._parse "+this.name)},e.prototype.getMatrix=function(){var t=this.volume.header,e=[t.a,0,0],i=[t.b*Math.cos(Math.PI/180*t.gamma),t.b*Math.sin(Math.PI/180*t.gamma),0],r=[t.c*Math.cos(Math.PI/180*t.beta),t.c*(Math.cos(Math.PI/180*t.alpha)-Math.cos(Math.PI/180*t.gamma)*Math.cos(Math.PI/180*t.beta))/Math.sin(Math.PI/180*t.gamma),0];r[2]=Math.sqrt(t.c*t.c*Math.sin(Math.PI/180*t.beta)*Math.sin(Math.PI/180*t.beta)-r[1]*r[1]);var n=[[],e,i,r],o=[0,t.NA,t.NB,t.NC],a=[0,1,2,3],s=new ei;return s.set(n[a[1]][0]/o[a[1]],n[a[2]][0]/o[a[2]],n[a[3]][0]/o[a[3]],0,n[a[1]][1]/o[a[1]],n[a[2]][1]/o[a[2]],n[a[3]][1]/o[a[3]],0,n[a[1]][2]/o[a[1]],n[a[2]][2]/o[a[2]],n[a[3]][2]/o[a[3]],0,0,0,0,1),s.multiply((new ei).makeTranslation(t.AMIN,t.BMIN,t.CMIN)),s},Object.defineProperties(e.prototype,i),e}(tE);function dE(t,e,i){var r,n,o;t/=360,e/=100,i/=100;var a=Math.floor(6*t),s=6*t-a,c=i*(1-e),u=i*(1-s*e),h=i*(1-(1-s)*e);switch(a%6){case 0:r=i,n=h,o=c;break;case 1:r=u,n=i,o=c;break;case 2:r=c,n=i,o=h;break;case 3:r=c,n=u,o=i;break;case 4:r=h,n=c,o=i;break;case 5:r=i,n=c,o=u}return[r,n,o]}id.add("xplor",pE),id.add("cns",pE);var fE={red:dE(0,100,100),orange:dE(20,100,100),gold:dE(40,100,100),yellow:dE(60,100,100),lime:dE(80,100,100),green:dE(120,80,100),sea:dE(150,100,100),cyan:dE(180,100,85),sky:dE(210,75,95),blue:dE(240,70,100),purple:dE(275,75,100),magenta:dE(300,95,100),hotpink:dE(335,100,100),pink:dE(350,55,100),peach:dE(25,75,100),lilac:dE(275,55,100),pinktint:dE(340,30,100),peachtint:dE(25,50,100),yellowtint:dE(60,50,100),greentint:dE(135,40,100),bluetint:dE(220,40,100),lilactint:dE(275,35,100),white:dE(0,0,100),gray:dE(0,0,50),brown:dE(20,45,75),deadwhite:[1,1,1],deadblack:[0,0,0],invisible:[0,0,0]},mE=/[\s,]+/,gE=/[^{}\s]*{[^{}]+}|[^{}\s]+/g,vE=/^{+|}+$/g,yE=/^['"]+|['"]+$/g,bE=/\s*=\s*/g;function xE(t){for(var e,i,r,n=[],o=(t=t.replace(bE,"=")).match(gE),a=1;a<o.length;++a){var s=o[a];if("{"===s[0])e=s.substring(1,s.length-1);else{var c=s.split("=");2===c.length&&("color"===c[0]?i=fE[c[1]]:"width"===c[0]?r=parseInt(c[1]):"master"===c[0]&&n.push(c[1].replace(vE,"")))}}return{listName:e,listColor:i,listMasters:n,listWidth:r}}function _E(t){for(var e,i,r,n=(t=t.trim()).indexOf("{"),o=t.indexOf("}"),a=t.substr(o+1).split(mE),s=t.substr(n+1,o-1),c=[parseFloat(a[a.length-3]),parseFloat(a[a.length-2]),parseFloat(a[a.length-1])],u=4;u<=a.length;u++){var h=a[a.length-u];h in fE&&(e=fE[a[a.length-u]]),h.startsWith("width")&&(i=parseInt(h.substring(5))),h.startsWith("r=")&&(r=parseFloat(h.split("=")[1]))}return{label:s,position:c,color:e,radius:r,width:i}}function wE(t){var e=t.indexOf("{"),i=t.indexOf("}");return t.substring(-1!==e?e+1:0,-1!==i?i:void 0).trim()}function SE(t){for(var e,i={},r=(t=t.replace(bE,"=")).match(gE),n=1;n<r.length;++n){var o=r[n];if("{"===o[0])e=o.substring(1,o.length-1);else{var a=o.split("=");2===a.length?i[a[0]]=a[1].replace(vE,""):i[a[0]]=!0}}return[e,i]}var AE=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),(e.prototype=Object.create(t&&t.prototype)).constructor=e;var i={type:{configurable:!0},__objName:{configurable:!0}};return i.type.get=function(){return"kin"},i.__objName.get=function(){return"kinemage"},e.prototype._parse=function(){de.Debug&&Yp.time("KinParser._parse "+this.name);var ut={kinemage:void 0,onewidth:void 0,"1viewid":void 0,pdbfile:void 0,texts:[],text:"",captions:[],caption:"",groupDict:{},subgroupDict:{},masterDict:{},pointmasterDict:{},dotLists:[],vectorLists:[],ballLists:[],ribbonLists:[]};this.kinemage=ut;var ht,lt,pt,dt,ft,mt,gt,vt,yt,bt,xt,_t,wt,St,At,Mt,Et,Pt,Tt,Ct,It,Ot,Lt,Rt=!1,Dt="",kt=!1,Bt="",Nt=!1,Ft="",zt=!1,Ut="",jt=!1,Gt=!1;if(this.streamer.eachChunkOfLines(function(t){!function(t,e,i){for(var r=t;r<e;++r){var n=i[r];if("@"===n[0]&&(Gt=jt=zt=Nt=kt=Rt=!1),n)if(n.startsWith("@dotlist")){var o=xE(n),a=o.listColor,s=o.listName,c=o.listMasters;Rt=!0,Dt="",lt=[],pt=[],dt=[],ht=a,ut.dotLists.push({name:s,masterArray:c,labelArray:lt,positionArray:pt,colorArray:dt})}else if(n.startsWith("@vectorlist")){var u=xE(n),h=u.listMasters,l=u.listName,p=u.listWidth,d=u.listColor;h&&h.forEach(function(t){ut.masterDict[t]||(ut.masterDict[t]={indent:!1,visible:!1})}),kt=!0,Bt="",mt=ft=null,yt=[],bt=[],xt=[],_t=[],wt=[],St=[],gt=d,vt=[],p&&vt.push(p),ut.vectorLists.push({name:l,masterArray:h,label1Array:yt,label2Array:bt,position1Array:xt,position2Array:_t,color1Array:wt,color2Array:St,width:vt})}else if(n.startsWith("@balllist")){var f=xE(n),m=f.listName,g=f.listColor,v=f.listMasters;v&&v.forEach(function(t){ut.masterDict[t]||(ut.masterDict[t]={indent:!1,visible:!1})}),Nt=!0,Ft="",Et=[],At=[],Pt=[],Tt=[],Mt=g,ut.ballLists.push({name:m,masterArray:v,labelArray:Et,radiusArray:At,positionArray:Pt,colorArray:Tt})}else if(n.startsWith("@ribbonlist")){var y=xE(n),b=y.listMasters,x=y.listName,_=y.listColor;b&&b.forEach(function(t){ut.masterDict[t]||(ut.masterDict[t]={indent:!1,visible:!1})}),zt=!0,Ut="",It=[],Ot=[],Lt=[],Ct=_,ut.ribbonLists.push({name:x,masterArray:b,labelArray:It,positionArray:Ot,colorArray:Lt})}else if(n.startsWith("@text"))jt=!0,ut.texts.push(n.substr(5));else if(n.startsWith("@caption"))Gt=!0,ut.captions.push(n.substr(8));else if(Rt){var w=_E(n),S=w.label,A=w.color,M=w.position;'"'===S?S=Dt:Dt=S,void 0===A&&(A=ht),lt.push(S),pt.push.apply(pt,M),dt.push.apply(dt,A)}else if(kt){var E=n.indexOf("{"),P=n.indexOf("{",E+1),T=void 0,C=void 0;-1===P?C=T=n:(T=n.substr(0,P),C=n.substr(P));var I=_E(T),O=I.label,L=I.color,R=I.width,D=I.position;if('"'===O?O=Bt:Bt=O,void 0===L&&(L=gt),R&&vt.push(R),yt.push(O),xt.push.apply(xt,D),wt.push.apply(wt,L),-1===P&&ft)bt.push(Bt),_t.push.apply(_t,ft),St.push.apply(St,mt),Bt=O,ft=D,mt=L;else{var k=_E(C),B=k.label,N=k.color,F=k.position;'"'===B?B=Bt:Bt=B,void 0===N&&(N=gt),bt.push(B),_t.push.apply(_t,F),St.push.apply(St,N),ft=F,mt=N}}else if(Nt){var z=_E(n),U=z.label,j=z.radius,G=z.color,V=z.position;'"'===U?U=Ft:Ft=U,void 0===j&&(j=1),void 0===G&&(G=Mt),Et.push(U),At.push(j),Pt.push.apply(Pt,V),Tt.push.apply(Tt,G)}else if(zt){var H=_E(n),$=H.label,W=H.color,X=H.position;'"'===$?$=Ut:Ut=$,void 0===W&&(W=Ct),It.push($),Ot.push.apply(Ot,X),Lt.push.apply(Lt,W)}else if(jt)ut.texts.push(n);else if(Gt)ut.captions.push(n);else if(n.startsWith("@kinemage"))ut.kinemage=parseInt(n.substr(9).trim());else if(n.startsWith("@onewidth"))ut.onewidth=!0;else if(n.startsWith("@1viewid"))ut["1viewid"]=wE(n);else if(n.startsWith("@pdbfile"))ut.pdbfile=wE(n);else if(n.startsWith("@group")){var q=SE(n),Y=q[0],Z=q[1];for(var K in ut.groupDict[Y]||(ut.groupDict[Y]={dominant:!1,animate:!1}),Z)ut.groupDict[Y][K]=Z[K]}else if(n.startsWith("@subgroup")){var J=SE(n),Q=J[0],tt=J[1];for(var et in ut.subgroupDict[Q]||(ut.subgroupDict[Q]={dominant:!1,animate:!1,master:void 0}),tt)ut.subgroupDict[Q][et]=tt[et]}else if(n.startsWith("@master")){var it=wE(n),rt=-1===(ct=(st=n).indexOf("}"))?void 0:st.substr(ct+1).trim();ut.masterDict[it]||(ut.masterDict[it]={indent:!1,visible:!1}),"on"===rt?ut.masterDict[it].visible=!0:"off"===rt?ut.masterDict[it].visible=!1:"indent"===rt&&(ut.masterDict[it].indent=!0)}else if(n.startsWith("@pointmaster")){var nt=SE(n),ot=nt[0],at=nt[1];ut.pointmasterDict[ot]={id:Object.keys(at)[0].replace(yE,"")}}else console.log(n);else zt=Nt=kt=Rt=!1}var st,ct}(0,t.length,t)}),ut.text=ut.texts.join("\n").trim(),ut.caption=ut.captions.join("\n").trim(),ut.ribbonLists){var e=[];ut.ribbonLists.forEach(function(t){e.push(function(t){for(var e=t.labelArray,i=t.positionArray,r=t.colorArray,n=[],o=0;o<3*(e.length-2);++o)n[o]=e[o-2*Math.floor(o/3)];for(var a=[],s=0;s<9*(i.length/3-2);++s)a[s]=i[s-6*Math.floor(s/9)];for(var c=[],u=0;u<9*(r.length/3-2);++u)c[u]=r[u-6*Math.floor(u/9)];return{name:t.name,masterArray:t.masterArray,labelArray:n,positionArray:a,colorArray:c}}(t))}),ut.ribbonLists=e}de.Debug&&Yp.timeEnd("KinParser._parse "+this.name)},Object.defineProperties(e.prototype,i),e}(wA);id.add("kin",AE);var ME=function(i){function t(t,e){i.call(this,t,e),this.loader=this.getLoader(),this.surface=new ry(this.name,this.path)}i&&(t.__proto__=i),(t.prototype=Object.create(i&&i.prototype)).constructor=t;var e={type:{configurable:!0},__objName:{configurable:!0}};return e.type.get=function(){return"surface"},e.__objName.get=function(){return"surface"},t.prototype._parse=function(){var t=this.loader.parse(this.streamer.asText());this.surface.fromGeometry(t)},Object.defineProperties(t.prototype,e),t}(wA),EE=function(){this.regexp={vertex_pattern:/^v\s+([\d.+\-eE]+)\s+([\d.+\-eE]+)\s+([\d.+\-eE]+)/,normal_pattern:/^vn\s+([\d.+\-eE]+)\s+([\d.+\-eE]+)\s+([\d.+\-eE]+)/,uv_pattern:/^vt\s+([\d.+\-eE]+)\s+([\d.+\-eE]+)/,face_vertex:/^f\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)(?:\s+(-?\d+))?/,face_vertex_uv:/^f\s+(-?\d+)\/(-?\d+)\s+(-?\d+)\/(-?\d+)\s+(-?\d+)\/(-?\d+)(?:\s+(-?\d+)\/(-?\d+))?/,face_vertex_uv_normal:/^f\s+(-?\d+)\/(-?\d+)\/(-?\d+)\s+(-?\d+)\/(-?\d+)\/(-?\d+)\s+(-?\d+)\/(-?\d+)\/(-?\d+)(?:\s+(-?\d+)\/(-?\d+)\/(-?\d+))?/,face_vertex_normal:/^f\s+(-?\d+)\/\/(-?\d+)\s+(-?\d+)\/\/(-?\d+)\s+(-?\d+)\/\/(-?\d+)(?:\s+(-?\d+)\/\/(-?\d+))?/,object_pattern:/^[og]\s*(.+)?/,smoothing_pattern:/^s\s+(\d+|on|off)/,material_library_pattern:/^mtllib /,material_use_pattern:/^usemtl /}};EE.prototype={constructor:EE,setPath:function(t){this.path=t},_createParserState:function(){var t={objects:[],object:{},vertices:[],normals:[],startObject:function(t,e){if(this.object&&!1===this.object.fromDeclaration)return this.object.name=t,void(this.object.fromDeclaration=!1!==e);this.object={name:t||"",geometry:{vertices:[],normals:[]},fromDeclaration:!1!==e},this.objects.push(this.object)},parseVertexIndex:function(t,e){var i=parseInt(t,10);return 3*(0<=i?i-1:i+e/3)},parseNormalIndex:function(t,e){var i=parseInt(t,10);return 3*(0<=i?i-1:i+e/3)},addVertex:function(t,e,i){var r=this.vertices,n=this.object.geometry.vertices;n.push(r[t+0]),n.push(r[t+1]),n.push(r[t+2]),n.push(r[e+0]),n.push(r[e+1]),n.push(r[e+2]),n.push(r[i+0]),n.push(r[i+1]),n.push(r[i+2])},addVertexLine:function(t){var e=this.vertices,i=this.object.geometry.vertices;i.push(e[t+0]),i.push(e[t+1]),i.push(e[t+2])},addNormal:function(t,e,i){var r=this.normals,n=this.object.geometry.normals;n.push(r[t+0]),n.push(r[t+1]),n.push(r[t+2]),n.push(r[e+0]),n.push(r[e+1]),n.push(r[e+2]),n.push(r[i+0]),n.push(r[i+1]),n.push(r[i+2])},addFace:function(t,e,i,r,n,o,a,s){var c,u=this.vertices.length,h=this.parseVertexIndex(t,u),l=this.parseVertexIndex(e,u),p=this.parseVertexIndex(i,u);if(void 0===r?this.addVertex(h,l,p):(c=this.parseVertexIndex(r,u),this.addVertex(h,l,c),this.addVertex(l,p,c)),void 0!==n){var d=this.normals.length;h=this.parseNormalIndex(n,d),l=n===o?h:this.parseNormalIndex(o,d),p=n===a?h:this.parseNormalIndex(a,d),void 0===r?this.addNormal(h,l,p):(c=this.parseNormalIndex(s,d),this.addNormal(h,l,c),this.addNormal(l,p,c))}},addLineGeometry:function(t){this.object.geometry.type="Line";for(var e=this.vertices.length,i=0,r=t.length;i<r;i++)this.addVertexLine(this.parseVertexIndex(t[i],e))}};return t.startObject("",!1),t},parse:function(t){var e,i,r=this,n=this._createParserState();-1!==t.indexOf("\r\n")&&(t=t.replace(/\r\n/g,"\n")),-1!==t.indexOf("\\\n")&&(t=t.replace(/\\\n/g,""));var o=t.split("\n"),a="",s="",c="",u=[],h="function"==typeof"".trimLeft;for(e=0,i=o.length;e<i;e++)if(a=o[e],0!==(a=h?a.trimLeft():a.trim()).length&&"#"!==(s=a.charAt(0)))if("v"===s){if(" "===(c=a.charAt(1))&&null!==(u=r.regexp.vertex_pattern.exec(a)))n.vertices.push(parseFloat(u[1]),parseFloat(u[2]),parseFloat(u[3]));else if("n"===c&&null!==(u=r.regexp.normal_pattern.exec(a)))n.normals.push(parseFloat(u[1]),parseFloat(u[2]),parseFloat(u[3]));else if("t"!==c||null===r.regexp.uv_pattern.exec(a))throw new Error("Unexpected vertex/normal/uv line: '"+a+"'")}else if("f"===s)if(null!==(u=r.regexp.face_vertex_uv_normal.exec(a)))n.addFace(u[1],u[4],u[7],u[10],u[3],u[6],u[9],u[12]);else if(null!==r.regexp.face_vertex_uv.exec(a));else if(null!==(u=r.regexp.face_vertex_normal.exec(a)))n.addFace(u[1],u[3],u[5],u[7],u[2],u[4],u[6],u[8]);else{if(null===(u=r.regexp.face_vertex.exec(a)))throw new Error("Unexpected face line: '"+a+"'");n.addFace(u[1],u[2],u[3],u[4])}else if("l"===s){var l=a.substring(1).trim().split(" "),p=[],d=[];if(-1===a.indexOf("/"))p=l;else for(var f=0,m=l.length;f<m;f++){var g=l[f].split("/");""!==g[0]&&p.push(g[0]),""!==g[1]&&d.push(g[1])}n.addLineGeometry(p,d)}else if(null!==(u=r.regexp.object_pattern.exec(a))){var v=u[0].substr(1).trim();n.startObject(v)}else if(r.regexp.material_use_pattern.test(a));else if(r.regexp.material_library_pattern.test(a));else if(null===r.regexp.smoothing_pattern.exec(a)){if("\0"===a)continue;throw new Error("Unexpected line: '"+a+"'")}var y=[];for(e=0,i=n.objects.length;e<i;e++){var b=n.objects[e].geometry;if(0!==b.vertices.length){var x=new $r;x.addAttribute("position",new wr(new Float32Array(b.vertices),3)),0<b.normals.length?x.addAttribute("normal",new wr(new Float32Array(b.normals),3)):x.computeVertexNormals(),y.push(x)}}return y}};var PE=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),(e.prototype=Object.create(t&&t.prototype)).constructor=e;var i={type:{configurable:!0}};return i.type.get=function(){return"obj"},e.prototype.getLoader=function(){return new EE},Object.defineProperties(e.prototype,i),e}(ME);id.add("obj",PE);var TE=function(){this.propertyNameMapping={}};TE.prototype={constructor:TE,setPropertyNameMapping:function(t){this.propertyNameMapping=t},bin2str:function(t){for(var e=new Uint8Array(t),i="",r=0;r<t.byteLength;r++)i+=String.fromCharCode(e[r]);return i},isASCII:function(t){return"ascii"===this.parseHeader(this.bin2str(t)).format},parse:function(t){return t instanceof ArrayBuffer?this.isASCII(t)?this.parseASCII(this.bin2str(t)):this.parseBinary(t):this.parseASCII(t)},parseHeader:function(t){var e="",i=0,r=/ply([\s\S]*)end_header\s/.exec(t);null!==r&&(e=r[1],i=r[0].length);var n,o,a,s,c,u,h={comments:[],elements:[],headerLength:i},l=e.split("\n");for(var p=0;p<l.length;p++){var d=l[p];if(""!==(d=d.trim()))switch(o=(a=d.split(/\s+/)).shift(),d=a.join(" "),o){case"format":h.format=a[0],h.version=a[1];break;case"comment":h.comments.push(d);break;case"element":void 0!==n&&h.elements.push(n),(n={}).name=a[0],n.count=parseInt(a[1]),n.properties=[];break;case"property":n.properties.push((s=a,c=this.propertyNameMapping,u=void 0,"list"===(u={type:s[0]}).type?(u.name=s[3],u.countType=s[1],u.itemType=s[2]):u.name=s[1],u.name in c&&(u.name=c[u.name]),u));break;default:console.log("unhandled",o,a)}}return void 0!==n&&h.elements.push(n),h},parseASCIINumber:function(t,e){switch(e){case"char":case"uchar":case"short":case"ushort":case"int":case"uint":case"int8":case"uint8":case"int16":case"uint16":case"int32":case"uint32":return parseInt(t);case"float":case"double":case"float32":case"float64":return parseFloat(t)}},parseASCIIElement:function(t,e){for(var i=e.split(/\s+/),r={},n=0;n<t.length;n++)if("list"===t[n].type){for(var o=[],a=this.parseASCIINumber(i.shift(),t[n].countType),s=0;s<a;s++)o.push(this.parseASCIINumber(i.shift(),t[n].itemType));r[t[n].name]=o}else r[t[n].name]=this.parseASCIINumber(i.shift(),t[n].type);return r},parseASCII:function(t){var e,i=new _r,r=this.parseHeader(t),n="";null!==(e=/end_header\s([\s\S]*)$/.exec(t))&&(n=e[1]);var o=n.split("\n"),a=0,s=0;i.useColor=!1;for(var c=0;c<o.length;c++){var u=o[c];if(""!==(u=u.trim())){s>=r.elements[a].count&&(a++,s=0);var h=this.parseASCIIElement(r.elements[a].properties,u);this.handleElement(i,r.elements[a].name,h),s++}}return this.postProcess(i)},postProcess:function(t){if(t.useColor){for(var e=0;e<t.faces.length;e++)t.faces[e].vertexColors=[t.colors[t.faces[e].a],t.colors[t.faces[e].b],t.colors[t.faces[e].c]];t.elementsNeedUpdate=!0}return t.computeBoundingSphere(),t},handleElement:function(t,e,i){if("vertex"===e){if(t.vertices.push(new ri(i.x,i.y,i.z)),"red"in i&&"green"in i&&"blue"in i){t.useColor=!0;var r=new ki;r.setRGB(i.red/255,i.green/255,i.blue/255),t.colors.push(r)}}else if("face"===e){var n=i.vertex_indices;3===n.length?t.faces.push(new pr(n[0],n[1],n[2])):4===n.length&&t.faces.push(new pr(n[0],n[1],n[3]),new pr(n[1],n[2],n[3]))}},binaryRead:function(t,e,i,r){switch(i){case"int8":case"char":return[t.getInt8(e),1];case"uint8":case"uchar":return[t.getUint8(e),1];case"int16":case"short":return[t.getInt16(e,r),2];case"uint16":case"ushort":return[t.getUint16(e,r),2];case"int32":case"int":return[t.getInt32(e,r),4];case"uint32":case"uint":return[t.getUint32(e,r),4];case"float32":case"float":return[t.getFloat32(e,r),4];case"float64":case"double":return[t.getFloat64(e,r),8]}},binaryReadElement:function(t,e,i,r){for(var n,o={},a=0,s=0;s<i.length;s++)if("list"===i[s].type){var c=[],u=(n=this.binaryRead(t,e+a,i[s].countType,r))[0];a+=n[1];for(var h=0;h<u;h++)n=this.binaryRead(t,e+a,i[s].itemType,r),c.push(n[0]),a+=n[1];o[i[s].name]=c}else n=this.binaryRead(t,e+a,i[s].type,r),o[i[s].name]=n[0],a+=n[1];return[o,a]},parseBinary:function(t){for(var e,i=new _r,r=this.parseHeader(this.bin2str(t)),n="binary_little_endian"===r.format,o=new DataView(t,r.headerLength),a=0,s=0;s<r.elements.length;s++)for(var c=0;c<r.elements[s].count;c++){a+=(e=this.binaryReadElement(o,a,r.elements[s].properties,n))[1];var u=e[0];this.handleElement(i,r.elements[s].name,u)}return this.postProcess(i)}};var CE=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),(e.prototype=Object.create(t&&t.prototype)).constructor=e;var i={type:{configurable:!0}};return i.type.get=function(){return"ply"},e.prototype.getLoader=function(){return new TE},Object.defineProperties(e.prototype,i),e}(ME);id.add("ply",CE);var IE=function(r){function t(t,e){var i=e||{};r.call(this,t,i),this.delimiter=bl(i.delimiter,","),this.comment=bl(i.comment,"#"),this.columnNames=bl(i.columnNames,!1),this.table={name:this.name,path:this.path,columnNames:[],data:[]}}r&&(t.__proto__=r),(t.prototype=Object.create(r&&r.prototype)).constructor=t;var e={type:{configurable:!0},__objName:{configurable:!0}};return e.type.get=function(){return"csv"},e.__objName.get=function(){return"table"},t.prototype._parse=function(){var o=this,a=this.table.data,s=new RegExp("\\s*"+this.delimiter+"\\s*"),c=0;this.streamer.eachChunkOfLines(function(t){for(var e=t.length,i=0;i<e;++i){var r=t[i].trim();if(!r.startsWith(o.comment)){var n=r.split(s);0===c?o.table.columnNames=n:r&&a.push(n),++c}}})},Object.defineProperties(t.prototype,e),t}(wA);id.add("csv",IE);var OE=function(r){function t(t,e){var i=e||{};r.call(this,t,i),this.string=bl(i.string,!1),this.json={name:this.name,path:this.path,data:{}}}r&&(t.__proto__=r),(t.prototype=Object.create(r&&r.prototype)).constructor=t;var e={type:{configurable:!0},__objName:{configurable:!0},isJson:{configurable:!0}};return e.type.get=function(){return"json"},e.__objName.get=function(){return"json"},e.isJson.get=function(){return!0},t.prototype._parse=function(){this.streamer.isBinary()||this.string?this.json.data=JSON.parse(this.streamer.asText()):this.json.data=this.streamer.data},Object.defineProperties(t.prototype,e),t}(wA);id.add("json",OE);var LE=function(r){function t(t,e){var i=e||{};r.call(this,t,i),this.msgpack={name:this.name,path:this.path,data:void 0}}r&&(t.__proto__=r),(t.prototype=Object.create(r&&r.prototype)).constructor=t;var e={type:{configurable:!0},__objName:{configurable:!0},isBinary:{configurable:!0}};return e.type.get=function(){return"msgpack"},e.__objName.get=function(){return"msgpack"},e.isBinary.get=function(){return!0},t.prototype._parse=function(){de.Debug&&Yp.time("MsgpackParser._parse "+this.name),this.msgpack.data=oM(this.streamer.data),de.Debug&&Yp.timeEnd("MsgpackParser._parse "+this.name)},Object.defineProperties(t.prototype,e),t}(wA);id.add("msgpack",LE);var RE=function(r){function t(t,e){var i=e||{};r.call(this,t,i),this.netcdf={name:this.name,path:this.path,data:void 0}}r&&(t.__proto__=r),(t.prototype=Object.create(r&&r.prototype)).constructor=t;var e={type:{configurable:!0},__objName:{configurable:!0},isBinary:{configurable:!0}};return e.type.get=function(){return"netcdf"},e.__objName.get=function(){return"netcdf"},e.isBinary.get=function(){return!0},t.prototype._parse=function(){de.Debug&&Yp.time("NetcdfParser._parse "+this.name),this.netcdf.data=new GM(this.streamer.data),de.Debug&&Yp.timeEnd("NetcdfParser._parse "+this.name)},Object.defineProperties(t.prototype,e),t}(wA);id.add("netcdf",RE);var DE=function(i){function t(t,e){i.call(this,t,e),this.text={name:this.name,path:this.path,data:""}}i&&(t.__proto__=i),(t.prototype=Object.create(i&&i.prototype)).constructor=t;var e={type:{configurable:!0},__objName:{configurable:!0}};return e.type.get=function(){return"text"},e.__objName.get=function(){return"text"},t.prototype._parse=function(){this.text.data=this.streamer.asText()},Object.defineProperties(t.prototype,e),t}(wA);id.add("txt",DE),id.add("text",DE);var kE=/^['"]|['"]$/g,BE=/^<([\w-:.]+)\s*/,NE=/^([^<]*)/,FE=/([\w:-]+)\s*=\s*("[^"]*"|'[^']*'|\w+)\s*/;function zE(i){return i=i.trim().replace(/<!--[\s\S]*?-->/g,""),{declaration:function(){if(s(/^<\?xml\s*/)){for(var t={attributes:{}};!c()&&!u("?>");){var e=a();if(!e)return t;t.attributes[e.name]=e.value}return s(/\?>\s*/),t}}(),root:function t(){var e=s(BE);if(e){for(var i,r,n={name:e[1],attributes:{},children:[]};!(c()||u(">")||u("?>")||u("/>"));){var o=a();if(!o)return n;n.attributes[o.name]=o.value}if(s(/^\s*\/>\s*/))return n;for(s(/\??>\s*/),n.content=(i=s(NE))?i[1]:"";r=t();)n.children.push(r);return s(/^<\/[\w-:.]+>\s*/),n}}()};function a(){var t,e=s(FE);if(e)return{name:e[1],value:(t=e[2],t.replace(kE,""))}}function s(t){var e=i.match(t);if(e)return i=i.slice(e[0].length),e}function c(){return 0===i.length}function u(t){return 0===i.indexOf(t)}}var UE=function(r){function t(t,e){var i=e||{};r.call(this,t,i),this.useDomParser=bl(i.useDomParser,!1),this.xml={name:this.name,path:this.path,data:{}}}r&&(t.__proto__=r),(t.prototype=Object.create(r&&r.prototype)).constructor=t;var e={type:{configurable:!0},__objName:{configurable:!0},isXml:{configurable:!0}};return e.type.get=function(){return"xml"},e.__objName.get=function(){return"xml"},e.isXml.get=function(){return!0},t.prototype.__xmlParser=function(t){return zE(t)},t.prototype.__domParser=function(t){return(new window.DOMParser).parseFromString(t,"text/xml")},t.prototype._parse=function(){de.Debug&&Yp.time("XmlParser._parse "+this.name),this.useDomParser?this.streamer.data instanceof Document?this.xml.data=this.streamer.data:this.xml.data=this.__domParser(this.streamer.asText()):this.xml.data=this.__xmlParser(this.streamer.asText()),de.Debug&&Yp.timeEnd("XmlParser._parse "+this.name)},Object.defineProperties(t.prototype,e),t}(wA);function jE(t,e){var i=t.getNamedItem(e);return null!==i?i.value:""}function GE(t,e,i){void 0===i&&(i=!1);var r=jE(t,"icode").trim(),n=jE(t,"chain").trim(),o=jE(t,"altcode"),a=jE(t,"resnum");return r&&(a+="^"+r),n&&(a+=":"+n),e&&(a+="."+e),i&&o.trim()&&(a+="%"+o),a+="/"+(parseInt(jE(t,"model"))-1)}function VE(t,e,i){void 0===t[e]?t[e]=i:t[e]|=i}function HE(t,e){return null!==t&&t.value===e}function $E(t,e,i){for(var r=0,n=e.getElementsByTagName("clash"),o=0,a=n.length;o<a;++o)if(t[jE(n[o].attributes,"cid")]){r+=1;break}return 0<e.getElementsByTagName("angle-outlier").length&&(r+=1),0<e.getElementsByTagName("bond-outlier").length&&(r+=1),0<e.getElementsByTagName("plane-outlier").length&&(r+=1),HE(i.getNamedItem("rota"),"OUTLIER")&&(r+=1),HE(i.getNamedItem("rama"),"OUTLIER")&&(r+=1),HE(i.getNamedItem("RNApucker"),"outlier")&&(r+=1),r}id.add("xml",UE);var WE=function(t,e){this.name=t,this.path=e,this.rsrzDict={},this.rsccDict={},this.rciDict={},this.clashDict={},this.clashArray=[],this.geoDict={},this.geoAtomDict={},this.atomDict={},this.clashSele="NONE"},XE={type:{configurable:!0}};XE.type.get=function(){return"validation"},WE.prototype.fromXml=function(t){de.Debug&&Yp.time("Validation.fromXml");var e,i,r,n=this.rsrzDict,o=this.rsccDict,a=this.rciDict,s=this.clashDict,c=this.clashArray,u=this.geoDict,h=this.geoAtomDict,l=this.atomDict,p=t.getElementsByTagName("Entry");if(1===p.length){var d=p[0].getElementsByTagName("chemical_shift_list");if(1===d.length)for(var f=d[0].getElementsByTagName("random_coil_index"),m=0,g=f.length;m<g;++m){var v=f[m].attributes;a[(r=void 0,i=jE(e=v,"chain").trim(),r="["+jE(e,"rescode")+"]"+jE(e,"resnum"),i&&(r+=":"+i),r)]=parseFloat(jE(v,"value"))}}var y=t.getElementsByTagName("ModelledSubgroup"),b={},x=[];de.Debug&&Yp.time("Validation.fromXml#clashDict");for(var _=0,w=y.length;_<w;++_){var S=y[_],A=S.attributes,M=GE(A);null!==A.getNamedItem("rsrz")&&(n[M]=parseFloat(jE(A,"rsrz"))),null!==A.getNamedItem("rscc")&&(o[M]=parseFloat(jE(A,"rscc")));var E=t.createAttribute("sele");E.value=M,A.setNamedItem(E);for(var P=S.getElementsByTagName("clash"),T=0,C=P.length;T<C;++T){var I=P[T].attributes,O=jE(I,"atom");if("H"!==Rb(O)){var L=jE(I,"cid"),R=GE(A,O,!0);if(l[R]=!0,void 0===b[L])b[L]={sele1:R,res1:M};else{var D=b[L];D.res1!==M&&(D.sele2=R,D.res2=M,x.push(D.res1,M),s[L]=D,c.push(D))}}}}de.Debug&&Yp.timeEnd("Validation.fromXml#clashDict");for(var k=0,B=y.length;k<B;++k){var N=y[k],F=N.attributes,z=jE(F,"sele");if("."!==jE(F,"seq")){var U=$E(s,N,F);0<U&&(u[z]=U)}else{var j=N.getElementsByTagName("clash"),G=N.getElementsByTagName("mog-bond-outlier"),V=N.getElementsByTagName("mog-angle-outlier");if(0<G.length||0<V.length||0<j.length){var H={};h[z]=H;for(var $=0,W=j.length;$<W;++$){var X=j[$].attributes;s[jE(X,"cid")]&&VE(H,jE(X,"atom"),1)}for(var q=0,Y=G.length;q<Y;++q){jE(G[q].attributes,"atoms").split(",").forEach(function(t){VE(H,t,2)})}for(var Z=0,K=V.length;Z<K;++Z){jE(V[Z].attributes,"atoms").split(",").forEach(function(t){VE(H,t,4)})}}}}this.clashSele=x.length?x.join(" OR "):"NONE",de.Debug&&Yp.timeEnd("Validation.fromXml")},WE.prototype.getClashData=function(t){de.Debug&&Yp.time("Validation.getClashData");var e=t||{},i=e.structure,o=i.atomSet,r=new ki(bl(e.color,"#f0027f")),a=i.getAtomProxy(),s=i.getAtomProxy(),c=new ri,u=new ri,h=new ri,n=this.clashArray,l=n.length,p=new Float32Array(3*l),d=new Float32Array(3*l),f=Vd(l,r.r,r.g,r.b),m=new Float32Array(l),g=new Float32Array(l);de.Debug&&Yp.time("Validation.getClashData#atomDict");var v=this.atomDict;i.eachAtom(function(t){var e,i,r,n,o,a,s=(i=(e=t).inscode,r=e.chainname,n=e.atomname,o=e.altloc,a=e.resno+"",i&&(a+="^"+i),r&&(a+=":"+r),n&&(a+="."+n),o&&(a+="%"+o),a+="/"+e.modelIndex);!0===v[s]&&(v[s]=t.index)}),de.Debug&&Yp.timeEnd("Validation.getClashData#atomDict");var y=0;return n.forEach(function(t,e){if(a.index=v[t.sele1],s.index=v[t.sele2],void 0!==a.index&&void 0!==s.index&&o.isSet(a.index,s.index)){c.subVectors(s,a).setLength(a.vdw),u.copy(a).add(c),c.subVectors(a,s).setLength(s.vdw),h.copy(s).add(c);var i=a.distanceTo(s)/2,r=Math.sqrt(a.vdw*a.vdw-i*i),n=Math.sqrt(s.vdw*s.vdw-i*i);u.toArray(p,3*y),h.toArray(d,3*y),m[y]=(r+n)/2,g[y]=e,++y}}),de.Debug&&Yp.timeEnd("Validation.getClashData"),{position1:p.subarray(0,3*y),position2:d.subarray(0,3*y),color:f.subarray(0,3*y),color2:f.subarray(0,3*y),radius:m.subarray(0,y),picking:new mv(g.subarray(0,y),this,i)}},Object.defineProperties(WE.prototype,XE);var qE=function(r){function t(t,e){var i=e||{};r.call(this,t,i),this.useDomParser=!0,this.validation=new WE(this.name,this.path)}r&&(t.__proto__=r),(t.prototype=Object.create(r&&r.prototype)).constructor=t;var e={__objName:{configurable:!0},isXml:{configurable:!0}};return e.__objName.get=function(){return"validation"},e.isXml.get=function(){return!0},t.prototype._parse=function(){r.prototype._parse.call(this),de.Debug&&Yp.time("ValidationParser._parse "+this.name),this.validation.fromXml(this.xml.data),de.Debug&&Yp.timeEnd("ValidationParser._parse "+this.name)},Object.defineProperties(t.prototype,e),t}(UE);function YE(t,e){return t.length===e?t:t.subarray?t.subarray(0,e):(t.length=e,t)}function ZE(t,e,i,r,n){if(e.subarray&&t.subarray)t.set(e.subarray(i,i+r),n);else for(var o=0;o<r;o++)t[n+o]=e[i+o]}function KE(t,e,i,r){for(var n=65535&t|0,o=t>>>16&65535|0,a=0;0!==i;){for(i-=a=2e3<i?2e3:i;o=o+(n=n+e[r++]|0)|0,--a;);n%=65521,o%=65521}return n|o<<16|0}id.add("validation",qE);var JE=function(){for(var t,e=[],i=0;i<256;i++){t=i;for(var r=0;r<8;r++)t=1&t?3988292384^t>>>1:t>>>1;e[i]=t}return e}();function QE(t,e,i,r){var n=JE,o=r+i;t^=-1;for(var a=r;a<o;a++)t=t>>>8^n[255&(t^e[a])];return-1^t}var tP=30,eP=12;function iP(t,e){var i,r,n,o,a,s,c,u,h,l,p,d,f,m,g,v,y,b,x,_,w,S,A,M,E;i=t.state,r=t.next_in,M=t.input,n=r+(t.avail_in-5),o=t.next_out,E=t.output,a=o-(e-t.avail_out),s=o+(t.avail_out-257),c=i.dmax,u=i.wsize,h=i.whave,l=i.wnext,p=i.window,d=i.hold,f=i.bits,m=i.lencode,g=i.distcode,v=(1<<i.lenbits)-1,y=(1<<i.distbits)-1;t:do{f<15&&(d+=M[r++]<<f,f+=8,d+=M[r++]<<f,f+=8),b=m[d&v];e:for(;;){if(d>>>=x=b>>>24,f-=x,0===(x=b>>>16&255))E[o++]=65535&b;else{if(!(16&x)){if(0==(64&x)){b=m[(65535&b)+(d&(1<<x)-1)];continue e}if(32&x){i.mode=eP;break t}t.msg="invalid literal/length code",i.mode=tP;break t}_=65535&b,(x&=15)&&(f<x&&(d+=M[r++]<<f,f+=8),_+=d&(1<<x)-1,d>>>=x,f-=x),f<15&&(d+=M[r++]<<f,f+=8,d+=M[r++]<<f,f+=8),b=g[d&y];i:for(;;){if(d>>>=x=b>>>24,f-=x,!(16&(x=b>>>16&255))){if(0==(64&x)){b=g[(65535&b)+(d&(1<<x)-1)];continue i}t.msg="invalid distance code",i.mode=tP;break t}if(w=65535&b,f<(x&=15)&&(d+=M[r++]<<f,(f+=8)<x&&(d+=M[r++]<<f,f+=8)),c<(w+=d&(1<<x)-1)){t.msg="invalid distance too far back",i.mode=tP;break t}if(d>>>=x,f-=x,(x=o-a)<w){if(h<(x=w-x)&&i.sane){t.msg="invalid distance too far back",i.mode=tP;break t}if(A=p,(S=0)===l){if(S+=u-x,x<_){for(_-=x;E[o++]=p[S++],--x;);S=o-w,A=E}}else if(l<x){if(S+=u+l-x,(x-=l)<_){for(_-=x;E[o++]=p[S++],--x;);if(S=0,l<_){for(_-=x=l;E[o++]=p[S++],--x;);S=o-w,A=E}}}else if(S+=l-x,x<_){for(_-=x;E[o++]=p[S++],--x;);S=o-w,A=E}for(;2<_;)E[o++]=A[S++],E[o++]=A[S++],E[o++]=A[S++],_-=3;_&&(E[o++]=A[S++],1<_&&(E[o++]=A[S++]))}else{for(S=o-w;E[o++]=E[S++],E[o++]=E[S++],E[o++]=E[S++],2<(_-=3););_&&(E[o++]=E[S++],1<_&&(E[o++]=E[S++]))}break}}break}}while(r<n&&o<s);r-=_=f>>3,d&=(1<<(f-=_<<3))-1,t.next_in=r,t.next_out=o,t.avail_in=r<n?n-r+5:5-(r-n),t.avail_out=o<s?s-o+257:257-(o-s),i.hold=d,i.bits=f}var rP=15,nP=852,oP=592,aP=0,sP=1,cP=2,uP=[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],hP=[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],lP=[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],pP=[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];function dP(t,e,i,r,n,o,a,s){var c,u,h,l,p,d,f,m,g,v=s.bits,y=0,b=0,x=0,_=0,w=0,S=0,A=0,M=0,E=0,P=0,T=null,C=0,I=new Uint16Array(rP+1),O=new Uint16Array(rP+1),L=null,R=0;for(y=0;y<=rP;y++)I[y]=0;for(b=0;b<r;b++)I[e[i+b]]++;for(w=v,_=rP;1<=_&&0===I[_];_--);if(_<w&&(w=_),0===_)return n[o++]=20971520,n[o++]=20971520,s.bits=1,0;for(x=1;x<_&&0===I[x];x++);for(w<x&&(w=x),y=M=1;y<=rP;y++)if(M<<=1,(M-=I[y])<0)return-1;if(0<M&&(t===aP||1!==_))return-1;for(O[1]=0,y=1;y<rP;y++)O[y+1]=O[y]+I[y];for(b=0;b<r;b++)0!==e[i+b]&&(a[O[e[i+b]]++]=b);if(t===aP?(T=L=a,d=19):t===sP?(T=uP,C-=257,L=hP,R-=257,d=256):(T=lP,L=pP,d=-1),y=x,p=o,A=b=P=0,h=-1,l=(E=1<<(S=w))-1,t===sP&&nP<E||t===cP&&oP<E)return 1;for(;;){for(f=y-A,a[b]<d?(m=0,g=a[b]):a[b]>d?(m=L[R+a[b]],g=T[C+a[b]]):(m=96,g=0),c=1<<y-A,x=u=1<<S;n[p+(P>>A)+(u-=c)]=f<<24|m<<16|g|0,0!==u;);for(c=1<<y-1;P&c;)c>>=1;if(0!==c?(P&=c-1,P+=c):P=0,b++,0==--I[y]){if(y===_)break;y=e[i+a[b]]}if(w<y&&(P&l)!==h){for(0===A&&(A=w),p+=x,M=1<<(S=y-A);S+A<_&&!((M-=I[S+A])<=0);)S++,M<<=1;if(E+=1<<S,t===sP&&nP<E||t===cP&&oP<E)return 1;n[h=P&l]=w<<24|S<<16|p-o|0}}return 0!==P&&(n[p+P]=y-A<<24|64<<16|0),s.bits=w,0}var fP=0,mP=1,gP=2,vP=4,yP=5,bP=6,xP=0,_P=1,wP=2,SP=-2,AP=-3,MP=-4,EP=-5,PP=8,TP=1,CP=2,IP=3,OP=4,LP=5,RP=6,DP=7,kP=8,BP=9,NP=10,FP=11,zP=12,UP=13,jP=14,GP=15,VP=16,HP=17,$P=18,WP=19,XP=20,qP=21,YP=22,ZP=23,KP=24,JP=25,QP=26,tT=27,eT=28,iT=29,rT=30,nT=31,oT=32,aT=852,sT=592;function cT(t){return(t>>>24&255)+(t>>>8&65280)+((65280&t)<<8)+((255&t)<<24)}function uT(){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}function hT(t){var e,i,r;return t&&t.state?((e=t.state).wsize=0,e.whave=0,e.wnext=0,(i=t)&&i.state?(r=i.state,i.total_in=i.total_out=r.total=0,i.msg="",r.wrap&&(i.adler=1&r.wrap),r.mode=TP,r.last=0,r.havedict=0,r.dmax=32768,r.head=null,r.hold=0,r.bits=0,r.lencode=r.lendyn=new Int32Array(aT),r.distcode=r.distdyn=new Int32Array(sT),r.sane=1,r.back=-1,xP):SP):SP}function lT(t,e){var i,r,n,o,a,s;return t?(r=new uT,(t.state=r).window=null,o=e,(i=(n=t)&&n.state?(s=n.state,o<0?(a=0,o=-o):(a=1+(o>>4),o<48&&(o&=15)),o&&(o<8||15<o)?SP:(null!==s.window&&s.wbits!==o&&(s.window=null),s.wrap=a,s.wbits=o,hT(n))):SP)!==xP&&(t.state=null),i):SP}var pT,dT,fT=!0;function mT(t){if(fT){var e;for(pT=new Int32Array(512),dT=new Int32Array(32),e=0;e<144;)t.lens[e++]=8;for(;e<256;)t.lens[e++]=9;for(;e<280;)t.lens[e++]=7;for(;e<288;)t.lens[e++]=8;for(dP(mP,t.lens,0,288,pT,0,t.work,{bits:9}),e=0;e<32;)t.lens[e++]=5;dP(gP,t.lens,0,32,dT,0,t.work,{bits:5}),fT=!1}t.lencode=pT,t.lenbits=9,t.distcode=dT,t.distbits=5}function gT(t,e,i,r){var n,o=t.state;return null===o.window&&(o.wsize=1<<o.wbits,o.wnext=0,o.whave=0,o.window=new Uint8Array(o.wsize)),r>=o.wsize?(ZE(o.window,e,i-o.wsize,o.wsize,0),o.wnext=0,o.whave=o.wsize):(r<(n=o.wsize-o.wnext)&&(n=r),ZE(o.window,e,i-r,n,o.wnext),(r-=n)?(ZE(o.window,e,i-r,r,0),o.wnext=r,o.whave=o.wsize):(o.wnext+=n,o.wnext===o.wsize&&(o.wnext=0),o.whave<o.wsize&&(o.whave+=n))),0}function vT(t,e){var i,r,n,o,a,s,c,u,h,l,p,d,f,m,g,v,y,b,x,_,w,S,A,M,E=0,P=new Uint8Array(4),T=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];if(!t||!t.state||!t.output||!t.input&&0!==t.avail_in)return SP;(i=t.state).mode===zP&&(i.mode=UP),a=t.next_out,n=t.output,c=t.avail_out,o=t.next_in,r=t.input,s=t.avail_in,u=i.hold,h=i.bits,l=s,p=c,S=xP;t:for(;;)switch(i.mode){case TP:if(0===i.wrap){i.mode=UP;break}for(;h<16;){if(0===s)break t;s--,u+=r[o++]<<h,h+=8}if(2&i.wrap&&35615===u){P[i.check=0]=255&u,P[1]=u>>>8&255,i.check=QE(i.check,P,2,0),h=u=0,i.mode=CP;break}if(i.flags=0,i.head&&(i.head.done=!1),!(1&i.wrap)||(((255&u)<<8)+(u>>8))%31){t.msg="incorrect header check",i.mode=rT;break}if((15&u)!==PP){t.msg="unknown compression method",i.mode=rT;break}if(h-=4,w=8+(15&(u>>>=4)),0===i.wbits)i.wbits=w;else if(w>i.wbits){t.msg="invalid window size",i.mode=rT;break}i.dmax=1<<w,t.adler=i.check=1,i.mode=512&u?NP:zP,h=u=0;break;case CP:for(;h<16;){if(0===s)break t;s--,u+=r[o++]<<h,h+=8}if(i.flags=u,(255&i.flags)!==PP){t.msg="unknown compression method",i.mode=rT;break}if(57344&i.flags){t.msg="unknown header flags set",i.mode=rT;break}i.head&&(i.head.text=u>>8&1),512&i.flags&&(P[0]=255&u,P[1]=u>>>8&255,i.check=QE(i.check,P,2,0)),h=u=0,i.mode=IP;case IP:for(;h<32;){if(0===s)break t;s--,u+=r[o++]<<h,h+=8}i.head&&(i.head.time=u),512&i.flags&&(P[0]=255&u,P[1]=u>>>8&255,P[2]=u>>>16&255,P[3]=u>>>24&255,i.check=QE(i.check,P,4,0)),h=u=0,i.mode=OP;case OP:for(;h<16;){if(0===s)break t;s--,u+=r[o++]<<h,h+=8}i.head&&(i.head.xflags=255&u,i.head.os=u>>8),512&i.flags&&(P[0]=255&u,P[1]=u>>>8&255,i.check=QE(i.check,P,2,0)),h=u=0,i.mode=LP;case LP:if(1024&i.flags){for(;h<16;){if(0===s)break t;s--,u+=r[o++]<<h,h+=8}i.length=u,i.head&&(i.head.extra_len=u),512&i.flags&&(P[0]=255&u,P[1]=u>>>8&255,i.check=QE(i.check,P,2,0)),h=u=0}else i.head&&(i.head.extra=null);i.mode=RP;case RP:if(1024&i.flags&&(s<(d=i.length)&&(d=s),d&&(i.head&&(w=i.head.extra_len-i.length,i.head.extra||(i.head.extra=new Array(i.head.extra_len)),ZE(i.head.extra,r,o,d,w)),512&i.flags&&(i.check=QE(i.check,r,d,o)),s-=d,o+=d,i.length-=d),i.length))break t;i.length=0,i.mode=DP;case DP:if(2048&i.flags){if(0===s)break t;for(d=0;w=r[o+d++],i.head&&w&&i.length<65536&&(i.head.name+=String.fromCharCode(w)),w&&d<s;);if(512&i.flags&&(i.check=QE(i.check,r,d,o)),s-=d,o+=d,w)break t}else i.head&&(i.head.name=null);i.length=0,i.mode=kP;case kP:if(4096&i.flags){if(0===s)break t;for(d=0;w=r[o+d++],i.head&&w&&i.length<65536&&(i.head.comment+=String.fromCharCode(w)),w&&d<s;);if(512&i.flags&&(i.check=QE(i.check,r,d,o)),s-=d,o+=d,w)break t}else i.head&&(i.head.comment=null);i.mode=BP;case BP:if(512&i.flags){for(;h<16;){if(0===s)break t;s--,u+=r[o++]<<h,h+=8}if(u!==(65535&i.check)){t.msg="header crc mismatch",i.mode=rT;break}h=u=0}i.head&&(i.head.hcrc=i.flags>>9&1,i.head.done=!0),t.adler=i.check=0,i.mode=zP;break;case NP:for(;h<32;){if(0===s)break t;s--,u+=r[o++]<<h,h+=8}t.adler=i.check=cT(u),h=u=0,i.mode=FP;case FP:if(0===i.havedict)return t.next_out=a,t.avail_out=c,t.next_in=o,t.avail_in=s,i.hold=u,i.bits=h,wP;t.adler=i.check=1,i.mode=zP;case zP:if(e===yP||e===bP)break t;case UP:if(i.last){u>>>=7&h,h-=7&h,i.mode=tT;break}for(;h<3;){if(0===s)break t;s--,u+=r[o++]<<h,h+=8}switch(i.last=1&u,h-=1,3&(u>>>=1)){case 0:i.mode=jP;break;case 1:if(mT(i),i.mode=XP,e===bP){u>>>=2,h-=2;break t}break;case 2:i.mode=HP;break;case 3:t.msg="invalid block type",i.mode=rT}u>>>=2,h-=2;break;case jP:for(u>>>=7&h,h-=7&h;h<32;){if(0===s)break t;s--,u+=r[o++]<<h,h+=8}if((65535&u)!=(u>>>16^65535)){t.msg="invalid stored block lengths",i.mode=rT;break}if(i.length=65535&u,h=u=0,i.mode=GP,e===bP)break t;case GP:i.mode=VP;case VP:if(d=i.length){if(s<d&&(d=s),c<d&&(d=c),0===d)break t;ZE(n,r,o,d,a),s-=d,o+=d,c-=d,a+=d,i.length-=d;break}i.mode=zP;break;case HP:for(;h<14;){if(0===s)break t;s--,u+=r[o++]<<h,h+=8}if(i.nlen=257+(31&u),u>>>=5,h-=5,i.ndist=1+(31&u),u>>>=5,h-=5,i.ncode=4+(15&u),u>>>=4,h-=4,286<i.nlen||30<i.ndist){t.msg="too many length or distance symbols",i.mode=rT;break}i.have=0,i.mode=$P;case $P:for(;i.have<i.ncode;){for(;h<3;){if(0===s)break t;s--,u+=r[o++]<<h,h+=8}i.lens[T[i.have++]]=7&u,u>>>=3,h-=3}for(;i.have<19;)i.lens[T[i.have++]]=0;if(i.lencode=i.lendyn,i.lenbits=7,A={bits:i.lenbits},S=dP(fP,i.lens,0,19,i.lencode,0,i.work,A),i.lenbits=A.bits,S){t.msg="invalid code lengths set",i.mode=rT;break}i.have=0,i.mode=WP;case WP:for(;i.have<i.nlen+i.ndist;){for(;v=(E=i.lencode[u&(1<<i.lenbits)-1])>>>16&255,y=65535&E,!((g=E>>>24)<=h);){if(0===s)break t;s--,u+=r[o++]<<h,h+=8}if(y<16)u>>>=g,h-=g,i.lens[i.have++]=y;else{if(16===y){for(M=g+2;h<M;){if(0===s)break t;s--,u+=r[o++]<<h,h+=8}if(u>>>=g,h-=g,0===i.have){t.msg="invalid bit length repeat",i.mode=rT;break}w=i.lens[i.have-1],d=3+(3&u),u>>>=2,h-=2}else if(17===y){for(M=g+3;h<M;){if(0===s)break t;s--,u+=r[o++]<<h,h+=8}h-=g,w=0,d=3+(7&(u>>>=g)),u>>>=3,h-=3}else{for(M=g+7;h<M;){if(0===s)break t;s--,u+=r[o++]<<h,h+=8}h-=g,w=0,d=11+(127&(u>>>=g)),u>>>=7,h-=7}if(i.have+d>i.nlen+i.ndist){t.msg="invalid bit length repeat",i.mode=rT;break}for(;d--;)i.lens[i.have++]=w}}if(i.mode===rT)break;if(0===i.lens[256]){t.msg="invalid code -- missing end-of-block",i.mode=rT;break}if(i.lenbits=9,A={bits:i.lenbits},S=dP(mP,i.lens,0,i.nlen,i.lencode,0,i.work,A),i.lenbits=A.bits,S){t.msg="invalid literal/lengths set",i.mode=rT;break}if(i.distbits=6,i.distcode=i.distdyn,A={bits:i.distbits},S=dP(gP,i.lens,i.nlen,i.ndist,i.distcode,0,i.work,A),i.distbits=A.bits,S){t.msg="invalid distances set",i.mode=rT;break}if(i.mode=XP,e===bP)break t;case XP:i.mode=qP;case qP:if(6<=s&&258<=c){t.next_out=a,t.avail_out=c,t.next_in=o,t.avail_in=s,i.hold=u,i.bits=h,iP(t,p),a=t.next_out,n=t.output,c=t.avail_out,o=t.next_in,r=t.input,s=t.avail_in,u=i.hold,h=i.bits,i.mode===zP&&(i.back=-1);break}for(i.back=0;v=(E=i.lencode[u&(1<<i.lenbits)-1])>>>16&255,y=65535&E,!((g=E>>>24)<=h);){if(0===s)break t;s--,u+=r[o++]<<h,h+=8}if(v&&0==(240&v)){for(b=g,x=v,_=y;v=(E=i.lencode[_+((u&(1<<b+x)-1)>>b)])>>>16&255,y=65535&E,!(b+(g=E>>>24)<=h);){if(0===s)break t;s--,u+=r[o++]<<h,h+=8}u>>>=b,h-=b,i.back+=b}if(u>>>=g,h-=g,i.back+=g,i.length=y,0===v){i.mode=QP;break}if(32&v){i.back=-1,i.mode=zP;break}if(64&v){t.msg="invalid literal/length code",i.mode=rT;break}i.extra=15&v,i.mode=YP;case YP:if(i.extra){for(M=i.extra;h<M;){if(0===s)break t;s--,u+=r[o++]<<h,h+=8}i.length+=u&(1<<i.extra)-1,u>>>=i.extra,h-=i.extra,i.back+=i.extra}i.was=i.length,i.mode=ZP;case ZP:for(;v=(E=i.distcode[u&(1<<i.distbits)-1])>>>16&255,y=65535&E,!((g=E>>>24)<=h);){if(0===s)break t;s--,u+=r[o++]<<h,h+=8}if(0==(240&v)){for(b=g,x=v,_=y;v=(E=i.distcode[_+((u&(1<<b+x)-1)>>b)])>>>16&255,y=65535&E,!(b+(g=E>>>24)<=h);){if(0===s)break t;s--,u+=r[o++]<<h,h+=8}u>>>=b,h-=b,i.back+=b}if(u>>>=g,h-=g,i.back+=g,64&v){t.msg="invalid distance code",i.mode=rT;break}i.offset=y,i.extra=15&v,i.mode=KP;case KP:if(i.extra){for(M=i.extra;h<M;){if(0===s)break t;s--,u+=r[o++]<<h,h+=8}i.offset+=u&(1<<i.extra)-1,u>>>=i.extra,h-=i.extra,i.back+=i.extra}if(i.offset>i.dmax){t.msg="invalid distance too far back",i.mode=rT;break}i.mode=JP;case JP:if(0===c)break t;if(d=p-c,i.offset>d){if((d=i.offset-d)>i.whave&&i.sane){t.msg="invalid distance too far back",i.mode=rT;break}d>i.wnext?(d-=i.wnext,f=i.wsize-d):f=i.wnext-d,d>i.length&&(d=i.length),m=i.window}else m=n,f=a-i.offset,d=i.length;for(c<d&&(d=c),c-=d,i.length-=d;n[a++]=m[f++],--d;);0===i.length&&(i.mode=qP);break;case QP:if(0===c)break t;n[a++]=i.length,c--,i.mode=qP;break;case tT:if(i.wrap){for(;h<32;){if(0===s)break t;s--,u|=r[o++]<<h,h+=8}if(p-=c,t.total_out+=p,i.total+=p,p&&(t.adler=i.check=i.flags?QE(i.check,n,p,a-p):KE(i.check,n,p,a-p)),p=c,(i.flags?u:cT(u))!==i.check){t.msg="incorrect data check",i.mode=rT;break}h=u=0}i.mode=eT;case eT:if(i.wrap&&i.flags){for(;h<32;){if(0===s)break t;s--,u+=r[o++]<<h,h+=8}if(u!==(4294967295&i.total)){t.msg="incorrect length check",i.mode=rT;break}h=u=0}i.mode=iT;case iT:S=_P;break t;case rT:S=AP;break t;case nT:return MP;case oT:default:return SP}return t.next_out=a,t.avail_out=c,t.next_in=o,t.avail_in=s,i.hold=u,i.bits=h,(i.wsize||p!==t.avail_out&&i.mode<rT&&(i.mode<tT||e!==vP))&&gT(t,t.output,t.next_out,p-t.avail_out),l-=t.avail_in,p-=t.avail_out,t.total_in+=l,t.total_out+=p,i.total+=p,i.wrap&&p&&(t.adler=i.check=i.flags?QE(i.check,n,p,t.next_out-p):KE(i.check,n,p,t.next_out-p)),t.data_type=i.bits+(i.last?64:0)+(i.mode===zP?128:0)+(i.mode===XP||i.mode===GP?256:0),(0===l&&0===p||e===vP)&&S===xP&&(S=EP),S}var yT=!0,bT=!0;try{String.fromCharCode.apply(null,[0])}catch(t){yT=!1}try{String.fromCharCode.apply(null,new Uint8Array(1))}catch(t){bT=!1}for(var xT=new Uint8Array(256),_T=0;_T<256;_T++)xT[_T]=252<=_T?6:248<=_T?5:240<=_T?4:224<=_T?3:192<=_T?2:1;function wT(t){var e,i,r,n,o,a=t.length,s=0;for(n=0;n<a;n++)55296==(64512&(i=t.charCodeAt(n)))&&n+1<a&&56320==(64512&(r=t.charCodeAt(n+1)))&&(i=65536+(i-55296<<10)+(r-56320),n++),s+=i<128?1:i<2048?2:i<65536?3:4;for(e=new Uint8Array(s),n=o=0;o<s;n++)55296==(64512&(i=t.charCodeAt(n)))&&n+1<a&&56320==(64512&(r=t.charCodeAt(n+1)))&&(i=65536+(i-55296<<10)+(r-56320),n++),i<128?e[o++]=i:(i<2048?e[o++]=192|i>>>6:(i<65536?e[o++]=224|i>>>12:(e[o++]=240|i>>>18,e[o++]=128|i>>>12&63),e[o++]=128|i>>>6&63),e[o++]=128|63&i);return e}function ST(t,e){var i,r,n,o,a=e||t.length,s=new Array(2*a);for(i=r=0;i<a;)if((n=t[i++])<128)s[r++]=n;else if(4<(o=xT[n]))s[r++]=65533,i+=o-1;else{for(n&=2===o?31:3===o?15:7;1<o&&i<a;)n=n<<6|63&t[i++],o--;1<o?s[r++]=65533:n<65536?s[r++]=n:(n-=65536,s[r++]=55296|n>>10&1023,s[r++]=56320|1023&n)}return function(t,e){if(e<65537&&(t.subarray&&bT||!t.subarray&&yT))return String.fromCharCode.apply(null,YE(t,e));for(var i="",r=0;r<e;r++)i+=String.fromCharCode(t[r]);return i}(s,r)}function AT(t,e){var i;for((e=e||t.length)>t.length&&(e=t.length),i=e-1;0<=i&&128==(192&t[i]);)i--;return i<0?e:0===i?e:i+xT[t[i]]>e?i:e}xT[254]=xT[254]=1;var MT=0,ET={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"};function PT(){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}function TT(){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}var CT=Object.prototype.toString;function IT(t){if(!(this instanceof IT))return new IT(t);this.options=function(t){for(var e=Array.prototype.slice.call(arguments,1);e.length;){var i=e.shift();if(i){if("object"!=typeof i)throw new TypeError(i+"must be non-object");for(var r in i)i.hasOwnProperty(r)&&(t[r]=i[r])}}return t}({chunkSize:16384,windowBits:0,to:""},t||{});var e=this.options;e.raw&&0<=e.windowBits&&e.windowBits<16&&(e.windowBits=-e.windowBits,0===e.windowBits&&(e.windowBits=-15)),!(0<=e.windowBits&&e.windowBits<16)||t&&t.windowBits||(e.windowBits+=32),15<e.windowBits&&e.windowBits<48&&0==(15&e.windowBits)&&(e.windowBits|=15),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new PT,this.strm.avail_out=0;var i,r,n,o=lT(this.strm,e.windowBits);if(o!==MT)throw new Error(ET[o]);this.header=new TT,i=this.strm,r=this.header,i&&i.state&&(0==(2&(n=i.state).wrap)||((n.head=r).done=!1))}IT.prototype.push=function(t,e){var i,r,n,o,a,s,c,u,h,l,p=this.strm,d=this.options.chunkSize,f=this.options.dictionary,m=!1;if(this.ended)return!1;r=e===~~e?e:!0===e?4:0,"string"==typeof t?p.input=function(t){for(var e=new Uint8Array(t.length),i=0,r=e.length;i<r;i++)e[i]=t.charCodeAt(i);return e}(t):"[object ArrayBuffer]"===CT.call(t)?p.input=new Uint8Array(t):p.input=t,p.next_in=0,p.avail_in=p.input.length;do{if(0===p.avail_out&&(p.output=new Uint8Array(d),p.next_out=0,p.avail_out=d),2===(i=vT(p,0))&&f&&(s="string"==typeof f?wT(f):"[object ArrayBuffer]"===CT.call(f)?new Uint8Array(f):f,c=this.strm,h=void 0,l=(u=s).length,i=c&&c.state?0!==(h=c.state).wrap&&h.mode!==FP?SP:h.mode===FP&&KE(1,u,l,0)!==h.check?AP:gT(c,u,l,l)?(h.mode=nT,MP):(h.havedict=1,xP):SP),-5===i&&!0===m&&(i=MT,m=!1),1!==i&&i!==MT)return this.onEnd(i),!(this.ended=!0);p.next_out&&(0!==p.avail_out&&1!==i&&(0!==p.avail_in||4!==r&&2!==r)||("string"===this.options.to?(n=AT(p.output,p.next_out),o=p.next_out-n,a=ST(p.output,n),p.next_out=o,p.avail_out=d-o,o&&ZE(p.output,p.output,n,o,0),this.onData(a)):this.onData(YE(p.output,p.next_out)))),0===p.avail_in&&0===p.avail_out&&(m=!0)}while((0<p.avail_in||0===p.avail_out)&&1!==i);return 1===i&&(r=4),4===r?(i=function(t){if(!t||!t.state)return SP;var e=t.state;return e.window&&(e.window=null),t.state=null,xP}(this.strm),this.onEnd(i),this.ended=!0,i===MT):2!==r||(this.onEnd(MT),!(p.avail_out=0))},IT.prototype.onData=function(t){this.chunks.push(t)},IT.prototype.onEnd=function(t){t===MT&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=function(t){var e,i,r,n,o,a;for(e=r=0,i=t.length;e<i;e++)r+=t[e].length;for(a=new Uint8Array(r),e=n=0,i=t.length;e<i;e++)o=t[e],a.set(o,n),n+=o.length;return a}(this.chunks)),this.chunks=[],this.err=t,this.msg=this.strm.msg},nd.add("gz",function(e){var i;e instanceof ArrayBuffer&&(e=new Uint8Array(e));try{i=function(t,e){var i=new IT(e);if(i.push(t,!0),i.err)throw i.msg;return i.result}(e)}catch(t){i=e}return i});var OT=function(){},LT="//mmtf.rcsb.org/v1.0/",RT=LT+"full/",DT=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),((e.prototype=Object.create(t&&t.prototype)).constructor=e).prototype.getUrl=function(t){var e,i=md(t),r=i.name.substr(0,4);return!["pdb","cif"].includes(i.ext)||!1!==i.compressed&&"gz"!==i.compressed?"mmtf"===i.ext?e=i.base.endsWith(".bb")?"//mmtf.rcsb.org/v1.0/reduced/"+r:RT+r:(i.ext&&Yp.warn("unsupported ext",i.ext),e=RT+r):e="//files.rcsb.org/download/"+i.path,wl()+e},e.prototype.getExt=function(t){var e=md(t).ext;return e||"mmtf"},e}(OT);td.add("rcsb",new DT);var kT="//pubchem.ncbi.nlm.nih.gov/rest/pug/compound/cid/",BT="/SDF?record_type=3d",NT=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),((e.prototype=Object.create(t&&t.prototype)).constructor=e).prototype.getUrl=function(t){var e,i=md(t),r=i.name;return i.ext&&"sdf"!==i.ext&&Yp.warn("unsupported ext",i.ext),e=kT+r+BT,wl()+e},e.prototype.getExt=function(t){var e=md(t).ext;return e||"sdf"},e}(OT);td.add("pubchem",new NT);var FT=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),((e.prototype=Object.create(t&&t.prototype)).constructor=e).prototype.getUrl=function(t){return t},e.prototype.getExt=function(t){return md(t).ext},e}(OT);td.add("ftp",new FT),td.add("http",new FT),td.add("https",new FT);var zT=/^((http|https|ftp):)*\/\//,UT=function(e){function t(t){void 0===t&&(t=""),e.call(this),this.baseUrl=t}return e&&(t.__proto__=e),((t.prototype=Object.create(e&&e.prototype)).constructor=t).prototype.getUrl=function(t){var e,i,r,n,o=md(t),a=this.baseUrl+o.path;return zT.test(this.baseUrl)||(e=a,i=window.location,r=i.pathname,n=r.substring(0,r.lastIndexOf("/")+1),a=i.origin+n+e),a},t.prototype.getExt=function(t){return md(t).ext},t}(OT),jT=function(e){function t(t){void 0===t&&(t=""),e.call(this),this.baseUrl=t}return e&&(t.__proto__=e),((t.prototype=Object.create(e&&e.prototype)).constructor=t).prototype.getListing=function(e){void 0===e&&(e="");var t=this.baseUrl+"dir/"+e;return"/"!==t[t.length-1]&&(t+="/"),vd(t,{ext:"json"}).then(function(t){return{path:e,data:t.data}})},t.prototype.getUrl=function(t){var e=md(t);return this.baseUrl+"file/"+e.path+e.query},t.prototype.getCountUrl=function(t){var e=md(t);return this.baseUrl+"traj/numframes/"+e.path+e.query},t.prototype.getFrameUrl=function(t,e){var i=md(t);return this.baseUrl+"traj/frame/"+e+"/"+i.path+i.query},t.prototype.getFrameParams=function(t,e){return"atomIndices="+e.join(";")},t.prototype.getPathUrl=function(t,e){var i=md(t);return this.baseUrl+"traj/path/"+e+"/"+i.path+i.query},t.prototype.getExt=function(t){return md(t).ext},t}(OT);function GT(t,e){return{type:"integer",max:t,min:e}}function VT(t,e,i){return{type:"number",precision:t,max:e,min:i}}function HT(t,e,i){return{type:"range",step:t,max:e,min:i}}function $T(){for(var t=[],e=arguments.length;e--;)t[e]=arguments[e];return{type:"select",options:t.reduce(function(t,e){var i;return Object.assign({},t,((i={})[e]=e,i))},{})}}var WT={backgroundColor:{type:"color"},quality:$T("auto","low","medium","high"),sampleLevel:HT(1,5,-1),impostor:{type:"boolean"},workerDefault:{type:"boolean"},rotateSpeed:VT(1,10,0),zoomSpeed:VT(1,10,0),panSpeed:VT(1,10,0),clipNear:HT(1,100,0),clipFar:HT(1,100,0),clipDist:GT(200,0),fogNear:HT(1,100,0),fogFar:HT(1,100,0),cameraType:$T("perspective","orthographic","stereo"),cameraEyeSep:VT(3,1,.01),cameraFov:HT(1,120,15),lightColor:{type:"color"},lightIntensity:VT(2,10,0),ambientColor:{type:"color"},ambientIntensity:VT(2,10,0),hoverTimeout:GT(1e4,-1),tooltip:{type:"boolean"},mousePreset:$T.apply(void 0,Object.keys(Ay))};window.Promise||(window.Promise=s),de.Version="2.0.0-dev.36",de.StaticDatasource=UT,de.MdsrvDatasource=jT,de.Colormaker=ip,de.Selection=Lp,de.PdbWriter=xd,de.SdfWriter=_d,de.StlWriter=Ad,de.Stage=E_,de.Collection=Zx,de.ComponentCollection=w_,de.RepresentationCollection=Jx,de.Component=qx,de.ShapeComponent=P_,de.StructureComponent=b_,de.SurfaceComponent=x_,de.VolumeComponent=__,de.Assembly=fb,de.TrajectoryPlayer=o_,de.Superposition=r_,de.Frames=e_,de.Queue=am,de.Counter=Md,de.BufferRepresentation=mx,de.ArrowBuffer=XS,de.BoxBuffer=QS,de.ConeBuffer=HS,de.CylinderBuffer=Gw,de.EllipsoidBuffer=oA,de.MeshBuffer=my,de.OctahedronBuffer=hA,de.PointBuffer=Ix,de.SphereBuffer=Px,de.TetrahedronBuffer=mA,de.TextBuffer=Aw,de.TorusBuffer=_A,de.WidelineBuffer=Pw,de.Shape=dx,de.Structure=cx,de.Kdtree=ub,de.SpatialHash=Zm,de.MolecularSurface=SS,de.Volume=ay,de.MouseActions=Sy,de.KeyActions=Py,de.setDebug=function(t){de.Debug=t},de.MeasurementDefaultParams=Zp,de.setMeasurementDefaultParams=function(t){void 0===t&&(t={}),Object.assign(Zp,t)},de.ScriptExtensions=Kp,de.ColormakerRegistry=Qp,de.DatasourceRegistry=td,de.DecompressorRegistry=nd,de.ParserRegistry=id,de.RepresentationRegistry=ed,de.setListingDatasource=function(t){de.ListingDatasource=t},de.setTrajectoryDatasource=function(t){de.TrajectoryDatasource=t},de.autoLoad=vd,de.getDataInfo=gd,de.getFileInfo=md,de.superpose=v_,de.guessElement=Rb,de.concatStructures=function(t){for(var e=[],i=arguments.length-1;0<i--;)e[i]=arguments[i+1];de.Debug&&Yp.time("concatStructures");var r=new cx(t,""),n=new yb(r),o=r.atomStore,a=r.atomMap;o.addField("formalCharge",1,"int8"),o.addField("partialCharge",1,"float32");var s={},c=0,u=0,h=0;e.forEach(function(t){t.eachAtom(function(t){o.growIfFull(),o.atomTypeId[c]=a.add(t.atomname,t.element),o.x[c]=t.x,o.y[c]=t.y,o.z[c]=t.z,o.serial[c]=t.serial,o.formalCharge[c]=t.formalCharge,o.partialCharge[c]=t.partialCharge,o.altloc[c]=t.altloc,o.occupancy[c]=t.occupancy,o.bfactor[c]=t.bfactor,n.addAtom(t.modelIndex+h,t.chainname,t.chainid,t.resname,t.resno,1===t.hetero,t.sstruc,t.inscode),s[t.index+u]=c,c+=1}),u+=t.atomStore.count,h+=t.modelStore.count});var l=r.bondStore,p=r.getAtomProxy(),d=r.getAtomProxy();return u=0,e.forEach(function(t){t.eachBond(function(t){p.index=s[t.atomIndex1+u],d.index=s[t.atomIndex2+u],l.addBond(p,d,t.bondOrder)}),u+=t.atomStore.count}),n.finalize(),Cb(r,!0),Tb(r,!0),r.finalizeAtoms(),r.finalizeBonds(),Db(r),de.Debug&&Yp.timeEnd("concatStructures"),r},de.flatten=function t(e,i){i=bl(i,[]);for(var r=0;r<e.length;r++)Array.isArray(e[r])?t(e[r],i):i.push(e[r]);return i},de.throttle=function(i,r,n){var o,a,s,c=null,u=0;function h(){u=!1===n.leading?0:Date.now(),c=null,s=i.apply(o,a),c||(o=a=null)}return n||(n={}),function(){var t=Date.now();u||!1!==n.leading||(u=t);var e=r-(t-u);return o=this,a=arguments,e<=0||r<e?(c&&(clearTimeout(c),c=null),u=t,s=i.apply(o,a),c||(o=a=null)):c||!1===n.trailing||(c=setTimeout(h,e)),s}},de.download=Ml,de.getQuery=yl,de.uniqueArray=Cl,de.LeftMouseButton=1,de.MiddleMouseButton=2,de.RightMouseButton=3,de.Signal=op,de.Matrix3=ni,de.Matrix4=ei,de.Vector2=ti,de.Vector3=ri,de.Box3=Pi,de.Quaternion=ii,de.Euler=Gi,de.Plane=Ci,de.Color=ki,de.UIStageParameters=WT,Object.defineProperty(de,"__esModule",{value:!0})});
	
	/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4).setImmediate, (function() { return this; }())))

/***/ }),
/* 4 */
/***/ (function(module, exports, __webpack_require__) {

	/* WEBPACK VAR INJECTION */(function(global) {var scope = (typeof global !== "undefined" && global) ||
	            (typeof self !== "undefined" && self) ||
	            window;
	var apply = Function.prototype.apply;
	
	// DOM APIs, for completeness
	
	exports.setTimeout = function() {
	  return new Timeout(apply.call(setTimeout, scope, arguments), clearTimeout);
	};
	exports.setInterval = function() {
	  return new Timeout(apply.call(setInterval, scope, arguments), clearInterval);
	};
	exports.clearTimeout =
	exports.clearInterval = function(timeout) {
	  if (timeout) {
	    timeout.close();
	  }
	};
	
	function Timeout(id, clearFn) {
	  this._id = id;
	  this._clearFn = clearFn;
	}
	Timeout.prototype.unref = Timeout.prototype.ref = function() {};
	Timeout.prototype.close = function() {
	  this._clearFn.call(scope, this._id);
	};
	
	// Does not start the time, just sets up the members needed.
	exports.enroll = function(item, msecs) {
	  clearTimeout(item._idleTimeoutId);
	  item._idleTimeout = msecs;
	};
	
	exports.unenroll = function(item) {
	  clearTimeout(item._idleTimeoutId);
	  item._idleTimeout = -1;
	};
	
	exports._unrefActive = exports.active = function(item) {
	  clearTimeout(item._idleTimeoutId);
	
	  var msecs = item._idleTimeout;
	  if (msecs >= 0) {
	    item._idleTimeoutId = setTimeout(function onTimeout() {
	      if (item._onTimeout)
	        item._onTimeout();
	    }, msecs);
	  }
	};
	
	// setimmediate attaches itself to the global object
	__webpack_require__(5);
	// On some exotic environments, it's not clear which object `setimmediate` was
	// able to install onto.  Search each possibility in the same order as the
	// `setimmediate` library.
	exports.setImmediate = (typeof self !== "undefined" && self.setImmediate) ||
	                       (typeof global !== "undefined" && global.setImmediate) ||
	                       (this && this.setImmediate);
	exports.clearImmediate = (typeof self !== "undefined" && self.clearImmediate) ||
	                         (typeof global !== "undefined" && global.clearImmediate) ||
	                         (this && this.clearImmediate);
	
	/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))

/***/ }),
/* 5 */
/***/ (function(module, exports, __webpack_require__) {

	/* WEBPACK VAR INJECTION */(function(global, process) {(function (global, undefined) {
	    "use strict";
	
	    if (global.setImmediate) {
	        return;
	    }
	
	    var nextHandle = 1; // Spec says greater than zero
	    var tasksByHandle = {};
	    var currentlyRunningATask = false;
	    var doc = global.document;
	    var registerImmediate;
	
	    function setImmediate(callback) {
	      // Callback can either be a function or a string
	      if (typeof callback !== "function") {
	        callback = new Function("" + callback);
	      }
	      // Copy function arguments
	      var args = new Array(arguments.length - 1);
	      for (var i = 0; i < args.length; i++) {
	          args[i] = arguments[i + 1];
	      }
	      // Store and register the task
	      var task = { callback: callback, args: args };
	      tasksByHandle[nextHandle] = task;
	      registerImmediate(nextHandle);
	      return nextHandle++;
	    }
	
	    function clearImmediate(handle) {
	        delete tasksByHandle[handle];
	    }
	
	    function run(task) {
	        var callback = task.callback;
	        var args = task.args;
	        switch (args.length) {
	        case 0:
	            callback();
	            break;
	        case 1:
	            callback(args[0]);
	            break;
	        case 2:
	            callback(args[0], args[1]);
	            break;
	        case 3:
	            callback(args[0], args[1], args[2]);
	            break;
	        default:
	            callback.apply(undefined, args);
	            break;
	        }
	    }
	
	    function runIfPresent(handle) {
	        // From the spec: "Wait until any invocations of this algorithm started before this one have completed."
	        // So if we're currently running a task, we'll need to delay this invocation.
	        if (currentlyRunningATask) {
	            // Delay by doing a setTimeout. setImmediate was tried instead, but in Firefox 7 it generated a
	            // "too much recursion" error.
	            setTimeout(runIfPresent, 0, handle);
	        } else {
	            var task = tasksByHandle[handle];
	            if (task) {
	                currentlyRunningATask = true;
	                try {
	                    run(task);
	                } finally {
	                    clearImmediate(handle);
	                    currentlyRunningATask = false;
	                }
	            }
	        }
	    }
	
	    function installNextTickImplementation() {
	        registerImmediate = function(handle) {
	            process.nextTick(function () { runIfPresent(handle); });
	        };
	    }
	
	    function canUsePostMessage() {
	        // The test against `importScripts` prevents this implementation from being installed inside a web worker,
	        // where `global.postMessage` means something completely different and can't be used for this purpose.
	        if (global.postMessage && !global.importScripts) {
	            var postMessageIsAsynchronous = true;
	            var oldOnMessage = global.onmessage;
	            global.onmessage = function() {
	                postMessageIsAsynchronous = false;
	            };
	            global.postMessage("", "*");
	            global.onmessage = oldOnMessage;
	            return postMessageIsAsynchronous;
	        }
	    }
	
	    function installPostMessageImplementation() {
	        // Installs an event handler on `global` for the `message` event: see
	        // * https://developer.mozilla.org/en/DOM/window.postMessage
	        // * http://www.whatwg.org/specs/web-apps/current-work/multipage/comms.html#crossDocumentMessages
	
	        var messagePrefix = "setImmediate$" + Math.random() + "$";
	        var onGlobalMessage = function(event) {
	            if (event.source === global &&
	                typeof event.data === "string" &&
	                event.data.indexOf(messagePrefix) === 0) {
	                runIfPresent(+event.data.slice(messagePrefix.length));
	            }
	        };
	
	        if (global.addEventListener) {
	            global.addEventListener("message", onGlobalMessage, false);
	        } else {
	            global.attachEvent("onmessage", onGlobalMessage);
	        }
	
	        registerImmediate = function(handle) {
	            global.postMessage(messagePrefix + handle, "*");
	        };
	    }
	
	    function installMessageChannelImplementation() {
	        var channel = new MessageChannel();
	        channel.port1.onmessage = function(event) {
	            var handle = event.data;
	            runIfPresent(handle);
	        };
	
	        registerImmediate = function(handle) {
	            channel.port2.postMessage(handle);
	        };
	    }
	
	    function installReadyStateChangeImplementation() {
	        var html = doc.documentElement;
	        registerImmediate = function(handle) {
	            // Create a <script> element; its readystatechange event will be fired asynchronously once it is inserted
	            // into the document. Do so, thus queuing up the task. Remember to clean up once it's been called.
	            var script = doc.createElement("script");
	            script.onreadystatechange = function () {
	                runIfPresent(handle);
	                script.onreadystatechange = null;
	                html.removeChild(script);
	                script = null;
	            };
	            html.appendChild(script);
	        };
	    }
	
	    function installSetTimeoutImplementation() {
	        registerImmediate = function(handle) {
	            setTimeout(runIfPresent, 0, handle);
	        };
	    }
	
	    // If supported, we should attach to the prototype of global, since that is where setTimeout et al. live.
	    var attachTo = Object.getPrototypeOf && Object.getPrototypeOf(global);
	    attachTo = attachTo && attachTo.setTimeout ? attachTo : global;
	
	    // Don't get fooled by e.g. browserify environments.
	    if ({}.toString.call(global.process) === "[object process]") {
	        // For Node.js before 0.9
	        installNextTickImplementation();
	
	    } else if (canUsePostMessage()) {
	        // For non-IE10 modern browsers
	        installPostMessageImplementation();
	
	    } else if (global.MessageChannel) {
	        // For web workers, where supported
	        installMessageChannelImplementation();
	
	    } else if (doc && "onreadystatechange" in doc.createElement("script")) {
	        // For IE 6–8
	        installReadyStateChangeImplementation();
	
	    } else {
	        // For older browsers
	        installSetTimeoutImplementation();
	    }
	
	    attachTo.setImmediate = setImmediate;
	    attachTo.clearImmediate = clearImmediate;
	}(typeof self === "undefined" ? typeof global === "undefined" ? this : global : self));
	
	/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()), __webpack_require__(6)))

/***/ }),
/* 6 */
/***/ (function(module, exports) {

	// shim for using process in browser
	var process = module.exports = {};
	
	// cached from whatever global is present so that test runners that stub it
	// don't break things.  But we need to wrap it in a try catch in case it is
	// wrapped in strict mode code which doesn't define any globals.  It's inside a
	// function because try/catches deoptimize in certain engines.
	
	var cachedSetTimeout;
	var cachedClearTimeout;
	
	function defaultSetTimout() {
	    throw new Error('setTimeout has not been defined');
	}
	function defaultClearTimeout () {
	    throw new Error('clearTimeout has not been defined');
	}
	(function () {
	    try {
	        if (typeof setTimeout === 'function') {
	            cachedSetTimeout = setTimeout;
	        } else {
	            cachedSetTimeout = defaultSetTimout;
	        }
	    } catch (e) {
	        cachedSetTimeout = defaultSetTimout;
	    }
	    try {
	        if (typeof clearTimeout === 'function') {
	            cachedClearTimeout = clearTimeout;
	        } else {
	            cachedClearTimeout = defaultClearTimeout;
	        }
	    } catch (e) {
	        cachedClearTimeout = defaultClearTimeout;
	    }
	} ())
	function runTimeout(fun) {
	    if (cachedSetTimeout === setTimeout) {
	        //normal enviroments in sane situations
	        return setTimeout(fun, 0);
	    }
	    // if setTimeout wasn't available but was latter defined
	    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
	        cachedSetTimeout = setTimeout;
	        return setTimeout(fun, 0);
	    }
	    try {
	        // when when somebody has screwed with setTimeout but no I.E. maddness
	        return cachedSetTimeout(fun, 0);
	    } catch(e){
	        try {
	            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
	            return cachedSetTimeout.call(null, fun, 0);
	        } catch(e){
	            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
	            return cachedSetTimeout.call(this, fun, 0);
	        }
	    }
	
	
	}
	function runClearTimeout(marker) {
	    if (cachedClearTimeout === clearTimeout) {
	        //normal enviroments in sane situations
	        return clearTimeout(marker);
	    }
	    // if clearTimeout wasn't available but was latter defined
	    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
	        cachedClearTimeout = clearTimeout;
	        return clearTimeout(marker);
	    }
	    try {
	        // when when somebody has screwed with setTimeout but no I.E. maddness
	        return cachedClearTimeout(marker);
	    } catch (e){
	        try {
	            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally
	            return cachedClearTimeout.call(null, marker);
	        } catch (e){
	            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
	            // Some versions of I.E. have different rules for clearTimeout vs setTimeout
	            return cachedClearTimeout.call(this, marker);
	        }
	    }
	
	
	
	}
	var queue = [];
	var draining = false;
	var currentQueue;
	var queueIndex = -1;
	
	function cleanUpNextTick() {
	    if (!draining || !currentQueue) {
	        return;
	    }
	    draining = false;
	    if (currentQueue.length) {
	        queue = currentQueue.concat(queue);
	    } else {
	        queueIndex = -1;
	    }
	    if (queue.length) {
	        drainQueue();
	    }
	}
	
	function drainQueue() {
	    if (draining) {
	        return;
	    }
	    var timeout = runTimeout(cleanUpNextTick);
	    draining = true;
	
	    var len = queue.length;
	    while(len) {
	        currentQueue = queue;
	        queue = [];
	        while (++queueIndex < len) {
	            if (currentQueue) {
	                currentQueue[queueIndex].run();
	            }
	        }
	        queueIndex = -1;
	        len = queue.length;
	    }
	    currentQueue = null;
	    draining = false;
	    runClearTimeout(timeout);
	}
	
	process.nextTick = function (fun) {
	    var args = new Array(arguments.length - 1);
	    if (arguments.length > 1) {
	        for (var i = 1; i < arguments.length; i++) {
	            args[i - 1] = arguments[i];
	        }
	    }
	    queue.push(new Item(fun, args));
	    if (queue.length === 1 && !draining) {
	        runTimeout(drainQueue);
	    }
	};
	
	// v8 likes predictible objects
	function Item(fun, array) {
	    this.fun = fun;
	    this.array = array;
	}
	Item.prototype.run = function () {
	    this.fun.apply(null, this.array);
	};
	process.title = 'browser';
	process.browser = true;
	process.env = {};
	process.argv = [];
	process.version = ''; // empty string to avoid regexp issues
	process.versions = {};
	
	function noop() {}
	
	process.on = noop;
	process.addListener = noop;
	process.once = noop;
	process.off = noop;
	process.removeListener = noop;
	process.removeAllListeners = noop;
	process.emit = noop;
	process.prependListener = noop;
	process.prependOnceListener = noop;
	
	process.listeners = function (name) { return [] }
	
	process.binding = function (name) {
	    throw new Error('process.binding is not supported');
	};
	
	process.cwd = function () { return '/' };
	process.chdir = function (dir) {
	    throw new Error('process.chdir is not supported');
	};
	process.umask = function() { return 0; };


/***/ }),
/* 7 */
/***/ (function(module, exports, __webpack_require__) {

	var _ = __webpack_require__(8)
	var NGL = __webpack_require__(3)
	var BaseView = __webpack_require__(10).BaseView
	var widgets = __webpack_require__(2)
	
	
	var ColormakerRegistryModel = widgets.DOMWidgetModel.extend({
	    defaults: function(){
	        return _.extend(widgets.DOMWidgetModel.prototype.defaults(), {
	            _model_name: 'ColormakerRegistryModel',
	            _model_module: 'nglview-js-widgets',
	            _model_module_version: __webpack_require__(11).version,
	            _view_name: "ColormakerRegistryView",
	            _view_module: "nglview-js-widgets",
	            _view_module_version: __webpack_require__(11).version,
	        });
	    }
	})
	
	
	var ColormakerRegistryView = BaseView.extend({
	    addSelectionScheme: function(label, args){
	        var id = NGL.ColormakerRegistry.addSelectionScheme(args, label)
	        this._updateId(id, label)
	    },
	
	    addSelectionSchemeOriginal: function(label, args){
	        var id = NGL.ColormakerRegistry.addSelectionScheme(args, label);
	        var scheme = NGL.ColormakerRegistry.userSchemes[id];
	        NGL.ColormakerRegistry.removeScheme(id);
	        // hard code the scheme ID
	        NGL.ColormakerRegistry.add(label, scheme);
	    },
	
	    addScheme: function(label, func_str){
	        var func = Function("return " + func_str)()
	        console.log(func)
	        var id = NGL.ColormakerRegistry.addScheme(function(params){
	            this.atomColor = func
	        })
	        this._updateId(id, label)
	    },
	
	    _updateId: function(oldId, newId){
	        var scheme = NGL.ColormakerRegistry.userSchemes[oldId]
	        console.log(oldId, scheme)
	        NGL.ColormakerRegistry.add(newId, scheme)
	        NGL.ColormakerRegistry.removeScheme(oldId)
	    },
	
	    removeScheme: function(schemeId){
	        NGL.ColormakerRegistry.removeScheme(schemeId)
	    },
	})
	
	
	module.exports = {
	    ColormakerRegistryView: ColormakerRegistryView,
	    ColormakerRegistryModel: ColormakerRegistryModel
	}


/***/ }),
/* 8 */
/***/ (function(module, exports, __webpack_require__) {

	var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(global, module) {//     Underscore.js 1.9.1
	//     http://underscorejs.org
	//     (c) 2009-2018 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
	//     Underscore may be freely distributed under the MIT license.
	
	(function() {
	
	  // Baseline setup
	  // --------------
	
	  // Establish the root object, `window` (`self`) in the browser, `global`
	  // on the server, or `this` in some virtual machines. We use `self`
	  // instead of `window` for `WebWorker` support.
	  var root = typeof self == 'object' && self.self === self && self ||
	            typeof global == 'object' && global.global === global && global ||
	            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;
	  var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null;
	
	  // 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,
	      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 their old module API. If we're in
	  // the browser, add `_` as a global object.
	  // (`nodeType` is checked to ensure that `module`
	  // and `exports` are not HTML elements.)
	  if (typeof exports != 'undefined' && !exports.nodeType) {
	    if (typeof module != 'undefined' && !module.nodeType && module.exports) {
	      exports = module.exports = _;
	    }
	    exports._ = _;
	  } else {
	    root._ = _;
	  }
	
	  // Current version.
	  _.VERSION = '1.9.1';
	
	  // 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);
	      };
	      // The 2-argument case is omitted because we’re not using it.
	      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);
	    };
	  };
	
	  var builtinIteratee;
	
	  // An 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 (_.iteratee !== builtinIteratee) return _.iteratee(value, context);
	    if (value == null) return _.identity;
	    if (_.isFunction(value)) return optimizeCb(value, context, argCount);
	    if (_.isObject(value) && !_.isArray(value)) return _.matcher(value);
	    return _.property(value);
	  };
	
	  // External wrapper for our callback generator. Users may customize
	  // `_.iteratee` if they want additional predicate/iteratee shorthand styles.
	  // This abstraction hides the internal-only argCount argument.
	  _.iteratee = builtinIteratee = function(value, context) {
	    return cb(value, context, Infinity);
	  };
	
	  // Some functions take a variable number of arguments, or a few expected
	  // arguments at the beginning and then a variable number of values to operate
	  // on. This helper accumulates all remaining arguments past the function’s
	  // argument length (or an explicit `startIndex`), into an array that becomes
	  // the last argument. Similar to ES6’s "rest parameter".
	  var restArguments = function(func, startIndex) {
	    startIndex = startIndex == null ? func.length - 1 : +startIndex;
	    return function() {
	      var length = Math.max(arguments.length - startIndex, 0),
	          rest = Array(length),
	          index = 0;
	      for (; index < length; index++) {
	        rest[index] = arguments[index + startIndex];
	      }
	      switch (startIndex) {
	        case 0: return func.call(this, rest);
	        case 1: return func.call(this, arguments[0], rest);
	        case 2: return func.call(this, arguments[0], arguments[1], rest);
	      }
	      var args = Array(startIndex + 1);
	      for (index = 0; index < startIndex; index++) {
	        args[index] = arguments[index];
	      }
	      args[startIndex] = rest;
	      return func.apply(this, args);
	    };
	  };
	
	  // 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 shallowProperty = function(key) {
	    return function(obj) {
	      return obj == null ? void 0 : obj[key];
	    };
	  };
	
	  var has = function(obj, path) {
	    return obj != null && hasOwnProperty.call(obj, path);
	  }
	
	  var deepGet = function(obj, path) {
	    var length = path.length;
	    for (var i = 0; i < length; i++) {
	      if (obj == null) return void 0;
	      obj = obj[path[i]];
	    }
	    return length ? obj : void 0;
	  };
	
	  // 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 = shallowProperty('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.
	  var createReduce = function(dir) {
	    // Wrap code that reassigns argument variables in a separate function than
	    // the one that accesses `arguments.length` to avoid a perf hit. (#1991)
	    var reducer = function(obj, iteratee, memo, initial) {
	      var keys = !isArrayLike(obj) && _.keys(obj),
	          length = (keys || obj).length,
	          index = dir > 0 ? 0 : length - 1;
	      if (!initial) {
	        memo = obj[keys ? keys[index] : index];
	        index += dir;
	      }
	      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) {
	      var initial = arguments.length >= 3;
	      return reducer(obj, optimizeCb(iteratee, context, 4), memo, initial);
	    };
	  };
	
	  // **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 keyFinder = isArrayLike(obj) ? _.findIndex : _.findKey;
	    var key = keyFinder(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 = restArguments(function(obj, path, args) {
	    var contextPath, func;
	    if (_.isFunction(path)) {
	      func = path;
	    } else if (_.isArray(path)) {
	      contextPath = path.slice(0, -1);
	      path = path[path.length - 1];
	    }
	    return _.map(obj, function(context) {
	      var method = func;
	      if (!method) {
	        if (contextPath && contextPath.length) {
	          context = deepGet(context, contextPath);
	        }
	        if (context == null) return void 0;
	        method = context[path];
	      }
	      return method == null ? method : method.apply(context, 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 || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) {
	      obj = isArrayLike(obj) ? obj : _.values(obj);
	      for (var i = 0, length = obj.length; i < length; i++) {
	        value = obj[i];
	        if (value != null && value > result) {
	          result = value;
	        }
	      }
	    } else {
	      iteratee = cb(iteratee, context);
	      _.each(obj, function(v, index, list) {
	        computed = iteratee(v, index, list);
	        if (computed > lastComputed || computed === -Infinity && result === -Infinity) {
	          result = v;
	          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 || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) {
	      obj = isArrayLike(obj) ? obj : _.values(obj);
	      for (var i = 0, length = obj.length; i < length; i++) {
	        value = obj[i];
	        if (value != null && value < result) {
	          result = value;
	        }
	      }
	    } else {
	      iteratee = cb(iteratee, context);
	      _.each(obj, function(v, index, list) {
	        computed = iteratee(v, index, list);
	        if (computed < lastComputed || computed === Infinity && result === Infinity) {
	          result = v;
	          lastComputed = computed;
	        }
	      });
	    }
	    return result;
	  };
	
	  // Shuffle a collection.
	  _.shuffle = function(obj) {
	    return _.sample(obj, Infinity);
	  };
	
	  // Sample **n** random values from a collection using the modern version of the
	  // [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle).
	  // 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)];
	    }
	    var sample = isArrayLike(obj) ? _.clone(obj) : _.values(obj);
	    var length = getLength(sample);
	    n = Math.max(Math.min(n, length), 0);
	    var last = length - 1;
	    for (var index = 0; index < n; index++) {
	      var rand = _.random(index, last);
	      var temp = sample[index];
	      sample[index] = sample[rand];
	      sample[rand] = temp;
	    }
	    return sample.slice(0, n);
	  };
	
	  // Sort the object's values by a criterion produced by an iteratee.
	  _.sortBy = function(obj, iteratee, context) {
	    var index = 0;
	    iteratee = cb(iteratee, context);
	    return _.pluck(_.map(obj, function(value, key, list) {
	      return {
	        value: value,
	        index: index++,
	        criteria: iteratee(value, key, 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, partition) {
	    return function(obj, iteratee, context) {
	      var result = partition ? [[], []] : {};
	      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;
	  });
	
	  var reStrSymbol = /[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g;
	  // Safely create a real, live array from anything iterable.
	  _.toArray = function(obj) {
	    if (!obj) return [];
	    if (_.isArray(obj)) return slice.call(obj);
	    if (_.isString(obj)) {
	      // Keep surrogate pair characters together
	      return obj.match(reStrSymbol);
	    }
	    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 = group(function(result, value, pass) {
	    result[pass ? 0 : 1].push(value);
	  }, true);
	
	  // 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 || array.length < 1) return n == null ? 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 || array.length < 1) return n == null ? 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, Boolean);
	  };
	
	  // Internal implementation of a recursive `flatten` function.
	  var flatten = function(input, shallow, strict, output) {
	    output = output || [];
	    var idx = output.length;
	    for (var i = 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) {
	          var j = 0, len = value.length;
	          while (j < len) output[idx++] = value[j++];
	        } else {
	          flatten(value, shallow, strict, output);
	          idx = output.length;
	        }
	      } 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 = restArguments(function(array, otherArrays) {
	    return _.difference(array, otherArrays);
	  });
	
	  // Produce a duplicate-free version of the array. If the array has already
	  // been sorted, you have the option of using a faster algorithm.
	  // The faster algorithm will not work with an iteratee if the iteratee
	  // is not a one-to-one function, so providing an iteratee will disable
	  // the 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 && !iteratee) {
	        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 = restArguments(function(arrays) {
	    return _.uniq(flatten(arrays, 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;
	      var j;
	      for (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 = restArguments(function(array, rest) {
	    rest = flatten(rest, true, true);
	    return _.filter(array, function(value){
	      return !_.contains(rest, value);
	    });
	  });
	
	  // 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;
	  };
	
	  // Zip together multiple lists into a single array -- elements that share
	  // an index go together.
	  _.zip = restArguments(_.unzip);
	
	  // 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. Passing by pairs is the reverse of _.pairs.
	  _.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.
	  var createPredicateIndexFinder = function(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.
	  var createIndexFinder = function(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;
	    }
	    if (!step) {
	      step = stop < start ? -1 : 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;
	  };
	
	  // Chunk a single array into multiple arrays, each containing `count` or fewer
	  // items.
	  _.chunk = function(array, count) {
	    if (count == null || count < 1) return [];
	    var result = [];
	    var i = 0, length = array.length;
	    while (i < length) {
	      result.push(slice.call(array, i, i += count));
	    }
	    return result;
	  };
	
	  // 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 = restArguments(function(func, context, args) {
	    if (!_.isFunction(func)) throw new TypeError('Bind must be called on a function');
	    var bound = restArguments(function(callArgs) {
	      return executeBound(func, bound, context, this, args.concat(callArgs));
	    });
	    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 by default, allowing any combination of arguments to be
	  // pre-filled. Set `_.partial.placeholder` for a custom placeholder argument.
	  _.partial = restArguments(function(func, boundArgs) {
	    var placeholder = _.partial.placeholder;
	    var bound = function() {
	      var position = 0, length = boundArgs.length;
	      var args = Array(length);
	      for (var i = 0; i < length; i++) {
	        args[i] = boundArgs[i] === placeholder ? arguments[position++] : boundArgs[i];
	      }
	      while (position < arguments.length) args.push(arguments[position++]);
	      return executeBound(func, bound, this, this, args);
	    };
	    return bound;
	  });
	
	  _.partial.placeholder = _;
	
	  // 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 = restArguments(function(obj, keys) {
	    keys = flatten(keys, false, false);
	    var index = keys.length;
	    if (index < 1) throw new Error('bindAll must be passed function names');
	    while (index--) {
	      var key = keys[index];
	      obj[key] = _.bind(obj[key], 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 = restArguments(function(func, wait, args) {
	    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 timeout, context, args, result;
	    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;
	    };
	
	    var throttled = 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;
	    };
	
	    throttled.cancel = function() {
	      clearTimeout(timeout);
	      previous = 0;
	      timeout = context = args = null;
	    };
	
	    return throttled;
	  };
	
	  // 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, result;
	
	    var later = function(context, args) {
	      timeout = null;
	      if (args) result = func.apply(context, args);
	    };
	
	    var debounced = restArguments(function(args) {
	      if (timeout) clearTimeout(timeout);
	      if (immediate) {
	        var callNow = !timeout;
	        timeout = setTimeout(later, wait);
	        if (callNow) result = func.apply(this, args);
	      } else {
	        timeout = _.delay(later, wait, this, args);
	      }
	
	      return result;
	    });
	
	    debounced.cancel = function() {
	      clearTimeout(timeout);
	      timeout = null;
	    };
	
	    return debounced;
	  };
	
	  // 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);
	
	  _.restArguments = restArguments;
	
	  // 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'];
	
	  var collectNonEnumProps = function(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 = {};
	    for (var index = 0; index < length; index++) {
	      var currentKey = keys[index];
	      results[currentKey] = iteratee(obj[currentKey], currentKey, obj);
	    }
	    return results;
	  };
	
	  // Convert an object into a list of `[key, value]` pairs.
	  // The opposite of _.object.
	  _.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();
	  };
	
	  // An internal function for creating assigner functions.
	  var createAssigner = function(keysFunc, defaults) {
	    return function(obj) {
	      var length = arguments.length;
	      if (defaults) obj = Object(obj);
	      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 (!defaults || obj[key] === void 0) obj[key] = source[key];
	        }
	      }
	      return obj;
	    };
	  };
	
	  // 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;
	    }
	  };
	
	  // Internal pick helper function to determine if `obj` has key `key`.
	  var keyInObj = function(value, key, obj) {
	    return key in obj;
	  };
	
	  // Return a copy of the object only containing the whitelisted properties.
	  _.pick = restArguments(function(obj, keys) {
	    var result = {}, iteratee = keys[0];
	    if (obj == null) return result;
	    if (_.isFunction(iteratee)) {
	      if (keys.length > 1) iteratee = optimizeCb(iteratee, keys[1]);
	      keys = _.allKeys(obj);
	    } else {
	      iteratee = keyInObj;
	      keys = flatten(keys, false, false);
	      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 = restArguments(function(obj, keys) {
	    var iteratee = keys[0], context;
	    if (_.isFunction(iteratee)) {
	      iteratee = _.negate(iteratee);
	      if (keys.length > 1) context = keys[1];
	    } else {
	      keys = _.map(flatten(keys, false, false), 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, deepEq;
	  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;
	    // `null` or `undefined` only equal to itself (strict comparison).
	    if (a == null || b == null) return false;
	    // `NaN`s are equivalent, but non-reflexive.
	    if (a !== a) return b !== b;
	    // Exhaust primitive checks
	    var type = typeof a;
	    if (type !== 'function' && type !== 'object' && typeof b != 'object') return false;
	    return deepEq(a, b, aStack, bStack);
	  };
	
	  // Internal recursive comparison function for `isEqual`.
	  deepEq = function(a, b, aStack, bStack) {
	    // 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;
	      case '[object Symbol]':
	        return SymbolProto.valueOf.call(a) === SymbolProto.valueOf.call(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, isMap, isWeakMap, isSet, isWeakSet.
	  _.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Error', 'Symbol', 'Map', 'WeakMap', 'Set', 'WeakSet'], 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), Safari 8 (#1929), and PhantomJS (#2236).
	  var nodelist = root.document && root.document.childNodes;
	  if (typeof /./ != 'function' && typeof Int8Array != 'object' && typeof nodelist != 'function') {
	    _.isFunction = function(obj) {
	      return typeof obj == 'function' || false;
	    };
	  }
	
	  // Is a given object a finite number?
	  _.isFinite = function(obj) {
	    return !_.isSymbol(obj) && isFinite(obj) && !isNaN(parseFloat(obj));
	  };
	
	  // Is the given value `NaN`?
	  _.isNaN = function(obj) {
	    return _.isNumber(obj) && isNaN(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, path) {
	    if (!_.isArray(path)) {
	      return has(obj, path);
	    }
	    var length = path.length;
	    for (var i = 0; i < length; i++) {
	      var key = path[i];
	      if (obj == null || !hasOwnProperty.call(obj, key)) {
	        return false;
	      }
	      obj = obj[key];
	    }
	    return !!length;
	  };
	
	  // 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(){};
	
	  // Creates a function that, when passed an object, will traverse that object’s
	  // properties down the given `path`, specified as an array of keys or indexes.
	  _.property = function(path) {
	    if (!_.isArray(path)) {
	      return shallowProperty(path);
	    }
	    return function(obj) {
	      return deepGet(obj, path);
	    };
	  };
	
	  // Generates a function for a given object that returns a given property.
	  _.propertyOf = function(obj) {
	    if (obj == null) {
	      return function(){};
	    }
	    return function(path) {
	      return !_.isArray(path) ? obj[path] : deepGet(obj, path);
	    };
	  };
	
	  // 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);
	
	  // Traverses the children of `obj` along `path`. If a child is a function, it
	  // is invoked with its parent as context. Returns the value of the final
	  // child, or `fallback` if any child is undefined.
	  _.result = function(obj, path, fallback) {
	    if (!_.isArray(path)) path = [path];
	    var length = path.length;
	    if (!length) {
	      return _.isFunction(fallback) ? fallback.call(obj) : fallback;
	    }
	    for (var i = 0; i < length; i++) {
	      var prop = obj == null ? void 0 : obj[path[i]];
	      if (prop === void 0) {
	        prop = fallback;
	        i = length; // Ensure we don't continue iterating.
	      }
	      obj = _.isFunction(prop) ? prop.call(obj) : prop;
	    }
	    return obj;
	  };
	
	  // 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 escapeRegExp = /\\|'|\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(escapeRegExp, 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 offset.
	      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';
	
	    var render;
	    try {
	      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 chainResult = 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 chainResult(this, func.apply(_, args));
	      };
	    });
	    return _;
	  };
	
	  // 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 chainResult(this, obj);
	    };
	  });
	
	  // Add all accessor Array functions to the wrapper.
	  _.each(['concat', 'join', 'slice'], function(name) {
	    var method = ArrayProto[name];
	    _.prototype[name] = function() {
	      return chainResult(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 String(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 (true) {
	    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = function() {
	      return _;
	    }.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
	  }
	}());
	
	/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()), __webpack_require__(9)(module)))

/***/ }),
/* 9 */
/***/ (function(module, exports) {

	module.exports = function(module) {
		if(!module.webpackPolyfill) {
			module.deprecate = function() {};
			module.paths = [];
			// module.parent = undefined by default
			module.children = [];
			module.webpackPolyfill = 1;
		}
		return module;
	}


/***/ }),
/* 10 */
/***/ (function(module, exports, __webpack_require__) {

	var widgets = __webpack_require__(2)
	var NGL = __webpack_require__(3)
	
	
	var BaseView = widgets.DOMWidgetView.extend({
	
	    render: function(){
	        this.handleMessage();
	        this.displayed.then(() =>{
	            this.model.set("_ready", true)
	            this.touch()
	        })
	    },
	
	    executeCode: function(code){
	        eval(code);
	    },
	
	    handleMessage: function(){
	        this.model.on("msg:custom", function(msg){
	            this.on_msg(msg)
	        }.bind(this))
	    },
	
	    on_msg: function(msg){
	        if (msg.type == 'callMethod'){
	            this[msg.methodName].apply(this, msg.args, msg.kwargs)
	        }
	    }
	})
	
	module.exports = {
	    "BaseView": BaseView
	}


/***/ }),
/* 11 */
/***/ (function(module, exports) {

	module.exports = {"name":"nglview-js-widgets","version":"2.6.8","description":"nglview-js-widgets","author":"Hai Nguyen <hainm.comp@gmail.com>, Alexander Rose <alexander.rose@weirdbyte.de>","license":"MIT","main":"src/index.js","repository":{"type":"git","url":"git+https://github.com/arose/nglview.git"},"bugs":{"url":"https://github.com/arose/nglview/issues"},"files":["dist","src"],"keywords":["molecular graphics","molecular structure","jupyter","widgets","ipython","ipywidgets","science"],"scripts":{"lint":"eslint src test","prepublish":"webpack","test":"mocha"},"devDependencies":{"babel-eslint":"^7.0.0","babel-register":"^6.11.6","css-loader":"^0.23.1","eslint":"^3.2.2","eslint-config-google":"^0.7.1","file-loader":"^0.8.5","json-loader":"^0.5.4","ngl":"2.0.0-dev.36","style-loader":"^0.13.1","webpack":"^1.12.14"},"dependencies":{"jquery":"^3.2.1","jquery-ui":"^1.12.1","underscore":"^1.8.3","ngl":"2.0.0-dev.36","@jupyter-widgets/base":"^1.1 || ^2"},"jupyterlab":{"extension":"src/jupyterlab-plugin"},"homepage":"https://github.com/arose/nglview#readme","directories":{"test":"test"}}

/***/ }),
/* 12 */
/***/ (function(module, exports, __webpack_require__) {

	var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!
	 * jQuery JavaScript Library v3.4.1
	 * https://jquery.com/
	 *
	 * Includes Sizzle.js
	 * https://sizzlejs.com/
	 *
	 * Copyright JS Foundation and other contributors
	 * Released under the MIT license
	 * https://jquery.org/license
	 *
	 * Date: 2019-05-01T21:04Z
	 */
	( function( global, factory ) {
	
		"use strict";
	
		if ( typeof module === "object" && typeof module.exports === "object" ) {
	
			// For CommonJS and CommonJS-like environments where a proper `window`
			// is present, execute the factory and get jQuery.
			// For environments that do not have a `window` with a `document`
			// (such as Node.js), expose a factory as module.exports.
			// This accentuates the need for the creation of a real `window`.
			// e.g. var jQuery = require("jquery")(window);
			// See ticket #14549 for more info.
			module.exports = global.document ?
				factory( global, true ) :
				function( w ) {
					if ( !w.document ) {
						throw new Error( "jQuery requires a window with a document" );
					}
					return factory( w );
				};
		} else {
			factory( global );
		}
	
	// Pass this if window is not defined yet
	} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
	
	// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1
	// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode
	// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common
	// enough that all such attempts are guarded in a try block.
	"use strict";
	
	var arr = [];
	
	var document = window.document;
	
	var getProto = Object.getPrototypeOf;
	
	var slice = arr.slice;
	
	var concat = arr.concat;
	
	var push = arr.push;
	
	var indexOf = arr.indexOf;
	
	var class2type = {};
	
	var toString = class2type.toString;
	
	var hasOwn = class2type.hasOwnProperty;
	
	var fnToString = hasOwn.toString;
	
	var ObjectFunctionString = fnToString.call( Object );
	
	var support = {};
	
	var isFunction = function isFunction( obj ) {
	
	      // Support: Chrome <=57, Firefox <=52
	      // In some browsers, typeof returns "function" for HTML <object> elements
	      // (i.e., `typeof document.createElement( "object" ) === "function"`).
	      // We don't want to classify *any* DOM node as a function.
	      return typeof obj === "function" && typeof obj.nodeType !== "number";
	  };
	
	
	var isWindow = function isWindow( obj ) {
			return obj != null && obj === obj.window;
		};
	
	
	
	
		var preservedScriptAttributes = {
			type: true,
			src: true,
			nonce: true,
			noModule: true
		};
	
		function DOMEval( code, node, doc ) {
			doc = doc || document;
	
			var i, val,
				script = doc.createElement( "script" );
	
			script.text = code;
			if ( node ) {
				for ( i in preservedScriptAttributes ) {
	
					// Support: Firefox 64+, Edge 18+
					// Some browsers don't support the "nonce" property on scripts.
					// On the other hand, just using `getAttribute` is not enough as
					// the `nonce` attribute is reset to an empty string whenever it
					// becomes browsing-context connected.
					// See https://github.com/whatwg/html/issues/2369
					// See https://html.spec.whatwg.org/#nonce-attributes
					// The `node.getAttribute` check was added for the sake of
					// `jQuery.globalEval` so that it can fake a nonce-containing node
					// via an object.
					val = node[ i ] || node.getAttribute && node.getAttribute( i );
					if ( val ) {
						script.setAttribute( i, val );
					}
				}
			}
			doc.head.appendChild( script ).parentNode.removeChild( script );
		}
	
	
	function toType( obj ) {
		if ( obj == null ) {
			return obj + "";
		}
	
		// Support: Android <=2.3 only (functionish RegExp)
		return typeof obj === "object" || typeof obj === "function" ?
			class2type[ toString.call( obj ) ] || "object" :
			typeof obj;
	}
	/* global Symbol */
	// Defining this global in .eslintrc.json would create a danger of using the global
	// unguarded in another place, it seems safer to define global only for this module
	
	
	
	var
		version = "3.4.1",
	
		// Define a local copy of jQuery
		jQuery = function( selector, context ) {
	
			// The jQuery object is actually just the init constructor 'enhanced'
			// Need init if jQuery is called (just allow error to be thrown if not included)
			return new jQuery.fn.init( selector, context );
		},
	
		// Support: Android <=4.0 only
		// Make sure we trim BOM and NBSP
		rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;
	
	jQuery.fn = jQuery.prototype = {
	
		// The current version of jQuery being used
		jquery: version,
	
		constructor: jQuery,
	
		// The default length of a jQuery object is 0
		length: 0,
	
		toArray: function() {
			return slice.call( this );
		},
	
		// Get the Nth element in the matched element set OR
		// Get the whole matched element set as a clean array
		get: function( num ) {
	
			// Return all the elements in a clean array
			if ( num == null ) {
				return slice.call( this );
			}
	
			// Return just the one element from the set
			return num < 0 ? this[ num + this.length ] : this[ num ];
		},
	
		// Take an array of elements and push it onto the stack
		// (returning the new matched element set)
		pushStack: function( elems ) {
	
			// Build a new jQuery matched element set
			var ret = jQuery.merge( this.constructor(), elems );
	
			// Add the old object onto the stack (as a reference)
			ret.prevObject = this;
	
			// Return the newly-formed element set
			return ret;
		},
	
		// Execute a callback for every element in the matched set.
		each: function( callback ) {
			return jQuery.each( this, callback );
		},
	
		map: function( callback ) {
			return this.pushStack( jQuery.map( this, function( elem, i ) {
				return callback.call( elem, i, elem );
			} ) );
		},
	
		slice: function() {
			return this.pushStack( slice.apply( this, arguments ) );
		},
	
		first: function() {
			return this.eq( 0 );
		},
	
		last: function() {
			return this.eq( -1 );
		},
	
		eq: function( i ) {
			var len = this.length,
				j = +i + ( i < 0 ? len : 0 );
			return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
		},
	
		end: function() {
			return this.prevObject || this.constructor();
		},
	
		// For internal use only.
		// Behaves like an Array's method, not like a jQuery method.
		push: push,
		sort: arr.sort,
		splice: arr.splice
	};
	
	jQuery.extend = jQuery.fn.extend = function() {
		var options, name, src, copy, copyIsArray, clone,
			target = arguments[ 0 ] || {},
			i = 1,
			length = arguments.length,
			deep = false;
	
		// Handle a deep copy situation
		if ( typeof target === "boolean" ) {
			deep = target;
	
			// Skip the boolean and the target
			target = arguments[ i ] || {};
			i++;
		}
	
		// Handle case when target is a string or something (possible in deep copy)
		if ( typeof target !== "object" && !isFunction( target ) ) {
			target = {};
		}
	
		// Extend jQuery itself if only one argument is passed
		if ( i === length ) {
			target = this;
			i--;
		}
	
		for ( ; i < length; i++ ) {
	
			// Only deal with non-null/undefined values
			if ( ( options = arguments[ i ] ) != null ) {
	
				// Extend the base object
				for ( name in options ) {
					copy = options[ name ];
	
					// Prevent Object.prototype pollution
					// Prevent never-ending loop
					if ( name === "__proto__" || target === copy ) {
						continue;
					}
	
					// Recurse if we're merging plain objects or arrays
					if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
						( copyIsArray = Array.isArray( copy ) ) ) ) {
						src = target[ name ];
	
						// Ensure proper type for the source value
						if ( copyIsArray && !Array.isArray( src ) ) {
							clone = [];
						} else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) {
							clone = {};
						} else {
							clone = src;
						}
						copyIsArray = false;
	
						// Never move original objects, clone them
						target[ name ] = jQuery.extend( deep, clone, copy );
	
					// Don't bring in undefined values
					} else if ( copy !== undefined ) {
						target[ name ] = copy;
					}
				}
			}
		}
	
		// Return the modified object
		return target;
	};
	
	jQuery.extend( {
	
		// Unique for each copy of jQuery on the page
		expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
	
		// Assume jQuery is ready without the ready module
		isReady: true,
	
		error: function( msg ) {
			throw new Error( msg );
		},
	
		noop: function() {},
	
		isPlainObject: function( obj ) {
			var proto, Ctor;
	
			// Detect obvious negatives
			// Use toString instead of jQuery.type to catch host objects
			if ( !obj || toString.call( obj ) !== "[object Object]" ) {
				return false;
			}
	
			proto = getProto( obj );
	
			// Objects with no prototype (e.g., `Object.create( null )`) are plain
			if ( !proto ) {
				return true;
			}
	
			// Objects with prototype are plain iff they were constructed by a global Object function
			Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor;
			return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString;
		},
	
		isEmptyObject: function( obj ) {
			var name;
	
			for ( name in obj ) {
				return false;
			}
			return true;
		},
	
		// Evaluates a script in a global context
		globalEval: function( code, options ) {
			DOMEval( code, { nonce: options && options.nonce } );
		},
	
		each: function( obj, callback ) {
			var length, i = 0;
	
			if ( isArrayLike( obj ) ) {
				length = obj.length;
				for ( ; i < length; i++ ) {
					if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
						break;
					}
				}
			} else {
				for ( i in obj ) {
					if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
						break;
					}
				}
			}
	
			return obj;
		},
	
		// Support: Android <=4.0 only
		trim: function( text ) {
			return text == null ?
				"" :
				( text + "" ).replace( rtrim, "" );
		},
	
		// results is for internal usage only
		makeArray: function( arr, results ) {
			var ret = results || [];
	
			if ( arr != null ) {
				if ( isArrayLike( Object( arr ) ) ) {
					jQuery.merge( ret,
						typeof arr === "string" ?
						[ arr ] : arr
					);
				} else {
					push.call( ret, arr );
				}
			}
	
			return ret;
		},
	
		inArray: function( elem, arr, i ) {
			return arr == null ? -1 : indexOf.call( arr, elem, i );
		},
	
		// Support: Android <=4.0 only, PhantomJS 1 only
		// push.apply(_, arraylike) throws on ancient WebKit
		merge: function( first, second ) {
			var len = +second.length,
				j = 0,
				i = first.length;
	
			for ( ; j < len; j++ ) {
				first[ i++ ] = second[ j ];
			}
	
			first.length = i;
	
			return first;
		},
	
		grep: function( elems, callback, invert ) {
			var callbackInverse,
				matches = [],
				i = 0,
				length = elems.length,
				callbackExpect = !invert;
	
			// Go through the array, only saving the items
			// that pass the validator function
			for ( ; i < length; i++ ) {
				callbackInverse = !callback( elems[ i ], i );
				if ( callbackInverse !== callbackExpect ) {
					matches.push( elems[ i ] );
				}
			}
	
			return matches;
		},
	
		// arg is for internal usage only
		map: function( elems, callback, arg ) {
			var length, value,
				i = 0,
				ret = [];
	
			// Go through the array, translating each of the items to their new values
			if ( isArrayLike( elems ) ) {
				length = elems.length;
				for ( ; i < length; i++ ) {
					value = callback( elems[ i ], i, arg );
	
					if ( value != null ) {
						ret.push( value );
					}
				}
	
			// Go through every key on the object,
			} else {
				for ( i in elems ) {
					value = callback( elems[ i ], i, arg );
	
					if ( value != null ) {
						ret.push( value );
					}
				}
			}
	
			// Flatten any nested arrays
			return concat.apply( [], ret );
		},
	
		// A global GUID counter for objects
		guid: 1,
	
		// jQuery.support is not used in Core but other projects attach their
		// properties to it so it needs to exist.
		support: support
	} );
	
	if ( typeof Symbol === "function" ) {
		jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
	}
	
	// Populate the class2type map
	jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
	function( i, name ) {
		class2type[ "[object " + name + "]" ] = name.toLowerCase();
	} );
	
	function isArrayLike( obj ) {
	
		// Support: real iOS 8.2 only (not reproducible in simulator)
		// `in` check used to prevent JIT error (gh-2145)
		// hasOwn isn't used here due to false negatives
		// regarding Nodelist length in IE
		var length = !!obj && "length" in obj && obj.length,
			type = toType( obj );
	
		if ( isFunction( obj ) || isWindow( obj ) ) {
			return false;
		}
	
		return type === "array" || length === 0 ||
			typeof length === "number" && length > 0 && ( length - 1 ) in obj;
	}
	var Sizzle =
	/*!
	 * Sizzle CSS Selector Engine v2.3.4
	 * https://sizzlejs.com/
	 *
	 * Copyright JS Foundation and other contributors
	 * Released under the MIT license
	 * https://js.foundation/
	 *
	 * Date: 2019-04-08
	 */
	(function( window ) {
	
	var i,
		support,
		Expr,
		getText,
		isXML,
		tokenize,
		compile,
		select,
		outermostContext,
		sortInput,
		hasDuplicate,
	
		// Local document vars
		setDocument,
		document,
		docElem,
		documentIsHTML,
		rbuggyQSA,
		rbuggyMatches,
		matches,
		contains,
	
		// Instance-specific data
		expando = "sizzle" + 1 * new Date(),
		preferredDoc = window.document,
		dirruns = 0,
		done = 0,
		classCache = createCache(),
		tokenCache = createCache(),
		compilerCache = createCache(),
		nonnativeSelectorCache = createCache(),
		sortOrder = function( a, b ) {
			if ( a === b ) {
				hasDuplicate = true;
			}
			return 0;
		},
	
		// Instance methods
		hasOwn = ({}).hasOwnProperty,
		arr = [],
		pop = arr.pop,
		push_native = arr.push,
		push = arr.push,
		slice = arr.slice,
		// Use a stripped-down indexOf as it's faster than native
		// https://jsperf.com/thor-indexof-vs-for/5
		indexOf = function( list, elem ) {
			var i = 0,
				len = list.length;
			for ( ; i < len; i++ ) {
				if ( list[i] === elem ) {
					return i;
				}
			}
			return -1;
		},
	
		booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
	
		// Regular expressions
	
		// http://www.w3.org/TR/css3-selectors/#whitespace
		whitespace = "[\\x20\\t\\r\\n\\f]",
	
		// http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
		identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+",
	
		// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
		attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
			// Operator (capture 2)
			"*([*^$|!~]?=)" + whitespace +
			// "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
			"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
			"*\\]",
	
		pseudos = ":(" + identifier + ")(?:\\((" +
			// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
			// 1. quoted (capture 3; capture 4 or capture 5)
			"('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
			// 2. simple (capture 6)
			"((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
			// 3. anything else (capture 2)
			".*" +
			")\\)|)",
	
		// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
		rwhitespace = new RegExp( whitespace + "+", "g" ),
		rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
	
		rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
		rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
		rdescend = new RegExp( whitespace + "|>" ),
	
		rpseudo = new RegExp( pseudos ),
		ridentifier = new RegExp( "^" + identifier + "$" ),
	
		matchExpr = {
			"ID": new RegExp( "^#(" + identifier + ")" ),
			"CLASS": new RegExp( "^\\.(" + identifier + ")" ),
			"TAG": new RegExp( "^(" + identifier + "|[*])" ),
			"ATTR": new RegExp( "^" + attributes ),
			"PSEUDO": new RegExp( "^" + pseudos ),
			"CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
				"*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
				"*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
			"bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
			// For use in libraries implementing .is()
			// We use this for POS matching in `select`
			"needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
				whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
		},
	
		rhtml = /HTML$/i,
		rinputs = /^(?:input|select|textarea|button)$/i,
		rheader = /^h\d$/i,
	
		rnative = /^[^{]+\{\s*\[native \w/,
	
		// Easily-parseable/retrievable ID or TAG or CLASS selectors
		rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
	
		rsibling = /[+~]/,
	
		// CSS escapes
		// http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
		runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
		funescape = function( _, escaped, escapedWhitespace ) {
			var high = "0x" + escaped - 0x10000;
			// NaN means non-codepoint
			// Support: Firefox<24
			// Workaround erroneous numeric interpretation of +"0x"
			return high !== high || escapedWhitespace ?
				escaped :
				high < 0 ?
					// BMP codepoint
					String.fromCharCode( high + 0x10000 ) :
					// Supplemental Plane codepoint (surrogate pair)
					String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
		},
	
		// CSS string/identifier serialization
		// https://drafts.csswg.org/cssom/#common-serializing-idioms
		rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,
		fcssescape = function( ch, asCodePoint ) {
			if ( asCodePoint ) {
	
				// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
				if ( ch === "\0" ) {
					return "\uFFFD";
				}
	
				// Control characters and (dependent upon position) numbers get escaped as code points
				return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
			}
	
			// Other potentially-special ASCII characters get backslash-escaped
			return "\\" + ch;
		},
	
		// Used for iframes
		// See setDocument()
		// Removing the function wrapper causes a "Permission Denied"
		// error in IE
		unloadHandler = function() {
			setDocument();
		},
	
		inDisabledFieldset = addCombinator(
			function( elem ) {
				return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset";
			},
			{ dir: "parentNode", next: "legend" }
		);
	
	// Optimize for push.apply( _, NodeList )
	try {
		push.apply(
			(arr = slice.call( preferredDoc.childNodes )),
			preferredDoc.childNodes
		);
		// Support: Android<4.0
		// Detect silently failing push.apply
		arr[ preferredDoc.childNodes.length ].nodeType;
	} catch ( e ) {
		push = { apply: arr.length ?
	
			// Leverage slice if possible
			function( target, els ) {
				push_native.apply( target, slice.call(els) );
			} :
	
			// Support: IE<9
			// Otherwise append directly
			function( target, els ) {
				var j = target.length,
					i = 0;
				// Can't trust NodeList.length
				while ( (target[j++] = els[i++]) ) {}
				target.length = j - 1;
			}
		};
	}
	
	function Sizzle( selector, context, results, seed ) {
		var m, i, elem, nid, match, groups, newSelector,
			newContext = context && context.ownerDocument,
	
			// nodeType defaults to 9, since context defaults to document
			nodeType = context ? context.nodeType : 9;
	
		results = results || [];
	
		// Return early from calls with invalid selector or context
		if ( typeof selector !== "string" || !selector ||
			nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
	
			return results;
		}
	
		// Try to shortcut find operations (as opposed to filters) in HTML documents
		if ( !seed ) {
	
			if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
				setDocument( context );
			}
			context = context || document;
	
			if ( documentIsHTML ) {
	
				// If the selector is sufficiently simple, try using a "get*By*" DOM method
				// (excepting DocumentFragment context, where the methods don't exist)
				if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
	
					// ID selector
					if ( (m = match[1]) ) {
	
						// Document context
						if ( nodeType === 9 ) {
							if ( (elem = context.getElementById( m )) ) {
	
								// Support: IE, Opera, Webkit
								// TODO: identify versions
								// getElementById can match elements by name instead of ID
								if ( elem.id === m ) {
									results.push( elem );
									return results;
								}
							} else {
								return results;
							}
	
						// Element context
						} else {
	
							// Support: IE, Opera, Webkit
							// TODO: identify versions
							// getElementById can match elements by name instead of ID
							if ( newContext && (elem = newContext.getElementById( m )) &&
								contains( context, elem ) &&
								elem.id === m ) {
	
								results.push( elem );
								return results;
							}
						}
	
					// Type selector
					} else if ( match[2] ) {
						push.apply( results, context.getElementsByTagName( selector ) );
						return results;
	
					// Class selector
					} else if ( (m = match[3]) && support.getElementsByClassName &&
						context.getElementsByClassName ) {
	
						push.apply( results, context.getElementsByClassName( m ) );
						return results;
					}
				}
	
				// Take advantage of querySelectorAll
				if ( support.qsa &&
					!nonnativeSelectorCache[ selector + " " ] &&
					(!rbuggyQSA || !rbuggyQSA.test( selector )) &&
	
					// Support: IE 8 only
					// Exclude object elements
					(nodeType !== 1 || context.nodeName.toLowerCase() !== "object") ) {
	
					newSelector = selector;
					newContext = context;
	
					// qSA considers elements outside a scoping root when evaluating child or
					// descendant combinators, which is not what we want.
					// In such cases, we work around the behavior by prefixing every selector in the
					// list with an ID selector referencing the scope context.
					// Thanks to Andrew Dupont for this technique.
					if ( nodeType === 1 && rdescend.test( selector ) ) {
	
						// Capture the context ID, setting it first if necessary
						if ( (nid = context.getAttribute( "id" )) ) {
							nid = nid.replace( rcssescape, fcssescape );
						} else {
							context.setAttribute( "id", (nid = expando) );
						}
	
						// Prefix every selector in the list
						groups = tokenize( selector );
						i = groups.length;
						while ( i-- ) {
							groups[i] = "#" + nid + " " + toSelector( groups[i] );
						}
						newSelector = groups.join( "," );
	
						// Expand context for sibling selectors
						newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
							context;
					}
	
					try {
						push.apply( results,
							newContext.querySelectorAll( newSelector )
						);
						return results;
					} catch ( qsaError ) {
						nonnativeSelectorCache( selector, true );
					} finally {
						if ( nid === expando ) {
							context.removeAttribute( "id" );
						}
					}
				}
			}
		}
	
		// All others
		return select( selector.replace( rtrim, "$1" ), context, results, seed );
	}
	
	/**
	 * Create key-value caches of limited size
	 * @returns {function(string, object)} Returns the Object data after storing it on itself with
	 *	property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
	 *	deleting the oldest entry
	 */
	function createCache() {
		var keys = [];
	
		function cache( key, value ) {
			// Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
			if ( keys.push( key + " " ) > Expr.cacheLength ) {
				// Only keep the most recent entries
				delete cache[ keys.shift() ];
			}
			return (cache[ key + " " ] = value);
		}
		return cache;
	}
	
	/**
	 * Mark a function for special use by Sizzle
	 * @param {Function} fn The function to mark
	 */
	function markFunction( fn ) {
		fn[ expando ] = true;
		return fn;
	}
	
	/**
	 * Support testing using an element
	 * @param {Function} fn Passed the created element and returns a boolean result
	 */
	function assert( fn ) {
		var el = document.createElement("fieldset");
	
		try {
			return !!fn( el );
		} catch (e) {
			return false;
		} finally {
			// Remove from its parent by default
			if ( el.parentNode ) {
				el.parentNode.removeChild( el );
			}
			// release memory in IE
			el = null;
		}
	}
	
	/**
	 * Adds the same handler for all of the specified attrs
	 * @param {String} attrs Pipe-separated list of attributes
	 * @param {Function} handler The method that will be applied
	 */
	function addHandle( attrs, handler ) {
		var arr = attrs.split("|"),
			i = arr.length;
	
		while ( i-- ) {
			Expr.attrHandle[ arr[i] ] = handler;
		}
	}
	
	/**
	 * Checks document order of two siblings
	 * @param {Element} a
	 * @param {Element} b
	 * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
	 */
	function siblingCheck( a, b ) {
		var cur = b && a,
			diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
				a.sourceIndex - b.sourceIndex;
	
		// Use IE sourceIndex if available on both nodes
		if ( diff ) {
			return diff;
		}
	
		// Check if b follows a
		if ( cur ) {
			while ( (cur = cur.nextSibling) ) {
				if ( cur === b ) {
					return -1;
				}
			}
		}
	
		return a ? 1 : -1;
	}
	
	/**
	 * Returns a function to use in pseudos for input types
	 * @param {String} type
	 */
	function createInputPseudo( type ) {
		return function( elem ) {
			var name = elem.nodeName.toLowerCase();
			return name === "input" && elem.type === type;
		};
	}
	
	/**
	 * Returns a function to use in pseudos for buttons
	 * @param {String} type
	 */
	function createButtonPseudo( type ) {
		return function( elem ) {
			var name = elem.nodeName.toLowerCase();
			return (name === "input" || name === "button") && elem.type === type;
		};
	}
	
	/**
	 * Returns a function to use in pseudos for :enabled/:disabled
	 * @param {Boolean} disabled true for :disabled; false for :enabled
	 */
	function createDisabledPseudo( disabled ) {
	
		// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable
		return function( elem ) {
	
			// Only certain elements can match :enabled or :disabled
			// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled
			// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled
			if ( "form" in elem ) {
	
				// Check for inherited disabledness on relevant non-disabled elements:
				// * listed form-associated elements in a disabled fieldset
				//   https://html.spec.whatwg.org/multipage/forms.html#category-listed
				//   https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled
				// * option elements in a disabled optgroup
				//   https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled
				// All such elements have a "form" property.
				if ( elem.parentNode && elem.disabled === false ) {
	
					// Option elements defer to a parent optgroup if present
					if ( "label" in elem ) {
						if ( "label" in elem.parentNode ) {
							return elem.parentNode.disabled === disabled;
						} else {
							return elem.disabled === disabled;
						}
					}
	
					// Support: IE 6 - 11
					// Use the isDisabled shortcut property to check for disabled fieldset ancestors
					return elem.isDisabled === disabled ||
	
						// Where there is no isDisabled, check manually
						/* jshint -W018 */
						elem.isDisabled !== !disabled &&
							inDisabledFieldset( elem ) === disabled;
				}
	
				return elem.disabled === disabled;
	
			// Try to winnow out elements that can't be disabled before trusting the disabled property.
			// Some victims get caught in our net (label, legend, menu, track), but it shouldn't
			// even exist on them, let alone have a boolean value.
			} else if ( "label" in elem ) {
				return elem.disabled === disabled;
			}
	
			// Remaining elements are neither :enabled nor :disabled
			return false;
		};
	}
	
	/**
	 * Returns a function to use in pseudos for positionals
	 * @param {Function} fn
	 */
	function createPositionalPseudo( fn ) {
		return markFunction(function( argument ) {
			argument = +argument;
			return markFunction(function( seed, matches ) {
				var j,
					matchIndexes = fn( [], seed.length, argument ),
					i = matchIndexes.length;
	
				// Match elements found at the specified indexes
				while ( i-- ) {
					if ( seed[ (j = matchIndexes[i]) ] ) {
						seed[j] = !(matches[j] = seed[j]);
					}
				}
			});
		});
	}
	
	/**
	 * Checks a node for validity as a Sizzle context
	 * @param {Element|Object=} context
	 * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
	 */
	function testContext( context ) {
		return context && typeof context.getElementsByTagName !== "undefined" && context;
	}
	
	// Expose support vars for convenience
	support = Sizzle.support = {};
	
	/**
	 * Detects XML nodes
	 * @param {Element|Object} elem An element or a document
	 * @returns {Boolean} True iff elem is a non-HTML XML node
	 */
	isXML = Sizzle.isXML = function( elem ) {
		var namespace = elem.namespaceURI,
			docElem = (elem.ownerDocument || elem).documentElement;
	
		// Support: IE <=8
		// Assume HTML when documentElement doesn't yet exist, such as inside loading iframes
		// https://bugs.jquery.com/ticket/4833
		return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" );
	};
	
	/**
	 * Sets document-related variables once based on the current document
	 * @param {Element|Object} [doc] An element or document object to use to set the document
	 * @returns {Object} Returns the current document
	 */
	setDocument = Sizzle.setDocument = function( node ) {
		var hasCompare, subWindow,
			doc = node ? node.ownerDocument || node : preferredDoc;
	
		// Return early if doc is invalid or already selected
		if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
			return document;
		}
	
		// Update global variables
		document = doc;
		docElem = document.documentElement;
		documentIsHTML = !isXML( document );
	
		// Support: IE 9-11, Edge
		// Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
		if ( preferredDoc !== document &&
			(subWindow = document.defaultView) && subWindow.top !== subWindow ) {
	
			// Support: IE 11, Edge
			if ( subWindow.addEventListener ) {
				subWindow.addEventListener( "unload", unloadHandler, false );
	
			// Support: IE 9 - 10 only
			} else if ( subWindow.attachEvent ) {
				subWindow.attachEvent( "onunload", unloadHandler );
			}
		}
	
		/* Attributes
		---------------------------------------------------------------------- */
	
		// Support: IE<8
		// Verify that getAttribute really returns attributes and not properties
		// (excepting IE8 booleans)
		support.attributes = assert(function( el ) {
			el.className = "i";
			return !el.getAttribute("className");
		});
	
		/* getElement(s)By*
		---------------------------------------------------------------------- */
	
		// Check if getElementsByTagName("*") returns only elements
		support.getElementsByTagName = assert(function( el ) {
			el.appendChild( document.createComment("") );
			return !el.getElementsByTagName("*").length;
		});
	
		// Support: IE<9
		support.getElementsByClassName = rnative.test( document.getElementsByClassName );
	
		// Support: IE<10
		// Check if getElementById returns elements by name
		// The broken getElementById methods don't pick up programmatically-set names,
		// so use a roundabout getElementsByName test
		support.getById = assert(function( el ) {
			docElem.appendChild( el ).id = expando;
			return !document.getElementsByName || !document.getElementsByName( expando ).length;
		});
	
		// ID filter and find
		if ( support.getById ) {
			Expr.filter["ID"] = function( id ) {
				var attrId = id.replace( runescape, funescape );
				return function( elem ) {
					return elem.getAttribute("id") === attrId;
				};
			};
			Expr.find["ID"] = function( id, context ) {
				if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
					var elem = context.getElementById( id );
					return elem ? [ elem ] : [];
				}
			};
		} else {
			Expr.filter["ID"] =  function( id ) {
				var attrId = id.replace( runescape, funescape );
				return function( elem ) {
					var node = typeof elem.getAttributeNode !== "undefined" &&
						elem.getAttributeNode("id");
					return node && node.value === attrId;
				};
			};
	
			// Support: IE 6 - 7 only
			// getElementById is not reliable as a find shortcut
			Expr.find["ID"] = function( id, context ) {
				if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
					var node, i, elems,
						elem = context.getElementById( id );
	
					if ( elem ) {
	
						// Verify the id attribute
						node = elem.getAttributeNode("id");
						if ( node && node.value === id ) {
							return [ elem ];
						}
	
						// Fall back on getElementsByName
						elems = context.getElementsByName( id );
						i = 0;
						while ( (elem = elems[i++]) ) {
							node = elem.getAttributeNode("id");
							if ( node && node.value === id ) {
								return [ elem ];
							}
						}
					}
	
					return [];
				}
			};
		}
	
		// Tag
		Expr.find["TAG"] = support.getElementsByTagName ?
			function( tag, context ) {
				if ( typeof context.getElementsByTagName !== "undefined" ) {
					return context.getElementsByTagName( tag );
	
				// DocumentFragment nodes don't have gEBTN
				} else if ( support.qsa ) {
					return context.querySelectorAll( tag );
				}
			} :
	
			function( tag, context ) {
				var elem,
					tmp = [],
					i = 0,
					// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
					results = context.getElementsByTagName( tag );
	
				// Filter out possible comments
				if ( tag === "*" ) {
					while ( (elem = results[i++]) ) {
						if ( elem.nodeType === 1 ) {
							tmp.push( elem );
						}
					}
	
					return tmp;
				}
				return results;
			};
	
		// Class
		Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
			if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
				return context.getElementsByClassName( className );
			}
		};
	
		/* QSA/matchesSelector
		---------------------------------------------------------------------- */
	
		// QSA and matchesSelector support
	
		// matchesSelector(:active) reports false when true (IE9/Opera 11.5)
		rbuggyMatches = [];
	
		// qSa(:focus) reports false when true (Chrome 21)
		// We allow this because of a bug in IE8/9 that throws an error
		// whenever `document.activeElement` is accessed on an iframe
		// So, we allow :focus to pass through QSA all the time to avoid the IE error
		// See https://bugs.jquery.com/ticket/13378
		rbuggyQSA = [];
	
		if ( (support.qsa = rnative.test( document.querySelectorAll )) ) {
			// Build QSA regex
			// Regex strategy adopted from Diego Perini
			assert(function( el ) {
				// Select is set to empty string on purpose
				// This is to test IE's treatment of not explicitly
				// setting a boolean content attribute,
				// since its presence should be enough
				// https://bugs.jquery.com/ticket/12359
				docElem.appendChild( el ).innerHTML = "<a id='" + expando + "'></a>" +
					"<select id='" + expando + "-\r\\' msallowcapture=''>" +
					"<option selected=''></option></select>";
	
				// Support: IE8, Opera 11-12.16
				// Nothing should be selected when empty strings follow ^= or $= or *=
				// The test attribute must be unknown in Opera but "safe" for WinRT
				// https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
				if ( el.querySelectorAll("[msallowcapture^='']").length ) {
					rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
				}
	
				// Support: IE8
				// Boolean attributes and "value" are not treated correctly
				if ( !el.querySelectorAll("[selected]").length ) {
					rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
				}
	
				// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
				if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
					rbuggyQSA.push("~=");
				}
	
				// Webkit/Opera - :checked should return selected option elements
				// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
				// IE8 throws error here and will not see later tests
				if ( !el.querySelectorAll(":checked").length ) {
					rbuggyQSA.push(":checked");
				}
	
				// Support: Safari 8+, iOS 8+
				// https://bugs.webkit.org/show_bug.cgi?id=136851
				// In-page `selector#id sibling-combinator selector` fails
				if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
					rbuggyQSA.push(".#.+[+~]");
				}
			});
	
			assert(function( el ) {
				el.innerHTML = "<a href='' disabled='disabled'></a>" +
					"<select disabled='disabled'><option/></select>";
	
				// Support: Windows 8 Native Apps
				// The type and name attributes are restricted during .innerHTML assignment
				var input = document.createElement("input");
				input.setAttribute( "type", "hidden" );
				el.appendChild( input ).setAttribute( "name", "D" );
	
				// Support: IE8
				// Enforce case-sensitivity of name attribute
				if ( el.querySelectorAll("[name=d]").length ) {
					rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
				}
	
				// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
				// IE8 throws error here and will not see later tests
				if ( el.querySelectorAll(":enabled").length !== 2 ) {
					rbuggyQSA.push( ":enabled", ":disabled" );
				}
	
				// Support: IE9-11+
				// IE's :disabled selector does not pick up the children of disabled fieldsets
				docElem.appendChild( el ).disabled = true;
				if ( el.querySelectorAll(":disabled").length !== 2 ) {
					rbuggyQSA.push( ":enabled", ":disabled" );
				}
	
				// Opera 10-11 does not throw on post-comma invalid pseudos
				el.querySelectorAll("*,:x");
				rbuggyQSA.push(",.*:");
			});
		}
	
		if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
			docElem.webkitMatchesSelector ||
			docElem.mozMatchesSelector ||
			docElem.oMatchesSelector ||
			docElem.msMatchesSelector) )) ) {
	
			assert(function( el ) {
				// Check to see if it's possible to do matchesSelector
				// on a disconnected node (IE 9)
				support.disconnectedMatch = matches.call( el, "*" );
	
				// This should fail with an exception
				// Gecko does not error, returns false instead
				matches.call( el, "[s!='']:x" );
				rbuggyMatches.push( "!=", pseudos );
			});
		}
	
		rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
		rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
	
		/* Contains
		---------------------------------------------------------------------- */
		hasCompare = rnative.test( docElem.compareDocumentPosition );
	
		// Element contains another
		// Purposefully self-exclusive
		// As in, an element does not contain itself
		contains = hasCompare || rnative.test( docElem.contains ) ?
			function( a, b ) {
				var adown = a.nodeType === 9 ? a.documentElement : a,
					bup = b && b.parentNode;
				return a === bup || !!( bup && bup.nodeType === 1 && (
					adown.contains ?
						adown.contains( bup ) :
						a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
				));
			} :
			function( a, b ) {
				if ( b ) {
					while ( (b = b.parentNode) ) {
						if ( b === a ) {
							return true;
						}
					}
				}
				return false;
			};
	
		/* Sorting
		---------------------------------------------------------------------- */
	
		// Document order sorting
		sortOrder = hasCompare ?
		function( a, b ) {
	
			// Flag for duplicate removal
			if ( a === b ) {
				hasDuplicate = true;
				return 0;
			}
	
			// Sort on method existence if only one input has compareDocumentPosition
			var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
			if ( compare ) {
				return compare;
			}
	
			// Calculate position if both inputs belong to the same document
			compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
				a.compareDocumentPosition( b ) :
	
				// Otherwise we know they are disconnected
				1;
	
			// Disconnected nodes
			if ( compare & 1 ||
				(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
	
				// Choose the first element that is related to our preferred document
				if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
					return -1;
				}
				if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
					return 1;
				}
	
				// Maintain original order
				return sortInput ?
					( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
					0;
			}
	
			return compare & 4 ? -1 : 1;
		} :
		function( a, b ) {
			// Exit early if the nodes are identical
			if ( a === b ) {
				hasDuplicate = true;
				return 0;
			}
	
			var cur,
				i = 0,
				aup = a.parentNode,
				bup = b.parentNode,
				ap = [ a ],
				bp = [ b ];
	
			// Parentless nodes are either documents or disconnected
			if ( !aup || !bup ) {
				return a === document ? -1 :
					b === document ? 1 :
					aup ? -1 :
					bup ? 1 :
					sortInput ?
					( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
					0;
	
			// If the nodes are siblings, we can do a quick check
			} else if ( aup === bup ) {
				return siblingCheck( a, b );
			}
	
			// Otherwise we need full lists of their ancestors for comparison
			cur = a;
			while ( (cur = cur.parentNode) ) {
				ap.unshift( cur );
			}
			cur = b;
			while ( (cur = cur.parentNode) ) {
				bp.unshift( cur );
			}
	
			// Walk down the tree looking for a discrepancy
			while ( ap[i] === bp[i] ) {
				i++;
			}
	
			return i ?
				// Do a sibling check if the nodes have a common ancestor
				siblingCheck( ap[i], bp[i] ) :
	
				// Otherwise nodes in our document sort first
				ap[i] === preferredDoc ? -1 :
				bp[i] === preferredDoc ? 1 :
				0;
		};
	
		return document;
	};
	
	Sizzle.matches = function( expr, elements ) {
		return Sizzle( expr, null, null, elements );
	};
	
	Sizzle.matchesSelector = function( elem, expr ) {
		// Set document vars if needed
		if ( ( elem.ownerDocument || elem ) !== document ) {
			setDocument( elem );
		}
	
		if ( support.matchesSelector && documentIsHTML &&
			!nonnativeSelectorCache[ expr + " " ] &&
			( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
			( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {
	
			try {
				var ret = matches.call( elem, expr );
	
				// IE 9's matchesSelector returns false on disconnected nodes
				if ( ret || support.disconnectedMatch ||
						// As well, disconnected nodes are said to be in a document
						// fragment in IE 9
						elem.document && elem.document.nodeType !== 11 ) {
					return ret;
				}
			} catch (e) {
				nonnativeSelectorCache( expr, true );
			}
		}
	
		return Sizzle( expr, document, null, [ elem ] ).length > 0;
	};
	
	Sizzle.contains = function( context, elem ) {
		// Set document vars if needed
		if ( ( context.ownerDocument || context ) !== document ) {
			setDocument( context );
		}
		return contains( context, elem );
	};
	
	Sizzle.attr = function( elem, name ) {
		// Set document vars if needed
		if ( ( elem.ownerDocument || elem ) !== document ) {
			setDocument( elem );
		}
	
		var fn = Expr.attrHandle[ name.toLowerCase() ],
			// Don't get fooled by Object.prototype properties (jQuery #13807)
			val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
				fn( elem, name, !documentIsHTML ) :
				undefined;
	
		return val !== undefined ?
			val :
			support.attributes || !documentIsHTML ?
				elem.getAttribute( name ) :
				(val = elem.getAttributeNode(name)) && val.specified ?
					val.value :
					null;
	};
	
	Sizzle.escape = function( sel ) {
		return (sel + "").replace( rcssescape, fcssescape );
	};
	
	Sizzle.error = function( msg ) {
		throw new Error( "Syntax error, unrecognized expression: " + msg );
	};
	
	/**
	 * Document sorting and removing duplicates
	 * @param {ArrayLike} results
	 */
	Sizzle.uniqueSort = function( results ) {
		var elem,
			duplicates = [],
			j = 0,
			i = 0;
	
		// Unless we *know* we can detect duplicates, assume their presence
		hasDuplicate = !support.detectDuplicates;
		sortInput = !support.sortStable && results.slice( 0 );
		results.sort( sortOrder );
	
		if ( hasDuplicate ) {
			while ( (elem = results[i++]) ) {
				if ( elem === results[ i ] ) {
					j = duplicates.push( i );
				}
			}
			while ( j-- ) {
				results.splice( duplicates[ j ], 1 );
			}
		}
	
		// Clear input after sorting to release objects
		// See https://github.com/jquery/sizzle/pull/225
		sortInput = null;
	
		return results;
	};
	
	/**
	 * Utility function for retrieving the text value of an array of DOM nodes
	 * @param {Array|Element} elem
	 */
	getText = Sizzle.getText = function( elem ) {
		var node,
			ret = "",
			i = 0,
			nodeType = elem.nodeType;
	
		if ( !nodeType ) {
			// If no nodeType, this is expected to be an array
			while ( (node = elem[i++]) ) {
				// Do not traverse comment nodes
				ret += getText( node );
			}
		} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
			// Use textContent for elements
			// innerText usage removed for consistency of new lines (jQuery #11153)
			if ( typeof elem.textContent === "string" ) {
				return elem.textContent;
			} else {
				// Traverse its children
				for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
					ret += getText( elem );
				}
			}
		} else if ( nodeType === 3 || nodeType === 4 ) {
			return elem.nodeValue;
		}
		// Do not include comment or processing instruction nodes
	
		return ret;
	};
	
	Expr = Sizzle.selectors = {
	
		// Can be adjusted by the user
		cacheLength: 50,
	
		createPseudo: markFunction,
	
		match: matchExpr,
	
		attrHandle: {},
	
		find: {},
	
		relative: {
			">": { dir: "parentNode", first: true },
			" ": { dir: "parentNode" },
			"+": { dir: "previousSibling", first: true },
			"~": { dir: "previousSibling" }
		},
	
		preFilter: {
			"ATTR": function( match ) {
				match[1] = match[1].replace( runescape, funescape );
	
				// Move the given value to match[3] whether quoted or unquoted
				match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
	
				if ( match[2] === "~=" ) {
					match[3] = " " + match[3] + " ";
				}
	
				return match.slice( 0, 4 );
			},
	
			"CHILD": function( match ) {
				/* matches from matchExpr["CHILD"]
					1 type (only|nth|...)
					2 what (child|of-type)
					3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
					4 xn-component of xn+y argument ([+-]?\d*n|)
					5 sign of xn-component
					6 x of xn-component
					7 sign of y-component
					8 y of y-component
				*/
				match[1] = match[1].toLowerCase();
	
				if ( match[1].slice( 0, 3 ) === "nth" ) {
					// nth-* requires argument
					if ( !match[3] ) {
						Sizzle.error( match[0] );
					}
	
					// numeric x and y parameters for Expr.filter.CHILD
					// remember that false/true cast respectively to 0/1
					match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
					match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
	
				// other types prohibit arguments
				} else if ( match[3] ) {
					Sizzle.error( match[0] );
				}
	
				return match;
			},
	
			"PSEUDO": function( match ) {
				var excess,
					unquoted = !match[6] && match[2];
	
				if ( matchExpr["CHILD"].test( match[0] ) ) {
					return null;
				}
	
				// Accept quoted arguments as-is
				if ( match[3] ) {
					match[2] = match[4] || match[5] || "";
	
				// Strip excess characters from unquoted arguments
				} else if ( unquoted && rpseudo.test( unquoted ) &&
					// Get excess from tokenize (recursively)
					(excess = tokenize( unquoted, true )) &&
					// advance to the next closing parenthesis
					(excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
	
					// excess is a negative index
					match[0] = match[0].slice( 0, excess );
					match[2] = unquoted.slice( 0, excess );
				}
	
				// Return only captures needed by the pseudo filter method (type and argument)
				return match.slice( 0, 3 );
			}
		},
	
		filter: {
	
			"TAG": function( nodeNameSelector ) {
				var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
				return nodeNameSelector === "*" ?
					function() { return true; } :
					function( elem ) {
						return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
					};
			},
	
			"CLASS": function( className ) {
				var pattern = classCache[ className + " " ];
	
				return pattern ||
					(pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
					classCache( className, function( elem ) {
						return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );
					});
			},
	
			"ATTR": function( name, operator, check ) {
				return function( elem ) {
					var result = Sizzle.attr( elem, name );
	
					if ( result == null ) {
						return operator === "!=";
					}
					if ( !operator ) {
						return true;
					}
	
					result += "";
	
					return operator === "=" ? result === check :
						operator === "!=" ? result !== check :
						operator === "^=" ? check && result.indexOf( check ) === 0 :
						operator === "*=" ? check && result.indexOf( check ) > -1 :
						operator === "$=" ? check && result.slice( -check.length ) === check :
						operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
						operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
						false;
				};
			},
	
			"CHILD": function( type, what, argument, first, last ) {
				var simple = type.slice( 0, 3 ) !== "nth",
					forward = type.slice( -4 ) !== "last",
					ofType = what === "of-type";
	
				return first === 1 && last === 0 ?
	
					// Shortcut for :nth-*(n)
					function( elem ) {
						return !!elem.parentNode;
					} :
	
					function( elem, context, xml ) {
						var cache, uniqueCache, outerCache, node, nodeIndex, start,
							dir = simple !== forward ? "nextSibling" : "previousSibling",
							parent = elem.parentNode,
							name = ofType && elem.nodeName.toLowerCase(),
							useCache = !xml && !ofType,
							diff = false;
	
						if ( parent ) {
	
							// :(first|last|only)-(child|of-type)
							if ( simple ) {
								while ( dir ) {
									node = elem;
									while ( (node = node[ dir ]) ) {
										if ( ofType ?
											node.nodeName.toLowerCase() === name :
											node.nodeType === 1 ) {
	
											return false;
										}
									}
									// Reverse direction for :only-* (if we haven't yet done so)
									start = dir = type === "only" && !start && "nextSibling";
								}
								return true;
							}
	
							start = [ forward ? parent.firstChild : parent.lastChild ];
	
							// non-xml :nth-child(...) stores cache data on `parent`
							if ( forward && useCache ) {
	
								// Seek `elem` from a previously-cached index
	
								// ...in a gzip-friendly way
								node = parent;
								outerCache = node[ expando ] || (node[ expando ] = {});
	
								// Support: IE <9 only
								// Defend against cloned attroperties (jQuery gh-1709)
								uniqueCache = outerCache[ node.uniqueID ] ||
									(outerCache[ node.uniqueID ] = {});
	
								cache = uniqueCache[ type ] || [];
								nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
								diff = nodeIndex && cache[ 2 ];
								node = nodeIndex && parent.childNodes[ nodeIndex ];
	
								while ( (node = ++nodeIndex && node && node[ dir ] ||
	
									// Fallback to seeking `elem` from the start
									(diff = nodeIndex = 0) || start.pop()) ) {
	
									// When found, cache indexes on `parent` and break
									if ( node.nodeType === 1 && ++diff && node === elem ) {
										uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
										break;
									}
								}
	
							} else {
								// Use previously-cached element index if available
								if ( useCache ) {
									// ...in a gzip-friendly way
									node = elem;
									outerCache = node[ expando ] || (node[ expando ] = {});
	
									// Support: IE <9 only
									// Defend against cloned attroperties (jQuery gh-1709)
									uniqueCache = outerCache[ node.uniqueID ] ||
										(outerCache[ node.uniqueID ] = {});
	
									cache = uniqueCache[ type ] || [];
									nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
									diff = nodeIndex;
								}
	
								// xml :nth-child(...)
								// or :nth-last-child(...) or :nth(-last)?-of-type(...)
								if ( diff === false ) {
									// Use the same loop as above to seek `elem` from the start
									while ( (node = ++nodeIndex && node && node[ dir ] ||
										(diff = nodeIndex = 0) || start.pop()) ) {
	
										if ( ( ofType ?
											node.nodeName.toLowerCase() === name :
											node.nodeType === 1 ) &&
											++diff ) {
	
											// Cache the index of each encountered element
											if ( useCache ) {
												outerCache = node[ expando ] || (node[ expando ] = {});
	
												// Support: IE <9 only
												// Defend against cloned attroperties (jQuery gh-1709)
												uniqueCache = outerCache[ node.uniqueID ] ||
													(outerCache[ node.uniqueID ] = {});
	
												uniqueCache[ type ] = [ dirruns, diff ];
											}
	
											if ( node === elem ) {
												break;
											}
										}
									}
								}
							}
	
							// Incorporate the offset, then check against cycle size
							diff -= last;
							return diff === first || ( diff % first === 0 && diff / first >= 0 );
						}
					};
			},
	
			"PSEUDO": function( pseudo, argument ) {
				// pseudo-class names are case-insensitive
				// http://www.w3.org/TR/selectors/#pseudo-classes
				// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
				// Remember that setFilters inherits from pseudos
				var args,
					fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
						Sizzle.error( "unsupported pseudo: " + pseudo );
	
				// The user may use createPseudo to indicate that
				// arguments are needed to create the filter function
				// just as Sizzle does
				if ( fn[ expando ] ) {
					return fn( argument );
				}
	
				// But maintain support for old signatures
				if ( fn.length > 1 ) {
					args = [ pseudo, pseudo, "", argument ];
					return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
						markFunction(function( seed, matches ) {
							var idx,
								matched = fn( seed, argument ),
								i = matched.length;
							while ( i-- ) {
								idx = indexOf( seed, matched[i] );
								seed[ idx ] = !( matches[ idx ] = matched[i] );
							}
						}) :
						function( elem ) {
							return fn( elem, 0, args );
						};
				}
	
				return fn;
			}
		},
	
		pseudos: {
			// Potentially complex pseudos
			"not": markFunction(function( selector ) {
				// Trim the selector passed to compile
				// to avoid treating leading and trailing
				// spaces as combinators
				var input = [],
					results = [],
					matcher = compile( selector.replace( rtrim, "$1" ) );
	
				return matcher[ expando ] ?
					markFunction(function( seed, matches, context, xml ) {
						var elem,
							unmatched = matcher( seed, null, xml, [] ),
							i = seed.length;
	
						// Match elements unmatched by `matcher`
						while ( i-- ) {
							if ( (elem = unmatched[i]) ) {
								seed[i] = !(matches[i] = elem);
							}
						}
					}) :
					function( elem, context, xml ) {
						input[0] = elem;
						matcher( input, null, xml, results );
						// Don't keep the element (issue #299)
						input[0] = null;
						return !results.pop();
					};
			}),
	
			"has": markFunction(function( selector ) {
				return function( elem ) {
					return Sizzle( selector, elem ).length > 0;
				};
			}),
	
			"contains": markFunction(function( text ) {
				text = text.replace( runescape, funescape );
				return function( elem ) {
					return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1;
				};
			}),
	
			// "Whether an element is represented by a :lang() selector
			// is based solely on the element's language value
			// being equal to the identifier C,
			// or beginning with the identifier C immediately followed by "-".
			// The matching of C against the element's language value is performed case-insensitively.
			// The identifier C does not have to be a valid language name."
			// http://www.w3.org/TR/selectors/#lang-pseudo
			"lang": markFunction( function( lang ) {
				// lang value must be a valid identifier
				if ( !ridentifier.test(lang || "") ) {
					Sizzle.error( "unsupported lang: " + lang );
				}
				lang = lang.replace( runescape, funescape ).toLowerCase();
				return function( elem ) {
					var elemLang;
					do {
						if ( (elemLang = documentIsHTML ?
							elem.lang :
							elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
	
							elemLang = elemLang.toLowerCase();
							return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
						}
					} while ( (elem = elem.parentNode) && elem.nodeType === 1 );
					return false;
				};
			}),
	
			// Miscellaneous
			"target": function( elem ) {
				var hash = window.location && window.location.hash;
				return hash && hash.slice( 1 ) === elem.id;
			},
	
			"root": function( elem ) {
				return elem === docElem;
			},
	
			"focus": function( elem ) {
				return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
			},
	
			// Boolean properties
			"enabled": createDisabledPseudo( false ),
			"disabled": createDisabledPseudo( true ),
	
			"checked": function( elem ) {
				// In CSS3, :checked should return both checked and selected elements
				// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
				var nodeName = elem.nodeName.toLowerCase();
				return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
			},
	
			"selected": function( elem ) {
				// Accessing this property makes selected-by-default
				// options in Safari work properly
				if ( elem.parentNode ) {
					elem.parentNode.selectedIndex;
				}
	
				return elem.selected === true;
			},
	
			// Contents
			"empty": function( elem ) {
				// http://www.w3.org/TR/selectors/#empty-pseudo
				// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
				//   but not by others (comment: 8; processing instruction: 7; etc.)
				// nodeType < 6 works because attributes (2) do not appear as children
				for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
					if ( elem.nodeType < 6 ) {
						return false;
					}
				}
				return true;
			},
	
			"parent": function( elem ) {
				return !Expr.pseudos["empty"]( elem );
			},
	
			// Element/input types
			"header": function( elem ) {
				return rheader.test( elem.nodeName );
			},
	
			"input": function( elem ) {
				return rinputs.test( elem.nodeName );
			},
	
			"button": function( elem ) {
				var name = elem.nodeName.toLowerCase();
				return name === "input" && elem.type === "button" || name === "button";
			},
	
			"text": function( elem ) {
				var attr;
				return elem.nodeName.toLowerCase() === "input" &&
					elem.type === "text" &&
	
					// Support: IE<8
					// New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
					( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
			},
	
			// Position-in-collection
			"first": createPositionalPseudo(function() {
				return [ 0 ];
			}),
	
			"last": createPositionalPseudo(function( matchIndexes, length ) {
				return [ length - 1 ];
			}),
	
			"eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
				return [ argument < 0 ? argument + length : argument ];
			}),
	
			"even": createPositionalPseudo(function( matchIndexes, length ) {
				var i = 0;
				for ( ; i < length; i += 2 ) {
					matchIndexes.push( i );
				}
				return matchIndexes;
			}),
	
			"odd": createPositionalPseudo(function( matchIndexes, length ) {
				var i = 1;
				for ( ; i < length; i += 2 ) {
					matchIndexes.push( i );
				}
				return matchIndexes;
			}),
	
			"lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
				var i = argument < 0 ?
					argument + length :
					argument > length ?
						length :
						argument;
				for ( ; --i >= 0; ) {
					matchIndexes.push( i );
				}
				return matchIndexes;
			}),
	
			"gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
				var i = argument < 0 ? argument + length : argument;
				for ( ; ++i < length; ) {
					matchIndexes.push( i );
				}
				return matchIndexes;
			})
		}
	};
	
	Expr.pseudos["nth"] = Expr.pseudos["eq"];
	
	// Add button/input type pseudos
	for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
		Expr.pseudos[ i ] = createInputPseudo( i );
	}
	for ( i in { submit: true, reset: true } ) {
		Expr.pseudos[ i ] = createButtonPseudo( i );
	}
	
	// Easy API for creating new setFilters
	function setFilters() {}
	setFilters.prototype = Expr.filters = Expr.pseudos;
	Expr.setFilters = new setFilters();
	
	tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
		var matched, match, tokens, type,
			soFar, groups, preFilters,
			cached = tokenCache[ selector + " " ];
	
		if ( cached ) {
			return parseOnly ? 0 : cached.slice( 0 );
		}
	
		soFar = selector;
		groups = [];
		preFilters = Expr.preFilter;
	
		while ( soFar ) {
	
			// Comma and first run
			if ( !matched || (match = rcomma.exec( soFar )) ) {
				if ( match ) {
					// Don't consume trailing commas as valid
					soFar = soFar.slice( match[0].length ) || soFar;
				}
				groups.push( (tokens = []) );
			}
	
			matched = false;
	
			// Combinators
			if ( (match = rcombinators.exec( soFar )) ) {
				matched = match.shift();
				tokens.push({
					value: matched,
					// Cast descendant combinators to space
					type: match[0].replace( rtrim, " " )
				});
				soFar = soFar.slice( matched.length );
			}
	
			// Filters
			for ( type in Expr.filter ) {
				if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
					(match = preFilters[ type ]( match ))) ) {
					matched = match.shift();
					tokens.push({
						value: matched,
						type: type,
						matches: match
					});
					soFar = soFar.slice( matched.length );
				}
			}
	
			if ( !matched ) {
				break;
			}
		}
	
		// Return the length of the invalid excess
		// if we're just parsing
		// Otherwise, throw an error or return tokens
		return parseOnly ?
			soFar.length :
			soFar ?
				Sizzle.error( selector ) :
				// Cache the tokens
				tokenCache( selector, groups ).slice( 0 );
	};
	
	function toSelector( tokens ) {
		var i = 0,
			len = tokens.length,
			selector = "";
		for ( ; i < len; i++ ) {
			selector += tokens[i].value;
		}
		return selector;
	}
	
	function addCombinator( matcher, combinator, base ) {
		var dir = combinator.dir,
			skip = combinator.next,
			key = skip || dir,
			checkNonElements = base && key === "parentNode",
			doneName = done++;
	
		return combinator.first ?
			// Check against closest ancestor/preceding element
			function( elem, context, xml ) {
				while ( (elem = elem[ dir ]) ) {
					if ( elem.nodeType === 1 || checkNonElements ) {
						return matcher( elem, context, xml );
					}
				}
				return false;
			} :
	
			// Check against all ancestor/preceding elements
			function( elem, context, xml ) {
				var oldCache, uniqueCache, outerCache,
					newCache = [ dirruns, doneName ];
	
				// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
				if ( xml ) {
					while ( (elem = elem[ dir ]) ) {
						if ( elem.nodeType === 1 || checkNonElements ) {
							if ( matcher( elem, context, xml ) ) {
								return true;
							}
						}
					}
				} else {
					while ( (elem = elem[ dir ]) ) {
						if ( elem.nodeType === 1 || checkNonElements ) {
							outerCache = elem[ expando ] || (elem[ expando ] = {});
	
							// Support: IE <9 only
							// Defend against cloned attroperties (jQuery gh-1709)
							uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});
	
							if ( skip && skip === elem.nodeName.toLowerCase() ) {
								elem = elem[ dir ] || elem;
							} else if ( (oldCache = uniqueCache[ key ]) &&
								oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
	
								// Assign to newCache so results back-propagate to previous elements
								return (newCache[ 2 ] = oldCache[ 2 ]);
							} else {
								// Reuse newcache so results back-propagate to previous elements
								uniqueCache[ key ] = newCache;
	
								// A match means we're done; a fail means we have to keep checking
								if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
									return true;
								}
							}
						}
					}
				}
				return false;
			};
	}
	
	function elementMatcher( matchers ) {
		return matchers.length > 1 ?
			function( elem, context, xml ) {
				var i = matchers.length;
				while ( i-- ) {
					if ( !matchers[i]( elem, context, xml ) ) {
						return false;
					}
				}
				return true;
			} :
			matchers[0];
	}
	
	function multipleContexts( selector, contexts, results ) {
		var i = 0,
			len = contexts.length;
		for ( ; i < len; i++ ) {
			Sizzle( selector, contexts[i], results );
		}
		return results;
	}
	
	function condense( unmatched, map, filter, context, xml ) {
		var elem,
			newUnmatched = [],
			i = 0,
			len = unmatched.length,
			mapped = map != null;
	
		for ( ; i < len; i++ ) {
			if ( (elem = unmatched[i]) ) {
				if ( !filter || filter( elem, context, xml ) ) {
					newUnmatched.push( elem );
					if ( mapped ) {
						map.push( i );
					}
				}
			}
		}
	
		return newUnmatched;
	}
	
	function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
		if ( postFilter && !postFilter[ expando ] ) {
			postFilter = setMatcher( postFilter );
		}
		if ( postFinder && !postFinder[ expando ] ) {
			postFinder = setMatcher( postFinder, postSelector );
		}
		return markFunction(function( seed, results, context, xml ) {
			var temp, i, elem,
				preMap = [],
				postMap = [],
				preexisting = results.length,
	
				// Get initial elements from seed or context
				elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
	
				// Prefilter to get matcher input, preserving a map for seed-results synchronization
				matcherIn = preFilter && ( seed || !selector ) ?
					condense( elems, preMap, preFilter, context, xml ) :
					elems,
	
				matcherOut = matcher ?
					// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
					postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
	
						// ...intermediate processing is necessary
						[] :
	
						// ...otherwise use results directly
						results :
					matcherIn;
	
			// Find primary matches
			if ( matcher ) {
				matcher( matcherIn, matcherOut, context, xml );
			}
	
			// Apply postFilter
			if ( postFilter ) {
				temp = condense( matcherOut, postMap );
				postFilter( temp, [], context, xml );
	
				// Un-match failing elements by moving them back to matcherIn
				i = temp.length;
				while ( i-- ) {
					if ( (elem = temp[i]) ) {
						matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
					}
				}
			}
	
			if ( seed ) {
				if ( postFinder || preFilter ) {
					if ( postFinder ) {
						// Get the final matcherOut by condensing this intermediate into postFinder contexts
						temp = [];
						i = matcherOut.length;
						while ( i-- ) {
							if ( (elem = matcherOut[i]) ) {
								// Restore matcherIn since elem is not yet a final match
								temp.push( (matcherIn[i] = elem) );
							}
						}
						postFinder( null, (matcherOut = []), temp, xml );
					}
	
					// Move matched elements from seed to results to keep them synchronized
					i = matcherOut.length;
					while ( i-- ) {
						if ( (elem = matcherOut[i]) &&
							(temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {
	
							seed[temp] = !(results[temp] = elem);
						}
					}
				}
	
			// Add elements to results, through postFinder if defined
			} else {
				matcherOut = condense(
					matcherOut === results ?
						matcherOut.splice( preexisting, matcherOut.length ) :
						matcherOut
				);
				if ( postFinder ) {
					postFinder( null, results, matcherOut, xml );
				} else {
					push.apply( results, matcherOut );
				}
			}
		});
	}
	
	function matcherFromTokens( tokens ) {
		var checkContext, matcher, j,
			len = tokens.length,
			leadingRelative = Expr.relative[ tokens[0].type ],
			implicitRelative = leadingRelative || Expr.relative[" "],
			i = leadingRelative ? 1 : 0,
	
			// The foundational matcher ensures that elements are reachable from top-level context(s)
			matchContext = addCombinator( function( elem ) {
				return elem === checkContext;
			}, implicitRelative, true ),
			matchAnyContext = addCombinator( function( elem ) {
				return indexOf( checkContext, elem ) > -1;
			}, implicitRelative, true ),
			matchers = [ function( elem, context, xml ) {
				var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
					(checkContext = context).nodeType ?
						matchContext( elem, context, xml ) :
						matchAnyContext( elem, context, xml ) );
				// Avoid hanging onto element (issue #299)
				checkContext = null;
				return ret;
			} ];
	
		for ( ; i < len; i++ ) {
			if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
				matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
			} else {
				matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
	
				// Return special upon seeing a positional matcher
				if ( matcher[ expando ] ) {
					// Find the next relative operator (if any) for proper handling
					j = ++i;
					for ( ; j < len; j++ ) {
						if ( Expr.relative[ tokens[j].type ] ) {
							break;
						}
					}
					return setMatcher(
						i > 1 && elementMatcher( matchers ),
						i > 1 && toSelector(
							// If the preceding token was a descendant combinator, insert an implicit any-element `*`
							tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
						).replace( rtrim, "$1" ),
						matcher,
						i < j && matcherFromTokens( tokens.slice( i, j ) ),
						j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
						j < len && toSelector( tokens )
					);
				}
				matchers.push( matcher );
			}
		}
	
		return elementMatcher( matchers );
	}
	
	function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
		var bySet = setMatchers.length > 0,
			byElement = elementMatchers.length > 0,
			superMatcher = function( seed, context, xml, results, outermost ) {
				var elem, j, matcher,
					matchedCount = 0,
					i = "0",
					unmatched = seed && [],
					setMatched = [],
					contextBackup = outermostContext,
					// We must always have either seed elements or outermost context
					elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
					// Use integer dirruns iff this is the outermost matcher
					dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
					len = elems.length;
	
				if ( outermost ) {
					outermostContext = context === document || context || outermost;
				}
	
				// Add elements passing elementMatchers directly to results
				// Support: IE<9, Safari
				// Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
				for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
					if ( byElement && elem ) {
						j = 0;
						if ( !context && elem.ownerDocument !== document ) {
							setDocument( elem );
							xml = !documentIsHTML;
						}
						while ( (matcher = elementMatchers[j++]) ) {
							if ( matcher( elem, context || document, xml) ) {
								results.push( elem );
								break;
							}
						}
						if ( outermost ) {
							dirruns = dirrunsUnique;
						}
					}
	
					// Track unmatched elements for set filters
					if ( bySet ) {
						// They will have gone through all possible matchers
						if ( (elem = !matcher && elem) ) {
							matchedCount--;
						}
	
						// Lengthen the array for every element, matched or not
						if ( seed ) {
							unmatched.push( elem );
						}
					}
				}
	
				// `i` is now the count of elements visited above, and adding it to `matchedCount`
				// makes the latter nonnegative.
				matchedCount += i;
	
				// Apply set filters to unmatched elements
				// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
				// equals `i`), unless we didn't visit _any_ elements in the above loop because we have
				// no element matchers and no seed.
				// Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
				// case, which will result in a "00" `matchedCount` that differs from `i` but is also
				// numerically zero.
				if ( bySet && i !== matchedCount ) {
					j = 0;
					while ( (matcher = setMatchers[j++]) ) {
						matcher( unmatched, setMatched, context, xml );
					}
	
					if ( seed ) {
						// Reintegrate element matches to eliminate the need for sorting
						if ( matchedCount > 0 ) {
							while ( i-- ) {
								if ( !(unmatched[i] || setMatched[i]) ) {
									setMatched[i] = pop.call( results );
								}
							}
						}
	
						// Discard index placeholder values to get only actual matches
						setMatched = condense( setMatched );
					}
	
					// Add matches to results
					push.apply( results, setMatched );
	
					// Seedless set matches succeeding multiple successful matchers stipulate sorting
					if ( outermost && !seed && setMatched.length > 0 &&
						( matchedCount + setMatchers.length ) > 1 ) {
	
						Sizzle.uniqueSort( results );
					}
				}
	
				// Override manipulation of globals by nested matchers
				if ( outermost ) {
					dirruns = dirrunsUnique;
					outermostContext = contextBackup;
				}
	
				return unmatched;
			};
	
		return bySet ?
			markFunction( superMatcher ) :
			superMatcher;
	}
	
	compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
		var i,
			setMatchers = [],
			elementMatchers = [],
			cached = compilerCache[ selector + " " ];
	
		if ( !cached ) {
			// Generate a function of recursive functions that can be used to check each element
			if ( !match ) {
				match = tokenize( selector );
			}
			i = match.length;
			while ( i-- ) {
				cached = matcherFromTokens( match[i] );
				if ( cached[ expando ] ) {
					setMatchers.push( cached );
				} else {
					elementMatchers.push( cached );
				}
			}
	
			// Cache the compiled function
			cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
	
			// Save selector and tokenization
			cached.selector = selector;
		}
		return cached;
	};
	
	/**
	 * A low-level selection function that works with Sizzle's compiled
	 *  selector functions
	 * @param {String|Function} selector A selector or a pre-compiled
	 *  selector function built with Sizzle.compile
	 * @param {Element} context
	 * @param {Array} [results]
	 * @param {Array} [seed] A set of elements to match against
	 */
	select = Sizzle.select = function( selector, context, results, seed ) {
		var i, tokens, token, type, find,
			compiled = typeof selector === "function" && selector,
			match = !seed && tokenize( (selector = compiled.selector || selector) );
	
		results = results || [];
	
		// Try to minimize operations if there is only one selector in the list and no seed
		// (the latter of which guarantees us context)
		if ( match.length === 1 ) {
	
			// Reduce context if the leading compound selector is an ID
			tokens = match[0] = match[0].slice( 0 );
			if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
					context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) {
	
				context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
				if ( !context ) {
					return results;
	
				// Precompiled matchers will still verify ancestry, so step up a level
				} else if ( compiled ) {
					context = context.parentNode;
				}
	
				selector = selector.slice( tokens.shift().value.length );
			}
	
			// Fetch a seed set for right-to-left matching
			i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
			while ( i-- ) {
				token = tokens[i];
	
				// Abort if we hit a combinator
				if ( Expr.relative[ (type = token.type) ] ) {
					break;
				}
				if ( (find = Expr.find[ type ]) ) {
					// Search, expanding context for leading sibling combinators
					if ( (seed = find(
						token.matches[0].replace( runescape, funescape ),
						rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
					)) ) {
	
						// If seed is empty or no tokens remain, we can return early
						tokens.splice( i, 1 );
						selector = seed.length && toSelector( tokens );
						if ( !selector ) {
							push.apply( results, seed );
							return results;
						}
	
						break;
					}
				}
			}
		}
	
		// Compile and execute a filtering function if one is not provided
		// Provide `match` to avoid retokenization if we modified the selector above
		( compiled || compile( selector, match ) )(
			seed,
			context,
			!documentIsHTML,
			results,
			!context || rsibling.test( selector ) && testContext( context.parentNode ) || context
		);
		return results;
	};
	
	// One-time assignments
	
	// Sort stability
	support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
	
	// Support: Chrome 14-35+
	// Always assume duplicates if they aren't passed to the comparison function
	support.detectDuplicates = !!hasDuplicate;
	
	// Initialize against the default document
	setDocument();
	
	// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
	// Detached nodes confoundingly follow *each other*
	support.sortDetached = assert(function( el ) {
		// Should return 1, but returns 4 (following)
		return el.compareDocumentPosition( document.createElement("fieldset") ) & 1;
	});
	
	// Support: IE<8
	// Prevent attribute/property "interpolation"
	// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
	if ( !assert(function( el ) {
		el.innerHTML = "<a href='#'></a>";
		return el.firstChild.getAttribute("href") === "#" ;
	}) ) {
		addHandle( "type|href|height|width", function( elem, name, isXML ) {
			if ( !isXML ) {
				return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
			}
		});
	}
	
	// Support: IE<9
	// Use defaultValue in place of getAttribute("value")
	if ( !support.attributes || !assert(function( el ) {
		el.innerHTML = "<input/>";
		el.firstChild.setAttribute( "value", "" );
		return el.firstChild.getAttribute( "value" ) === "";
	}) ) {
		addHandle( "value", function( elem, name, isXML ) {
			if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
				return elem.defaultValue;
			}
		});
	}
	
	// Support: IE<9
	// Use getAttributeNode to fetch booleans when getAttribute lies
	if ( !assert(function( el ) {
		return el.getAttribute("disabled") == null;
	}) ) {
		addHandle( booleans, function( elem, name, isXML ) {
			var val;
			if ( !isXML ) {
				return elem[ name ] === true ? name.toLowerCase() :
						(val = elem.getAttributeNode( name )) && val.specified ?
						val.value :
					null;
			}
		});
	}
	
	return Sizzle;
	
	})( window );
	
	
	
	jQuery.find = Sizzle;
	jQuery.expr = Sizzle.selectors;
	
	// Deprecated
	jQuery.expr[ ":" ] = jQuery.expr.pseudos;
	jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
	jQuery.text = Sizzle.getText;
	jQuery.isXMLDoc = Sizzle.isXML;
	jQuery.contains = Sizzle.contains;
	jQuery.escapeSelector = Sizzle.escape;
	
	
	
	
	var dir = function( elem, dir, until ) {
		var matched = [],
			truncate = until !== undefined;
	
		while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
			if ( elem.nodeType === 1 ) {
				if ( truncate && jQuery( elem ).is( until ) ) {
					break;
				}
				matched.push( elem );
			}
		}
		return matched;
	};
	
	
	var siblings = function( n, elem ) {
		var matched = [];
	
		for ( ; n; n = n.nextSibling ) {
			if ( n.nodeType === 1 && n !== elem ) {
				matched.push( n );
			}
		}
	
		return matched;
	};
	
	
	var rneedsContext = jQuery.expr.match.needsContext;
	
	
	
	function nodeName( elem, name ) {
	
	  return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
	
	};
	var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
	
	
	
	// Implement the identical functionality for filter and not
	function winnow( elements, qualifier, not ) {
		if ( isFunction( qualifier ) ) {
			return jQuery.grep( elements, function( elem, i ) {
				return !!qualifier.call( elem, i, elem ) !== not;
			} );
		}
	
		// Single element
		if ( qualifier.nodeType ) {
			return jQuery.grep( elements, function( elem ) {
				return ( elem === qualifier ) !== not;
			} );
		}
	
		// Arraylike of elements (jQuery, arguments, Array)
		if ( typeof qualifier !== "string" ) {
			return jQuery.grep( elements, function( elem ) {
				return ( indexOf.call( qualifier, elem ) > -1 ) !== not;
			} );
		}
	
		// Filtered directly for both simple and complex selectors
		return jQuery.filter( qualifier, elements, not );
	}
	
	jQuery.filter = function( expr, elems, not ) {
		var elem = elems[ 0 ];
	
		if ( not ) {
			expr = ":not(" + expr + ")";
		}
	
		if ( elems.length === 1 && elem.nodeType === 1 ) {
			return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];
		}
	
		return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
			return elem.nodeType === 1;
		} ) );
	};
	
	jQuery.fn.extend( {
		find: function( selector ) {
			var i, ret,
				len = this.length,
				self = this;
	
			if ( typeof selector !== "string" ) {
				return this.pushStack( jQuery( selector ).filter( function() {
					for ( i = 0; i < len; i++ ) {
						if ( jQuery.contains( self[ i ], this ) ) {
							return true;
						}
					}
				} ) );
			}
	
			ret = this.pushStack( [] );
	
			for ( i = 0; i < len; i++ ) {
				jQuery.find( selector, self[ i ], ret );
			}
	
			return len > 1 ? jQuery.uniqueSort( ret ) : ret;
		},
		filter: function( selector ) {
			return this.pushStack( winnow( this, selector || [], false ) );
		},
		not: function( selector ) {
			return this.pushStack( winnow( this, selector || [], true ) );
		},
		is: function( selector ) {
			return !!winnow(
				this,
	
				// If this is a positional/relative selector, check membership in the returned set
				// so $("p:first").is("p:last") won't return true for a doc with two "p".
				typeof selector === "string" && rneedsContext.test( selector ) ?
					jQuery( selector ) :
					selector || [],
				false
			).length;
		}
	} );
	
	
	// Initialize a jQuery object
	
	
	// A central reference to the root jQuery(document)
	var rootjQuery,
	
		// A simple way to check for HTML strings
		// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
		// Strict HTML recognition (#11290: must start with <)
		// Shortcut simple #id case for speed
		rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,
	
		init = jQuery.fn.init = function( selector, context, root ) {
			var match, elem;
	
			// HANDLE: $(""), $(null), $(undefined), $(false)
			if ( !selector ) {
				return this;
			}
	
			// Method init() accepts an alternate rootjQuery
			// so migrate can support jQuery.sub (gh-2101)
			root = root || rootjQuery;
	
			// Handle HTML strings
			if ( typeof selector === "string" ) {
				if ( selector[ 0 ] === "<" &&
					selector[ selector.length - 1 ] === ">" &&
					selector.length >= 3 ) {
	
					// Assume that strings that start and end with <> are HTML and skip the regex check
					match = [ null, selector, null ];
	
				} else {
					match = rquickExpr.exec( selector );
				}
	
				// Match html or make sure no context is specified for #id
				if ( match && ( match[ 1 ] || !context ) ) {
	
					// HANDLE: $(html) -> $(array)
					if ( match[ 1 ] ) {
						context = context instanceof jQuery ? context[ 0 ] : context;
	
						// Option to run scripts is true for back-compat
						// Intentionally let the error be thrown if parseHTML is not present
						jQuery.merge( this, jQuery.parseHTML(
							match[ 1 ],
							context && context.nodeType ? context.ownerDocument || context : document,
							true
						) );
	
						// HANDLE: $(html, props)
						if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
							for ( match in context ) {
	
								// Properties of context are called as methods if possible
								if ( isFunction( this[ match ] ) ) {
									this[ match ]( context[ match ] );
	
								// ...and otherwise set as attributes
								} else {
									this.attr( match, context[ match ] );
								}
							}
						}
	
						return this;
	
					// HANDLE: $(#id)
					} else {
						elem = document.getElementById( match[ 2 ] );
	
						if ( elem ) {
	
							// Inject the element directly into the jQuery object
							this[ 0 ] = elem;
							this.length = 1;
						}
						return this;
					}
	
				// HANDLE: $(expr, $(...))
				} else if ( !context || context.jquery ) {
					return ( context || root ).find( selector );
	
				// HANDLE: $(expr, context)
				// (which is just equivalent to: $(context).find(expr)
				} else {
					return this.constructor( context ).find( selector );
				}
	
			// HANDLE: $(DOMElement)
			} else if ( selector.nodeType ) {
				this[ 0 ] = selector;
				this.length = 1;
				return this;
	
			// HANDLE: $(function)
			// Shortcut for document ready
			} else if ( isFunction( selector ) ) {
				return root.ready !== undefined ?
					root.ready( selector ) :
	
					// Execute immediately if ready is not present
					selector( jQuery );
			}
	
			return jQuery.makeArray( selector, this );
		};
	
	// Give the init function the jQuery prototype for later instantiation
	init.prototype = jQuery.fn;
	
	// Initialize central reference
	rootjQuery = jQuery( document );
	
	
	var rparentsprev = /^(?:parents|prev(?:Until|All))/,
	
		// Methods guaranteed to produce a unique set when starting from a unique set
		guaranteedUnique = {
			children: true,
			contents: true,
			next: true,
			prev: true
		};
	
	jQuery.fn.extend( {
		has: function( target ) {
			var targets = jQuery( target, this ),
				l = targets.length;
	
			return this.filter( function() {
				var i = 0;
				for ( ; i < l; i++ ) {
					if ( jQuery.contains( this, targets[ i ] ) ) {
						return true;
					}
				}
			} );
		},
	
		closest: function( selectors, context ) {
			var cur,
				i = 0,
				l = this.length,
				matched = [],
				targets = typeof selectors !== "string" && jQuery( selectors );
	
			// Positional selectors never match, since there's no _selection_ context
			if ( !rneedsContext.test( selectors ) ) {
				for ( ; i < l; i++ ) {
					for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
	
						// Always skip document fragments
						if ( cur.nodeType < 11 && ( targets ?
							targets.index( cur ) > -1 :
	
							// Don't pass non-elements to Sizzle
							cur.nodeType === 1 &&
								jQuery.find.matchesSelector( cur, selectors ) ) ) {
	
							matched.push( cur );
							break;
						}
					}
				}
			}
	
			return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
		},
	
		// Determine the position of an element within the set
		index: function( elem ) {
	
			// No argument, return index in parent
			if ( !elem ) {
				return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
			}
	
			// Index in selector
			if ( typeof elem === "string" ) {
				return indexOf.call( jQuery( elem ), this[ 0 ] );
			}
	
			// Locate the position of the desired element
			return indexOf.call( this,
	
				// If it receives a jQuery object, the first element is used
				elem.jquery ? elem[ 0 ] : elem
			);
		},
	
		add: function( selector, context ) {
			return this.pushStack(
				jQuery.uniqueSort(
					jQuery.merge( this.get(), jQuery( selector, context ) )
				)
			);
		},
	
		addBack: function( selector ) {
			return this.add( selector == null ?
				this.prevObject : this.prevObject.filter( selector )
			);
		}
	} );
	
	function sibling( cur, dir ) {
		while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}
		return cur;
	}
	
	jQuery.each( {
		parent: function( elem ) {
			var parent = elem.parentNode;
			return parent && parent.nodeType !== 11 ? parent : null;
		},
		parents: function( elem ) {
			return dir( elem, "parentNode" );
		},
		parentsUntil: function( elem, i, until ) {
			return dir( elem, "parentNode", until );
		},
		next: function( elem ) {
			return sibling( elem, "nextSibling" );
		},
		prev: function( elem ) {
			return sibling( elem, "previousSibling" );
		},
		nextAll: function( elem ) {
			return dir( elem, "nextSibling" );
		},
		prevAll: function( elem ) {
			return dir( elem, "previousSibling" );
		},
		nextUntil: function( elem, i, until ) {
			return dir( elem, "nextSibling", until );
		},
		prevUntil: function( elem, i, until ) {
			return dir( elem, "previousSibling", until );
		},
		siblings: function( elem ) {
			return siblings( ( elem.parentNode || {} ).firstChild, elem );
		},
		children: function( elem ) {
			return siblings( elem.firstChild );
		},
		contents: function( elem ) {
			if ( typeof elem.contentDocument !== "undefined" ) {
				return elem.contentDocument;
			}
	
			// Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only
			// Treat the template element as a regular one in browsers that
			// don't support it.
			if ( nodeName( elem, "template" ) ) {
				elem = elem.content || elem;
			}
	
			return jQuery.merge( [], elem.childNodes );
		}
	}, function( name, fn ) {
		jQuery.fn[ name ] = function( until, selector ) {
			var matched = jQuery.map( this, fn, until );
	
			if ( name.slice( -5 ) !== "Until" ) {
				selector = until;
			}
	
			if ( selector && typeof selector === "string" ) {
				matched = jQuery.filter( selector, matched );
			}
	
			if ( this.length > 1 ) {
	
				// Remove duplicates
				if ( !guaranteedUnique[ name ] ) {
					jQuery.uniqueSort( matched );
				}
	
				// Reverse order for parents* and prev-derivatives
				if ( rparentsprev.test( name ) ) {
					matched.reverse();
				}
			}
	
			return this.pushStack( matched );
		};
	} );
	var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g );
	
	
	
	// Convert String-formatted options into Object-formatted ones
	function createOptions( options ) {
		var object = {};
		jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {
			object[ flag ] = true;
		} );
		return object;
	}
	
	/*
	 * Create a callback list using the following parameters:
	 *
	 *	options: an optional list of space-separated options that will change how
	 *			the callback list behaves or a more traditional option object
	 *
	 * By default a callback list will act like an event callback list and can be
	 * "fired" multiple times.
	 *
	 * Possible options:
	 *
	 *	once:			will ensure the callback list can only be fired once (like a Deferred)
	 *
	 *	memory:			will keep track of previous values and will call any callback added
	 *					after the list has been fired right away with the latest "memorized"
	 *					values (like a Deferred)
	 *
	 *	unique:			will ensure a callback can only be added once (no duplicate in the list)
	 *
	 *	stopOnFalse:	interrupt callings when a callback returns false
	 *
	 */
	jQuery.Callbacks = function( options ) {
	
		// Convert options from String-formatted to Object-formatted if needed
		// (we check in cache first)
		options = typeof options === "string" ?
			createOptions( options ) :
			jQuery.extend( {}, options );
	
		var // Flag to know if list is currently firing
			firing,
	
			// Last fire value for non-forgettable lists
			memory,
	
			// Flag to know if list was already fired
			fired,
	
			// Flag to prevent firing
			locked,
	
			// Actual callback list
			list = [],
	
			// Queue of execution data for repeatable lists
			queue = [],
	
			// Index of currently firing callback (modified by add/remove as needed)
			firingIndex = -1,
	
			// Fire callbacks
			fire = function() {
	
				// Enforce single-firing
				locked = locked || options.once;
	
				// Execute callbacks for all pending executions,
				// respecting firingIndex overrides and runtime changes
				fired = firing = true;
				for ( ; queue.length; firingIndex = -1 ) {
					memory = queue.shift();
					while ( ++firingIndex < list.length ) {
	
						// Run callback and check for early termination
						if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
							options.stopOnFalse ) {
	
							// Jump to end and forget the data so .add doesn't re-fire
							firingIndex = list.length;
							memory = false;
						}
					}
				}
	
				// Forget the data if we're done with it
				if ( !options.memory ) {
					memory = false;
				}
	
				firing = false;
	
				// Clean up if we're done firing for good
				if ( locked ) {
	
					// Keep an empty list if we have data for future add calls
					if ( memory ) {
						list = [];
	
					// Otherwise, this object is spent
					} else {
						list = "";
					}
				}
			},
	
			// Actual Callbacks object
			self = {
	
				// Add a callback or a collection of callbacks to the list
				add: function() {
					if ( list ) {
	
						// If we have memory from a past run, we should fire after adding
						if ( memory && !firing ) {
							firingIndex = list.length - 1;
							queue.push( memory );
						}
	
						( function add( args ) {
							jQuery.each( args, function( _, arg ) {
								if ( isFunction( arg ) ) {
									if ( !options.unique || !self.has( arg ) ) {
										list.push( arg );
									}
								} else if ( arg && arg.length && toType( arg ) !== "string" ) {
	
									// Inspect recursively
									add( arg );
								}
							} );
						} )( arguments );
	
						if ( memory && !firing ) {
							fire();
						}
					}
					return this;
				},
	
				// Remove a callback from the list
				remove: function() {
					jQuery.each( arguments, function( _, arg ) {
						var index;
						while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
							list.splice( index, 1 );
	
							// Handle firing indexes
							if ( index <= firingIndex ) {
								firingIndex--;
							}
						}
					} );
					return this;
				},
	
				// Check if a given callback is in the list.
				// If no argument is given, return whether or not list has callbacks attached.
				has: function( fn ) {
					return fn ?
						jQuery.inArray( fn, list ) > -1 :
						list.length > 0;
				},
	
				// Remove all callbacks from the list
				empty: function() {
					if ( list ) {
						list = [];
					}
					return this;
				},
	
				// Disable .fire and .add
				// Abort any current/pending executions
				// Clear all callbacks and values
				disable: function() {
					locked = queue = [];
					list = memory = "";
					return this;
				},
				disabled: function() {
					return !list;
				},
	
				// Disable .fire
				// Also disable .add unless we have memory (since it would have no effect)
				// Abort any pending executions
				lock: function() {
					locked = queue = [];
					if ( !memory && !firing ) {
						list = memory = "";
					}
					return this;
				},
				locked: function() {
					return !!locked;
				},
	
				// Call all callbacks with the given context and arguments
				fireWith: function( context, args ) {
					if ( !locked ) {
						args = args || [];
						args = [ context, args.slice ? args.slice() : args ];
						queue.push( args );
						if ( !firing ) {
							fire();
						}
					}
					return this;
				},
	
				// Call all the callbacks with the given arguments
				fire: function() {
					self.fireWith( this, arguments );
					return this;
				},
	
				// To know if the callbacks have already been called at least once
				fired: function() {
					return !!fired;
				}
			};
	
		return self;
	};
	
	
	function Identity( v ) {
		return v;
	}
	function Thrower( ex ) {
		throw ex;
	}
	
	function adoptValue( value, resolve, reject, noValue ) {
		var method;
	
		try {
	
			// Check for promise aspect first to privilege synchronous behavior
			if ( value && isFunction( ( method = value.promise ) ) ) {
				method.call( value ).done( resolve ).fail( reject );
	
			// Other thenables
			} else if ( value && isFunction( ( method = value.then ) ) ) {
				method.call( value, resolve, reject );
	
			// Other non-thenables
			} else {
	
				// Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:
				// * false: [ value ].slice( 0 ) => resolve( value )
				// * true: [ value ].slice( 1 ) => resolve()
				resolve.apply( undefined, [ value ].slice( noValue ) );
			}
	
		// For Promises/A+, convert exceptions into rejections
		// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in
		// Deferred#then to conditionally suppress rejection.
		} catch ( value ) {
	
			// Support: Android 4.0 only
			// Strict mode functions invoked without .call/.apply get global-object context
			reject.apply( undefined, [ value ] );
		}
	}
	
	jQuery.extend( {
	
		Deferred: function( func ) {
			var tuples = [
	
					// action, add listener, callbacks,
					// ... .then handlers, argument index, [final state]
					[ "notify", "progress", jQuery.Callbacks( "memory" ),
						jQuery.Callbacks( "memory" ), 2 ],
					[ "resolve", "done", jQuery.Callbacks( "once memory" ),
						jQuery.Callbacks( "once memory" ), 0, "resolved" ],
					[ "reject", "fail", jQuery.Callbacks( "once memory" ),
						jQuery.Callbacks( "once memory" ), 1, "rejected" ]
				],
				state = "pending",
				promise = {
					state: function() {
						return state;
					},
					always: function() {
						deferred.done( arguments ).fail( arguments );
						return this;
					},
					"catch": function( fn ) {
						return promise.then( null, fn );
					},
	
					// Keep pipe for back-compat
					pipe: function( /* fnDone, fnFail, fnProgress */ ) {
						var fns = arguments;
	
						return jQuery.Deferred( function( newDefer ) {
							jQuery.each( tuples, function( i, tuple ) {
	
								// Map tuples (progress, done, fail) to arguments (done, fail, progress)
								var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];
	
								// deferred.progress(function() { bind to newDefer or newDefer.notify })
								// deferred.done(function() { bind to newDefer or newDefer.resolve })
								// deferred.fail(function() { bind to newDefer or newDefer.reject })
								deferred[ tuple[ 1 ] ]( function() {
									var returned = fn && fn.apply( this, arguments );
									if ( returned && isFunction( returned.promise ) ) {
										returned.promise()
											.progress( newDefer.notify )
											.done( newDefer.resolve )
											.fail( newDefer.reject );
									} else {
										newDefer[ tuple[ 0 ] + "With" ](
											this,
											fn ? [ returned ] : arguments
										);
									}
								} );
							} );
							fns = null;
						} ).promise();
					},
					then: function( onFulfilled, onRejected, onProgress ) {
						var maxDepth = 0;
						function resolve( depth, deferred, handler, special ) {
							return function() {
								var that = this,
									args = arguments,
									mightThrow = function() {
										var returned, then;
	
										// Support: Promises/A+ section 2.3.3.3.3
										// https://promisesaplus.com/#point-59
										// Ignore double-resolution attempts
										if ( depth < maxDepth ) {
											return;
										}
	
										returned = handler.apply( that, args );
	
										// Support: Promises/A+ section 2.3.1
										// https://promisesaplus.com/#point-48
										if ( returned === deferred.promise() ) {
											throw new TypeError( "Thenable self-resolution" );
										}
	
										// Support: Promises/A+ sections 2.3.3.1, 3.5
										// https://promisesaplus.com/#point-54
										// https://promisesaplus.com/#point-75
										// Retrieve `then` only once
										then = returned &&
	
											// Support: Promises/A+ section 2.3.4
											// https://promisesaplus.com/#point-64
											// Only check objects and functions for thenability
											( typeof returned === "object" ||
												typeof returned === "function" ) &&
											returned.then;
	
										// Handle a returned thenable
										if ( isFunction( then ) ) {
	
											// Special processors (notify) just wait for resolution
											if ( special ) {
												then.call(
													returned,
													resolve( maxDepth, deferred, Identity, special ),
													resolve( maxDepth, deferred, Thrower, special )
												);
	
											// Normal processors (resolve) also hook into progress
											} else {
	
												// ...and disregard older resolution values
												maxDepth++;
	
												then.call(
													returned,
													resolve( maxDepth, deferred, Identity, special ),
													resolve( maxDepth, deferred, Thrower, special ),
													resolve( maxDepth, deferred, Identity,
														deferred.notifyWith )
												);
											}
	
										// Handle all other returned values
										} else {
	
											// Only substitute handlers pass on context
											// and multiple values (non-spec behavior)
											if ( handler !== Identity ) {
												that = undefined;
												args = [ returned ];
											}
	
											// Process the value(s)
											// Default process is resolve
											( special || deferred.resolveWith )( that, args );
										}
									},
	
									// Only normal processors (resolve) catch and reject exceptions
									process = special ?
										mightThrow :
										function() {
											try {
												mightThrow();
											} catch ( e ) {
	
												if ( jQuery.Deferred.exceptionHook ) {
													jQuery.Deferred.exceptionHook( e,
														process.stackTrace );
												}
	
												// Support: Promises/A+ section 2.3.3.3.4.1
												// https://promisesaplus.com/#point-61
												// Ignore post-resolution exceptions
												if ( depth + 1 >= maxDepth ) {
	
													// Only substitute handlers pass on context
													// and multiple values (non-spec behavior)
													if ( handler !== Thrower ) {
														that = undefined;
														args = [ e ];
													}
	
													deferred.rejectWith( that, args );
												}
											}
										};
	
								// Support: Promises/A+ section 2.3.3.3.1
								// https://promisesaplus.com/#point-57
								// Re-resolve promises immediately to dodge false rejection from
								// subsequent errors
								if ( depth ) {
									process();
								} else {
	
									// Call an optional hook to record the stack, in case of exception
									// since it's otherwise lost when execution goes async
									if ( jQuery.Deferred.getStackHook ) {
										process.stackTrace = jQuery.Deferred.getStackHook();
									}
									window.setTimeout( process );
								}
							};
						}
	
						return jQuery.Deferred( function( newDefer ) {
	
							// progress_handlers.add( ... )
							tuples[ 0 ][ 3 ].add(
								resolve(
									0,
									newDefer,
									isFunction( onProgress ) ?
										onProgress :
										Identity,
									newDefer.notifyWith
								)
							);
	
							// fulfilled_handlers.add( ... )
							tuples[ 1 ][ 3 ].add(
								resolve(
									0,
									newDefer,
									isFunction( onFulfilled ) ?
										onFulfilled :
										Identity
								)
							);
	
							// rejected_handlers.add( ... )
							tuples[ 2 ][ 3 ].add(
								resolve(
									0,
									newDefer,
									isFunction( onRejected ) ?
										onRejected :
										Thrower
								)
							);
						} ).promise();
					},
	
					// Get a promise for this deferred
					// If obj is provided, the promise aspect is added to the object
					promise: function( obj ) {
						return obj != null ? jQuery.extend( obj, promise ) : promise;
					}
				},
				deferred = {};
	
			// Add list-specific methods
			jQuery.each( tuples, function( i, tuple ) {
				var list = tuple[ 2 ],
					stateString = tuple[ 5 ];
	
				// promise.progress = list.add
				// promise.done = list.add
				// promise.fail = list.add
				promise[ tuple[ 1 ] ] = list.add;
	
				// Handle state
				if ( stateString ) {
					list.add(
						function() {
	
							// state = "resolved" (i.e., fulfilled)
							// state = "rejected"
							state = stateString;
						},
	
						// rejected_callbacks.disable
						// fulfilled_callbacks.disable
						tuples[ 3 - i ][ 2 ].disable,
	
						// rejected_handlers.disable
						// fulfilled_handlers.disable
						tuples[ 3 - i ][ 3 ].disable,
	
						// progress_callbacks.lock
						tuples[ 0 ][ 2 ].lock,
	
						// progress_handlers.lock
						tuples[ 0 ][ 3 ].lock
					);
				}
	
				// progress_handlers.fire
				// fulfilled_handlers.fire
				// rejected_handlers.fire
				list.add( tuple[ 3 ].fire );
	
				// deferred.notify = function() { deferred.notifyWith(...) }
				// deferred.resolve = function() { deferred.resolveWith(...) }
				// deferred.reject = function() { deferred.rejectWith(...) }
				deferred[ tuple[ 0 ] ] = function() {
					deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments );
					return this;
				};
	
				// deferred.notifyWith = list.fireWith
				// deferred.resolveWith = list.fireWith
				// deferred.rejectWith = list.fireWith
				deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
			} );
	
			// Make the deferred a promise
			promise.promise( deferred );
	
			// Call given func if any
			if ( func ) {
				func.call( deferred, deferred );
			}
	
			// All done!
			return deferred;
		},
	
		// Deferred helper
		when: function( singleValue ) {
			var
	
				// count of uncompleted subordinates
				remaining = arguments.length,
	
				// count of unprocessed arguments
				i = remaining,
	
				// subordinate fulfillment data
				resolveContexts = Array( i ),
				resolveValues = slice.call( arguments ),
	
				// the master Deferred
				master = jQuery.Deferred(),
	
				// subordinate callback factory
				updateFunc = function( i ) {
					return function( value ) {
						resolveContexts[ i ] = this;
						resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
						if ( !( --remaining ) ) {
							master.resolveWith( resolveContexts, resolveValues );
						}
					};
				};
	
			// Single- and empty arguments are adopted like Promise.resolve
			if ( remaining <= 1 ) {
				adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,
					!remaining );
	
				// Use .then() to unwrap secondary thenables (cf. gh-3000)
				if ( master.state() === "pending" ||
					isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
	
					return master.then();
				}
			}
	
			// Multiple arguments are aggregated like Promise.all array elements
			while ( i-- ) {
				adoptValue( resolveValues[ i ], updateFunc( i ), master.reject );
			}
	
			return master.promise();
		}
	} );
	
	
	// These usually indicate a programmer mistake during development,
	// warn about them ASAP rather than swallowing them by default.
	var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
	
	jQuery.Deferred.exceptionHook = function( error, stack ) {
	
		// Support: IE 8 - 9 only
		// Console exists when dev tools are open, which can happen at any time
		if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {
			window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack );
		}
	};
	
	
	
	
	jQuery.readyException = function( error ) {
		window.setTimeout( function() {
			throw error;
		} );
	};
	
	
	
	
	// The deferred used on DOM ready
	var readyList = jQuery.Deferred();
	
	jQuery.fn.ready = function( fn ) {
	
		readyList
			.then( fn )
	
			// Wrap jQuery.readyException in a function so that the lookup
			// happens at the time of error handling instead of callback
			// registration.
			.catch( function( error ) {
				jQuery.readyException( error );
			} );
	
		return this;
	};
	
	jQuery.extend( {
	
		// Is the DOM ready to be used? Set to true once it occurs.
		isReady: false,
	
		// A counter to track how many items to wait for before
		// the ready event fires. See #6781
		readyWait: 1,
	
		// Handle when the DOM is ready
		ready: function( wait ) {
	
			// Abort if there are pending holds or we're already ready
			if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
				return;
			}
	
			// Remember that the DOM is ready
			jQuery.isReady = true;
	
			// If a normal DOM Ready event fired, decrement, and wait if need be
			if ( wait !== true && --jQuery.readyWait > 0 ) {
				return;
			}
	
			// If there are functions bound, to execute
			readyList.resolveWith( document, [ jQuery ] );
		}
	} );
	
	jQuery.ready.then = readyList.then;
	
	// The ready event handler and self cleanup method
	function completed() {
		document.removeEventListener( "DOMContentLoaded", completed );
		window.removeEventListener( "load", completed );
		jQuery.ready();
	}
	
	// Catch cases where $(document).ready() is called
	// after the browser event has already occurred.
	// Support: IE <=9 - 10 only
	// Older IE sometimes signals "interactive" too soon
	if ( document.readyState === "complete" ||
		( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
	
		// Handle it asynchronously to allow scripts the opportunity to delay ready
		window.setTimeout( jQuery.ready );
	
	} else {
	
		// Use the handy event callback
		document.addEventListener( "DOMContentLoaded", completed );
	
		// A fallback to window.onload, that will always work
		window.addEventListener( "load", completed );
	}
	
	
	
	
	// Multifunctional method to get and set values of a collection
	// The value/s can optionally be executed if it's a function
	var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
		var i = 0,
			len = elems.length,
			bulk = key == null;
	
		// Sets many values
		if ( toType( key ) === "object" ) {
			chainable = true;
			for ( i in key ) {
				access( elems, fn, i, key[ i ], true, emptyGet, raw );
			}
	
		// Sets one value
		} else if ( value !== undefined ) {
			chainable = true;
	
			if ( !isFunction( value ) ) {
				raw = true;
			}
	
			if ( bulk ) {
	
				// Bulk operations run against the entire set
				if ( raw ) {
					fn.call( elems, value );
					fn = null;
	
				// ...except when executing function values
				} else {
					bulk = fn;
					fn = function( elem, key, value ) {
						return bulk.call( jQuery( elem ), value );
					};
				}
			}
	
			if ( fn ) {
				for ( ; i < len; i++ ) {
					fn(
						elems[ i ], key, raw ?
						value :
						value.call( elems[ i ], i, fn( elems[ i ], key ) )
					);
				}
			}
		}
	
		if ( chainable ) {
			return elems;
		}
	
		// Gets
		if ( bulk ) {
			return fn.call( elems );
		}
	
		return len ? fn( elems[ 0 ], key ) : emptyGet;
	};
	
	
	// Matches dashed string for camelizing
	var rmsPrefix = /^-ms-/,
		rdashAlpha = /-([a-z])/g;
	
	// Used by camelCase as callback to replace()
	function fcamelCase( all, letter ) {
		return letter.toUpperCase();
	}
	
	// Convert dashed to camelCase; used by the css and data modules
	// Support: IE <=9 - 11, Edge 12 - 15
	// Microsoft forgot to hump their vendor prefix (#9572)
	function camelCase( string ) {
		return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
	}
	var acceptData = function( owner ) {
	
		// Accepts only:
		//  - Node
		//    - Node.ELEMENT_NODE
		//    - Node.DOCUMENT_NODE
		//  - Object
		//    - Any
		return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
	};
	
	
	
	
	function Data() {
		this.expando = jQuery.expando + Data.uid++;
	}
	
	Data.uid = 1;
	
	Data.prototype = {
	
		cache: function( owner ) {
	
			// Check if the owner object already has a cache
			var value = owner[ this.expando ];
	
			// If not, create one
			if ( !value ) {
				value = {};
	
				// We can accept data for non-element nodes in modern browsers,
				// but we should not, see #8335.
				// Always return an empty object.
				if ( acceptData( owner ) ) {
	
					// If it is a node unlikely to be stringify-ed or looped over
					// use plain assignment
					if ( owner.nodeType ) {
						owner[ this.expando ] = value;
	
					// Otherwise secure it in a non-enumerable property
					// configurable must be true to allow the property to be
					// deleted when data is removed
					} else {
						Object.defineProperty( owner, this.expando, {
							value: value,
							configurable: true
						} );
					}
				}
			}
	
			return value;
		},
		set: function( owner, data, value ) {
			var prop,
				cache = this.cache( owner );
	
			// Handle: [ owner, key, value ] args
			// Always use camelCase key (gh-2257)
			if ( typeof data === "string" ) {
				cache[ camelCase( data ) ] = value;
	
			// Handle: [ owner, { properties } ] args
			} else {
	
				// Copy the properties one-by-one to the cache object
				for ( prop in data ) {
					cache[ camelCase( prop ) ] = data[ prop ];
				}
			}
			return cache;
		},
		get: function( owner, key ) {
			return key === undefined ?
				this.cache( owner ) :
	
				// Always use camelCase key (gh-2257)
				owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];
		},
		access: function( owner, key, value ) {
	
			// In cases where either:
			//
			//   1. No key was specified
			//   2. A string key was specified, but no value provided
			//
			// Take the "read" path and allow the get method to determine
			// which value to return, respectively either:
			//
			//   1. The entire cache object
			//   2. The data stored at the key
			//
			if ( key === undefined ||
					( ( key && typeof key === "string" ) && value === undefined ) ) {
	
				return this.get( owner, key );
			}
	
			// When the key is not a string, or both a key and value
			// are specified, set or extend (existing objects) with either:
			//
			//   1. An object of properties
			//   2. A key and value
			//
			this.set( owner, key, value );
	
			// Since the "set" path can have two possible entry points
			// return the expected data based on which path was taken[*]
			return value !== undefined ? value : key;
		},
		remove: function( owner, key ) {
			var i,
				cache = owner[ this.expando ];
	
			if ( cache === undefined ) {
				return;
			}
	
			if ( key !== undefined ) {
	
				// Support array or space separated string of keys
				if ( Array.isArray( key ) ) {
	
					// If key is an array of keys...
					// We always set camelCase keys, so remove that.
					key = key.map( camelCase );
				} else {
					key = camelCase( key );
	
					// If a key with the spaces exists, use it.
					// Otherwise, create an array by matching non-whitespace
					key = key in cache ?
						[ key ] :
						( key.match( rnothtmlwhite ) || [] );
				}
	
				i = key.length;
	
				while ( i-- ) {
					delete cache[ key[ i ] ];
				}
			}
	
			// Remove the expando if there's no more data
			if ( key === undefined || jQuery.isEmptyObject( cache ) ) {
	
				// Support: Chrome <=35 - 45
				// Webkit & Blink performance suffers when deleting properties
				// from DOM nodes, so set to undefined instead
				// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)
				if ( owner.nodeType ) {
					owner[ this.expando ] = undefined;
				} else {
					delete owner[ this.expando ];
				}
			}
		},
		hasData: function( owner ) {
			var cache = owner[ this.expando ];
			return cache !== undefined && !jQuery.isEmptyObject( cache );
		}
	};
	var dataPriv = new Data();
	
	var dataUser = new Data();
	
	
	
	//	Implementation Summary
	//
	//	1. Enforce API surface and semantic compatibility with 1.9.x branch
	//	2. Improve the module's maintainability by reducing the storage
	//		paths to a single mechanism.
	//	3. Use the same single mechanism to support "private" and "user" data.
	//	4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
	//	5. Avoid exposing implementation details on user objects (eg. expando properties)
	//	6. Provide a clear path for implementation upgrade to WeakMap in 2014
	
	var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
		rmultiDash = /[A-Z]/g;
	
	function getData( data ) {
		if ( data === "true" ) {
			return true;
		}
	
		if ( data === "false" ) {
			return false;
		}
	
		if ( data === "null" ) {
			return null;
		}
	
		// Only convert to a number if it doesn't change the string
		if ( data === +data + "" ) {
			return +data;
		}
	
		if ( rbrace.test( data ) ) {
			return JSON.parse( data );
		}
	
		return data;
	}
	
	function dataAttr( elem, key, data ) {
		var name;
	
		// If nothing was found internally, try to fetch any
		// data from the HTML5 data-* attribute
		if ( data === undefined && elem.nodeType === 1 ) {
			name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase();
			data = elem.getAttribute( name );
	
			if ( typeof data === "string" ) {
				try {
					data = getData( data );
				} catch ( e ) {}
	
				// Make sure we set the data so it isn't changed later
				dataUser.set( elem, key, data );
			} else {
				data = undefined;
			}
		}
		return data;
	}
	
	jQuery.extend( {
		hasData: function( elem ) {
			return dataUser.hasData( elem ) || dataPriv.hasData( elem );
		},
	
		data: function( elem, name, data ) {
			return dataUser.access( elem, name, data );
		},
	
		removeData: function( elem, name ) {
			dataUser.remove( elem, name );
		},
	
		// TODO: Now that all calls to _data and _removeData have been replaced
		// with direct calls to dataPriv methods, these can be deprecated.
		_data: function( elem, name, data ) {
			return dataPriv.access( elem, name, data );
		},
	
		_removeData: function( elem, name ) {
			dataPriv.remove( elem, name );
		}
	} );
	
	jQuery.fn.extend( {
		data: function( key, value ) {
			var i, name, data,
				elem = this[ 0 ],
				attrs = elem && elem.attributes;
	
			// Gets all values
			if ( key === undefined ) {
				if ( this.length ) {
					data = dataUser.get( elem );
	
					if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) {
						i = attrs.length;
						while ( i-- ) {
	
							// Support: IE 11 only
							// The attrs elements can be null (#14894)
							if ( attrs[ i ] ) {
								name = attrs[ i ].name;
								if ( name.indexOf( "data-" ) === 0 ) {
									name = camelCase( name.slice( 5 ) );
									dataAttr( elem, name, data[ name ] );
								}
							}
						}
						dataPriv.set( elem, "hasDataAttrs", true );
					}
				}
	
				return data;
			}
	
			// Sets multiple values
			if ( typeof key === "object" ) {
				return this.each( function() {
					dataUser.set( this, key );
				} );
			}
	
			return access( this, function( value ) {
				var data;
	
				// The calling jQuery object (element matches) is not empty
				// (and therefore has an element appears at this[ 0 ]) and the
				// `value` parameter was not undefined. An empty jQuery object
				// will result in `undefined` for elem = this[ 0 ] which will
				// throw an exception if an attempt to read a data cache is made.
				if ( elem && value === undefined ) {
	
					// Attempt to get data from the cache
					// The key will always be camelCased in Data
					data = dataUser.get( elem, key );
					if ( data !== undefined ) {
						return data;
					}
	
					// Attempt to "discover" the data in
					// HTML5 custom data-* attrs
					data = dataAttr( elem, key );
					if ( data !== undefined ) {
						return data;
					}
	
					// We tried really hard, but the data doesn't exist.
					return;
				}
	
				// Set the data...
				this.each( function() {
	
					// We always store the camelCased key
					dataUser.set( this, key, value );
				} );
			}, null, value, arguments.length > 1, null, true );
		},
	
		removeData: function( key ) {
			return this.each( function() {
				dataUser.remove( this, key );
			} );
		}
	} );
	
	
	jQuery.extend( {
		queue: function( elem, type, data ) {
			var queue;
	
			if ( elem ) {
				type = ( type || "fx" ) + "queue";
				queue = dataPriv.get( elem, type );
	
				// Speed up dequeue by getting out quickly if this is just a lookup
				if ( data ) {
					if ( !queue || Array.isArray( data ) ) {
						queue = dataPriv.access( elem, type, jQuery.makeArray( data ) );
					} else {
						queue.push( data );
					}
				}
				return queue || [];
			}
		},
	
		dequeue: function( elem, type ) {
			type = type || "fx";
	
			var queue = jQuery.queue( elem, type ),
				startLength = queue.length,
				fn = queue.shift(),
				hooks = jQuery._queueHooks( elem, type ),
				next = function() {
					jQuery.dequeue( elem, type );
				};
	
			// If the fx queue is dequeued, always remove the progress sentinel
			if ( fn === "inprogress" ) {
				fn = queue.shift();
				startLength--;
			}
	
			if ( fn ) {
	
				// Add a progress sentinel to prevent the fx queue from being
				// automatically dequeued
				if ( type === "fx" ) {
					queue.unshift( "inprogress" );
				}
	
				// Clear up the last queue stop function
				delete hooks.stop;
				fn.call( elem, next, hooks );
			}
	
			if ( !startLength && hooks ) {
				hooks.empty.fire();
			}
		},
	
		// Not public - generate a queueHooks object, or return the current one
		_queueHooks: function( elem, type ) {
			var key = type + "queueHooks";
			return dataPriv.get( elem, key ) || dataPriv.access( elem, key, {
				empty: jQuery.Callbacks( "once memory" ).add( function() {
					dataPriv.remove( elem, [ type + "queue", key ] );
				} )
			} );
		}
	} );
	
	jQuery.fn.extend( {
		queue: function( type, data ) {
			var setter = 2;
	
			if ( typeof type !== "string" ) {
				data = type;
				type = "fx";
				setter--;
			}
	
			if ( arguments.length < setter ) {
				return jQuery.queue( this[ 0 ], type );
			}
	
			return data === undefined ?
				this :
				this.each( function() {
					var queue = jQuery.queue( this, type, data );
	
					// Ensure a hooks for this queue
					jQuery._queueHooks( this, type );
	
					if ( type === "fx" && queue[ 0 ] !== "inprogress" ) {
						jQuery.dequeue( this, type );
					}
				} );
		},
		dequeue: function( type ) {
			return this.each( function() {
				jQuery.dequeue( this, type );
			} );
		},
		clearQueue: function( type ) {
			return this.queue( type || "fx", [] );
		},
	
		// Get a promise resolved when queues of a certain type
		// are emptied (fx is the type by default)
		promise: function( type, obj ) {
			var tmp,
				count = 1,
				defer = jQuery.Deferred(),
				elements = this,
				i = this.length,
				resolve = function() {
					if ( !( --count ) ) {
						defer.resolveWith( elements, [ elements ] );
					}
				};
	
			if ( typeof type !== "string" ) {
				obj = type;
				type = undefined;
			}
			type = type || "fx";
	
			while ( i-- ) {
				tmp = dataPriv.get( elements[ i ], type + "queueHooks" );
				if ( tmp && tmp.empty ) {
					count++;
					tmp.empty.add( resolve );
				}
			}
			resolve();
			return defer.promise( obj );
		}
	} );
	var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
	
	var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
	
	
	var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
	
	var documentElement = document.documentElement;
	
	
	
		var isAttached = function( elem ) {
				return jQuery.contains( elem.ownerDocument, elem );
			},
			composed = { composed: true };
	
		// Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only
		// Check attachment across shadow DOM boundaries when possible (gh-3504)
		// Support: iOS 10.0-10.2 only
		// Early iOS 10 versions support `attachShadow` but not `getRootNode`,
		// leading to errors. We need to check for `getRootNode`.
		if ( documentElement.getRootNode ) {
			isAttached = function( elem ) {
				return jQuery.contains( elem.ownerDocument, elem ) ||
					elem.getRootNode( composed ) === elem.ownerDocument;
			};
		}
	var isHiddenWithinTree = function( elem, el ) {
	
			// isHiddenWithinTree might be called from jQuery#filter function;
			// in that case, element will be second argument
			elem = el || elem;
	
			// Inline style trumps all
			return elem.style.display === "none" ||
				elem.style.display === "" &&
	
				// Otherwise, check computed style
				// Support: Firefox <=43 - 45
				// Disconnected elements can have computed display: none, so first confirm that elem is
				// in the document.
				isAttached( elem ) &&
	
				jQuery.css( elem, "display" ) === "none";
		};
	
	var swap = function( elem, options, callback, args ) {
		var ret, name,
			old = {};
	
		// Remember the old values, and insert the new ones
		for ( name in options ) {
			old[ name ] = elem.style[ name ];
			elem.style[ name ] = options[ name ];
		}
	
		ret = callback.apply( elem, args || [] );
	
		// Revert the old values
		for ( name in options ) {
			elem.style[ name ] = old[ name ];
		}
	
		return ret;
	};
	
	
	
	
	function adjustCSS( elem, prop, valueParts, tween ) {
		var adjusted, scale,
			maxIterations = 20,
			currentValue = tween ?
				function() {
					return tween.cur();
				} :
				function() {
					return jQuery.css( elem, prop, "" );
				},
			initial = currentValue(),
			unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
	
			// Starting value computation is required for potential unit mismatches
			initialInUnit = elem.nodeType &&
				( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
				rcssNum.exec( jQuery.css( elem, prop ) );
	
		if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
	
			// Support: Firefox <=54
			// Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)
			initial = initial / 2;
	
			// Trust units reported by jQuery.css
			unit = unit || initialInUnit[ 3 ];
	
			// Iteratively approximate from a nonzero starting point
			initialInUnit = +initial || 1;
	
			while ( maxIterations-- ) {
	
				// Evaluate and update our best guess (doubling guesses that zero out).
				// Finish if the scale equals or crosses 1 (making the old*new product non-positive).
				jQuery.style( elem, prop, initialInUnit + unit );
				if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {
					maxIterations = 0;
				}
				initialInUnit = initialInUnit / scale;
	
			}
	
			initialInUnit = initialInUnit * 2;
			jQuery.style( elem, prop, initialInUnit + unit );
	
			// Make sure we update the tween properties later on
			valueParts = valueParts || [];
		}
	
		if ( valueParts ) {
			initialInUnit = +initialInUnit || +initial || 0;
	
			// Apply relative offset (+=/-=) if specified
			adjusted = valueParts[ 1 ] ?
				initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
				+valueParts[ 2 ];
			if ( tween ) {
				tween.unit = unit;
				tween.start = initialInUnit;
				tween.end = adjusted;
			}
		}
		return adjusted;
	}
	
	
	var defaultDisplayMap = {};
	
	function getDefaultDisplay( elem ) {
		var temp,
			doc = elem.ownerDocument,
			nodeName = elem.nodeName,
			display = defaultDisplayMap[ nodeName ];
	
		if ( display ) {
			return display;
		}
	
		temp = doc.body.appendChild( doc.createElement( nodeName ) );
		display = jQuery.css( temp, "display" );
	
		temp.parentNode.removeChild( temp );
	
		if ( display === "none" ) {
			display = "block";
		}
		defaultDisplayMap[ nodeName ] = display;
	
		return display;
	}
	
	function showHide( elements, show ) {
		var display, elem,
			values = [],
			index = 0,
			length = elements.length;
	
		// Determine new display value for elements that need to change
		for ( ; index < length; index++ ) {
			elem = elements[ index ];
			if ( !elem.style ) {
				continue;
			}
	
			display = elem.style.display;
			if ( show ) {
	
				// Since we force visibility upon cascade-hidden elements, an immediate (and slow)
				// check is required in this first loop unless we have a nonempty display value (either
				// inline or about-to-be-restored)
				if ( display === "none" ) {
					values[ index ] = dataPriv.get( elem, "display" ) || null;
					if ( !values[ index ] ) {
						elem.style.display = "";
					}
				}
				if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) {
					values[ index ] = getDefaultDisplay( elem );
				}
			} else {
				if ( display !== "none" ) {
					values[ index ] = "none";
	
					// Remember what we're overwriting
					dataPriv.set( elem, "display", display );
				}
			}
		}
	
		// Set the display of the elements in a second loop to avoid constant reflow
		for ( index = 0; index < length; index++ ) {
			if ( values[ index ] != null ) {
				elements[ index ].style.display = values[ index ];
			}
		}
	
		return elements;
	}
	
	jQuery.fn.extend( {
		show: function() {
			return showHide( this, true );
		},
		hide: function() {
			return showHide( this );
		},
		toggle: function( state ) {
			if ( typeof state === "boolean" ) {
				return state ? this.show() : this.hide();
			}
	
			return this.each( function() {
				if ( isHiddenWithinTree( this ) ) {
					jQuery( this ).show();
				} else {
					jQuery( this ).hide();
				}
			} );
		}
	} );
	var rcheckableType = ( /^(?:checkbox|radio)$/i );
	
	var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i );
	
	var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i );
	
	
	
	// We have to close these tags to support XHTML (#13200)
	var wrapMap = {
	
		// Support: IE <=9 only
		option: [ 1, "<select multiple='multiple'>", "</select>" ],
	
		// XHTML parsers do not magically insert elements in the
		// same way that tag soup parsers do. So we cannot shorten
		// this by omitting <tbody> or other required elements.
		thead: [ 1, "<table>", "</table>" ],
		col: [ 2, "<table><colgroup>", "</colgroup></table>" ],
		tr: [ 2, "<table><tbody>", "</tbody></table>" ],
		td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
	
		_default: [ 0, "", "" ]
	};
	
	// Support: IE <=9 only
	wrapMap.optgroup = wrapMap.option;
	
	wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
	wrapMap.th = wrapMap.td;
	
	
	function getAll( context, tag ) {
	
		// Support: IE <=9 - 11 only
		// Use typeof to avoid zero-argument method invocation on host objects (#15151)
		var ret;
	
		if ( typeof context.getElementsByTagName !== "undefined" ) {
			ret = context.getElementsByTagName( tag || "*" );
	
		} else if ( typeof context.querySelectorAll !== "undefined" ) {
			ret = context.querySelectorAll( tag || "*" );
	
		} else {
			ret = [];
		}
	
		if ( tag === undefined || tag && nodeName( context, tag ) ) {
			return jQuery.merge( [ context ], ret );
		}
	
		return ret;
	}
	
	
	// Mark scripts as having already been evaluated
	function setGlobalEval( elems, refElements ) {
		var i = 0,
			l = elems.length;
	
		for ( ; i < l; i++ ) {
			dataPriv.set(
				elems[ i ],
				"globalEval",
				!refElements || dataPriv.get( refElements[ i ], "globalEval" )
			);
		}
	}
	
	
	var rhtml = /<|&#?\w+;/;
	
	function buildFragment( elems, context, scripts, selection, ignored ) {
		var elem, tmp, tag, wrap, attached, j,
			fragment = context.createDocumentFragment(),
			nodes = [],
			i = 0,
			l = elems.length;
	
		for ( ; i < l; i++ ) {
			elem = elems[ i ];
	
			if ( elem || elem === 0 ) {
	
				// Add nodes directly
				if ( toType( elem ) === "object" ) {
	
					// Support: Android <=4.0 only, PhantomJS 1 only
					// push.apply(_, arraylike) throws on ancient WebKit
					jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
	
				// Convert non-html into a text node
				} else if ( !rhtml.test( elem ) ) {
					nodes.push( context.createTextNode( elem ) );
	
				// Convert html into DOM nodes
				} else {
					tmp = tmp || fragment.appendChild( context.createElement( "div" ) );
	
					// Deserialize a standard representation
					tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
					wrap = wrapMap[ tag ] || wrapMap._default;
					tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];
	
					// Descend through wrappers to the right content
					j = wrap[ 0 ];
					while ( j-- ) {
						tmp = tmp.lastChild;
					}
	
					// Support: Android <=4.0 only, PhantomJS 1 only
					// push.apply(_, arraylike) throws on ancient WebKit
					jQuery.merge( nodes, tmp.childNodes );
	
					// Remember the top-level container
					tmp = fragment.firstChild;
	
					// Ensure the created nodes are orphaned (#12392)
					tmp.textContent = "";
				}
			}
		}
	
		// Remove wrapper from fragment
		fragment.textContent = "";
	
		i = 0;
		while ( ( elem = nodes[ i++ ] ) ) {
	
			// Skip elements already in the context collection (trac-4087)
			if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
				if ( ignored ) {
					ignored.push( elem );
				}
				continue;
			}
	
			attached = isAttached( elem );
	
			// Append to fragment
			tmp = getAll( fragment.appendChild( elem ), "script" );
	
			// Preserve script evaluation history
			if ( attached ) {
				setGlobalEval( tmp );
			}
	
			// Capture executables
			if ( scripts ) {
				j = 0;
				while ( ( elem = tmp[ j++ ] ) ) {
					if ( rscriptType.test( elem.type || "" ) ) {
						scripts.push( elem );
					}
				}
			}
		}
	
		return fragment;
	}
	
	
	( function() {
		var fragment = document.createDocumentFragment(),
			div = fragment.appendChild( document.createElement( "div" ) ),
			input = document.createElement( "input" );
	
		// Support: Android 4.0 - 4.3 only
		// Check state lost if the name is set (#11217)
		// Support: Windows Web Apps (WWA)
		// `name` and `type` must use .setAttribute for WWA (#14901)
		input.setAttribute( "type", "radio" );
		input.setAttribute( "checked", "checked" );
		input.setAttribute( "name", "t" );
	
		div.appendChild( input );
	
		// Support: Android <=4.1 only
		// Older WebKit doesn't clone checked state correctly in fragments
		support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
	
		// Support: IE <=11 only
		// Make sure textarea (and checkbox) defaultValue is properly cloned
		div.innerHTML = "<textarea>x</textarea>";
		support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
	} )();
	
	
	var
		rkeyEvent = /^key/,
		rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
		rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
	
	function returnTrue() {
		return true;
	}
	
	function returnFalse() {
		return false;
	}
	
	// Support: IE <=9 - 11+
	// focus() and blur() are asynchronous, except when they are no-op.
	// So expect focus to be synchronous when the element is already active,
	// and blur to be synchronous when the element is not already active.
	// (focus and blur are always synchronous in other supported browsers,
	// this just defines when we can count on it).
	function expectSync( elem, type ) {
		return ( elem === safeActiveElement() ) === ( type === "focus" );
	}
	
	// Support: IE <=9 only
	// Accessing document.activeElement can throw unexpectedly
	// https://bugs.jquery.com/ticket/13393
	function safeActiveElement() {
		try {
			return document.activeElement;
		} catch ( err ) { }
	}
	
	function on( elem, types, selector, data, fn, one ) {
		var origFn, type;
	
		// Types can be a map of types/handlers
		if ( typeof types === "object" ) {
	
			// ( types-Object, selector, data )
			if ( typeof selector !== "string" ) {
	
				// ( types-Object, data )
				data = data || selector;
				selector = undefined;
			}
			for ( type in types ) {
				on( elem, type, selector, data, types[ type ], one );
			}
			return elem;
		}
	
		if ( data == null && fn == null ) {
	
			// ( types, fn )
			fn = selector;
			data = selector = undefined;
		} else if ( fn == null ) {
			if ( typeof selector === "string" ) {
	
				// ( types, selector, fn )
				fn = data;
				data = undefined;
			} else {
	
				// ( types, data, fn )
				fn = data;
				data = selector;
				selector = undefined;
			}
		}
		if ( fn === false ) {
			fn = returnFalse;
		} else if ( !fn ) {
			return elem;
		}
	
		if ( one === 1 ) {
			origFn = fn;
			fn = function( event ) {
	
				// Can use an empty set, since event contains the info
				jQuery().off( event );
				return origFn.apply( this, arguments );
			};
	
			// Use same guid so caller can remove using origFn
			fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
		}
		return elem.each( function() {
			jQuery.event.add( this, types, fn, data, selector );
		} );
	}
	
	/*
	 * Helper functions for managing events -- not part of the public interface.
	 * Props to Dean Edwards' addEvent library for many of the ideas.
	 */
	jQuery.event = {
	
		global: {},
	
		add: function( elem, types, handler, data, selector ) {
	
			var handleObjIn, eventHandle, tmp,
				events, t, handleObj,
				special, handlers, type, namespaces, origType,
				elemData = dataPriv.get( elem );
	
			// Don't attach events to noData or text/comment nodes (but allow plain objects)
			if ( !elemData ) {
				return;
			}
	
			// Caller can pass in an object of custom data in lieu of the handler
			if ( handler.handler ) {
				handleObjIn = handler;
				handler = handleObjIn.handler;
				selector = handleObjIn.selector;
			}
	
			// Ensure that invalid selectors throw exceptions at attach time
			// Evaluate against documentElement in case elem is a non-element node (e.g., document)
			if ( selector ) {
				jQuery.find.matchesSelector( documentElement, selector );
			}
	
			// Make sure that the handler has a unique ID, used to find/remove it later
			if ( !handler.guid ) {
				handler.guid = jQuery.guid++;
			}
	
			// Init the element's event structure and main handler, if this is the first
			if ( !( events = elemData.events ) ) {
				events = elemData.events = {};
			}
			if ( !( eventHandle = elemData.handle ) ) {
				eventHandle = elemData.handle = function( e ) {
	
					// Discard the second event of a jQuery.event.trigger() and
					// when an event is called after a page has unloaded
					return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?
						jQuery.event.dispatch.apply( elem, arguments ) : undefined;
				};
			}
	
			// Handle multiple events separated by a space
			types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
			t = types.length;
			while ( t-- ) {
				tmp = rtypenamespace.exec( types[ t ] ) || [];
				type = origType = tmp[ 1 ];
				namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
	
				// There *must* be a type, no attaching namespace-only handlers
				if ( !type ) {
					continue;
				}
	
				// If event changes its type, use the special event handlers for the changed type
				special = jQuery.event.special[ type ] || {};
	
				// If selector defined, determine special event api type, otherwise given type
				type = ( selector ? special.delegateType : special.bindType ) || type;
	
				// Update special based on newly reset type
				special = jQuery.event.special[ type ] || {};
	
				// handleObj is passed to all event handlers
				handleObj = jQuery.extend( {
					type: type,
					origType: origType,
					data: data,
					handler: handler,
					guid: handler.guid,
					selector: selector,
					needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
					namespace: namespaces.join( "." )
				}, handleObjIn );
	
				// Init the event handler queue if we're the first
				if ( !( handlers = events[ type ] ) ) {
					handlers = events[ type ] = [];
					handlers.delegateCount = 0;
	
					// Only use addEventListener if the special events handler returns false
					if ( !special.setup ||
						special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
	
						if ( elem.addEventListener ) {
							elem.addEventListener( type, eventHandle );
						}
					}
				}
	
				if ( special.add ) {
					special.add.call( elem, handleObj );
	
					if ( !handleObj.handler.guid ) {
						handleObj.handler.guid = handler.guid;
					}
				}
	
				// Add to the element's handler list, delegates in front
				if ( selector ) {
					handlers.splice( handlers.delegateCount++, 0, handleObj );
				} else {
					handlers.push( handleObj );
				}
	
				// Keep track of which events have ever been used, for event optimization
				jQuery.event.global[ type ] = true;
			}
	
		},
	
		// Detach an event or set of events from an element
		remove: function( elem, types, handler, selector, mappedTypes ) {
	
			var j, origCount, tmp,
				events, t, handleObj,
				special, handlers, type, namespaces, origType,
				elemData = dataPriv.hasData( elem ) && dataPriv.get( elem );
	
			if ( !elemData || !( events = elemData.events ) ) {
				return;
			}
	
			// Once for each type.namespace in types; type may be omitted
			types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
			t = types.length;
			while ( t-- ) {
				tmp = rtypenamespace.exec( types[ t ] ) || [];
				type = origType = tmp[ 1 ];
				namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
	
				// Unbind all events (on this namespace, if provided) for the element
				if ( !type ) {
					for ( type in events ) {
						jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
					}
					continue;
				}
	
				special = jQuery.event.special[ type ] || {};
				type = ( selector ? special.delegateType : special.bindType ) || type;
				handlers = events[ type ] || [];
				tmp = tmp[ 2 ] &&
					new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );
	
				// Remove matching events
				origCount = j = handlers.length;
				while ( j-- ) {
					handleObj = handlers[ j ];
	
					if ( ( mappedTypes || origType === handleObj.origType ) &&
						( !handler || handler.guid === handleObj.guid ) &&
						( !tmp || tmp.test( handleObj.namespace ) ) &&
						( !selector || selector === handleObj.selector ||
							selector === "**" && handleObj.selector ) ) {
						handlers.splice( j, 1 );
	
						if ( handleObj.selector ) {
							handlers.delegateCount--;
						}
						if ( special.remove ) {
							special.remove.call( elem, handleObj );
						}
					}
				}
	
				// Remove generic event handler if we removed something and no more handlers exist
				// (avoids potential for endless recursion during removal of special event handlers)
				if ( origCount && !handlers.length ) {
					if ( !special.teardown ||
						special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
	
						jQuery.removeEvent( elem, type, elemData.handle );
					}
	
					delete events[ type ];
				}
			}
	
			// Remove data and the expando if it's no longer used
			if ( jQuery.isEmptyObject( events ) ) {
				dataPriv.remove( elem, "handle events" );
			}
		},
	
		dispatch: function( nativeEvent ) {
	
			// Make a writable jQuery.Event from the native event object
			var event = jQuery.event.fix( nativeEvent );
	
			var i, j, ret, matched, handleObj, handlerQueue,
				args = new Array( arguments.length ),
				handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [],
				special = jQuery.event.special[ event.type ] || {};
	
			// Use the fix-ed jQuery.Event rather than the (read-only) native event
			args[ 0 ] = event;
	
			for ( i = 1; i < arguments.length; i++ ) {
				args[ i ] = arguments[ i ];
			}
	
			event.delegateTarget = this;
	
			// Call the preDispatch hook for the mapped type, and let it bail if desired
			if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
				return;
			}
	
			// Determine handlers
			handlerQueue = jQuery.event.handlers.call( this, event, handlers );
	
			// Run delegates first; they may want to stop propagation beneath us
			i = 0;
			while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
				event.currentTarget = matched.elem;
	
				j = 0;
				while ( ( handleObj = matched.handlers[ j++ ] ) &&
					!event.isImmediatePropagationStopped() ) {
	
					// If the event is namespaced, then each handler is only invoked if it is
					// specially universal or its namespaces are a superset of the event's.
					if ( !event.rnamespace || handleObj.namespace === false ||
						event.rnamespace.test( handleObj.namespace ) ) {
	
						event.handleObj = handleObj;
						event.data = handleObj.data;
	
						ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
							handleObj.handler ).apply( matched.elem, args );
	
						if ( ret !== undefined ) {
							if ( ( event.result = ret ) === false ) {
								event.preventDefault();
								event.stopPropagation();
							}
						}
					}
				}
			}
	
			// Call the postDispatch hook for the mapped type
			if ( special.postDispatch ) {
				special.postDispatch.call( this, event );
			}
	
			return event.result;
		},
	
		handlers: function( event, handlers ) {
			var i, handleObj, sel, matchedHandlers, matchedSelectors,
				handlerQueue = [],
				delegateCount = handlers.delegateCount,
				cur = event.target;
	
			// Find delegate handlers
			if ( delegateCount &&
	
				// Support: IE <=9
				// Black-hole SVG <use> instance trees (trac-13180)
				cur.nodeType &&
	
				// Support: Firefox <=42
				// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)
				// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click
				// Support: IE 11 only
				// ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343)
				!( event.type === "click" && event.button >= 1 ) ) {
	
				for ( ; cur !== this; cur = cur.parentNode || this ) {
	
					// Don't check non-elements (#13208)
					// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
					if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) {
						matchedHandlers = [];
						matchedSelectors = {};
						for ( i = 0; i < delegateCount; i++ ) {
							handleObj = handlers[ i ];
	
							// Don't conflict with Object.prototype properties (#13203)
							sel = handleObj.selector + " ";
	
							if ( matchedSelectors[ sel ] === undefined ) {
								matchedSelectors[ sel ] = handleObj.needsContext ?
									jQuery( sel, this ).index( cur ) > -1 :
									jQuery.find( sel, this, null, [ cur ] ).length;
							}
							if ( matchedSelectors[ sel ] ) {
								matchedHandlers.push( handleObj );
							}
						}
						if ( matchedHandlers.length ) {
							handlerQueue.push( { elem: cur, handlers: matchedHandlers } );
						}
					}
				}
			}
	
			// Add the remaining (directly-bound) handlers
			cur = this;
			if ( delegateCount < handlers.length ) {
				handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );
			}
	
			return handlerQueue;
		},
	
		addProp: function( name, hook ) {
			Object.defineProperty( jQuery.Event.prototype, name, {
				enumerable: true,
				configurable: true,
	
				get: isFunction( hook ) ?
					function() {
						if ( this.originalEvent ) {
								return hook( this.originalEvent );
						}
					} :
					function() {
						if ( this.originalEvent ) {
								return this.originalEvent[ name ];
						}
					},
	
				set: function( value ) {
					Object.defineProperty( this, name, {
						enumerable: true,
						configurable: true,
						writable: true,
						value: value
					} );
				}
			} );
		},
	
		fix: function( originalEvent ) {
			return originalEvent[ jQuery.expando ] ?
				originalEvent :
				new jQuery.Event( originalEvent );
		},
	
		special: {
			load: {
	
				// Prevent triggered image.load events from bubbling to window.load
				noBubble: true
			},
			click: {
	
				// Utilize native event to ensure correct state for checkable inputs
				setup: function( data ) {
	
					// For mutual compressibility with _default, replace `this` access with a local var.
					// `|| data` is dead code meant only to preserve the variable through minification.
					var el = this || data;
	
					// Claim the first handler
					if ( rcheckableType.test( el.type ) &&
						el.click && nodeName( el, "input" ) ) {
	
						// dataPriv.set( el, "click", ... )
						leverageNative( el, "click", returnTrue );
					}
	
					// Return false to allow normal processing in the caller
					return false;
				},
				trigger: function( data ) {
	
					// For mutual compressibility with _default, replace `this` access with a local var.
					// `|| data` is dead code meant only to preserve the variable through minification.
					var el = this || data;
	
					// Force setup before triggering a click
					if ( rcheckableType.test( el.type ) &&
						el.click && nodeName( el, "input" ) ) {
	
						leverageNative( el, "click" );
					}
	
					// Return non-false to allow normal event-path propagation
					return true;
				},
	
				// For cross-browser consistency, suppress native .click() on links
				// Also prevent it if we're currently inside a leveraged native-event stack
				_default: function( event ) {
					var target = event.target;
					return rcheckableType.test( target.type ) &&
						target.click && nodeName( target, "input" ) &&
						dataPriv.get( target, "click" ) ||
						nodeName( target, "a" );
				}
			},
	
			beforeunload: {
				postDispatch: function( event ) {
	
					// Support: Firefox 20+
					// Firefox doesn't alert if the returnValue field is not set.
					if ( event.result !== undefined && event.originalEvent ) {
						event.originalEvent.returnValue = event.result;
					}
				}
			}
		}
	};
	
	// Ensure the presence of an event listener that handles manually-triggered
	// synthetic events by interrupting progress until reinvoked in response to
	// *native* events that it fires directly, ensuring that state changes have
	// already occurred before other listeners are invoked.
	function leverageNative( el, type, expectSync ) {
	
		// Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add
		if ( !expectSync ) {
			if ( dataPriv.get( el, type ) === undefined ) {
				jQuery.event.add( el, type, returnTrue );
			}
			return;
		}
	
		// Register the controller as a special universal handler for all event namespaces
		dataPriv.set( el, type, false );
		jQuery.event.add( el, type, {
			namespace: false,
			handler: function( event ) {
				var notAsync, result,
					saved = dataPriv.get( this, type );
	
				if ( ( event.isTrigger & 1 ) && this[ type ] ) {
	
					// Interrupt processing of the outer synthetic .trigger()ed event
					// Saved data should be false in such cases, but might be a leftover capture object
					// from an async native handler (gh-4350)
					if ( !saved.length ) {
	
						// Store arguments for use when handling the inner native event
						// There will always be at least one argument (an event object), so this array
						// will not be confused with a leftover capture object.
						saved = slice.call( arguments );
						dataPriv.set( this, type, saved );
	
						// Trigger the native event and capture its result
						// Support: IE <=9 - 11+
						// focus() and blur() are asynchronous
						notAsync = expectSync( this, type );
						this[ type ]();
						result = dataPriv.get( this, type );
						if ( saved !== result || notAsync ) {
							dataPriv.set( this, type, false );
						} else {
							result = {};
						}
						if ( saved !== result ) {
	
							// Cancel the outer synthetic event
							event.stopImmediatePropagation();
							event.preventDefault();
							return result.value;
						}
	
					// If this is an inner synthetic event for an event with a bubbling surrogate
					// (focus or blur), assume that the surrogate already propagated from triggering the
					// native event and prevent that from happening again here.
					// This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the
					// bubbling surrogate propagates *after* the non-bubbling base), but that seems
					// less bad than duplication.
					} else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) {
						event.stopPropagation();
					}
	
				// If this is a native event triggered above, everything is now in order
				// Fire an inner synthetic event with the original arguments
				} else if ( saved.length ) {
	
					// ...and capture the result
					dataPriv.set( this, type, {
						value: jQuery.event.trigger(
	
							// Support: IE <=9 - 11+
							// Extend with the prototype to reset the above stopImmediatePropagation()
							jQuery.extend( saved[ 0 ], jQuery.Event.prototype ),
							saved.slice( 1 ),
							this
						)
					} );
	
					// Abort handling of the native event
					event.stopImmediatePropagation();
				}
			}
		} );
	}
	
	jQuery.removeEvent = function( elem, type, handle ) {
	
		// This "if" is needed for plain objects
		if ( elem.removeEventListener ) {
			elem.removeEventListener( type, handle );
		}
	};
	
	jQuery.Event = function( src, props ) {
	
		// Allow instantiation without the 'new' keyword
		if ( !( this instanceof jQuery.Event ) ) {
			return new jQuery.Event( src, props );
		}
	
		// Event object
		if ( src && src.type ) {
			this.originalEvent = src;
			this.type = src.type;
	
			// Events bubbling up the document may have been marked as prevented
			// by a handler lower down the tree; reflect the correct value.
			this.isDefaultPrevented = src.defaultPrevented ||
					src.defaultPrevented === undefined &&
	
					// Support: Android <=2.3 only
					src.returnValue === false ?
				returnTrue :
				returnFalse;
	
			// Create target properties
			// Support: Safari <=6 - 7 only
			// Target should not be a text node (#504, #13143)
			this.target = ( src.target && src.target.nodeType === 3 ) ?
				src.target.parentNode :
				src.target;
	
			this.currentTarget = src.currentTarget;
			this.relatedTarget = src.relatedTarget;
	
		// Event type
		} else {
			this.type = src;
		}
	
		// Put explicitly provided properties onto the event object
		if ( props ) {
			jQuery.extend( this, props );
		}
	
		// Create a timestamp if incoming event doesn't have one
		this.timeStamp = src && src.timeStamp || Date.now();
	
		// Mark it as fixed
		this[ jQuery.expando ] = true;
	};
	
	// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
	// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
	jQuery.Event.prototype = {
		constructor: jQuery.Event,
		isDefaultPrevented: returnFalse,
		isPropagationStopped: returnFalse,
		isImmediatePropagationStopped: returnFalse,
		isSimulated: false,
	
		preventDefault: function() {
			var e = this.originalEvent;
	
			this.isDefaultPrevented = returnTrue;
	
			if ( e && !this.isSimulated ) {
				e.preventDefault();
			}
		},
		stopPropagation: function() {
			var e = this.originalEvent;
	
			this.isPropagationStopped = returnTrue;
	
			if ( e && !this.isSimulated ) {
				e.stopPropagation();
			}
		},
		stopImmediatePropagation: function() {
			var e = this.originalEvent;
	
			this.isImmediatePropagationStopped = returnTrue;
	
			if ( e && !this.isSimulated ) {
				e.stopImmediatePropagation();
			}
	
			this.stopPropagation();
		}
	};
	
	// Includes all common event props including KeyEvent and MouseEvent specific props
	jQuery.each( {
		altKey: true,
		bubbles: true,
		cancelable: true,
		changedTouches: true,
		ctrlKey: true,
		detail: true,
		eventPhase: true,
		metaKey: true,
		pageX: true,
		pageY: true,
		shiftKey: true,
		view: true,
		"char": true,
		code: true,
		charCode: true,
		key: true,
		keyCode: true,
		button: true,
		buttons: true,
		clientX: true,
		clientY: true,
		offsetX: true,
		offsetY: true,
		pointerId: true,
		pointerType: true,
		screenX: true,
		screenY: true,
		targetTouches: true,
		toElement: true,
		touches: true,
	
		which: function( event ) {
			var button = event.button;
	
			// Add which for key events
			if ( event.which == null && rkeyEvent.test( event.type ) ) {
				return event.charCode != null ? event.charCode : event.keyCode;
			}
	
			// Add which for click: 1 === left; 2 === middle; 3 === right
			if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {
				if ( button & 1 ) {
					return 1;
				}
	
				if ( button & 2 ) {
					return 3;
				}
	
				if ( button & 4 ) {
					return 2;
				}
	
				return 0;
			}
	
			return event.which;
		}
	}, jQuery.event.addProp );
	
	jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) {
		jQuery.event.special[ type ] = {
	
			// Utilize native event if possible so blur/focus sequence is correct
			setup: function() {
	
				// Claim the first handler
				// dataPriv.set( this, "focus", ... )
				// dataPriv.set( this, "blur", ... )
				leverageNative( this, type, expectSync );
	
				// Return false to allow normal processing in the caller
				return false;
			},
			trigger: function() {
	
				// Force setup before trigger
				leverageNative( this, type );
	
				// Return non-false to allow normal event-path propagation
				return true;
			},
	
			delegateType: delegateType
		};
	} );
	
	// Create mouseenter/leave events using mouseover/out and event-time checks
	// so that event delegation works in jQuery.
	// Do the same for pointerenter/pointerleave and pointerover/pointerout
	//
	// Support: Safari 7 only
	// Safari sends mouseenter too often; see:
	// https://bugs.chromium.org/p/chromium/issues/detail?id=470258
	// for the description of the bug (it existed in older Chrome versions as well).
	jQuery.each( {
		mouseenter: "mouseover",
		mouseleave: "mouseout",
		pointerenter: "pointerover",
		pointerleave: "pointerout"
	}, function( orig, fix ) {
		jQuery.event.special[ orig ] = {
			delegateType: fix,
			bindType: fix,
	
			handle: function( event ) {
				var ret,
					target = this,
					related = event.relatedTarget,
					handleObj = event.handleObj;
	
				// For mouseenter/leave call the handler if related is outside the target.
				// NB: No relatedTarget if the mouse left/entered the browser window
				if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
					event.type = handleObj.origType;
					ret = handleObj.handler.apply( this, arguments );
					event.type = fix;
				}
				return ret;
			}
		};
	} );
	
	jQuery.fn.extend( {
	
		on: function( types, selector, data, fn ) {
			return on( this, types, selector, data, fn );
		},
		one: function( types, selector, data, fn ) {
			return on( this, types, selector, data, fn, 1 );
		},
		off: function( types, selector, fn ) {
			var handleObj, type;
			if ( types && types.preventDefault && types.handleObj ) {
	
				// ( event )  dispatched jQuery.Event
				handleObj = types.handleObj;
				jQuery( types.delegateTarget ).off(
					handleObj.namespace ?
						handleObj.origType + "." + handleObj.namespace :
						handleObj.origType,
					handleObj.selector,
					handleObj.handler
				);
				return this;
			}
			if ( typeof types === "object" ) {
	
				// ( types-object [, selector] )
				for ( type in types ) {
					this.off( type, selector, types[ type ] );
				}
				return this;
			}
			if ( selector === false || typeof selector === "function" ) {
	
				// ( types [, fn] )
				fn = selector;
				selector = undefined;
			}
			if ( fn === false ) {
				fn = returnFalse;
			}
			return this.each( function() {
				jQuery.event.remove( this, types, fn, selector );
			} );
		}
	} );
	
	
	var
	
		/* eslint-disable max-len */
	
		// See https://github.com/eslint/eslint/issues/3229
		rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,
	
		/* eslint-enable */
	
		// Support: IE <=10 - 11, Edge 12 - 13 only
		// In IE/Edge using regex groups here causes severe slowdowns.
		// See https://connect.microsoft.com/IE/feedback/details/1736512/
		rnoInnerhtml = /<script|<style|<link/i,
	
		// checked="checked" or checked
		rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
		rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;
	
	// Prefer a tbody over its parent table for containing new rows
	function manipulationTarget( elem, content ) {
		if ( nodeName( elem, "table" ) &&
			nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) {
	
			return jQuery( elem ).children( "tbody" )[ 0 ] || elem;
		}
	
		return elem;
	}
	
	// Replace/restore the type attribute of script elements for safe DOM manipulation
	function disableScript( elem ) {
		elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type;
		return elem;
	}
	function restoreScript( elem ) {
		if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) {
			elem.type = elem.type.slice( 5 );
		} else {
			elem.removeAttribute( "type" );
		}
	
		return elem;
	}
	
	function cloneCopyEvent( src, dest ) {
		var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;
	
		if ( dest.nodeType !== 1 ) {
			return;
		}
	
		// 1. Copy private data: events, handlers, etc.
		if ( dataPriv.hasData( src ) ) {
			pdataOld = dataPriv.access( src );
			pdataCur = dataPriv.set( dest, pdataOld );
			events = pdataOld.events;
	
			if ( events ) {
				delete pdataCur.handle;
				pdataCur.events = {};
	
				for ( type in events ) {
					for ( i = 0, l = events[ type ].length; i < l; i++ ) {
						jQuery.event.add( dest, type, events[ type ][ i ] );
					}
				}
			}
		}
	
		// 2. Copy user data
		if ( dataUser.hasData( src ) ) {
			udataOld = dataUser.access( src );
			udataCur = jQuery.extend( {}, udataOld );
	
			dataUser.set( dest, udataCur );
		}
	}
	
	// Fix IE bugs, see support tests
	function fixInput( src, dest ) {
		var nodeName = dest.nodeName.toLowerCase();
	
		// Fails to persist the checked state of a cloned checkbox or radio button.
		if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
			dest.checked = src.checked;
	
		// Fails to return the selected option to the default selected state when cloning options
		} else if ( nodeName === "input" || nodeName === "textarea" ) {
			dest.defaultValue = src.defaultValue;
		}
	}
	
	function domManip( collection, args, callback, ignored ) {
	
		// Flatten any nested arrays
		args = concat.apply( [], args );
	
		var fragment, first, scripts, hasScripts, node, doc,
			i = 0,
			l = collection.length,
			iNoClone = l - 1,
			value = args[ 0 ],
			valueIsFunction = isFunction( value );
	
		// We can't cloneNode fragments that contain checked, in WebKit
		if ( valueIsFunction ||
				( l > 1 && typeof value === "string" &&
					!support.checkClone && rchecked.test( value ) ) ) {
			return collection.each( function( index ) {
				var self = collection.eq( index );
				if ( valueIsFunction ) {
					args[ 0 ] = value.call( this, index, self.html() );
				}
				domManip( self, args, callback, ignored );
			} );
		}
	
		if ( l ) {
			fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );
			first = fragment.firstChild;
	
			if ( fragment.childNodes.length === 1 ) {
				fragment = first;
			}
	
			// Require either new content or an interest in ignored elements to invoke the callback
			if ( first || ignored ) {
				scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
				hasScripts = scripts.length;
	
				// Use the original fragment for the last item
				// instead of the first because it can end up
				// being emptied incorrectly in certain situations (#8070).
				for ( ; i < l; i++ ) {
					node = fragment;
	
					if ( i !== iNoClone ) {
						node = jQuery.clone( node, true, true );
	
						// Keep references to cloned scripts for later restoration
						if ( hasScripts ) {
	
							// Support: Android <=4.0 only, PhantomJS 1 only
							// push.apply(_, arraylike) throws on ancient WebKit
							jQuery.merge( scripts, getAll( node, "script" ) );
						}
					}
	
					callback.call( collection[ i ], node, i );
				}
	
				if ( hasScripts ) {
					doc = scripts[ scripts.length - 1 ].ownerDocument;
	
					// Reenable scripts
					jQuery.map( scripts, restoreScript );
	
					// Evaluate executable scripts on first document insertion
					for ( i = 0; i < hasScripts; i++ ) {
						node = scripts[ i ];
						if ( rscriptType.test( node.type || "" ) &&
							!dataPriv.access( node, "globalEval" ) &&
							jQuery.contains( doc, node ) ) {
	
							if ( node.src && ( node.type || "" ).toLowerCase()  !== "module" ) {
	
								// Optional AJAX dependency, but won't run scripts if not present
								if ( jQuery._evalUrl && !node.noModule ) {
									jQuery._evalUrl( node.src, {
										nonce: node.nonce || node.getAttribute( "nonce" )
									} );
								}
							} else {
								DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc );
							}
						}
					}
				}
			}
		}
	
		return collection;
	}
	
	function remove( elem, selector, keepData ) {
		var node,
			nodes = selector ? jQuery.filter( selector, elem ) : elem,
			i = 0;
	
		for ( ; ( node = nodes[ i ] ) != null; i++ ) {
			if ( !keepData && node.nodeType === 1 ) {
				jQuery.cleanData( getAll( node ) );
			}
	
			if ( node.parentNode ) {
				if ( keepData && isAttached( node ) ) {
					setGlobalEval( getAll( node, "script" ) );
				}
				node.parentNode.removeChild( node );
			}
		}
	
		return elem;
	}
	
	jQuery.extend( {
		htmlPrefilter: function( html ) {
			return html.replace( rxhtmlTag, "<$1></$2>" );
		},
	
		clone: function( elem, dataAndEvents, deepDataAndEvents ) {
			var i, l, srcElements, destElements,
				clone = elem.cloneNode( true ),
				inPage = isAttached( elem );
	
			// Fix IE cloning issues
			if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
					!jQuery.isXMLDoc( elem ) ) {
	
				// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2
				destElements = getAll( clone );
				srcElements = getAll( elem );
	
				for ( i = 0, l = srcElements.length; i < l; i++ ) {
					fixInput( srcElements[ i ], destElements[ i ] );
				}
			}
	
			// Copy the events from the original to the clone
			if ( dataAndEvents ) {
				if ( deepDataAndEvents ) {
					srcElements = srcElements || getAll( elem );
					destElements = destElements || getAll( clone );
	
					for ( i = 0, l = srcElements.length; i < l; i++ ) {
						cloneCopyEvent( srcElements[ i ], destElements[ i ] );
					}
				} else {
					cloneCopyEvent( elem, clone );
				}
			}
	
			// Preserve script evaluation history
			destElements = getAll( clone, "script" );
			if ( destElements.length > 0 ) {
				setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
			}
	
			// Return the cloned set
			return clone;
		},
	
		cleanData: function( elems ) {
			var data, elem, type,
				special = jQuery.event.special,
				i = 0;
	
			for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {
				if ( acceptData( elem ) ) {
					if ( ( data = elem[ dataPriv.expando ] ) ) {
						if ( data.events ) {
							for ( type in data.events ) {
								if ( special[ type ] ) {
									jQuery.event.remove( elem, type );
	
								// This is a shortcut to avoid jQuery.event.remove's overhead
								} else {
									jQuery.removeEvent( elem, type, data.handle );
								}
							}
						}
	
						// Support: Chrome <=35 - 45+
						// Assign undefined instead of using delete, see Data#remove
						elem[ dataPriv.expando ] = undefined;
					}
					if ( elem[ dataUser.expando ] ) {
	
						// Support: Chrome <=35 - 45+
						// Assign undefined instead of using delete, see Data#remove
						elem[ dataUser.expando ] = undefined;
					}
				}
			}
		}
	} );
	
	jQuery.fn.extend( {
		detach: function( selector ) {
			return remove( this, selector, true );
		},
	
		remove: function( selector ) {
			return remove( this, selector );
		},
	
		text: function( value ) {
			return access( this, function( value ) {
				return value === undefined ?
					jQuery.text( this ) :
					this.empty().each( function() {
						if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
							this.textContent = value;
						}
					} );
			}, null, value, arguments.length );
		},
	
		append: function() {
			return domManip( this, arguments, function( elem ) {
				if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
					var target = manipulationTarget( this, elem );
					target.appendChild( elem );
				}
			} );
		},
	
		prepend: function() {
			return domManip( this, arguments, function( elem ) {
				if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
					var target = manipulationTarget( this, elem );
					target.insertBefore( elem, target.firstChild );
				}
			} );
		},
	
		before: function() {
			return domManip( this, arguments, function( elem ) {
				if ( this.parentNode ) {
					this.parentNode.insertBefore( elem, this );
				}
			} );
		},
	
		after: function() {
			return domManip( this, arguments, function( elem ) {
				if ( this.parentNode ) {
					this.parentNode.insertBefore( elem, this.nextSibling );
				}
			} );
		},
	
		empty: function() {
			var elem,
				i = 0;
	
			for ( ; ( elem = this[ i ] ) != null; i++ ) {
				if ( elem.nodeType === 1 ) {
	
					// Prevent memory leaks
					jQuery.cleanData( getAll( elem, false ) );
	
					// Remove any remaining nodes
					elem.textContent = "";
				}
			}
	
			return this;
		},
	
		clone: function( dataAndEvents, deepDataAndEvents ) {
			dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
			deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
	
			return this.map( function() {
				return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
			} );
		},
	
		html: function( value ) {
			return access( this, function( value ) {
				var elem = this[ 0 ] || {},
					i = 0,
					l = this.length;
	
				if ( value === undefined && elem.nodeType === 1 ) {
					return elem.innerHTML;
				}
	
				// See if we can take a shortcut and just use innerHTML
				if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
					!wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
	
					value = jQuery.htmlPrefilter( value );
	
					try {
						for ( ; i < l; i++ ) {
							elem = this[ i ] || {};
	
							// Remove element nodes and prevent memory leaks
							if ( elem.nodeType === 1 ) {
								jQuery.cleanData( getAll( elem, false ) );
								elem.innerHTML = value;
							}
						}
	
						elem = 0;
	
					// If using innerHTML throws an exception, use the fallback method
					} catch ( e ) {}
				}
	
				if ( elem ) {
					this.empty().append( value );
				}
			}, null, value, arguments.length );
		},
	
		replaceWith: function() {
			var ignored = [];
	
			// Make the changes, replacing each non-ignored context element with the new content
			return domManip( this, arguments, function( elem ) {
				var parent = this.parentNode;
	
				if ( jQuery.inArray( this, ignored ) < 0 ) {
					jQuery.cleanData( getAll( this ) );
					if ( parent ) {
						parent.replaceChild( elem, this );
					}
				}
	
			// Force callback invocation
			}, ignored );
		}
	} );
	
	jQuery.each( {
		appendTo: "append",
		prependTo: "prepend",
		insertBefore: "before",
		insertAfter: "after",
		replaceAll: "replaceWith"
	}, function( name, original ) {
		jQuery.fn[ name ] = function( selector ) {
			var elems,
				ret = [],
				insert = jQuery( selector ),
				last = insert.length - 1,
				i = 0;
	
			for ( ; i <= last; i++ ) {
				elems = i === last ? this : this.clone( true );
				jQuery( insert[ i ] )[ original ]( elems );
	
				// Support: Android <=4.0 only, PhantomJS 1 only
				// .get() because push.apply(_, arraylike) throws on ancient WebKit
				push.apply( ret, elems.get() );
			}
	
			return this.pushStack( ret );
		};
	} );
	var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
	
	var getStyles = function( elem ) {
	
			// Support: IE <=11 only, Firefox <=30 (#15098, #14150)
			// IE throws on elements created in popups
			// FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
			var view = elem.ownerDocument.defaultView;
	
			if ( !view || !view.opener ) {
				view = window;
			}
	
			return view.getComputedStyle( elem );
		};
	
	var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
	
	
	
	( function() {
	
		// Executing both pixelPosition & boxSizingReliable tests require only one layout
		// so they're executed at the same time to save the second computation.
		function computeStyleTests() {
	
			// This is a singleton, we need to execute it only once
			if ( !div ) {
				return;
			}
	
			container.style.cssText = "position:absolute;left:-11111px;width:60px;" +
				"margin-top:1px;padding:0;border:0";
			div.style.cssText =
				"position:relative;display:block;box-sizing:border-box;overflow:scroll;" +
				"margin:auto;border:1px;padding:1px;" +
				"width:60%;top:1%";
			documentElement.appendChild( container ).appendChild( div );
	
			var divStyle = window.getComputedStyle( div );
			pixelPositionVal = divStyle.top !== "1%";
	
			// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44
			reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;
	
			// Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3
			// Some styles come back with percentage values, even though they shouldn't
			div.style.right = "60%";
			pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;
	
			// Support: IE 9 - 11 only
			// Detect misreporting of content dimensions for box-sizing:border-box elements
			boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;
	
			// Support: IE 9 only
			// Detect overflow:scroll screwiness (gh-3699)
			// Support: Chrome <=64
			// Don't get tricked when zoom affects offsetWidth (gh-4029)
			div.style.position = "absolute";
			scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12;
	
			documentElement.removeChild( container );
	
			// Nullify the div so it wouldn't be stored in the memory and
			// it will also be a sign that checks already performed
			div = null;
		}
	
		function roundPixelMeasures( measure ) {
			return Math.round( parseFloat( measure ) );
		}
	
		var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,
			reliableMarginLeftVal,
			container = document.createElement( "div" ),
			div = document.createElement( "div" );
	
		// Finish early in limited (non-browser) environments
		if ( !div.style ) {
			return;
		}
	
		// Support: IE <=9 - 11 only
		// Style of cloned element affects source element cloned (#8908)
		div.style.backgroundClip = "content-box";
		div.cloneNode( true ).style.backgroundClip = "";
		support.clearCloneStyle = div.style.backgroundClip === "content-box";
	
		jQuery.extend( support, {
			boxSizingReliable: function() {
				computeStyleTests();
				return boxSizingReliableVal;
			},
			pixelBoxStyles: function() {
				computeStyleTests();
				return pixelBoxStylesVal;
			},
			pixelPosition: function() {
				computeStyleTests();
				return pixelPositionVal;
			},
			reliableMarginLeft: function() {
				computeStyleTests();
				return reliableMarginLeftVal;
			},
			scrollboxSize: function() {
				computeStyleTests();
				return scrollboxSizeVal;
			}
		} );
	} )();
	
	
	function curCSS( elem, name, computed ) {
		var width, minWidth, maxWidth, ret,
	
			// Support: Firefox 51+
			// Retrieving style before computed somehow
			// fixes an issue with getting wrong values
			// on detached elements
			style = elem.style;
	
		computed = computed || getStyles( elem );
	
		// getPropertyValue is needed for:
		//   .css('filter') (IE 9 only, #12537)
		//   .css('--customProperty) (#3144)
		if ( computed ) {
			ret = computed.getPropertyValue( name ) || computed[ name ];
	
			if ( ret === "" && !isAttached( elem ) ) {
				ret = jQuery.style( elem, name );
			}
	
			// A tribute to the "awesome hack by Dean Edwards"
			// Android Browser returns percentage for some values,
			// but width seems to be reliably pixels.
			// This is against the CSSOM draft spec:
			// https://drafts.csswg.org/cssom/#resolved-values
			if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {
	
				// Remember the original values
				width = style.width;
				minWidth = style.minWidth;
				maxWidth = style.maxWidth;
	
				// Put in the new values to get a computed value out
				style.minWidth = style.maxWidth = style.width = ret;
				ret = computed.width;
	
				// Revert the changed values
				style.width = width;
				style.minWidth = minWidth;
				style.maxWidth = maxWidth;
			}
		}
	
		return ret !== undefined ?
	
			// Support: IE <=9 - 11 only
			// IE returns zIndex value as an integer.
			ret + "" :
			ret;
	}
	
	
	function addGetHookIf( conditionFn, hookFn ) {
	
		// Define the hook, we'll check on the first run if it's really needed.
		return {
			get: function() {
				if ( conditionFn() ) {
	
					// Hook not needed (or it's not possible to use it due
					// to missing dependency), remove it.
					delete this.get;
					return;
				}
	
				// Hook needed; redefine it so that the support test is not executed again.
				return ( this.get = hookFn ).apply( this, arguments );
			}
		};
	}
	
	
	var cssPrefixes = [ "Webkit", "Moz", "ms" ],
		emptyStyle = document.createElement( "div" ).style,
		vendorProps = {};
	
	// Return a vendor-prefixed property or undefined
	function vendorPropName( name ) {
	
		// Check for vendor prefixed names
		var capName = name[ 0 ].toUpperCase() + name.slice( 1 ),
			i = cssPrefixes.length;
	
		while ( i-- ) {
			name = cssPrefixes[ i ] + capName;
			if ( name in emptyStyle ) {
				return name;
			}
		}
	}
	
	// Return a potentially-mapped jQuery.cssProps or vendor prefixed property
	function finalPropName( name ) {
		var final = jQuery.cssProps[ name ] || vendorProps[ name ];
	
		if ( final ) {
			return final;
		}
		if ( name in emptyStyle ) {
			return name;
		}
		return vendorProps[ name ] = vendorPropName( name ) || name;
	}
	
	
	var
	
		// Swappable if display is none or starts with table
		// except "table", "table-cell", or "table-caption"
		// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
		rdisplayswap = /^(none|table(?!-c[ea]).+)/,
		rcustomProp = /^--/,
		cssShow = { position: "absolute", visibility: "hidden", display: "block" },
		cssNormalTransform = {
			letterSpacing: "0",
			fontWeight: "400"
		};
	
	function setPositiveNumber( elem, value, subtract ) {
	
		// Any relative (+/-) values have already been
		// normalized at this point
		var matches = rcssNum.exec( value );
		return matches ?
	
			// Guard against undefined "subtract", e.g., when used as in cssHooks
			Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) :
			value;
	}
	
	function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {
		var i = dimension === "width" ? 1 : 0,
			extra = 0,
			delta = 0;
	
		// Adjustment may not be necessary
		if ( box === ( isBorderBox ? "border" : "content" ) ) {
			return 0;
		}
	
		for ( ; i < 4; i += 2 ) {
	
			// Both box models exclude margin
			if ( box === "margin" ) {
				delta += jQuery.css( elem, box + cssExpand[ i ], true, styles );
			}
	
			// If we get here with a content-box, we're seeking "padding" or "border" or "margin"
			if ( !isBorderBox ) {
	
				// Add padding
				delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
	
				// For "border" or "margin", add border
				if ( box !== "padding" ) {
					delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
	
				// But still keep track of it otherwise
				} else {
					extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
				}
	
			// If we get here with a border-box (content + padding + border), we're seeking "content" or
			// "padding" or "margin"
			} else {
	
				// For "content", subtract padding
				if ( box === "content" ) {
					delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
				}
	
				// For "content" or "padding", subtract border
				if ( box !== "margin" ) {
					delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
				}
			}
		}
	
		// Account for positive content-box scroll gutter when requested by providing computedVal
		if ( !isBorderBox && computedVal >= 0 ) {
	
			// offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border
			// Assuming integer scroll gutter, subtract the rest and round down
			delta += Math.max( 0, Math.ceil(
				elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
				computedVal -
				delta -
				extra -
				0.5
	
			// If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter
			// Use an explicit zero to avoid NaN (gh-3964)
			) ) || 0;
		}
	
		return delta;
	}
	
	function getWidthOrHeight( elem, dimension, extra ) {
	
		// Start with computed style
		var styles = getStyles( elem ),
	
			// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322).
			// Fake content-box until we know it's needed to know the true value.
			boxSizingNeeded = !support.boxSizingReliable() || extra,
			isBorderBox = boxSizingNeeded &&
				jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
			valueIsBorderBox = isBorderBox,
	
			val = curCSS( elem, dimension, styles ),
			offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 );
	
		// Support: Firefox <=54
		// Return a confounding non-pixel value or feign ignorance, as appropriate.
		if ( rnumnonpx.test( val ) ) {
			if ( !extra ) {
				return val;
			}
			val = "auto";
		}
	
	
		// Fall back to offsetWidth/offsetHeight when value is "auto"
		// This happens for inline elements with no explicit setting (gh-3571)
		// Support: Android <=4.1 - 4.3 only
		// Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)
		// Support: IE 9-11 only
		// Also use offsetWidth/offsetHeight for when box sizing is unreliable
		// We use getClientRects() to check for hidden/disconnected.
		// In those cases, the computed value can be trusted to be border-box
		if ( ( !support.boxSizingReliable() && isBorderBox ||
			val === "auto" ||
			!parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) &&
			elem.getClientRects().length ) {
	
			isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
	
			// Where available, offsetWidth/offsetHeight approximate border box dimensions.
			// Where not available (e.g., SVG), assume unreliable box-sizing and interpret the
			// retrieved value as a content box dimension.
			valueIsBorderBox = offsetProp in elem;
			if ( valueIsBorderBox ) {
				val = elem[ offsetProp ];
			}
		}
	
		// Normalize "" and auto
		val = parseFloat( val ) || 0;
	
		// Adjust for the element's box model
		return ( val +
			boxModelAdjustment(
				elem,
				dimension,
				extra || ( isBorderBox ? "border" : "content" ),
				valueIsBorderBox,
				styles,
	
				// Provide the current computed size to request scroll gutter calculation (gh-3589)
				val
			)
		) + "px";
	}
	
	jQuery.extend( {
	
		// Add in style property hooks for overriding the default
		// behavior of getting and setting a style property
		cssHooks: {
			opacity: {
				get: function( elem, computed ) {
					if ( computed ) {
	
						// We should always get a number back from opacity
						var ret = curCSS( elem, "opacity" );
						return ret === "" ? "1" : ret;
					}
				}
			}
		},
	
		// Don't automatically add "px" to these possibly-unitless properties
		cssNumber: {
			"animationIterationCount": true,
			"columnCount": true,
			"fillOpacity": true,
			"flexGrow": true,
			"flexShrink": true,
			"fontWeight": true,
			"gridArea": true,
			"gridColumn": true,
			"gridColumnEnd": true,
			"gridColumnStart": true,
			"gridRow": true,
			"gridRowEnd": true,
			"gridRowStart": true,
			"lineHeight": true,
			"opacity": true,
			"order": true,
			"orphans": true,
			"widows": true,
			"zIndex": true,
			"zoom": true
		},
	
		// Add in properties whose names you wish to fix before
		// setting or getting the value
		cssProps: {},
	
		// Get and set the style property on a DOM Node
		style: function( elem, name, value, extra ) {
	
			// Don't set styles on text and comment nodes
			if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
				return;
			}
	
			// Make sure that we're working with the right name
			var ret, type, hooks,
				origName = camelCase( name ),
				isCustomProp = rcustomProp.test( name ),
				style = elem.style;
	
			// Make sure that we're working with the right name. We don't
			// want to query the value if it is a CSS custom property
			// since they are user-defined.
			if ( !isCustomProp ) {
				name = finalPropName( origName );
			}
	
			// Gets hook for the prefixed version, then unprefixed version
			hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
	
			// Check if we're setting a value
			if ( value !== undefined ) {
				type = typeof value;
	
				// Convert "+=" or "-=" to relative numbers (#7345)
				if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
					value = adjustCSS( elem, name, ret );
	
					// Fixes bug #9237
					type = "number";
				}
	
				// Make sure that null and NaN values aren't set (#7116)
				if ( value == null || value !== value ) {
					return;
				}
	
				// If a number was passed in, add the unit (except for certain CSS properties)
				// The isCustomProp check can be removed in jQuery 4.0 when we only auto-append
				// "px" to a few hardcoded values.
				if ( type === "number" && !isCustomProp ) {
					value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
				}
	
				// background-* props affect original clone's values
				if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
					style[ name ] = "inherit";
				}
	
				// If a hook was provided, use that value, otherwise just set the specified value
				if ( !hooks || !( "set" in hooks ) ||
					( value = hooks.set( elem, value, extra ) ) !== undefined ) {
	
					if ( isCustomProp ) {
						style.setProperty( name, value );
					} else {
						style[ name ] = value;
					}
				}
	
			} else {
	
				// If a hook was provided get the non-computed value from there
				if ( hooks && "get" in hooks &&
					( ret = hooks.get( elem, false, extra ) ) !== undefined ) {
	
					return ret;
				}
	
				// Otherwise just get the value from the style object
				return style[ name ];
			}
		},
	
		css: function( elem, name, extra, styles ) {
			var val, num, hooks,
				origName = camelCase( name ),
				isCustomProp = rcustomProp.test( name );
	
			// Make sure that we're working with the right name. We don't
			// want to modify the value if it is a CSS custom property
			// since they are user-defined.
			if ( !isCustomProp ) {
				name = finalPropName( origName );
			}
	
			// Try prefixed name followed by the unprefixed name
			hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
	
			// If a hook was provided get the computed value from there
			if ( hooks && "get" in hooks ) {
				val = hooks.get( elem, true, extra );
			}
	
			// Otherwise, if a way to get the computed value exists, use that
			if ( val === undefined ) {
				val = curCSS( elem, name, styles );
			}
	
			// Convert "normal" to computed value
			if ( val === "normal" && name in cssNormalTransform ) {
				val = cssNormalTransform[ name ];
			}
	
			// Make numeric if forced or a qualifier was provided and val looks numeric
			if ( extra === "" || extra ) {
				num = parseFloat( val );
				return extra === true || isFinite( num ) ? num || 0 : val;
			}
	
			return val;
		}
	} );
	
	jQuery.each( [ "height", "width" ], function( i, dimension ) {
		jQuery.cssHooks[ dimension ] = {
			get: function( elem, computed, extra ) {
				if ( computed ) {
	
					// Certain elements can have dimension info if we invisibly show them
					// but it must have a current display style that would benefit
					return rdisplayswap.test( jQuery.css( elem, "display" ) ) &&
	
						// Support: Safari 8+
						// Table columns in Safari have non-zero offsetWidth & zero
						// getBoundingClientRect().width unless display is changed.
						// Support: IE <=11 only
						// Running getBoundingClientRect on a disconnected node
						// in IE throws an error.
						( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
							swap( elem, cssShow, function() {
								return getWidthOrHeight( elem, dimension, extra );
							} ) :
							getWidthOrHeight( elem, dimension, extra );
				}
			},
	
			set: function( elem, value, extra ) {
				var matches,
					styles = getStyles( elem ),
	
					// Only read styles.position if the test has a chance to fail
					// to avoid forcing a reflow.
					scrollboxSizeBuggy = !support.scrollboxSize() &&
						styles.position === "absolute",
	
					// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991)
					boxSizingNeeded = scrollboxSizeBuggy || extra,
					isBorderBox = boxSizingNeeded &&
						jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
					subtract = extra ?
						boxModelAdjustment(
							elem,
							dimension,
							extra,
							isBorderBox,
							styles
						) :
						0;
	
				// Account for unreliable border-box dimensions by comparing offset* to computed and
				// faking a content-box to get border and padding (gh-3699)
				if ( isBorderBox && scrollboxSizeBuggy ) {
					subtract -= Math.ceil(
						elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
						parseFloat( styles[ dimension ] ) -
						boxModelAdjustment( elem, dimension, "border", false, styles ) -
						0.5
					);
				}
	
				// Convert to pixels if value adjustment is needed
				if ( subtract && ( matches = rcssNum.exec( value ) ) &&
					( matches[ 3 ] || "px" ) !== "px" ) {
	
					elem.style[ dimension ] = value;
					value = jQuery.css( elem, dimension );
				}
	
				return setPositiveNumber( elem, value, subtract );
			}
		};
	} );
	
	jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
		function( elem, computed ) {
			if ( computed ) {
				return ( parseFloat( curCSS( elem, "marginLeft" ) ) ||
					elem.getBoundingClientRect().left -
						swap( elem, { marginLeft: 0 }, function() {
							return elem.getBoundingClientRect().left;
						} )
					) + "px";
			}
		}
	);
	
	// These hooks are used by animate to expand properties
	jQuery.each( {
		margin: "",
		padding: "",
		border: "Width"
	}, function( prefix, suffix ) {
		jQuery.cssHooks[ prefix + suffix ] = {
			expand: function( value ) {
				var i = 0,
					expanded = {},
	
					// Assumes a single number if not a string
					parts = typeof value === "string" ? value.split( " " ) : [ value ];
	
				for ( ; i < 4; i++ ) {
					expanded[ prefix + cssExpand[ i ] + suffix ] =
						parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
				}
	
				return expanded;
			}
		};
	
		if ( prefix !== "margin" ) {
			jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
		}
	} );
	
	jQuery.fn.extend( {
		css: function( name, value ) {
			return access( this, function( elem, name, value ) {
				var styles, len,
					map = {},
					i = 0;
	
				if ( Array.isArray( name ) ) {
					styles = getStyles( elem );
					len = name.length;
	
					for ( ; i < len; i++ ) {
						map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
					}
	
					return map;
				}
	
				return value !== undefined ?
					jQuery.style( elem, name, value ) :
					jQuery.css( elem, name );
			}, name, value, arguments.length > 1 );
		}
	} );
	
	
	function Tween( elem, options, prop, end, easing ) {
		return new Tween.prototype.init( elem, options, prop, end, easing );
	}
	jQuery.Tween = Tween;
	
	Tween.prototype = {
		constructor: Tween,
		init: function( elem, options, prop, end, easing, unit ) {
			this.elem = elem;
			this.prop = prop;
			this.easing = easing || jQuery.easing._default;
			this.options = options;
			this.start = this.now = this.cur();
			this.end = end;
			this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
		},
		cur: function() {
			var hooks = Tween.propHooks[ this.prop ];
	
			return hooks && hooks.get ?
				hooks.get( this ) :
				Tween.propHooks._default.get( this );
		},
		run: function( percent ) {
			var eased,
				hooks = Tween.propHooks[ this.prop ];
	
			if ( this.options.duration ) {
				this.pos = eased = jQuery.easing[ this.easing ](
					percent, this.options.duration * percent, 0, 1, this.options.duration
				);
			} else {
				this.pos = eased = percent;
			}
			this.now = ( this.end - this.start ) * eased + this.start;
	
			if ( this.options.step ) {
				this.options.step.call( this.elem, this.now, this );
			}
	
			if ( hooks && hooks.set ) {
				hooks.set( this );
			} else {
				Tween.propHooks._default.set( this );
			}
			return this;
		}
	};
	
	Tween.prototype.init.prototype = Tween.prototype;
	
	Tween.propHooks = {
		_default: {
			get: function( tween ) {
				var result;
	
				// Use a property on the element directly when it is not a DOM element,
				// or when there is no matching style property that exists.
				if ( tween.elem.nodeType !== 1 ||
					tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {
					return tween.elem[ tween.prop ];
				}
	
				// Passing an empty string as a 3rd parameter to .css will automatically
				// attempt a parseFloat and fallback to a string if the parse fails.
				// Simple values such as "10px" are parsed to Float;
				// complex values such as "rotate(1rad)" are returned as-is.
				result = jQuery.css( tween.elem, tween.prop, "" );
	
				// Empty strings, null, undefined and "auto" are converted to 0.
				return !result || result === "auto" ? 0 : result;
			},
			set: function( tween ) {
	
				// Use step hook for back compat.
				// Use cssHook if its there.
				// Use .style if available and use plain properties where available.
				if ( jQuery.fx.step[ tween.prop ] ) {
					jQuery.fx.step[ tween.prop ]( tween );
				} else if ( tween.elem.nodeType === 1 && (
						jQuery.cssHooks[ tween.prop ] ||
						tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {
					jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
				} else {
					tween.elem[ tween.prop ] = tween.now;
				}
			}
		}
	};
	
	// Support: IE <=9 only
	// Panic based approach to setting things on disconnected nodes
	Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
		set: function( tween ) {
			if ( tween.elem.nodeType && tween.elem.parentNode ) {
				tween.elem[ tween.prop ] = tween.now;
			}
		}
	};
	
	jQuery.easing = {
		linear: function( p ) {
			return p;
		},
		swing: function( p ) {
			return 0.5 - Math.cos( p * Math.PI ) / 2;
		},
		_default: "swing"
	};
	
	jQuery.fx = Tween.prototype.init;
	
	// Back compat <1.8 extension point
	jQuery.fx.step = {};
	
	
	
	
	var
		fxNow, inProgress,
		rfxtypes = /^(?:toggle|show|hide)$/,
		rrun = /queueHooks$/;
	
	function schedule() {
		if ( inProgress ) {
			if ( document.hidden === false && window.requestAnimationFrame ) {
				window.requestAnimationFrame( schedule );
			} else {
				window.setTimeout( schedule, jQuery.fx.interval );
			}
	
			jQuery.fx.tick();
		}
	}
	
	// Animations created synchronously will run synchronously
	function createFxNow() {
		window.setTimeout( function() {
			fxNow = undefined;
		} );
		return ( fxNow = Date.now() );
	}
	
	// Generate parameters to create a standard animation
	function genFx( type, includeWidth ) {
		var which,
			i = 0,
			attrs = { height: type };
	
		// If we include width, step value is 1 to do all cssExpand values,
		// otherwise step value is 2 to skip over Left and Right
		includeWidth = includeWidth ? 1 : 0;
		for ( ; i < 4; i += 2 - includeWidth ) {
			which = cssExpand[ i ];
			attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
		}
	
		if ( includeWidth ) {
			attrs.opacity = attrs.width = type;
		}
	
		return attrs;
	}
	
	function createTween( value, prop, animation ) {
		var tween,
			collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ),
			index = 0,
			length = collection.length;
		for ( ; index < length; index++ ) {
			if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {
	
				// We're done with this property
				return tween;
			}
		}
	}
	
	function defaultPrefilter( elem, props, opts ) {
		var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,
			isBox = "width" in props || "height" in props,
			anim = this,
			orig = {},
			style = elem.style,
			hidden = elem.nodeType && isHiddenWithinTree( elem ),
			dataShow = dataPriv.get( elem, "fxshow" );
	
		// Queue-skipping animations hijack the fx hooks
		if ( !opts.queue ) {
			hooks = jQuery._queueHooks( elem, "fx" );
			if ( hooks.unqueued == null ) {
				hooks.unqueued = 0;
				oldfire = hooks.empty.fire;
				hooks.empty.fire = function() {
					if ( !hooks.unqueued ) {
						oldfire();
					}
				};
			}
			hooks.unqueued++;
	
			anim.always( function() {
	
				// Ensure the complete handler is called before this completes
				anim.always( function() {
					hooks.unqueued--;
					if ( !jQuery.queue( elem, "fx" ).length ) {
						hooks.empty.fire();
					}
				} );
			} );
		}
	
		// Detect show/hide animations
		for ( prop in props ) {
			value = props[ prop ];
			if ( rfxtypes.test( value ) ) {
				delete props[ prop ];
				toggle = toggle || value === "toggle";
				if ( value === ( hidden ? "hide" : "show" ) ) {
	
					// Pretend to be hidden if this is a "show" and
					// there is still data from a stopped show/hide
					if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
						hidden = true;
	
					// Ignore all other no-op show/hide data
					} else {
						continue;
					}
				}
				orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
			}
		}
	
		// Bail out if this is a no-op like .hide().hide()
		propTween = !jQuery.isEmptyObject( props );
		if ( !propTween && jQuery.isEmptyObject( orig ) ) {
			return;
		}
	
		// Restrict "overflow" and "display" styles during box animations
		if ( isBox && elem.nodeType === 1 ) {
	
			// Support: IE <=9 - 11, Edge 12 - 15
			// Record all 3 overflow attributes because IE does not infer the shorthand
			// from identically-valued overflowX and overflowY and Edge just mirrors
			// the overflowX value there.
			opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
	
			// Identify a display type, preferring old show/hide data over the CSS cascade
			restoreDisplay = dataShow && dataShow.display;
			if ( restoreDisplay == null ) {
				restoreDisplay = dataPriv.get( elem, "display" );
			}
			display = jQuery.css( elem, "display" );
			if ( display === "none" ) {
				if ( restoreDisplay ) {
					display = restoreDisplay;
				} else {
	
					// Get nonempty value(s) by temporarily forcing visibility
					showHide( [ elem ], true );
					restoreDisplay = elem.style.display || restoreDisplay;
					display = jQuery.css( elem, "display" );
					showHide( [ elem ] );
				}
			}
	
			// Animate inline elements as inline-block
			if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) {
				if ( jQuery.css( elem, "float" ) === "none" ) {
	
					// Restore the original display value at the end of pure show/hide animations
					if ( !propTween ) {
						anim.done( function() {
							style.display = restoreDisplay;
						} );
						if ( restoreDisplay == null ) {
							display = style.display;
							restoreDisplay = display === "none" ? "" : display;
						}
					}
					style.display = "inline-block";
				}
			}
		}
	
		if ( opts.overflow ) {
			style.overflow = "hidden";
			anim.always( function() {
				style.overflow = opts.overflow[ 0 ];
				style.overflowX = opts.overflow[ 1 ];
				style.overflowY = opts.overflow[ 2 ];
			} );
		}
	
		// Implement show/hide animations
		propTween = false;
		for ( prop in orig ) {
	
			// General show/hide setup for this element animation
			if ( !propTween ) {
				if ( dataShow ) {
					if ( "hidden" in dataShow ) {
						hidden = dataShow.hidden;
					}
				} else {
					dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } );
				}
	
				// Store hidden/visible for toggle so `.stop().toggle()` "reverses"
				if ( toggle ) {
					dataShow.hidden = !hidden;
				}
	
				// Show elements before animating them
				if ( hidden ) {
					showHide( [ elem ], true );
				}
	
				/* eslint-disable no-loop-func */
	
				anim.done( function() {
	
				/* eslint-enable no-loop-func */
	
					// The final step of a "hide" animation is actually hiding the element
					if ( !hidden ) {
						showHide( [ elem ] );
					}
					dataPriv.remove( elem, "fxshow" );
					for ( prop in orig ) {
						jQuery.style( elem, prop, orig[ prop ] );
					}
				} );
			}
	
			// Per-property setup
			propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
			if ( !( prop in dataShow ) ) {
				dataShow[ prop ] = propTween.start;
				if ( hidden ) {
					propTween.end = propTween.start;
					propTween.start = 0;
				}
			}
		}
	}
	
	function propFilter( props, specialEasing ) {
		var index, name, easing, value, hooks;
	
		// camelCase, specialEasing and expand cssHook pass
		for ( index in props ) {
			name = camelCase( index );
			easing = specialEasing[ name ];
			value = props[ index ];
			if ( Array.isArray( value ) ) {
				easing = value[ 1 ];
				value = props[ index ] = value[ 0 ];
			}
	
			if ( index !== name ) {
				props[ name ] = value;
				delete props[ index ];
			}
	
			hooks = jQuery.cssHooks[ name ];
			if ( hooks && "expand" in hooks ) {
				value = hooks.expand( value );
				delete props[ name ];
	
				// Not quite $.extend, this won't overwrite existing keys.
				// Reusing 'index' because we have the correct "name"
				for ( index in value ) {
					if ( !( index in props ) ) {
						props[ index ] = value[ index ];
						specialEasing[ index ] = easing;
					}
				}
			} else {
				specialEasing[ name ] = easing;
			}
		}
	}
	
	function Animation( elem, properties, options ) {
		var result,
			stopped,
			index = 0,
			length = Animation.prefilters.length,
			deferred = jQuery.Deferred().always( function() {
	
				// Don't match elem in the :animated selector
				delete tick.elem;
			} ),
			tick = function() {
				if ( stopped ) {
					return false;
				}
				var currentTime = fxNow || createFxNow(),
					remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
	
					// Support: Android 2.3 only
					// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)
					temp = remaining / animation.duration || 0,
					percent = 1 - temp,
					index = 0,
					length = animation.tweens.length;
	
				for ( ; index < length; index++ ) {
					animation.tweens[ index ].run( percent );
				}
	
				deferred.notifyWith( elem, [ animation, percent, remaining ] );
	
				// If there's more to do, yield
				if ( percent < 1 && length ) {
					return remaining;
				}
	
				// If this was an empty animation, synthesize a final progress notification
				if ( !length ) {
					deferred.notifyWith( elem, [ animation, 1, 0 ] );
				}
	
				// Resolve the animation and report its conclusion
				deferred.resolveWith( elem, [ animation ] );
				return false;
			},
			animation = deferred.promise( {
				elem: elem,
				props: jQuery.extend( {}, properties ),
				opts: jQuery.extend( true, {
					specialEasing: {},
					easing: jQuery.easing._default
				}, options ),
				originalProperties: properties,
				originalOptions: options,
				startTime: fxNow || createFxNow(),
				duration: options.duration,
				tweens: [],
				createTween: function( prop, end ) {
					var tween = jQuery.Tween( elem, animation.opts, prop, end,
							animation.opts.specialEasing[ prop ] || animation.opts.easing );
					animation.tweens.push( tween );
					return tween;
				},
				stop: function( gotoEnd ) {
					var index = 0,
	
						// If we are going to the end, we want to run all the tweens
						// otherwise we skip this part
						length = gotoEnd ? animation.tweens.length : 0;
					if ( stopped ) {
						return this;
					}
					stopped = true;
					for ( ; index < length; index++ ) {
						animation.tweens[ index ].run( 1 );
					}
	
					// Resolve when we played the last frame; otherwise, reject
					if ( gotoEnd ) {
						deferred.notifyWith( elem, [ animation, 1, 0 ] );
						deferred.resolveWith( elem, [ animation, gotoEnd ] );
					} else {
						deferred.rejectWith( elem, [ animation, gotoEnd ] );
					}
					return this;
				}
			} ),
			props = animation.props;
	
		propFilter( props, animation.opts.specialEasing );
	
		for ( ; index < length; index++ ) {
			result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );
			if ( result ) {
				if ( isFunction( result.stop ) ) {
					jQuery._queueHooks( animation.elem, animation.opts.queue ).stop =
						result.stop.bind( result );
				}
				return result;
			}
		}
	
		jQuery.map( props, createTween, animation );
	
		if ( isFunction( animation.opts.start ) ) {
			animation.opts.start.call( elem, animation );
		}
	
		// Attach callbacks from options
		animation
			.progress( animation.opts.progress )
			.done( animation.opts.done, animation.opts.complete )
			.fail( animation.opts.fail )
			.always( animation.opts.always );
	
		jQuery.fx.timer(
			jQuery.extend( tick, {
				elem: elem,
				anim: animation,
				queue: animation.opts.queue
			} )
		);
	
		return animation;
	}
	
	jQuery.Animation = jQuery.extend( Animation, {
	
		tweeners: {
			"*": [ function( prop, value ) {
				var tween = this.createTween( prop, value );
				adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );
				return tween;
			} ]
		},
	
		tweener: function( props, callback ) {
			if ( isFunction( props ) ) {
				callback = props;
				props = [ "*" ];
			} else {
				props = props.match( rnothtmlwhite );
			}
	
			var prop,
				index = 0,
				length = props.length;
	
			for ( ; index < length; index++ ) {
				prop = props[ index ];
				Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];
				Animation.tweeners[ prop ].unshift( callback );
			}
		},
	
		prefilters: [ defaultPrefilter ],
	
		prefilter: function( callback, prepend ) {
			if ( prepend ) {
				Animation.prefilters.unshift( callback );
			} else {
				Animation.prefilters.push( callback );
			}
		}
	} );
	
	jQuery.speed = function( speed, easing, fn ) {
		var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
			complete: fn || !fn && easing ||
				isFunction( speed ) && speed,
			duration: speed,
			easing: fn && easing || easing && !isFunction( easing ) && easing
		};
	
		// Go to the end state if fx are off
		if ( jQuery.fx.off ) {
			opt.duration = 0;
	
		} else {
			if ( typeof opt.duration !== "number" ) {
				if ( opt.duration in jQuery.fx.speeds ) {
					opt.duration = jQuery.fx.speeds[ opt.duration ];
	
				} else {
					opt.duration = jQuery.fx.speeds._default;
				}
			}
		}
	
		// Normalize opt.queue - true/undefined/null -> "fx"
		if ( opt.queue == null || opt.queue === true ) {
			opt.queue = "fx";
		}
	
		// Queueing
		opt.old = opt.complete;
	
		opt.complete = function() {
			if ( isFunction( opt.old ) ) {
				opt.old.call( this );
			}
	
			if ( opt.queue ) {
				jQuery.dequeue( this, opt.queue );
			}
		};
	
		return opt;
	};
	
	jQuery.fn.extend( {
		fadeTo: function( speed, to, easing, callback ) {
	
			// Show any hidden elements after setting opacity to 0
			return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show()
	
				// Animate to the value specified
				.end().animate( { opacity: to }, speed, easing, callback );
		},
		animate: function( prop, speed, easing, callback ) {
			var empty = jQuery.isEmptyObject( prop ),
				optall = jQuery.speed( speed, easing, callback ),
				doAnimation = function() {
	
					// Operate on a copy of prop so per-property easing won't be lost
					var anim = Animation( this, jQuery.extend( {}, prop ), optall );
	
					// Empty animations, or finishing resolves immediately
					if ( empty || dataPriv.get( this, "finish" ) ) {
						anim.stop( true );
					}
				};
				doAnimation.finish = doAnimation;
	
			return empty || optall.queue === false ?
				this.each( doAnimation ) :
				this.queue( optall.queue, doAnimation );
		},
		stop: function( type, clearQueue, gotoEnd ) {
			var stopQueue = function( hooks ) {
				var stop = hooks.stop;
				delete hooks.stop;
				stop( gotoEnd );
			};
	
			if ( typeof type !== "string" ) {
				gotoEnd = clearQueue;
				clearQueue = type;
				type = undefined;
			}
			if ( clearQueue && type !== false ) {
				this.queue( type || "fx", [] );
			}
	
			return this.each( function() {
				var dequeue = true,
					index = type != null && type + "queueHooks",
					timers = jQuery.timers,
					data = dataPriv.get( this );
	
				if ( index ) {
					if ( data[ index ] && data[ index ].stop ) {
						stopQueue( data[ index ] );
					}
				} else {
					for ( index in data ) {
						if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
							stopQueue( data[ index ] );
						}
					}
				}
	
				for ( index = timers.length; index--; ) {
					if ( timers[ index ].elem === this &&
						( type == null || timers[ index ].queue === type ) ) {
	
						timers[ index ].anim.stop( gotoEnd );
						dequeue = false;
						timers.splice( index, 1 );
					}
				}
	
				// Start the next in the queue if the last step wasn't forced.
				// Timers currently will call their complete callbacks, which
				// will dequeue but only if they were gotoEnd.
				if ( dequeue || !gotoEnd ) {
					jQuery.dequeue( this, type );
				}
			} );
		},
		finish: function( type ) {
			if ( type !== false ) {
				type = type || "fx";
			}
			return this.each( function() {
				var index,
					data = dataPriv.get( this ),
					queue = data[ type + "queue" ],
					hooks = data[ type + "queueHooks" ],
					timers = jQuery.timers,
					length = queue ? queue.length : 0;
	
				// Enable finishing flag on private data
				data.finish = true;
	
				// Empty the queue first
				jQuery.queue( this, type, [] );
	
				if ( hooks && hooks.stop ) {
					hooks.stop.call( this, true );
				}
	
				// Look for any active animations, and finish them
				for ( index = timers.length; index--; ) {
					if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
						timers[ index ].anim.stop( true );
						timers.splice( index, 1 );
					}
				}
	
				// Look for any animations in the old queue and finish them
				for ( index = 0; index < length; index++ ) {
					if ( queue[ index ] && queue[ index ].finish ) {
						queue[ index ].finish.call( this );
					}
				}
	
				// Turn off finishing flag
				delete data.finish;
			} );
		}
	} );
	
	jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) {
		var cssFn = jQuery.fn[ name ];
		jQuery.fn[ name ] = function( speed, easing, callback ) {
			return speed == null || typeof speed === "boolean" ?
				cssFn.apply( this, arguments ) :
				this.animate( genFx( name, true ), speed, easing, callback );
		};
	} );
	
	// Generate shortcuts for custom animations
	jQuery.each( {
		slideDown: genFx( "show" ),
		slideUp: genFx( "hide" ),
		slideToggle: genFx( "toggle" ),
		fadeIn: { opacity: "show" },
		fadeOut: { opacity: "hide" },
		fadeToggle: { opacity: "toggle" }
	}, function( name, props ) {
		jQuery.fn[ name ] = function( speed, easing, callback ) {
			return this.animate( props, speed, easing, callback );
		};
	} );
	
	jQuery.timers = [];
	jQuery.fx.tick = function() {
		var timer,
			i = 0,
			timers = jQuery.timers;
	
		fxNow = Date.now();
	
		for ( ; i < timers.length; i++ ) {
			timer = timers[ i ];
	
			// Run the timer and safely remove it when done (allowing for external removal)
			if ( !timer() && timers[ i ] === timer ) {
				timers.splice( i--, 1 );
			}
		}
	
		if ( !timers.length ) {
			jQuery.fx.stop();
		}
		fxNow = undefined;
	};
	
	jQuery.fx.timer = function( timer ) {
		jQuery.timers.push( timer );
		jQuery.fx.start();
	};
	
	jQuery.fx.interval = 13;
	jQuery.fx.start = function() {
		if ( inProgress ) {
			return;
		}
	
		inProgress = true;
		schedule();
	};
	
	jQuery.fx.stop = function() {
		inProgress = null;
	};
	
	jQuery.fx.speeds = {
		slow: 600,
		fast: 200,
	
		// Default speed
		_default: 400
	};
	
	
	// Based off of the plugin by Clint Helfers, with permission.
	// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
	jQuery.fn.delay = function( time, type ) {
		time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
		type = type || "fx";
	
		return this.queue( type, function( next, hooks ) {
			var timeout = window.setTimeout( next, time );
			hooks.stop = function() {
				window.clearTimeout( timeout );
			};
		} );
	};
	
	
	( function() {
		var input = document.createElement( "input" ),
			select = document.createElement( "select" ),
			opt = select.appendChild( document.createElement( "option" ) );
	
		input.type = "checkbox";
	
		// Support: Android <=4.3 only
		// Default value for a checkbox should be "on"
		support.checkOn = input.value !== "";
	
		// Support: IE <=11 only
		// Must access selectedIndex to make default options select
		support.optSelected = opt.selected;
	
		// Support: IE <=11 only
		// An input loses its value after becoming a radio
		input = document.createElement( "input" );
		input.value = "t";
		input.type = "radio";
		support.radioValue = input.value === "t";
	} )();
	
	
	var boolHook,
		attrHandle = jQuery.expr.attrHandle;
	
	jQuery.fn.extend( {
		attr: function( name, value ) {
			return access( this, jQuery.attr, name, value, arguments.length > 1 );
		},
	
		removeAttr: function( name ) {
			return this.each( function() {
				jQuery.removeAttr( this, name );
			} );
		}
	} );
	
	jQuery.extend( {
		attr: function( elem, name, value ) {
			var ret, hooks,
				nType = elem.nodeType;
	
			// Don't get/set attributes on text, comment and attribute nodes
			if ( nType === 3 || nType === 8 || nType === 2 ) {
				return;
			}
	
			// Fallback to prop when attributes are not supported
			if ( typeof elem.getAttribute === "undefined" ) {
				return jQuery.prop( elem, name, value );
			}
	
			// Attribute hooks are determined by the lowercase version
			// Grab necessary hook if one is defined
			if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
				hooks = jQuery.attrHooks[ name.toLowerCase() ] ||
					( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );
			}
	
			if ( value !== undefined ) {
				if ( value === null ) {
					jQuery.removeAttr( elem, name );
					return;
				}
	
				if ( hooks && "set" in hooks &&
					( ret = hooks.set( elem, value, name ) ) !== undefined ) {
					return ret;
				}
	
				elem.setAttribute( name, value + "" );
				return value;
			}
	
			if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
				return ret;
			}
	
			ret = jQuery.find.attr( elem, name );
	
			// Non-existent attributes return null, we normalize to undefined
			return ret == null ? undefined : ret;
		},
	
		attrHooks: {
			type: {
				set: function( elem, value ) {
					if ( !support.radioValue && value === "radio" &&
						nodeName( elem, "input" ) ) {
						var val = elem.value;
						elem.setAttribute( "type", value );
						if ( val ) {
							elem.value = val;
						}
						return value;
					}
				}
			}
		},
	
		removeAttr: function( elem, value ) {
			var name,
				i = 0,
	
				// Attribute names can contain non-HTML whitespace characters
				// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2
				attrNames = value && value.match( rnothtmlwhite );
	
			if ( attrNames && elem.nodeType === 1 ) {
				while ( ( name = attrNames[ i++ ] ) ) {
					elem.removeAttribute( name );
				}
			}
		}
	} );
	
	// Hooks for boolean attributes
	boolHook = {
		set: function( elem, value, name ) {
			if ( value === false ) {
	
				// Remove boolean attributes when set to false
				jQuery.removeAttr( elem, name );
			} else {
				elem.setAttribute( name, name );
			}
			return name;
		}
	};
	
	jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
		var getter = attrHandle[ name ] || jQuery.find.attr;
	
		attrHandle[ name ] = function( elem, name, isXML ) {
			var ret, handle,
				lowercaseName = name.toLowerCase();
	
			if ( !isXML ) {
	
				// Avoid an infinite loop by temporarily removing this function from the getter
				handle = attrHandle[ lowercaseName ];
				attrHandle[ lowercaseName ] = ret;
				ret = getter( elem, name, isXML ) != null ?
					lowercaseName :
					null;
				attrHandle[ lowercaseName ] = handle;
			}
			return ret;
		};
	} );
	
	
	
	
	var rfocusable = /^(?:input|select|textarea|button)$/i,
		rclickable = /^(?:a|area)$/i;
	
	jQuery.fn.extend( {
		prop: function( name, value ) {
			return access( this, jQuery.prop, name, value, arguments.length > 1 );
		},
	
		removeProp: function( name ) {
			return this.each( function() {
				delete this[ jQuery.propFix[ name ] || name ];
			} );
		}
	} );
	
	jQuery.extend( {
		prop: function( elem, name, value ) {
			var ret, hooks,
				nType = elem.nodeType;
	
			// Don't get/set properties on text, comment and attribute nodes
			if ( nType === 3 || nType === 8 || nType === 2 ) {
				return;
			}
	
			if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
	
				// Fix name and attach hooks
				name = jQuery.propFix[ name ] || name;
				hooks = jQuery.propHooks[ name ];
			}
	
			if ( value !== undefined ) {
				if ( hooks && "set" in hooks &&
					( ret = hooks.set( elem, value, name ) ) !== undefined ) {
					return ret;
				}
	
				return ( elem[ name ] = value );
			}
	
			if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
				return ret;
			}
	
			return elem[ name ];
		},
	
		propHooks: {
			tabIndex: {
				get: function( elem ) {
	
					// Support: IE <=9 - 11 only
					// elem.tabIndex doesn't always return the
					// correct value when it hasn't been explicitly set
					// https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
					// Use proper attribute retrieval(#12072)
					var tabindex = jQuery.find.attr( elem, "tabindex" );
	
					if ( tabindex ) {
						return parseInt( tabindex, 10 );
					}
	
					if (
						rfocusable.test( elem.nodeName ) ||
						rclickable.test( elem.nodeName ) &&
						elem.href
					) {
						return 0;
					}
	
					return -1;
				}
			}
		},
	
		propFix: {
			"for": "htmlFor",
			"class": "className"
		}
	} );
	
	// Support: IE <=11 only
	// Accessing the selectedIndex property
	// forces the browser to respect setting selected
	// on the option
	// The getter ensures a default option is selected
	// when in an optgroup
	// eslint rule "no-unused-expressions" is disabled for this code
	// since it considers such accessions noop
	if ( !support.optSelected ) {
		jQuery.propHooks.selected = {
			get: function( elem ) {
	
				/* eslint no-unused-expressions: "off" */
	
				var parent = elem.parentNode;
				if ( parent && parent.parentNode ) {
					parent.parentNode.selectedIndex;
				}
				return null;
			},
			set: function( elem ) {
	
				/* eslint no-unused-expressions: "off" */
	
				var parent = elem.parentNode;
				if ( parent ) {
					parent.selectedIndex;
	
					if ( parent.parentNode ) {
						parent.parentNode.selectedIndex;
					}
				}
			}
		};
	}
	
	jQuery.each( [
		"tabIndex",
		"readOnly",
		"maxLength",
		"cellSpacing",
		"cellPadding",
		"rowSpan",
		"colSpan",
		"useMap",
		"frameBorder",
		"contentEditable"
	], function() {
		jQuery.propFix[ this.toLowerCase() ] = this;
	} );
	
	
	
	
		// Strip and collapse whitespace according to HTML spec
		// https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace
		function stripAndCollapse( value ) {
			var tokens = value.match( rnothtmlwhite ) || [];
			return tokens.join( " " );
		}
	
	
	function getClass( elem ) {
		return elem.getAttribute && elem.getAttribute( "class" ) || "";
	}
	
	function classesToArray( value ) {
		if ( Array.isArray( value ) ) {
			return value;
		}
		if ( typeof value === "string" ) {
			return value.match( rnothtmlwhite ) || [];
		}
		return [];
	}
	
	jQuery.fn.extend( {
		addClass: function( value ) {
			var classes, elem, cur, curValue, clazz, j, finalValue,
				i = 0;
	
			if ( isFunction( value ) ) {
				return this.each( function( j ) {
					jQuery( this ).addClass( value.call( this, j, getClass( this ) ) );
				} );
			}
	
			classes = classesToArray( value );
	
			if ( classes.length ) {
				while ( ( elem = this[ i++ ] ) ) {
					curValue = getClass( elem );
					cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
	
					if ( cur ) {
						j = 0;
						while ( ( clazz = classes[ j++ ] ) ) {
							if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
								cur += clazz + " ";
							}
						}
	
						// Only assign if different to avoid unneeded rendering.
						finalValue = stripAndCollapse( cur );
						if ( curValue !== finalValue ) {
							elem.setAttribute( "class", finalValue );
						}
					}
				}
			}
	
			return this;
		},
	
		removeClass: function( value ) {
			var classes, elem, cur, curValue, clazz, j, finalValue,
				i = 0;
	
			if ( isFunction( value ) ) {
				return this.each( function( j ) {
					jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );
				} );
			}
	
			if ( !arguments.length ) {
				return this.attr( "class", "" );
			}
	
			classes = classesToArray( value );
	
			if ( classes.length ) {
				while ( ( elem = this[ i++ ] ) ) {
					curValue = getClass( elem );
	
					// This expression is here for better compressibility (see addClass)
					cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
	
					if ( cur ) {
						j = 0;
						while ( ( clazz = classes[ j++ ] ) ) {
	
							// Remove *all* instances
							while ( cur.indexOf( " " + clazz + " " ) > -1 ) {
								cur = cur.replace( " " + clazz + " ", " " );
							}
						}
	
						// Only assign if different to avoid unneeded rendering.
						finalValue = stripAndCollapse( cur );
						if ( curValue !== finalValue ) {
							elem.setAttribute( "class", finalValue );
						}
					}
				}
			}
	
			return this;
		},
	
		toggleClass: function( value, stateVal ) {
			var type = typeof value,
				isValidValue = type === "string" || Array.isArray( value );
	
			if ( typeof stateVal === "boolean" && isValidValue ) {
				return stateVal ? this.addClass( value ) : this.removeClass( value );
			}
	
			if ( isFunction( value ) ) {
				return this.each( function( i ) {
					jQuery( this ).toggleClass(
						value.call( this, i, getClass( this ), stateVal ),
						stateVal
					);
				} );
			}
	
			return this.each( function() {
				var className, i, self, classNames;
	
				if ( isValidValue ) {
	
					// Toggle individual class names
					i = 0;
					self = jQuery( this );
					classNames = classesToArray( value );
	
					while ( ( className = classNames[ i++ ] ) ) {
	
						// Check each className given, space separated list
						if ( self.hasClass( className ) ) {
							self.removeClass( className );
						} else {
							self.addClass( className );
						}
					}
	
				// Toggle whole class name
				} else if ( value === undefined || type === "boolean" ) {
					className = getClass( this );
					if ( className ) {
	
						// Store className if set
						dataPriv.set( this, "__className__", className );
					}
	
					// If the element has a class name or if we're passed `false`,
					// then remove the whole classname (if there was one, the above saved it).
					// Otherwise bring back whatever was previously saved (if anything),
					// falling back to the empty string if nothing was stored.
					if ( this.setAttribute ) {
						this.setAttribute( "class",
							className || value === false ?
							"" :
							dataPriv.get( this, "__className__" ) || ""
						);
					}
				}
			} );
		},
	
		hasClass: function( selector ) {
			var className, elem,
				i = 0;
	
			className = " " + selector + " ";
			while ( ( elem = this[ i++ ] ) ) {
				if ( elem.nodeType === 1 &&
					( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {
						return true;
				}
			}
	
			return false;
		}
	} );
	
	
	
	
	var rreturn = /\r/g;
	
	jQuery.fn.extend( {
		val: function( value ) {
			var hooks, ret, valueIsFunction,
				elem = this[ 0 ];
	
			if ( !arguments.length ) {
				if ( elem ) {
					hooks = jQuery.valHooks[ elem.type ] ||
						jQuery.valHooks[ elem.nodeName.toLowerCase() ];
	
					if ( hooks &&
						"get" in hooks &&
						( ret = hooks.get( elem, "value" ) ) !== undefined
					) {
						return ret;
					}
	
					ret = elem.value;
	
					// Handle most common string cases
					if ( typeof ret === "string" ) {
						return ret.replace( rreturn, "" );
					}
	
					// Handle cases where value is null/undef or number
					return ret == null ? "" : ret;
				}
	
				return;
			}
	
			valueIsFunction = isFunction( value );
	
			return this.each( function( i ) {
				var val;
	
				if ( this.nodeType !== 1 ) {
					return;
				}
	
				if ( valueIsFunction ) {
					val = value.call( this, i, jQuery( this ).val() );
				} else {
					val = value;
				}
	
				// Treat null/undefined as ""; convert numbers to string
				if ( val == null ) {
					val = "";
	
				} else if ( typeof val === "number" ) {
					val += "";
	
				} else if ( Array.isArray( val ) ) {
					val = jQuery.map( val, function( value ) {
						return value == null ? "" : value + "";
					} );
				}
	
				hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
	
				// If set returns undefined, fall back to normal setting
				if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) {
					this.value = val;
				}
			} );
		}
	} );
	
	jQuery.extend( {
		valHooks: {
			option: {
				get: function( elem ) {
	
					var val = jQuery.find.attr( elem, "value" );
					return val != null ?
						val :
	
						// Support: IE <=10 - 11 only
						// option.text throws exceptions (#14686, #14858)
						// Strip and collapse whitespace
						// https://html.spec.whatwg.org/#strip-and-collapse-whitespace
						stripAndCollapse( jQuery.text( elem ) );
				}
			},
			select: {
				get: function( elem ) {
					var value, option, i,
						options = elem.options,
						index = elem.selectedIndex,
						one = elem.type === "select-one",
						values = one ? null : [],
						max = one ? index + 1 : options.length;
	
					if ( index < 0 ) {
						i = max;
	
					} else {
						i = one ? index : 0;
					}
	
					// Loop through all the selected options
					for ( ; i < max; i++ ) {
						option = options[ i ];
	
						// Support: IE <=9 only
						// IE8-9 doesn't update selected after form reset (#2551)
						if ( ( option.selected || i === index ) &&
	
								// Don't return options that are disabled or in a disabled optgroup
								!option.disabled &&
								( !option.parentNode.disabled ||
									!nodeName( option.parentNode, "optgroup" ) ) ) {
	
							// Get the specific value for the option
							value = jQuery( option ).val();
	
							// We don't need an array for one selects
							if ( one ) {
								return value;
							}
	
							// Multi-Selects return an array
							values.push( value );
						}
					}
	
					return values;
				},
	
				set: function( elem, value ) {
					var optionSet, option,
						options = elem.options,
						values = jQuery.makeArray( value ),
						i = options.length;
	
					while ( i-- ) {
						option = options[ i ];
	
						/* eslint-disable no-cond-assign */
	
						if ( option.selected =
							jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1
						) {
							optionSet = true;
						}
	
						/* eslint-enable no-cond-assign */
					}
	
					// Force browsers to behave consistently when non-matching value is set
					if ( !optionSet ) {
						elem.selectedIndex = -1;
					}
					return values;
				}
			}
		}
	} );
	
	// Radios and checkboxes getter/setter
	jQuery.each( [ "radio", "checkbox" ], function() {
		jQuery.valHooks[ this ] = {
			set: function( elem, value ) {
				if ( Array.isArray( value ) ) {
					return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );
				}
			}
		};
		if ( !support.checkOn ) {
			jQuery.valHooks[ this ].get = function( elem ) {
				return elem.getAttribute( "value" ) === null ? "on" : elem.value;
			};
		}
	} );
	
	
	
	
	// Return jQuery for attributes-only inclusion
	
	
	support.focusin = "onfocusin" in window;
	
	
	var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
		stopPropagationCallback = function( e ) {
			e.stopPropagation();
		};
	
	jQuery.extend( jQuery.event, {
	
		trigger: function( event, data, elem, onlyHandlers ) {
	
			var i, cur, tmp, bubbleType, ontype, handle, special, lastElement,
				eventPath = [ elem || document ],
				type = hasOwn.call( event, "type" ) ? event.type : event,
				namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : [];
	
			cur = lastElement = tmp = elem = elem || document;
	
			// Don't do events on text and comment nodes
			if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
				return;
			}
	
			// focus/blur morphs to focusin/out; ensure we're not firing them right now
			if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
				return;
			}
	
			if ( type.indexOf( "." ) > -1 ) {
	
				// Namespaced trigger; create a regexp to match event type in handle()
				namespaces = type.split( "." );
				type = namespaces.shift();
				namespaces.sort();
			}
			ontype = type.indexOf( ":" ) < 0 && "on" + type;
	
			// Caller can pass in a jQuery.Event object, Object, or just an event type string
			event = event[ jQuery.expando ] ?
				event :
				new jQuery.Event( type, typeof event === "object" && event );
	
			// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
			event.isTrigger = onlyHandlers ? 2 : 3;
			event.namespace = namespaces.join( "." );
			event.rnamespace = event.namespace ?
				new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) :
				null;
	
			// Clean up the event in case it is being reused
			event.result = undefined;
			if ( !event.target ) {
				event.target = elem;
			}
	
			// Clone any incoming data and prepend the event, creating the handler arg list
			data = data == null ?
				[ event ] :
				jQuery.makeArray( data, [ event ] );
	
			// Allow special events to draw outside the lines
			special = jQuery.event.special[ type ] || {};
			if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
				return;
			}
	
			// Determine event propagation path in advance, per W3C events spec (#9951)
			// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
			if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {
	
				bubbleType = special.delegateType || type;
				if ( !rfocusMorph.test( bubbleType + type ) ) {
					cur = cur.parentNode;
				}
				for ( ; cur; cur = cur.parentNode ) {
					eventPath.push( cur );
					tmp = cur;
				}
	
				// Only add window if we got to document (e.g., not plain obj or detached DOM)
				if ( tmp === ( elem.ownerDocument || document ) ) {
					eventPath.push( tmp.defaultView || tmp.parentWindow || window );
				}
			}
	
			// Fire handlers on the event path
			i = 0;
			while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {
				lastElement = cur;
				event.type = i > 1 ?
					bubbleType :
					special.bindType || type;
	
				// jQuery handler
				handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] &&
					dataPriv.get( cur, "handle" );
				if ( handle ) {
					handle.apply( cur, data );
				}
	
				// Native handler
				handle = ontype && cur[ ontype ];
				if ( handle && handle.apply && acceptData( cur ) ) {
					event.result = handle.apply( cur, data );
					if ( event.result === false ) {
						event.preventDefault();
					}
				}
			}
			event.type = type;
	
			// If nobody prevented the default action, do it now
			if ( !onlyHandlers && !event.isDefaultPrevented() ) {
	
				if ( ( !special._default ||
					special._default.apply( eventPath.pop(), data ) === false ) &&
					acceptData( elem ) ) {
	
					// Call a native DOM method on the target with the same name as the event.
					// Don't do default actions on window, that's where global variables be (#6170)
					if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {
	
						// Don't re-trigger an onFOO event when we call its FOO() method
						tmp = elem[ ontype ];
	
						if ( tmp ) {
							elem[ ontype ] = null;
						}
	
						// Prevent re-triggering of the same event, since we already bubbled it above
						jQuery.event.triggered = type;
	
						if ( event.isPropagationStopped() ) {
							lastElement.addEventListener( type, stopPropagationCallback );
						}
	
						elem[ type ]();
	
						if ( event.isPropagationStopped() ) {
							lastElement.removeEventListener( type, stopPropagationCallback );
						}
	
						jQuery.event.triggered = undefined;
	
						if ( tmp ) {
							elem[ ontype ] = tmp;
						}
					}
				}
			}
	
			return event.result;
		},
	
		// Piggyback on a donor event to simulate a different one
		// Used only for `focus(in | out)` events
		simulate: function( type, elem, event ) {
			var e = jQuery.extend(
				new jQuery.Event(),
				event,
				{
					type: type,
					isSimulated: true
				}
			);
	
			jQuery.event.trigger( e, null, elem );
		}
	
	} );
	
	jQuery.fn.extend( {
	
		trigger: function( type, data ) {
			return this.each( function() {
				jQuery.event.trigger( type, data, this );
			} );
		},
		triggerHandler: function( type, data ) {
			var elem = this[ 0 ];
			if ( elem ) {
				return jQuery.event.trigger( type, data, elem, true );
			}
		}
	} );
	
	
	// Support: Firefox <=44
	// Firefox doesn't have focus(in | out) events
	// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
	//
	// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1
	// focus(in | out) events fire after focus & blur events,
	// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
	// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857
	if ( !support.focusin ) {
		jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) {
	
			// Attach a single capturing handler on the document while someone wants focusin/focusout
			var handler = function( event ) {
				jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );
			};
	
			jQuery.event.special[ fix ] = {
				setup: function() {
					var doc = this.ownerDocument || this,
						attaches = dataPriv.access( doc, fix );
	
					if ( !attaches ) {
						doc.addEventListener( orig, handler, true );
					}
					dataPriv.access( doc, fix, ( attaches || 0 ) + 1 );
				},
				teardown: function() {
					var doc = this.ownerDocument || this,
						attaches = dataPriv.access( doc, fix ) - 1;
	
					if ( !attaches ) {
						doc.removeEventListener( orig, handler, true );
						dataPriv.remove( doc, fix );
	
					} else {
						dataPriv.access( doc, fix, attaches );
					}
				}
			};
		} );
	}
	var location = window.location;
	
	var nonce = Date.now();
	
	var rquery = ( /\?/ );
	
	
	
	// Cross-browser xml parsing
	jQuery.parseXML = function( data ) {
		var xml;
		if ( !data || typeof data !== "string" ) {
			return null;
		}
	
		// Support: IE 9 - 11 only
		// IE throws on parseFromString with invalid input.
		try {
			xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
		} catch ( e ) {
			xml = undefined;
		}
	
		if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
			jQuery.error( "Invalid XML: " + data );
		}
		return xml;
	};
	
	
	var
		rbracket = /\[\]$/,
		rCRLF = /\r?\n/g,
		rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
		rsubmittable = /^(?:input|select|textarea|keygen)/i;
	
	function buildParams( prefix, obj, traditional, add ) {
		var name;
	
		if ( Array.isArray( obj ) ) {
	
			// Serialize array item.
			jQuery.each( obj, function( i, v ) {
				if ( traditional || rbracket.test( prefix ) ) {
	
					// Treat each array item as a scalar.
					add( prefix, v );
	
				} else {
	
					// Item is non-scalar (array or object), encode its numeric index.
					buildParams(
						prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]",
						v,
						traditional,
						add
					);
				}
			} );
	
		} else if ( !traditional && toType( obj ) === "object" ) {
	
			// Serialize object item.
			for ( name in obj ) {
				buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
			}
	
		} else {
	
			// Serialize scalar item.
			add( prefix, obj );
		}
	}
	
	// Serialize an array of form elements or a set of
	// key/values into a query string
	jQuery.param = function( a, traditional ) {
		var prefix,
			s = [],
			add = function( key, valueOrFunction ) {
	
				// If value is a function, invoke it and use its return value
				var value = isFunction( valueOrFunction ) ?
					valueOrFunction() :
					valueOrFunction;
	
				s[ s.length ] = encodeURIComponent( key ) + "=" +
					encodeURIComponent( value == null ? "" : value );
			};
	
		if ( a == null ) {
			return "";
		}
	
		// If an array was passed in, assume that it is an array of form elements.
		if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
	
			// Serialize the form elements
			jQuery.each( a, function() {
				add( this.name, this.value );
			} );
	
		} else {
	
			// If traditional, encode the "old" way (the way 1.3.2 or older
			// did it), otherwise encode params recursively.
			for ( prefix in a ) {
				buildParams( prefix, a[ prefix ], traditional, add );
			}
		}
	
		// Return the resulting serialization
		return s.join( "&" );
	};
	
	jQuery.fn.extend( {
		serialize: function() {
			return jQuery.param( this.serializeArray() );
		},
		serializeArray: function() {
			return this.map( function() {
	
				// Can add propHook for "elements" to filter or add form elements
				var elements = jQuery.prop( this, "elements" );
				return elements ? jQuery.makeArray( elements ) : this;
			} )
			.filter( function() {
				var type = this.type;
	
				// Use .is( ":disabled" ) so that fieldset[disabled] works
				return this.name && !jQuery( this ).is( ":disabled" ) &&
					rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
					( this.checked || !rcheckableType.test( type ) );
			} )
			.map( function( i, elem ) {
				var val = jQuery( this ).val();
	
				if ( val == null ) {
					return null;
				}
	
				if ( Array.isArray( val ) ) {
					return jQuery.map( val, function( val ) {
						return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
					} );
				}
	
				return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
			} ).get();
		}
	} );
	
	
	var
		r20 = /%20/g,
		rhash = /#.*$/,
		rantiCache = /([?&])_=[^&]*/,
		rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
	
		// #7653, #8125, #8152: local protocol detection
		rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
		rnoContent = /^(?:GET|HEAD)$/,
		rprotocol = /^\/\//,
	
		/* Prefilters
		 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
		 * 2) These are called:
		 *    - BEFORE asking for a transport
		 *    - AFTER param serialization (s.data is a string if s.processData is true)
		 * 3) key is the dataType
		 * 4) the catchall symbol "*" can be used
		 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
		 */
		prefilters = {},
	
		/* Transports bindings
		 * 1) key is the dataType
		 * 2) the catchall symbol "*" can be used
		 * 3) selection will start with transport dataType and THEN go to "*" if needed
		 */
		transports = {},
	
		// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
		allTypes = "*/".concat( "*" ),
	
		// Anchor tag for parsing the document origin
		originAnchor = document.createElement( "a" );
		originAnchor.href = location.href;
	
	// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
	function addToPrefiltersOrTransports( structure ) {
	
		// dataTypeExpression is optional and defaults to "*"
		return function( dataTypeExpression, func ) {
	
			if ( typeof dataTypeExpression !== "string" ) {
				func = dataTypeExpression;
				dataTypeExpression = "*";
			}
	
			var dataType,
				i = 0,
				dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];
	
			if ( isFunction( func ) ) {
	
				// For each dataType in the dataTypeExpression
				while ( ( dataType = dataTypes[ i++ ] ) ) {
	
					// Prepend if requested
					if ( dataType[ 0 ] === "+" ) {
						dataType = dataType.slice( 1 ) || "*";
						( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );
	
					// Otherwise append
					} else {
						( structure[ dataType ] = structure[ dataType ] || [] ).push( func );
					}
				}
			}
		};
	}
	
	// Base inspection function for prefilters and transports
	function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
	
		var inspected = {},
			seekingTransport = ( structure === transports );
	
		function inspect( dataType ) {
			var selected;
			inspected[ dataType ] = true;
			jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
				var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
				if ( typeof dataTypeOrTransport === "string" &&
					!seekingTransport && !inspected[ dataTypeOrTransport ] ) {
	
					options.dataTypes.unshift( dataTypeOrTransport );
					inspect( dataTypeOrTransport );
					return false;
				} else if ( seekingTransport ) {
					return !( selected = dataTypeOrTransport );
				}
			} );
			return selected;
		}
	
		return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
	}
	
	// A special extend for ajax options
	// that takes "flat" options (not to be deep extended)
	// Fixes #9887
	function ajaxExtend( target, src ) {
		var key, deep,
			flatOptions = jQuery.ajaxSettings.flatOptions || {};
	
		for ( key in src ) {
			if ( src[ key ] !== undefined ) {
				( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
			}
		}
		if ( deep ) {
			jQuery.extend( true, target, deep );
		}
	
		return target;
	}
	
	/* Handles responses to an ajax request:
	 * - finds the right dataType (mediates between content-type and expected dataType)
	 * - returns the corresponding response
	 */
	function ajaxHandleResponses( s, jqXHR, responses ) {
	
		var ct, type, finalDataType, firstDataType,
			contents = s.contents,
			dataTypes = s.dataTypes;
	
		// Remove auto dataType and get content-type in the process
		while ( dataTypes[ 0 ] === "*" ) {
			dataTypes.shift();
			if ( ct === undefined ) {
				ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" );
			}
		}
	
		// Check if we're dealing with a known content-type
		if ( ct ) {
			for ( type in contents ) {
				if ( contents[ type ] && contents[ type ].test( ct ) ) {
					dataTypes.unshift( type );
					break;
				}
			}
		}
	
		// Check to see if we have a response for the expected dataType
		if ( dataTypes[ 0 ] in responses ) {
			finalDataType = dataTypes[ 0 ];
		} else {
	
			// Try convertible dataTypes
			for ( type in responses ) {
				if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) {
					finalDataType = type;
					break;
				}
				if ( !firstDataType ) {
					firstDataType = type;
				}
			}
	
			// Or just use first one
			finalDataType = finalDataType || firstDataType;
		}
	
		// If we found a dataType
		// We add the dataType to the list if needed
		// and return the corresponding response
		if ( finalDataType ) {
			if ( finalDataType !== dataTypes[ 0 ] ) {
				dataTypes.unshift( finalDataType );
			}
			return responses[ finalDataType ];
		}
	}
	
	/* Chain conversions given the request and the original response
	 * Also sets the responseXXX fields on the jqXHR instance
	 */
	function ajaxConvert( s, response, jqXHR, isSuccess ) {
		var conv2, current, conv, tmp, prev,
			converters = {},
	
			// Work with a copy of dataTypes in case we need to modify it for conversion
			dataTypes = s.dataTypes.slice();
	
		// Create converters map with lowercased keys
		if ( dataTypes[ 1 ] ) {
			for ( conv in s.converters ) {
				converters[ conv.toLowerCase() ] = s.converters[ conv ];
			}
		}
	
		current = dataTypes.shift();
	
		// Convert to each sequential dataType
		while ( current ) {
	
			if ( s.responseFields[ current ] ) {
				jqXHR[ s.responseFields[ current ] ] = response;
			}
	
			// Apply the dataFilter if provided
			if ( !prev && isSuccess && s.dataFilter ) {
				response = s.dataFilter( response, s.dataType );
			}
	
			prev = current;
			current = dataTypes.shift();
	
			if ( current ) {
	
				// There's only work to do if current dataType is non-auto
				if ( current === "*" ) {
	
					current = prev;
	
				// Convert response if prev dataType is non-auto and differs from current
				} else if ( prev !== "*" && prev !== current ) {
	
					// Seek a direct converter
					conv = converters[ prev + " " + current ] || converters[ "* " + current ];
	
					// If none found, seek a pair
					if ( !conv ) {
						for ( conv2 in converters ) {
	
							// If conv2 outputs current
							tmp = conv2.split( " " );
							if ( tmp[ 1 ] === current ) {
	
								// If prev can be converted to accepted input
								conv = converters[ prev + " " + tmp[ 0 ] ] ||
									converters[ "* " + tmp[ 0 ] ];
								if ( conv ) {
	
									// Condense equivalence converters
									if ( conv === true ) {
										conv = converters[ conv2 ];
	
									// Otherwise, insert the intermediate dataType
									} else if ( converters[ conv2 ] !== true ) {
										current = tmp[ 0 ];
										dataTypes.unshift( tmp[ 1 ] );
									}
									break;
								}
							}
						}
					}
	
					// Apply converter (if not an equivalence)
					if ( conv !== true ) {
	
						// Unless errors are allowed to bubble, catch and return them
						if ( conv && s.throws ) {
							response = conv( response );
						} else {
							try {
								response = conv( response );
							} catch ( e ) {
								return {
									state: "parsererror",
									error: conv ? e : "No conversion from " + prev + " to " + current
								};
							}
						}
					}
				}
			}
		}
	
		return { state: "success", data: response };
	}
	
	jQuery.extend( {
	
		// Counter for holding the number of active queries
		active: 0,
	
		// Last-Modified header cache for next request
		lastModified: {},
		etag: {},
	
		ajaxSettings: {
			url: location.href,
			type: "GET",
			isLocal: rlocalProtocol.test( location.protocol ),
			global: true,
			processData: true,
			async: true,
			contentType: "application/x-www-form-urlencoded; charset=UTF-8",
	
			/*
			timeout: 0,
			data: null,
			dataType: null,
			username: null,
			password: null,
			cache: null,
			throws: false,
			traditional: false,
			headers: {},
			*/
	
			accepts: {
				"*": allTypes,
				text: "text/plain",
				html: "text/html",
				xml: "application/xml, text/xml",
				json: "application/json, text/javascript"
			},
	
			contents: {
				xml: /\bxml\b/,
				html: /\bhtml/,
				json: /\bjson\b/
			},
	
			responseFields: {
				xml: "responseXML",
				text: "responseText",
				json: "responseJSON"
			},
	
			// Data converters
			// Keys separate source (or catchall "*") and destination types with a single space
			converters: {
	
				// Convert anything to text
				"* text": String,
	
				// Text to html (true = no transformation)
				"text html": true,
	
				// Evaluate text as a json expression
				"text json": JSON.parse,
	
				// Parse text as xml
				"text xml": jQuery.parseXML
			},
	
			// For options that shouldn't be deep extended:
			// you can add your own custom options here if
			// and when you create one that shouldn't be
			// deep extended (see ajaxExtend)
			flatOptions: {
				url: true,
				context: true
			}
		},
	
		// Creates a full fledged settings object into target
		// with both ajaxSettings and settings fields.
		// If target is omitted, writes into ajaxSettings.
		ajaxSetup: function( target, settings ) {
			return settings ?
	
				// Building a settings object
				ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
	
				// Extending ajaxSettings
				ajaxExtend( jQuery.ajaxSettings, target );
		},
	
		ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
		ajaxTransport: addToPrefiltersOrTransports( transports ),
	
		// Main method
		ajax: function( url, options ) {
	
			// If url is an object, simulate pre-1.5 signature
			if ( typeof url === "object" ) {
				options = url;
				url = undefined;
			}
	
			// Force options to be an object
			options = options || {};
	
			var transport,
	
				// URL without anti-cache param
				cacheURL,
	
				// Response headers
				responseHeadersString,
				responseHeaders,
	
				// timeout handle
				timeoutTimer,
	
				// Url cleanup var
				urlAnchor,
	
				// Request state (becomes false upon send and true upon completion)
				completed,
	
				// To know if global events are to be dispatched
				fireGlobals,
	
				// Loop variable
				i,
	
				// uncached part of the url
				uncached,
	
				// Create the final options object
				s = jQuery.ajaxSetup( {}, options ),
	
				// Callbacks context
				callbackContext = s.context || s,
	
				// Context for global events is callbackContext if it is a DOM node or jQuery collection
				globalEventContext = s.context &&
					( callbackContext.nodeType || callbackContext.jquery ) ?
						jQuery( callbackContext ) :
						jQuery.event,
	
				// Deferreds
				deferred = jQuery.Deferred(),
				completeDeferred = jQuery.Callbacks( "once memory" ),
	
				// Status-dependent callbacks
				statusCode = s.statusCode || {},
	
				// Headers (they are sent all at once)
				requestHeaders = {},
				requestHeadersNames = {},
	
				// Default abort message
				strAbort = "canceled",
	
				// Fake xhr
				jqXHR = {
					readyState: 0,
	
					// Builds headers hashtable if needed
					getResponseHeader: function( key ) {
						var match;
						if ( completed ) {
							if ( !responseHeaders ) {
								responseHeaders = {};
								while ( ( match = rheaders.exec( responseHeadersString ) ) ) {
									responseHeaders[ match[ 1 ].toLowerCase() + " " ] =
										( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] )
											.concat( match[ 2 ] );
								}
							}
							match = responseHeaders[ key.toLowerCase() + " " ];
						}
						return match == null ? null : match.join( ", " );
					},
	
					// Raw string
					getAllResponseHeaders: function() {
						return completed ? responseHeadersString : null;
					},
	
					// Caches the header
					setRequestHeader: function( name, value ) {
						if ( completed == null ) {
							name = requestHeadersNames[ name.toLowerCase() ] =
								requestHeadersNames[ name.toLowerCase() ] || name;
							requestHeaders[ name ] = value;
						}
						return this;
					},
	
					// Overrides response content-type header
					overrideMimeType: function( type ) {
						if ( completed == null ) {
							s.mimeType = type;
						}
						return this;
					},
	
					// Status-dependent callbacks
					statusCode: function( map ) {
						var code;
						if ( map ) {
							if ( completed ) {
	
								// Execute the appropriate callbacks
								jqXHR.always( map[ jqXHR.status ] );
							} else {
	
								// Lazy-add the new callbacks in a way that preserves old ones
								for ( code in map ) {
									statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
								}
							}
						}
						return this;
					},
	
					// Cancel the request
					abort: function( statusText ) {
						var finalText = statusText || strAbort;
						if ( transport ) {
							transport.abort( finalText );
						}
						done( 0, finalText );
						return this;
					}
				};
	
			// Attach deferreds
			deferred.promise( jqXHR );
	
			// Add protocol if not provided (prefilters might expect it)
			// Handle falsy url in the settings object (#10093: consistency with old signature)
			// We also use the url parameter if available
			s.url = ( ( url || s.url || location.href ) + "" )
				.replace( rprotocol, location.protocol + "//" );
	
			// Alias method option to type as per ticket #12004
			s.type = options.method || options.type || s.method || s.type;
	
			// Extract dataTypes list
			s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ];
	
			// A cross-domain request is in order when the origin doesn't match the current origin.
			if ( s.crossDomain == null ) {
				urlAnchor = document.createElement( "a" );
	
				// Support: IE <=8 - 11, Edge 12 - 15
				// IE throws exception on accessing the href property if url is malformed,
				// e.g. http://example.com:80x/
				try {
					urlAnchor.href = s.url;
	
					// Support: IE <=8 - 11 only
					// Anchor's host property isn't correctly set when s.url is relative
					urlAnchor.href = urlAnchor.href;
					s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !==
						urlAnchor.protocol + "//" + urlAnchor.host;
				} catch ( e ) {
	
					// If there is an error parsing the URL, assume it is crossDomain,
					// it can be rejected by the transport if it is invalid
					s.crossDomain = true;
				}
			}
	
			// Convert data if not already a string
			if ( s.data && s.processData && typeof s.data !== "string" ) {
				s.data = jQuery.param( s.data, s.traditional );
			}
	
			// Apply prefilters
			inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
	
			// If request was aborted inside a prefilter, stop there
			if ( completed ) {
				return jqXHR;
			}
	
			// We can fire global events as of now if asked to
			// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
			fireGlobals = jQuery.event && s.global;
	
			// Watch for a new set of requests
			if ( fireGlobals && jQuery.active++ === 0 ) {
				jQuery.event.trigger( "ajaxStart" );
			}
	
			// Uppercase the type
			s.type = s.type.toUpperCase();
	
			// Determine if request has content
			s.hasContent = !rnoContent.test( s.type );
	
			// Save the URL in case we're toying with the If-Modified-Since
			// and/or If-None-Match header later on
			// Remove hash to simplify url manipulation
			cacheURL = s.url.replace( rhash, "" );
	
			// More options handling for requests with no content
			if ( !s.hasContent ) {
	
				// Remember the hash so we can put it back
				uncached = s.url.slice( cacheURL.length );
	
				// If data is available and should be processed, append data to url
				if ( s.data && ( s.processData || typeof s.data === "string" ) ) {
					cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data;
	
					// #9682: remove data so that it's not used in an eventual retry
					delete s.data;
				}
	
				// Add or update anti-cache param if needed
				if ( s.cache === false ) {
					cacheURL = cacheURL.replace( rantiCache, "$1" );
					uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached;
				}
	
				// Put hash and anti-cache on the URL that will be requested (gh-1732)
				s.url = cacheURL + uncached;
	
			// Change '%20' to '+' if this is encoded form body content (gh-2658)
			} else if ( s.data && s.processData &&
				( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) {
				s.data = s.data.replace( r20, "+" );
			}
	
			// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
			if ( s.ifModified ) {
				if ( jQuery.lastModified[ cacheURL ] ) {
					jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
				}
				if ( jQuery.etag[ cacheURL ] ) {
					jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
				}
			}
	
			// Set the correct header, if data is being sent
			if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
				jqXHR.setRequestHeader( "Content-Type", s.contentType );
			}
	
			// Set the Accepts header for the server, depending on the dataType
			jqXHR.setRequestHeader(
				"Accept",
				s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?
					s.accepts[ s.dataTypes[ 0 ] ] +
						( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
					s.accepts[ "*" ]
			);
	
			// Check for headers option
			for ( i in s.headers ) {
				jqXHR.setRequestHeader( i, s.headers[ i ] );
			}
	
			// Allow custom headers/mimetypes and early abort
			if ( s.beforeSend &&
				( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {
	
				// Abort if not done already and return
				return jqXHR.abort();
			}
	
			// Aborting is no longer a cancellation
			strAbort = "abort";
	
			// Install callbacks on deferreds
			completeDeferred.add( s.complete );
			jqXHR.done( s.success );
			jqXHR.fail( s.error );
	
			// Get transport
			transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
	
			// If no transport, we auto-abort
			if ( !transport ) {
				done( -1, "No Transport" );
			} else {
				jqXHR.readyState = 1;
	
				// Send global event
				if ( fireGlobals ) {
					globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
				}
	
				// If request was aborted inside ajaxSend, stop there
				if ( completed ) {
					return jqXHR;
				}
	
				// Timeout
				if ( s.async && s.timeout > 0 ) {
					timeoutTimer = window.setTimeout( function() {
						jqXHR.abort( "timeout" );
					}, s.timeout );
				}
	
				try {
					completed = false;
					transport.send( requestHeaders, done );
				} catch ( e ) {
	
					// Rethrow post-completion exceptions
					if ( completed ) {
						throw e;
					}
	
					// Propagate others as results
					done( -1, e );
				}
			}
	
			// Callback for when everything is done
			function done( status, nativeStatusText, responses, headers ) {
				var isSuccess, success, error, response, modified,
					statusText = nativeStatusText;
	
				// Ignore repeat invocations
				if ( completed ) {
					return;
				}
	
				completed = true;
	
				// Clear timeout if it exists
				if ( timeoutTimer ) {
					window.clearTimeout( timeoutTimer );
				}
	
				// Dereference transport for early garbage collection
				// (no matter how long the jqXHR object will be used)
				transport = undefined;
	
				// Cache response headers
				responseHeadersString = headers || "";
	
				// Set readyState
				jqXHR.readyState = status > 0 ? 4 : 0;
	
				// Determine if successful
				isSuccess = status >= 200 && status < 300 || status === 304;
	
				// Get response data
				if ( responses ) {
					response = ajaxHandleResponses( s, jqXHR, responses );
				}
	
				// Convert no matter what (that way responseXXX fields are always set)
				response = ajaxConvert( s, response, jqXHR, isSuccess );
	
				// If successful, handle type chaining
				if ( isSuccess ) {
	
					// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
					if ( s.ifModified ) {
						modified = jqXHR.getResponseHeader( "Last-Modified" );
						if ( modified ) {
							jQuery.lastModified[ cacheURL ] = modified;
						}
						modified = jqXHR.getResponseHeader( "etag" );
						if ( modified ) {
							jQuery.etag[ cacheURL ] = modified;
						}
					}
	
					// if no content
					if ( status === 204 || s.type === "HEAD" ) {
						statusText = "nocontent";
	
					// if not modified
					} else if ( status === 304 ) {
						statusText = "notmodified";
	
					// If we have data, let's convert it
					} else {
						statusText = response.state;
						success = response.data;
						error = response.error;
						isSuccess = !error;
					}
				} else {
	
					// Extract error from statusText and normalize for non-aborts
					error = statusText;
					if ( status || !statusText ) {
						statusText = "error";
						if ( status < 0 ) {
							status = 0;
						}
					}
				}
	
				// Set data for the fake xhr object
				jqXHR.status = status;
				jqXHR.statusText = ( nativeStatusText || statusText ) + "";
	
				// Success/Error
				if ( isSuccess ) {
					deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
				} else {
					deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
				}
	
				// Status-dependent callbacks
				jqXHR.statusCode( statusCode );
				statusCode = undefined;
	
				if ( fireGlobals ) {
					globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
						[ jqXHR, s, isSuccess ? success : error ] );
				}
	
				// Complete
				completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
	
				if ( fireGlobals ) {
					globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
	
					// Handle the global AJAX counter
					if ( !( --jQuery.active ) ) {
						jQuery.event.trigger( "ajaxStop" );
					}
				}
			}
	
			return jqXHR;
		},
	
		getJSON: function( url, data, callback ) {
			return jQuery.get( url, data, callback, "json" );
		},
	
		getScript: function( url, callback ) {
			return jQuery.get( url, undefined, callback, "script" );
		}
	} );
	
	jQuery.each( [ "get", "post" ], function( i, method ) {
		jQuery[ method ] = function( url, data, callback, type ) {
	
			// Shift arguments if data argument was omitted
			if ( isFunction( data ) ) {
				type = type || callback;
				callback = data;
				data = undefined;
			}
	
			// The url can be an options object (which then must have .url)
			return jQuery.ajax( jQuery.extend( {
				url: url,
				type: method,
				dataType: type,
				data: data,
				success: callback
			}, jQuery.isPlainObject( url ) && url ) );
		};
	} );
	
	
	jQuery._evalUrl = function( url, options ) {
		return jQuery.ajax( {
			url: url,
	
			// Make this explicit, since user can override this through ajaxSetup (#11264)
			type: "GET",
			dataType: "script",
			cache: true,
			async: false,
			global: false,
	
			// Only evaluate the response if it is successful (gh-4126)
			// dataFilter is not invoked for failure responses, so using it instead
			// of the default converter is kludgy but it works.
			converters: {
				"text script": function() {}
			},
			dataFilter: function( response ) {
				jQuery.globalEval( response, options );
			}
		} );
	};
	
	
	jQuery.fn.extend( {
		wrapAll: function( html ) {
			var wrap;
	
			if ( this[ 0 ] ) {
				if ( isFunction( html ) ) {
					html = html.call( this[ 0 ] );
				}
	
				// The elements to wrap the target around
				wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
	
				if ( this[ 0 ].parentNode ) {
					wrap.insertBefore( this[ 0 ] );
				}
	
				wrap.map( function() {
					var elem = this;
	
					while ( elem.firstElementChild ) {
						elem = elem.firstElementChild;
					}
	
					return elem;
				} ).append( this );
			}
	
			return this;
		},
	
		wrapInner: function( html ) {
			if ( isFunction( html ) ) {
				return this.each( function( i ) {
					jQuery( this ).wrapInner( html.call( this, i ) );
				} );
			}
	
			return this.each( function() {
				var self = jQuery( this ),
					contents = self.contents();
	
				if ( contents.length ) {
					contents.wrapAll( html );
	
				} else {
					self.append( html );
				}
			} );
		},
	
		wrap: function( html ) {
			var htmlIsFunction = isFunction( html );
	
			return this.each( function( i ) {
				jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );
			} );
		},
	
		unwrap: function( selector ) {
			this.parent( selector ).not( "body" ).each( function() {
				jQuery( this ).replaceWith( this.childNodes );
			} );
			return this;
		}
	} );
	
	
	jQuery.expr.pseudos.hidden = function( elem ) {
		return !jQuery.expr.pseudos.visible( elem );
	};
	jQuery.expr.pseudos.visible = function( elem ) {
		return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );
	};
	
	
	
	
	jQuery.ajaxSettings.xhr = function() {
		try {
			return new window.XMLHttpRequest();
		} catch ( e ) {}
	};
	
	var xhrSuccessStatus = {
	
			// File protocol always yields status code 0, assume 200
			0: 200,
	
			// Support: IE <=9 only
			// #1450: sometimes IE returns 1223 when it should be 204
			1223: 204
		},
		xhrSupported = jQuery.ajaxSettings.xhr();
	
	support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
	support.ajax = xhrSupported = !!xhrSupported;
	
	jQuery.ajaxTransport( function( options ) {
		var callback, errorCallback;
	
		// Cross domain only allowed if supported through XMLHttpRequest
		if ( support.cors || xhrSupported && !options.crossDomain ) {
			return {
				send: function( headers, complete ) {
					var i,
						xhr = options.xhr();
	
					xhr.open(
						options.type,
						options.url,
						options.async,
						options.username,
						options.password
					);
	
					// Apply custom fields if provided
					if ( options.xhrFields ) {
						for ( i in options.xhrFields ) {
							xhr[ i ] = options.xhrFields[ i ];
						}
					}
	
					// Override mime type if needed
					if ( options.mimeType && xhr.overrideMimeType ) {
						xhr.overrideMimeType( options.mimeType );
					}
	
					// X-Requested-With header
					// For cross-domain requests, seeing as conditions for a preflight are
					// akin to a jigsaw puzzle, we simply never set it to be sure.
					// (it can always be set on a per-request basis or even using ajaxSetup)
					// For same-domain requests, won't change header if already provided.
					if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) {
						headers[ "X-Requested-With" ] = "XMLHttpRequest";
					}
	
					// Set headers
					for ( i in headers ) {
						xhr.setRequestHeader( i, headers[ i ] );
					}
	
					// Callback
					callback = function( type ) {
						return function() {
							if ( callback ) {
								callback = errorCallback = xhr.onload =
									xhr.onerror = xhr.onabort = xhr.ontimeout =
										xhr.onreadystatechange = null;
	
								if ( type === "abort" ) {
									xhr.abort();
								} else if ( type === "error" ) {
	
									// Support: IE <=9 only
									// On a manual native abort, IE9 throws
									// errors on any property access that is not readyState
									if ( typeof xhr.status !== "number" ) {
										complete( 0, "error" );
									} else {
										complete(
	
											// File: protocol always yields status 0; see #8605, #14207
											xhr.status,
											xhr.statusText
										);
									}
								} else {
									complete(
										xhrSuccessStatus[ xhr.status ] || xhr.status,
										xhr.statusText,
	
										// Support: IE <=9 only
										// IE9 has no XHR2 but throws on binary (trac-11426)
										// For XHR2 non-text, let the caller handle it (gh-2498)
										( xhr.responseType || "text" ) !== "text"  ||
										typeof xhr.responseText !== "string" ?
											{ binary: xhr.response } :
											{ text: xhr.responseText },
										xhr.getAllResponseHeaders()
									);
								}
							}
						};
					};
	
					// Listen to events
					xhr.onload = callback();
					errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" );
	
					// Support: IE 9 only
					// Use onreadystatechange to replace onabort
					// to handle uncaught aborts
					if ( xhr.onabort !== undefined ) {
						xhr.onabort = errorCallback;
					} else {
						xhr.onreadystatechange = function() {
	
							// Check readyState before timeout as it changes
							if ( xhr.readyState === 4 ) {
	
								// Allow onerror to be called first,
								// but that will not handle a native abort
								// Also, save errorCallback to a variable
								// as xhr.onerror cannot be accessed
								window.setTimeout( function() {
									if ( callback ) {
										errorCallback();
									}
								} );
							}
						};
					}
	
					// Create the abort callback
					callback = callback( "abort" );
	
					try {
	
						// Do send the request (this may raise an exception)
						xhr.send( options.hasContent && options.data || null );
					} catch ( e ) {
	
						// #14683: Only rethrow if this hasn't been notified as an error yet
						if ( callback ) {
							throw e;
						}
					}
				},
	
				abort: function() {
					if ( callback ) {
						callback();
					}
				}
			};
		}
	} );
	
	
	
	
	// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)
	jQuery.ajaxPrefilter( function( s ) {
		if ( s.crossDomain ) {
			s.contents.script = false;
		}
	} );
	
	// Install script dataType
	jQuery.ajaxSetup( {
		accepts: {
			script: "text/javascript, application/javascript, " +
				"application/ecmascript, application/x-ecmascript"
		},
		contents: {
			script: /\b(?:java|ecma)script\b/
		},
		converters: {
			"text script": function( text ) {
				jQuery.globalEval( text );
				return text;
			}
		}
	} );
	
	// Handle cache's special case and crossDomain
	jQuery.ajaxPrefilter( "script", function( s ) {
		if ( s.cache === undefined ) {
			s.cache = false;
		}
		if ( s.crossDomain ) {
			s.type = "GET";
		}
	} );
	
	// Bind script tag hack transport
	jQuery.ajaxTransport( "script", function( s ) {
	
		// This transport only deals with cross domain or forced-by-attrs requests
		if ( s.crossDomain || s.scriptAttrs ) {
			var script, callback;
			return {
				send: function( _, complete ) {
					script = jQuery( "<script>" )
						.attr( s.scriptAttrs || {} )
						.prop( { charset: s.scriptCharset, src: s.url } )
						.on( "load error", callback = function( evt ) {
							script.remove();
							callback = null;
							if ( evt ) {
								complete( evt.type === "error" ? 404 : 200, evt.type );
							}
						} );
	
					// Use native DOM manipulation to avoid our domManip AJAX trickery
					document.head.appendChild( script[ 0 ] );
				},
				abort: function() {
					if ( callback ) {
						callback();
					}
				}
			};
		}
	} );
	
	
	
	
	var oldCallbacks = [],
		rjsonp = /(=)\?(?=&|$)|\?\?/;
	
	// Default jsonp settings
	jQuery.ajaxSetup( {
		jsonp: "callback",
		jsonpCallback: function() {
			var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
			this[ callback ] = true;
			return callback;
		}
	} );
	
	// Detect, normalize options and install callbacks for jsonp requests
	jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
	
		var callbackName, overwritten, responseContainer,
			jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
				"url" :
				typeof s.data === "string" &&
					( s.contentType || "" )
						.indexOf( "application/x-www-form-urlencoded" ) === 0 &&
					rjsonp.test( s.data ) && "data"
			);
	
		// Handle iff the expected data type is "jsonp" or we have a parameter to set
		if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
	
			// Get callback name, remembering preexisting value associated with it
			callbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ?
				s.jsonpCallback() :
				s.jsonpCallback;
	
			// Insert callback into url or form data
			if ( jsonProp ) {
				s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
			} else if ( s.jsonp !== false ) {
				s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
			}
	
			// Use data converter to retrieve json after script execution
			s.converters[ "script json" ] = function() {
				if ( !responseContainer ) {
					jQuery.error( callbackName + " was not called" );
				}
				return responseContainer[ 0 ];
			};
	
			// Force json dataType
			s.dataTypes[ 0 ] = "json";
	
			// Install callback
			overwritten = window[ callbackName ];
			window[ callbackName ] = function() {
				responseContainer = arguments;
			};
	
			// Clean-up function (fires after converters)
			jqXHR.always( function() {
	
				// If previous value didn't exist - remove it
				if ( overwritten === undefined ) {
					jQuery( window ).removeProp( callbackName );
	
				// Otherwise restore preexisting value
				} else {
					window[ callbackName ] = overwritten;
				}
	
				// Save back as free
				if ( s[ callbackName ] ) {
	
					// Make sure that re-using the options doesn't screw things around
					s.jsonpCallback = originalSettings.jsonpCallback;
	
					// Save the callback name for future use
					oldCallbacks.push( callbackName );
				}
	
				// Call if it was a function and we have a response
				if ( responseContainer && isFunction( overwritten ) ) {
					overwritten( responseContainer[ 0 ] );
				}
	
				responseContainer = overwritten = undefined;
			} );
	
			// Delegate to script
			return "script";
		}
	} );
	
	
	
	
	// Support: Safari 8 only
	// In Safari 8 documents created via document.implementation.createHTMLDocument
	// collapse sibling forms: the second one becomes a child of the first one.
	// Because of that, this security measure has to be disabled in Safari 8.
	// https://bugs.webkit.org/show_bug.cgi?id=137337
	support.createHTMLDocument = ( function() {
		var body = document.implementation.createHTMLDocument( "" ).body;
		body.innerHTML = "<form></form><form></form>";
		return body.childNodes.length === 2;
	} )();
	
	
	// Argument "data" should be string of html
	// context (optional): If specified, the fragment will be created in this context,
	// defaults to document
	// keepScripts (optional): If true, will include scripts passed in the html string
	jQuery.parseHTML = function( data, context, keepScripts ) {
		if ( typeof data !== "string" ) {
			return [];
		}
		if ( typeof context === "boolean" ) {
			keepScripts = context;
			context = false;
		}
	
		var base, parsed, scripts;
	
		if ( !context ) {
	
			// Stop scripts or inline event handlers from being executed immediately
			// by using document.implementation
			if ( support.createHTMLDocument ) {
				context = document.implementation.createHTMLDocument( "" );
	
				// Set the base href for the created document
				// so any parsed elements with URLs
				// are based on the document's URL (gh-2965)
				base = context.createElement( "base" );
				base.href = document.location.href;
				context.head.appendChild( base );
			} else {
				context = document;
			}
		}
	
		parsed = rsingleTag.exec( data );
		scripts = !keepScripts && [];
	
		// Single tag
		if ( parsed ) {
			return [ context.createElement( parsed[ 1 ] ) ];
		}
	
		parsed = buildFragment( [ data ], context, scripts );
	
		if ( scripts && scripts.length ) {
			jQuery( scripts ).remove();
		}
	
		return jQuery.merge( [], parsed.childNodes );
	};
	
	
	/**
	 * Load a url into a page
	 */
	jQuery.fn.load = function( url, params, callback ) {
		var selector, type, response,
			self = this,
			off = url.indexOf( " " );
	
		if ( off > -1 ) {
			selector = stripAndCollapse( url.slice( off ) );
			url = url.slice( 0, off );
		}
	
		// If it's a function
		if ( isFunction( params ) ) {
	
			// We assume that it's the callback
			callback = params;
			params = undefined;
	
		// Otherwise, build a param string
		} else if ( params && typeof params === "object" ) {
			type = "POST";
		}
	
		// If we have elements to modify, make the request
		if ( self.length > 0 ) {
			jQuery.ajax( {
				url: url,
	
				// If "type" variable is undefined, then "GET" method will be used.
				// Make value of this field explicit since
				// user can override it through ajaxSetup method
				type: type || "GET",
				dataType: "html",
				data: params
			} ).done( function( responseText ) {
	
				// Save response for use in complete callback
				response = arguments;
	
				self.html( selector ?
	
					// If a selector was specified, locate the right elements in a dummy div
					// Exclude scripts to avoid IE 'Permission Denied' errors
					jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :
	
					// Otherwise use the full result
					responseText );
	
			// If the request succeeds, this function gets "data", "status", "jqXHR"
			// but they are ignored because response was set above.
			// If it fails, this function gets "jqXHR", "status", "error"
			} ).always( callback && function( jqXHR, status ) {
				self.each( function() {
					callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );
				} );
			} );
		}
	
		return this;
	};
	
	
	
	
	// Attach a bunch of functions for handling common AJAX events
	jQuery.each( [
		"ajaxStart",
		"ajaxStop",
		"ajaxComplete",
		"ajaxError",
		"ajaxSuccess",
		"ajaxSend"
	], function( i, type ) {
		jQuery.fn[ type ] = function( fn ) {
			return this.on( type, fn );
		};
	} );
	
	
	
	
	jQuery.expr.pseudos.animated = function( elem ) {
		return jQuery.grep( jQuery.timers, function( fn ) {
			return elem === fn.elem;
		} ).length;
	};
	
	
	
	
	jQuery.offset = {
		setOffset: function( elem, options, i ) {
			var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
				position = jQuery.css( elem, "position" ),
				curElem = jQuery( elem ),
				props = {};
	
			// Set position first, in-case top/left are set even on static elem
			if ( position === "static" ) {
				elem.style.position = "relative";
			}
	
			curOffset = curElem.offset();
			curCSSTop = jQuery.css( elem, "top" );
			curCSSLeft = jQuery.css( elem, "left" );
			calculatePosition = ( position === "absolute" || position === "fixed" ) &&
				( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1;
	
			// Need to be able to calculate position if either
			// top or left is auto and position is either absolute or fixed
			if ( calculatePosition ) {
				curPosition = curElem.position();
				curTop = curPosition.top;
				curLeft = curPosition.left;
	
			} else {
				curTop = parseFloat( curCSSTop ) || 0;
				curLeft = parseFloat( curCSSLeft ) || 0;
			}
	
			if ( isFunction( options ) ) {
	
				// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
				options = options.call( elem, i, jQuery.extend( {}, curOffset ) );
			}
	
			if ( options.top != null ) {
				props.top = ( options.top - curOffset.top ) + curTop;
			}
			if ( options.left != null ) {
				props.left = ( options.left - curOffset.left ) + curLeft;
			}
	
			if ( "using" in options ) {
				options.using.call( elem, props );
	
			} else {
				curElem.css( props );
			}
		}
	};
	
	jQuery.fn.extend( {
	
		// offset() relates an element's border box to the document origin
		offset: function( options ) {
	
			// Preserve chaining for setter
			if ( arguments.length ) {
				return options === undefined ?
					this :
					this.each( function( i ) {
						jQuery.offset.setOffset( this, options, i );
					} );
			}
	
			var rect, win,
				elem = this[ 0 ];
	
			if ( !elem ) {
				return;
			}
	
			// Return zeros for disconnected and hidden (display: none) elements (gh-2310)
			// Support: IE <=11 only
			// Running getBoundingClientRect on a
			// disconnected node in IE throws an error
			if ( !elem.getClientRects().length ) {
				return { top: 0, left: 0 };
			}
	
			// Get document-relative position by adding viewport scroll to viewport-relative gBCR
			rect = elem.getBoundingClientRect();
			win = elem.ownerDocument.defaultView;
			return {
				top: rect.top + win.pageYOffset,
				left: rect.left + win.pageXOffset
			};
		},
	
		// position() relates an element's margin box to its offset parent's padding box
		// This corresponds to the behavior of CSS absolute positioning
		position: function() {
			if ( !this[ 0 ] ) {
				return;
			}
	
			var offsetParent, offset, doc,
				elem = this[ 0 ],
				parentOffset = { top: 0, left: 0 };
	
			// position:fixed elements are offset from the viewport, which itself always has zero offset
			if ( jQuery.css( elem, "position" ) === "fixed" ) {
	
				// Assume position:fixed implies availability of getBoundingClientRect
				offset = elem.getBoundingClientRect();
	
			} else {
				offset = this.offset();
	
				// Account for the *real* offset parent, which can be the document or its root element
				// when a statically positioned element is identified
				doc = elem.ownerDocument;
				offsetParent = elem.offsetParent || doc.documentElement;
				while ( offsetParent &&
					( offsetParent === doc.body || offsetParent === doc.documentElement ) &&
					jQuery.css( offsetParent, "position" ) === "static" ) {
	
					offsetParent = offsetParent.parentNode;
				}
				if ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) {
	
					// Incorporate borders into its offset, since they are outside its content origin
					parentOffset = jQuery( offsetParent ).offset();
					parentOffset.top += jQuery.css( offsetParent, "borderTopWidth", true );
					parentOffset.left += jQuery.css( offsetParent, "borderLeftWidth", true );
				}
			}
	
			// Subtract parent offsets and element margins
			return {
				top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
				left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
			};
		},
	
		// This method will return documentElement in the following cases:
		// 1) For the element inside the iframe without offsetParent, this method will return
		//    documentElement of the parent window
		// 2) For the hidden or detached element
		// 3) For body or html element, i.e. in case of the html node - it will return itself
		//
		// but those exceptions were never presented as a real life use-cases
		// and might be considered as more preferable results.
		//
		// This logic, however, is not guaranteed and can change at any point in the future
		offsetParent: function() {
			return this.map( function() {
				var offsetParent = this.offsetParent;
	
				while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) {
					offsetParent = offsetParent.offsetParent;
				}
	
				return offsetParent || documentElement;
			} );
		}
	} );
	
	// Create scrollLeft and scrollTop methods
	jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
		var top = "pageYOffset" === prop;
	
		jQuery.fn[ method ] = function( val ) {
			return access( this, function( elem, method, val ) {
	
				// Coalesce documents and windows
				var win;
				if ( isWindow( elem ) ) {
					win = elem;
				} else if ( elem.nodeType === 9 ) {
					win = elem.defaultView;
				}
	
				if ( val === undefined ) {
					return win ? win[ prop ] : elem[ method ];
				}
	
				if ( win ) {
					win.scrollTo(
						!top ? val : win.pageXOffset,
						top ? val : win.pageYOffset
					);
	
				} else {
					elem[ method ] = val;
				}
			}, method, val, arguments.length );
		};
	} );
	
	// Support: Safari <=7 - 9.1, Chrome <=37 - 49
	// Add the top/left cssHooks using jQuery.fn.position
	// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
	// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347
	// getComputedStyle returns percent when specified for top/left/bottom/right;
	// rather than make the css module depend on the offset module, just check for it here
	jQuery.each( [ "top", "left" ], function( i, prop ) {
		jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
			function( elem, computed ) {
				if ( computed ) {
					computed = curCSS( elem, prop );
	
					// If curCSS returns percentage, fallback to offset
					return rnumnonpx.test( computed ) ?
						jQuery( elem ).position()[ prop ] + "px" :
						computed;
				}
			}
		);
	} );
	
	
	// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
	jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
		jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name },
			function( defaultExtra, funcName ) {
	
			// Margin is only for outerHeight, outerWidth
			jQuery.fn[ funcName ] = function( margin, value ) {
				var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
					extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
	
				return access( this, function( elem, type, value ) {
					var doc;
	
					if ( isWindow( elem ) ) {
	
						// $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)
						return funcName.indexOf( "outer" ) === 0 ?
							elem[ "inner" + name ] :
							elem.document.documentElement[ "client" + name ];
					}
	
					// Get document width or height
					if ( elem.nodeType === 9 ) {
						doc = elem.documentElement;
	
						// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
						// whichever is greatest
						return Math.max(
							elem.body[ "scroll" + name ], doc[ "scroll" + name ],
							elem.body[ "offset" + name ], doc[ "offset" + name ],
							doc[ "client" + name ]
						);
					}
	
					return value === undefined ?
	
						// Get width or height on the element, requesting but not forcing parseFloat
						jQuery.css( elem, type, extra ) :
	
						// Set width or height on the element
						jQuery.style( elem, type, value, extra );
				}, type, chainable ? margin : undefined, chainable );
			};
		} );
	} );
	
	
	jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
		"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
		"change select submit keydown keypress keyup contextmenu" ).split( " " ),
		function( i, name ) {
	
		// Handle event binding
		jQuery.fn[ name ] = function( data, fn ) {
			return arguments.length > 0 ?
				this.on( name, null, data, fn ) :
				this.trigger( name );
		};
	} );
	
	jQuery.fn.extend( {
		hover: function( fnOver, fnOut ) {
			return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
		}
	} );
	
	
	
	
	jQuery.fn.extend( {
	
		bind: function( types, data, fn ) {
			return this.on( types, null, data, fn );
		},
		unbind: function( types, fn ) {
			return this.off( types, null, fn );
		},
	
		delegate: function( selector, types, data, fn ) {
			return this.on( types, selector, data, fn );
		},
		undelegate: function( selector, types, fn ) {
	
			// ( namespace ) or ( selector, types [, fn] )
			return arguments.length === 1 ?
				this.off( selector, "**" ) :
				this.off( types, selector || "**", fn );
		}
	} );
	
	// Bind a function to a context, optionally partially applying any
	// arguments.
	// jQuery.proxy is deprecated to promote standards (specifically Function#bind)
	// However, it is not slated for removal any time soon
	jQuery.proxy = function( fn, context ) {
		var tmp, args, proxy;
	
		if ( typeof context === "string" ) {
			tmp = fn[ context ];
			context = fn;
			fn = tmp;
		}
	
		// Quick check to determine if target is callable, in the spec
		// this throws a TypeError, but we will just return undefined.
		if ( !isFunction( fn ) ) {
			return undefined;
		}
	
		// Simulated bind
		args = slice.call( arguments, 2 );
		proxy = function() {
			return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
		};
	
		// Set the guid of unique handler to the same of original handler, so it can be removed
		proxy.guid = fn.guid = fn.guid || jQuery.guid++;
	
		return proxy;
	};
	
	jQuery.holdReady = function( hold ) {
		if ( hold ) {
			jQuery.readyWait++;
		} else {
			jQuery.ready( true );
		}
	};
	jQuery.isArray = Array.isArray;
	jQuery.parseJSON = JSON.parse;
	jQuery.nodeName = nodeName;
	jQuery.isFunction = isFunction;
	jQuery.isWindow = isWindow;
	jQuery.camelCase = camelCase;
	jQuery.type = toType;
	
	jQuery.now = Date.now;
	
	jQuery.isNumeric = function( obj ) {
	
		// As of jQuery 3.0, isNumeric is limited to
		// strings and numbers (primitives or objects)
		// that can be coerced to finite numbers (gh-2662)
		var type = jQuery.type( obj );
		return ( type === "number" || type === "string" ) &&
	
			// parseFloat NaNs numeric-cast false positives ("")
			// ...but misinterprets leading-number strings, particularly hex literals ("0x...")
			// subtraction forces infinities to NaN
			!isNaN( obj - parseFloat( obj ) );
	};
	
	
	
	
	// Register as a named AMD module, since jQuery can be concatenated with other
	// files that may use define, but not via a proper concatenation script that
	// understands anonymous AMD modules. A named AMD is safest and most robust
	// way to register. Lowercase jquery is used because AMD module names are
	// derived from file names, and jQuery is normally delivered in a lowercase
	// file name. Do this after creating the global so that if an AMD module wants
	// to call noConflict to hide this version of jQuery, it will work.
	
	// Note that for maximum portability, libraries that are not jQuery should
	// declare themselves as anonymous modules, and avoid setting a global if an
	// AMD loader is present. jQuery is a special case. For more information, see
	// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
	
	if ( true ) {
		!(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = function() {
			return jQuery;
		}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
	}
	
	
	
	
	var
	
		// Map over jQuery in case of overwrite
		_jQuery = window.jQuery,
	
		// Map over the $ in case of overwrite
		_$ = window.$;
	
	jQuery.noConflict = function( deep ) {
		if ( window.$ === jQuery ) {
			window.$ = _$;
		}
	
		if ( deep && window.jQuery === jQuery ) {
			window.jQuery = _jQuery;
		}
	
		return jQuery;
	};
	
	// Expose jQuery and $ identifiers, even in AMD
	// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
	// and CommonJS for browser emulators (#13566)
	if ( !noGlobal ) {
		window.jQuery = window.$ = jQuery;
	}
	
	
	
	
	return jQuery;
	} );


/***/ }),
/* 13 */
/***/ (function(module, exports, __webpack_require__) {

	var __WEBPACK_AMD_DEFINE_RESULT__;/*
	
	 JS Signals <http://millermedeiros.github.com/js-signals/>
	 Released under the MIT license
	 Author: Miller Medeiros
	 Version: 1.0.0 - Build: 268 (2012/11/29 05:48 PM)
	*/
	(function(i){function h(a,b,c,d,e){this._listener=b;this._isOnce=c;this.context=d;this._signal=a;this._priority=e||0}function g(a,b){if(typeof a!=="function")throw Error("listener is a required param of {fn}() and should be a Function.".replace("{fn}",b));}function e(){this._bindings=[];this._prevParams=null;var a=this;this.dispatch=function(){e.prototype.dispatch.apply(a,arguments)}}h.prototype={active:!0,params:null,execute:function(a){var b;this.active&&this._listener&&(a=this.params?this.params.concat(a):
	a,b=this._listener.apply(this.context,a),this._isOnce&&this.detach());return b},detach:function(){return this.isBound()?this._signal.remove(this._listener,this.context):null},isBound:function(){return!!this._signal&&!!this._listener},isOnce:function(){return this._isOnce},getListener:function(){return this._listener},getSignal:function(){return this._signal},_destroy:function(){delete this._signal;delete this._listener;delete this.context},toString:function(){return"[SignalBinding isOnce:"+this._isOnce+
	", isBound:"+this.isBound()+", active:"+this.active+"]"}};e.prototype={VERSION:"1.0.0",memorize:!1,_shouldPropagate:!0,active:!0,_registerListener:function(a,b,c,d){var e=this._indexOfListener(a,c);if(e!==-1){if(a=this._bindings[e],a.isOnce()!==b)throw Error("You cannot add"+(b?"":"Once")+"() then add"+(!b?"":"Once")+"() the same listener without removing the relationship first.");}else a=new h(this,a,b,c,d),this._addBinding(a);this.memorize&&this._prevParams&&a.execute(this._prevParams);return a},
	_addBinding:function(a){var b=this._bindings.length;do--b;while(this._bindings[b]&&a._priority<=this._bindings[b]._priority);this._bindings.splice(b+1,0,a)},_indexOfListener:function(a,b){for(var c=this._bindings.length,d;c--;)if(d=this._bindings[c],d._listener===a&&d.context===b)return c;return-1},has:function(a,b){return this._indexOfListener(a,b)!==-1},add:function(a,b,c){g(a,"add");return this._registerListener(a,!1,b,c)},addOnce:function(a,b,c){g(a,"addOnce");return this._registerListener(a,
	!0,b,c)},remove:function(a,b){g(a,"remove");var c=this._indexOfListener(a,b);c!==-1&&(this._bindings[c]._destroy(),this._bindings.splice(c,1));return a},removeAll:function(){for(var a=this._bindings.length;a--;)this._bindings[a]._destroy();this._bindings.length=0},getNumListeners:function(){return this._bindings.length},halt:function(){this._shouldPropagate=!1},dispatch:function(a){if(this.active){var b=Array.prototype.slice.call(arguments),c=this._bindings.length,d;if(this.memorize)this._prevParams=
	b;if(c){d=this._bindings.slice();this._shouldPropagate=!0;do c--;while(d[c]&&this._shouldPropagate&&d[c].execute(b)!==!1)}}},forget:function(){this._prevParams=null},dispose:function(){this.removeAll();delete this._bindings;delete this._prevParams},toString:function(){return"[Signal active:"+this.active+" numListeners:"+this.getNumListeners()+"]"}};var f=e;f.Signal=e; true?!(__WEBPACK_AMD_DEFINE_RESULT__ = function(){return f}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)):typeof module!=="undefined"&&module.exports?module.exports=f:i.signals=
	f})(this);

/***/ }),
/* 14 */
/***/ (function(module, exports, __webpack_require__) {

	var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;if( typeof importScripts !== 'function' ){
	!function(t,e){ true?!(__WEBPACK_AMD_DEFINE_FACTORY__ = (e), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)):"object"==typeof exports?module.exports=e(require,exports,module):t.Tether=e()}(this,function(t,e,o){"use strict";function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function n(t){var e=getComputedStyle(t),o=e.position;if("fixed"===o)return t;for(var i=t;i=i.parentNode;){var n=void 0;try{n=getComputedStyle(i)}catch(r){}if("undefined"==typeof n||null===n)return i;var s=n.overflow,a=n.overflowX,f=n.overflowY;if(/(auto|scroll)/.test(s+f+a)&&("absolute"!==o||["relative","absolute","fixed"].indexOf(n.position)>=0))return i}return document.body}function r(t){var e=void 0;t===document?(e=document,t=document.documentElement):e=t.ownerDocument;var o=e.documentElement,i={},n=t.getBoundingClientRect();for(var r in n)i[r]=n[r];var s=x(e);return i.top-=s.top,i.left-=s.left,"undefined"==typeof i.width&&(i.width=document.body.scrollWidth-i.left-i.right),"undefined"==typeof i.height&&(i.height=document.body.scrollHeight-i.top-i.bottom),i.top=i.top-o.clientTop,i.left=i.left-o.clientLeft,i.right=e.body.clientWidth-i.width-i.left,i.bottom=e.body.clientHeight-i.height-i.top,i}function s(t){return t.offsetParent||document.documentElement}function a(){var t=document.createElement("div");t.style.width="100%",t.style.height="200px";var e=document.createElement("div");f(e.style,{position:"absolute",top:0,left:0,pointerEvents:"none",visibility:"hidden",width:"200px",height:"150px",overflow:"hidden"}),e.appendChild(t),document.body.appendChild(e);var o=t.offsetWidth;e.style.overflow="scroll";var i=t.offsetWidth;o===i&&(i=e.clientWidth),document.body.removeChild(e);var n=o-i;return{width:n,height:n}}function f(){var t=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],e=[];return Array.prototype.push.apply(e,arguments),e.slice(1).forEach(function(e){if(e)for(var o in e)({}).hasOwnProperty.call(e,o)&&(t[o]=e[o])}),t}function h(t,e){if("undefined"!=typeof t.classList)e.split(" ").forEach(function(e){e.trim()&&t.classList.remove(e)});else{var o=new RegExp("(^| )"+e.split(" ").join("|")+"( |$)","gi"),i=u(t).replace(o," ");p(t,i)}}function l(t,e){if("undefined"!=typeof t.classList)e.split(" ").forEach(function(e){e.trim()&&t.classList.add(e)});else{h(t,e);var o=u(t)+(" "+e);p(t,o)}}function d(t,e){if("undefined"!=typeof t.classList)return t.classList.contains(e);var o=u(t);return new RegExp("(^| )"+e+"( |$)","gi").test(o)}function u(t){return t.className instanceof SVGAnimatedString?t.className.baseVal:t.className}function p(t,e){t.setAttribute("class",e)}function c(t,e,o){o.forEach(function(o){-1===e.indexOf(o)&&d(t,o)&&h(t,o)}),e.forEach(function(e){d(t,e)||l(t,e)})}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function g(t,e){var o=arguments.length<=2||void 0===arguments[2]?1:arguments[2];return t+o>=e&&e>=t-o}function m(){return"undefined"!=typeof performance&&"undefined"!=typeof performance.now?performance.now():+new Date}function v(){for(var t={top:0,left:0},e=arguments.length,o=Array(e),i=0;e>i;i++)o[i]=arguments[i];return o.forEach(function(e){var o=e.top,i=e.left;"string"==typeof o&&(o=parseFloat(o,10)),"string"==typeof i&&(i=parseFloat(i,10)),t.top+=o,t.left+=i}),t}function y(t,e){return"string"==typeof t.left&&-1!==t.left.indexOf("%")&&(t.left=parseFloat(t.left,10)/100*e.width),"string"==typeof t.top&&-1!==t.top.indexOf("%")&&(t.top=parseFloat(t.top,10)/100*e.height),t}function b(t,e){return"scrollParent"===e?e=t.scrollParent:"window"===e&&(e=[pageXOffset,pageYOffset,innerWidth+pageXOffset,innerHeight+pageYOffset]),e===document&&(e=e.documentElement),"undefined"!=typeof e.nodeType&&!function(){var t=r(e),o=t,i=getComputedStyle(e);e=[o.left,o.top,t.width+o.left,t.height+o.top],U.forEach(function(t,o){t=t[0].toUpperCase()+t.substr(1),"Top"===t||"Left"===t?e[o]+=parseFloat(i["border"+t+"Width"]):e[o]-=parseFloat(i["border"+t+"Width"])})}(),e}var w=function(){function t(t,e){for(var o=0;o<e.length;o++){var i=e[o];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}return function(e,o,i){return o&&t(e.prototype,o),i&&t(e,i),e}}(),C=void 0;"undefined"==typeof C&&(C={modules:[]});var O=function(){var t=0;return function(){return++t}}(),E={},x=function(t){var e=t._tetherZeroElement;"undefined"==typeof e&&(e=t.createElement("div"),e.setAttribute("data-tether-id",O()),f(e.style,{top:0,left:0,position:"absolute"}),t.body.appendChild(e),t._tetherZeroElement=e);var o=e.getAttribute("data-tether-id");if("undefined"==typeof E[o]){E[o]={};var i=e.getBoundingClientRect();for(var n in i)E[o][n]=i[n];T(function(){delete E[o]})}return E[o]},A=[],T=function(t){A.push(t)},S=function(){for(var t=void 0;t=A.pop();)t()},W=function(){function t(){i(this,t)}return w(t,[{key:"on",value:function(t,e,o){var i=arguments.length<=3||void 0===arguments[3]?!1:arguments[3];"undefined"==typeof this.bindings&&(this.bindings={}),"undefined"==typeof this.bindings[t]&&(this.bindings[t]=[]),this.bindings[t].push({handler:e,ctx:o,once:i})}},{key:"once",value:function(t,e,o){this.on(t,e,o,!0)}},{key:"off",value:function(t,e){if("undefined"==typeof this.bindings||"undefined"==typeof this.bindings[t])if("undefined"==typeof e)delete this.bindings[t];else for(var o=0;o<this.bindings[t].length;)this.bindings[t][o].handler===e?this.bindings[t].splice(o,1):++o}},{key:"trigger",value:function(t){if("undefined"!=typeof this.bindings&&this.bindings[t])for(var e=0;e<this.bindings[t].length;){var o=this.bindings[t][e],i=o.handler,n=o.ctx,r=o.once,s=n;"undefined"==typeof s&&(s=this);for(var a=arguments.length,f=Array(a>1?a-1:0),h=1;a>h;h++)f[h-1]=arguments[h];i.apply(s,f),r?this.bindings[t].splice(e,1):++e}}}]),t}();C.Utils={getScrollParent:n,getBounds:r,getOffsetParent:s,extend:f,addClass:l,removeClass:h,hasClass:d,updateClasses:c,defer:T,flush:S,uniqueId:O,Evented:W,getScrollBarSize:a};var M=function(){function t(t,e){var o=[],i=!0,n=!1,r=void 0;try{for(var s,a=t[Symbol.iterator]();!(i=(s=a.next()).done)&&(o.push(s.value),!e||o.length!==e);i=!0);}catch(f){n=!0,r=f}finally{try{!i&&a["return"]&&a["return"]()}finally{if(n)throw r}}return o}return function(e,o){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,o);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),w=function(){function t(t,e){for(var o=0;o<e.length;o++){var i=e[o];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}return function(e,o,i){return o&&t(e.prototype,o),i&&t(e,i),e}}();if("undefined"==typeof C)throw new Error("You must include the utils.js file before tether.js");var P=C.Utils,n=P.getScrollParent,r=P.getBounds,s=P.getOffsetParent,f=P.extend,l=P.addClass,h=P.removeClass,c=P.updateClasses,T=P.defer,S=P.flush,a=P.getScrollBarSize,k=function(){for(var t=document.createElement("div"),e=["transform","webkitTransform","OTransform","MozTransform","msTransform"],o=0;o<e.length;++o){var i=e[o];if(void 0!==t.style[i])return i}}(),B=[],_=function(){B.forEach(function(t){t.position(!1)}),S()};!function(){var t=null,e=null,o=null,i=function n(){return"undefined"!=typeof e&&e>16?(e=Math.min(e-16,250),void(o=setTimeout(n,250))):void("undefined"!=typeof t&&m()-t<10||("undefined"!=typeof o&&(clearTimeout(o),o=null),t=m(),_(),e=m()-t))};["resize","scroll","touchmove"].forEach(function(t){window.addEventListener(t,i)})}();var z={center:"center",left:"right",right:"left"},F={middle:"middle",top:"bottom",bottom:"top"},L={top:0,left:0,middle:"50%",center:"50%",bottom:"100%",right:"100%"},Y=function(t,e){var o=t.left,i=t.top;return"auto"===o&&(o=z[e.left]),"auto"===i&&(i=F[e.top]),{left:o,top:i}},H=function(t){var e=t.left,o=t.top;return"undefined"!=typeof L[t.left]&&(e=L[t.left]),"undefined"!=typeof L[t.top]&&(o=L[t.top]),{left:e,top:o}},X=function(t){var e=t.split(" "),o=M(e,2),i=o[0],n=o[1];return{top:i,left:n}},j=X,N=function(){function t(e){var o=this;i(this,t),this.position=this.position.bind(this),B.push(this),this.history=[],this.setOptions(e,!1),C.modules.forEach(function(t){"undefined"!=typeof t.initialize&&t.initialize.call(o)}),this.position()}return w(t,[{key:"getClass",value:function(){var t=arguments.length<=0||void 0===arguments[0]?"":arguments[0],e=this.options.classes;return"undefined"!=typeof e&&e[t]?this.options.classes[t]:this.options.classPrefix?this.options.classPrefix+"-"+t:t}},{key:"setOptions",value:function(t){var e=this,o=arguments.length<=1||void 0===arguments[1]?!0:arguments[1],i={offset:"0 0",targetOffset:"0 0",targetAttachment:"auto auto",classPrefix:"tether"};this.options=f(i,t);var r=this.options,s=r.element,a=r.target,h=r.targetModifier;if(this.element=s,this.target=a,this.targetModifier=h,"viewport"===this.target?(this.target=document.body,this.targetModifier="visible"):"scroll-handle"===this.target&&(this.target=document.body,this.targetModifier="scroll-handle"),["element","target"].forEach(function(t){if("undefined"==typeof e[t])throw new Error("Tether Error: Both element and target must be defined");"undefined"!=typeof e[t].jquery?e[t]=e[t][0]:"string"==typeof e[t]&&(e[t]=document.querySelector(e[t]))}),l(this.element,this.getClass("element")),this.options.addTargetClasses!==!1&&l(this.target,this.getClass("target")),!this.options.attachment)throw new Error("Tether Error: You must provide an attachment");this.targetAttachment=j(this.options.targetAttachment),this.attachment=j(this.options.attachment),this.offset=X(this.options.offset),this.targetOffset=X(this.options.targetOffset),"undefined"!=typeof this.scrollParent&&this.disable(),this.scrollParent="scroll-handle"===this.targetModifier?this.target:n(this.target),this.options.enabled!==!1&&this.enable(o)}},{key:"getTargetBounds",value:function(){if("undefined"==typeof this.targetModifier)return r(this.target);if("visible"===this.targetModifier){if(this.target===document.body)return{top:pageYOffset,left:pageXOffset,height:innerHeight,width:innerWidth};var t=r(this.target),e={height:t.height,width:t.width,top:t.top,left:t.left};return e.height=Math.min(e.height,t.height-(pageYOffset-t.top)),e.height=Math.min(e.height,t.height-(t.top+t.height-(pageYOffset+innerHeight))),e.height=Math.min(innerHeight,e.height),e.height-=2,e.width=Math.min(e.width,t.width-(pageXOffset-t.left)),e.width=Math.min(e.width,t.width-(t.left+t.width-(pageXOffset+innerWidth))),e.width=Math.min(innerWidth,e.width),e.width-=2,e.top<pageYOffset&&(e.top=pageYOffset),e.left<pageXOffset&&(e.left=pageXOffset),e}if("scroll-handle"===this.targetModifier){var t=void 0,o=this.target;o===document.body?(o=document.documentElement,t={left:pageXOffset,top:pageYOffset,height:innerHeight,width:innerWidth}):t=r(o);var i=getComputedStyle(o),n=o.scrollWidth>o.clientWidth||[i.overflow,i.overflowX].indexOf("scroll")>=0||this.target!==document.body,s=0;n&&(s=15);var a=t.height-parseFloat(i.borderTopWidth)-parseFloat(i.borderBottomWidth)-s,e={width:15,height:.975*a*(a/o.scrollHeight),left:t.left+t.width-parseFloat(i.borderLeftWidth)-15},f=0;408>a&&this.target===document.body&&(f=-11e-5*Math.pow(a,2)-.00727*a+22.58),this.target!==document.body&&(e.height=Math.max(e.height,24));var h=this.target.scrollTop/(o.scrollHeight-a);return e.top=h*(a-e.height-f)+t.top+parseFloat(i.borderTopWidth),this.target===document.body&&(e.height=Math.max(e.height,24)),e}}},{key:"clearCache",value:function(){this._cache={}}},{key:"cache",value:function(t,e){return"undefined"==typeof this._cache&&(this._cache={}),"undefined"==typeof this._cache[t]&&(this._cache[t]=e.call(this)),this._cache[t]}},{key:"enable",value:function(){var t=arguments.length<=0||void 0===arguments[0]?!0:arguments[0];this.options.addTargetClasses!==!1&&l(this.target,this.getClass("enabled")),l(this.element,this.getClass("enabled")),this.enabled=!0,this.scrollParent!==document&&this.scrollParent.addEventListener("scroll",this.position),t&&this.position()}},{key:"disable",value:function(){h(this.target,this.getClass("enabled")),h(this.element,this.getClass("enabled")),this.enabled=!1,"undefined"!=typeof this.scrollParent&&this.scrollParent.removeEventListener("scroll",this.position)}},{key:"destroy",value:function(){var t=this;this.disable(),B.forEach(function(e,o){return e===t?void B.splice(o,1):void 0})}},{key:"updateAttachClasses",value:function(t,e){var o=this;t=t||this.attachment,e=e||this.targetAttachment;var i=["left","top","bottom","right","middle","center"];"undefined"!=typeof this._addAttachClasses&&this._addAttachClasses.length&&this._addAttachClasses.splice(0,this._addAttachClasses.length),"undefined"==typeof this._addAttachClasses&&(this._addAttachClasses=[]);var n=this._addAttachClasses;t.top&&n.push(this.getClass("element-attached")+"-"+t.top),t.left&&n.push(this.getClass("element-attached")+"-"+t.left),e.top&&n.push(this.getClass("target-attached")+"-"+e.top),e.left&&n.push(this.getClass("target-attached")+"-"+e.left);var r=[];i.forEach(function(t){r.push(o.getClass("element-attached")+"-"+t),r.push(o.getClass("target-attached")+"-"+t)}),T(function(){"undefined"!=typeof o._addAttachClasses&&(c(o.element,o._addAttachClasses,r),o.options.addTargetClasses!==!1&&c(o.target,o._addAttachClasses,r),delete o._addAttachClasses)})}},{key:"position",value:function(){var t=this,e=arguments.length<=0||void 0===arguments[0]?!0:arguments[0];if(this.enabled){this.clearCache();var o=Y(this.targetAttachment,this.attachment);this.updateAttachClasses(this.attachment,o);var i=this.cache("element-bounds",function(){return r(t.element)}),n=i.width,f=i.height;if(0===n&&0===f&&"undefined"!=typeof this.lastSize){var h=this.lastSize;n=h.width,f=h.height}else this.lastSize={width:n,height:f};var l=this.cache("target-bounds",function(){return t.getTargetBounds()}),d=l,u=y(H(this.attachment),{width:n,height:f}),p=y(H(o),d),c=y(this.offset,{width:n,height:f}),g=y(this.targetOffset,d);u=v(u,c),p=v(p,g);for(var m=l.left+p.left-u.left,b=l.top+p.top-u.top,w=0;w<C.modules.length;++w){var O=C.modules[w],E=O.position.call(this,{left:m,top:b,targetAttachment:o,targetPos:l,elementPos:i,offset:u,targetOffset:p,manualOffset:c,manualTargetOffset:g,scrollbarSize:A,attachment:this.attachment});if(E===!1)return!1;"undefined"!=typeof E&&"object"==typeof E&&(b=E.top,m=E.left)}var x={page:{top:b,left:m},viewport:{top:b-pageYOffset,bottom:pageYOffset-b-f+innerHeight,left:m-pageXOffset,right:pageXOffset-m-n+innerWidth}},A=void 0;return document.body.scrollWidth>window.innerWidth&&(A=this.cache("scrollbar-size",a),x.viewport.bottom-=A.height),document.body.scrollHeight>window.innerHeight&&(A=this.cache("scrollbar-size",a),x.viewport.right-=A.width),(-1===["","static"].indexOf(document.body.style.position)||-1===["","static"].indexOf(document.body.parentElement.style.position))&&(x.page.bottom=document.body.scrollHeight-b-f,x.page.right=document.body.scrollWidth-m-n),"undefined"!=typeof this.options.optimizations&&this.options.optimizations.moveElement!==!1&&"undefined"==typeof this.targetModifier&&!function(){var e=t.cache("target-offsetparent",function(){return s(t.target)}),o=t.cache("target-offsetparent-bounds",function(){return r(e)}),i=getComputedStyle(e),n=o,a={};if(["Top","Left","Bottom","Right"].forEach(function(t){a[t.toLowerCase()]=parseFloat(i["border"+t+"Width"])}),o.right=document.body.scrollWidth-o.left-n.width+a.right,o.bottom=document.body.scrollHeight-o.top-n.height+a.bottom,x.page.top>=o.top+a.top&&x.page.bottom>=o.bottom&&x.page.left>=o.left+a.left&&x.page.right>=o.right){var f=e.scrollTop,h=e.scrollLeft;x.offset={top:x.page.top-o.top+f-a.top,left:x.page.left-o.left+h-a.left}}}(),this.move(x),this.history.unshift(x),this.history.length>3&&this.history.pop(),e&&S(),!0}}},{key:"move",value:function(t){var e=this;if("undefined"!=typeof this.element.parentNode){var o={};for(var i in t){o[i]={};for(var n in t[i]){for(var r=!1,a=0;a<this.history.length;++a){var h=this.history[a];if("undefined"!=typeof h[i]&&!g(h[i][n],t[i][n])){r=!0;break}}r||(o[i][n]=!0)}}var l={top:"",left:"",right:"",bottom:""},d=function(t,o){var i="undefined"!=typeof e.options.optimizations,n=i?e.options.optimizations.gpu:null;if(n!==!1){var r=void 0,s=void 0;t.top?(l.top=0,r=o.top):(l.bottom=0,r=-o.bottom),t.left?(l.left=0,s=o.left):(l.right=0,s=-o.right),l[k]="translateX("+Math.round(s)+"px) translateY("+Math.round(r)+"px)","msTransform"!==k&&(l[k]+=" translateZ(0)")}else t.top?l.top=o.top+"px":l.bottom=o.bottom+"px",t.left?l.left=o.left+"px":l.right=o.right+"px"},u=!1;if((o.page.top||o.page.bottom)&&(o.page.left||o.page.right)?(l.position="absolute",d(o.page,t.page)):(o.viewport.top||o.viewport.bottom)&&(o.viewport.left||o.viewport.right)?(l.position="fixed",d(o.viewport,t.viewport)):"undefined"!=typeof o.offset&&o.offset.top&&o.offset.left?!function(){l.position="absolute";var i=e.cache("target-offsetparent",function(){return s(e.target)});s(e.element)!==i&&T(function(){e.element.parentNode.removeChild(e.element),i.appendChild(e.element)}),d(o.offset,t.offset),u=!0}():(l.position="absolute",d({top:!0,left:!0},t.page)),!u){for(var p=!0,c=this.element.parentNode;c&&"BODY"!==c.tagName;){if("static"!==getComputedStyle(c).position){p=!1;break}c=c.parentNode}p||(this.element.parentNode.removeChild(this.element),document.body.appendChild(this.element))}var m={},v=!1;for(var n in l){var y=l[n],b=this.element.style[n];""!==b&&""!==y&&["top","left","bottom","right"].indexOf(n)>=0&&(b=parseFloat(b),y=parseFloat(y)),b!==y&&(v=!0,m[n]=y)}v&&T(function(){f(e.element.style,m)})}}}]),t}();N.modules=[],C.position=_;var R=f(N,C),M=function(){function t(t,e){var o=[],i=!0,n=!1,r=void 0;try{for(var s,a=t[Symbol.iterator]();!(i=(s=a.next()).done)&&(o.push(s.value),!e||o.length!==e);i=!0);}catch(f){n=!0,r=f}finally{try{!i&&a["return"]&&a["return"]()}finally{if(n)throw r}}return o}return function(e,o){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,o);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),P=C.Utils,r=P.getBounds,f=P.extend,c=P.updateClasses,T=P.defer,U=["left","top","right","bottom"];C.modules.push({position:function(t){var e=this,o=t.top,i=t.left,n=t.targetAttachment;if(!this.options.constraints)return!0;var s=this.cache("element-bounds",function(){return r(e.element)}),a=s.height,h=s.width;if(0===h&&0===a&&"undefined"!=typeof this.lastSize){var l=this.lastSize;h=l.width,a=l.height}var d=this.cache("target-bounds",function(){return e.getTargetBounds()}),u=d.height,p=d.width,g=[this.getClass("pinned"),this.getClass("out-of-bounds")];this.options.constraints.forEach(function(t){var e=t.outOfBoundsClass,o=t.pinnedClass;e&&g.push(e),o&&g.push(o)}),g.forEach(function(t){["left","top","right","bottom"].forEach(function(e){g.push(t+"-"+e)})});var m=[],v=f({},n),y=f({},this.attachment);return this.options.constraints.forEach(function(t){var r=t.to,s=t.attachment,f=t.pin;"undefined"==typeof s&&(s="");var l=void 0,d=void 0;if(s.indexOf(" ")>=0){var c=s.split(" "),g=M(c,2);d=g[0],l=g[1]}else l=d=s;var w=b(e,r);("target"===d||"both"===d)&&(o<w[1]&&"top"===v.top&&(o+=u,v.top="bottom"),o+a>w[3]&&"bottom"===v.top&&(o-=u,v.top="top")),"together"===d&&(o<w[1]&&"top"===v.top&&("bottom"===y.top?(o+=u,v.top="bottom",o+=a,y.top="top"):"top"===y.top&&(o+=u,v.top="bottom",o-=a,y.top="bottom")),o+a>w[3]&&"bottom"===v.top&&("top"===y.top?(o-=u,v.top="top",o-=a,y.top="bottom"):"bottom"===y.top&&(o-=u,v.top="top",o+=a,y.top="top")),"middle"===v.top&&(o+a>w[3]&&"top"===y.top?(o-=a,y.top="bottom"):o<w[1]&&"bottom"===y.top&&(o+=a,y.top="top"))),("target"===l||"both"===l)&&(i<w[0]&&"left"===v.left&&(i+=p,v.left="right"),i+h>w[2]&&"right"===v.left&&(i-=p,v.left="left")),"together"===l&&(i<w[0]&&"left"===v.left?"right"===y.left?(i+=p,v.left="right",i+=h,y.left="left"):"left"===y.left&&(i+=p,v.left="right",i-=h,y.left="right"):i+h>w[2]&&"right"===v.left?"left"===y.left?(i-=p,v.left="left",i-=h,y.left="right"):"right"===y.left&&(i-=p,v.left="left",i+=h,y.left="left"):"center"===v.left&&(i+h>w[2]&&"left"===y.left?(i-=h,y.left="right"):i<w[0]&&"right"===y.left&&(i+=h,y.left="left"))),("element"===d||"both"===d)&&(o<w[1]&&"bottom"===y.top&&(o+=a,y.top="top"),o+a>w[3]&&"top"===y.top&&(o-=a,y.top="bottom")),("element"===l||"both"===l)&&(i<w[0]&&"right"===y.left&&(i+=h,y.left="left"),i+h>w[2]&&"left"===y.left&&(i-=h,y.left="right")),"string"==typeof f?f=f.split(",").map(function(t){return t.trim()}):f===!0&&(f=["top","left","right","bottom"]),f=f||[];var C=[],O=[];o<w[1]&&(f.indexOf("top")>=0?(o=w[1],C.push("top")):O.push("top")),o+a>w[3]&&(f.indexOf("bottom")>=0?(o=w[3]-a,C.push("bottom")):O.push("bottom")),i<w[0]&&(f.indexOf("left")>=0?(i=w[0],C.push("left")):O.push("left")),i+h>w[2]&&(f.indexOf("right")>=0?(i=w[2]-h,C.push("right")):O.push("right")),C.length&&!function(){var t=void 0;t="undefined"!=typeof e.options.pinnedClass?e.options.pinnedClass:e.getClass("pinned"),m.push(t),C.forEach(function(e){m.push(t+"-"+e)})}(),O.length&&!function(){var t=void 0;t="undefined"!=typeof e.options.outOfBoundsClass?e.options.outOfBoundsClass:e.getClass("out-of-bounds"),m.push(t),O.forEach(function(e){m.push(t+"-"+e)})}(),(C.indexOf("left")>=0||C.indexOf("right")>=0)&&(y.left=v.left=!1),(C.indexOf("top")>=0||C.indexOf("bottom")>=0)&&(y.top=v.top=!1),(v.top!==n.top||v.left!==n.left||y.top!==e.attachment.top||y.left!==e.attachment.left)&&e.updateAttachClasses(y,v)}),T(function(){e.options.addTargetClasses!==!1&&c(e.target,m,g),c(e.element,m,g)}),{top:o,left:i}}});var P=C.Utils,r=P.getBounds,c=P.updateClasses,T=P.defer;C.modules.push({position:function(t){var e=this,o=t.top,i=t.left,n=this.cache("element-bounds",function(){return r(e.element)}),s=n.height,a=n.width,f=this.getTargetBounds(),h=o+s,l=i+a,d=[];o<=f.bottom&&h>=f.top&&["left","right"].forEach(function(t){var e=f[t];(e===i||e===l)&&d.push(t)}),i<=f.right&&l>=f.left&&["top","bottom"].forEach(function(t){var e=f[t];(e===o||e===h)&&d.push(t)});var u=[],p=[],g=["left","top","right","bottom"];return u.push(this.getClass("abutted")),g.forEach(function(t){u.push(e.getClass("abutted")+"-"+t)}),d.length&&p.push(this.getClass("abutted")),d.forEach(function(t){p.push(e.getClass("abutted")+"-"+t)}),T(function(){e.options.addTargetClasses!==!1&&c(e.target,p,u),c(e.element,p,u)}),!0}});var M=function(){function t(t,e){var o=[],i=!0,n=!1,r=void 0;try{for(var s,a=t[Symbol.iterator]();!(i=(s=a.next()).done)&&(o.push(s.value),!e||o.length!==e);i=!0);}catch(f){n=!0,r=f}finally{try{!i&&a["return"]&&a["return"]()}finally{if(n)throw r}}return o}return function(e,o){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,o);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}();return C.modules.push({position:function(t){var e=t.top,o=t.left;if(this.options.shift){var i=this.options.shift;"function"==typeof this.options.shift&&(i=this.options.shift.call(this,{top:e,left:o}));var n=void 0,r=void 0;if("string"==typeof i){i=i.split(" "),i[1]=i[1]||i[0];var s=M(i,2);n=s[0],r=s[1],n=parseFloat(n,10),r=parseFloat(r,10)}else n=i.top,r=i.left;return e+=n,o+=r,{top:e,left:o}}}}),R});
	}

/***/ }),
/* 15 */
/***/ (function(module, exports) {

	if( typeof importScripts !== 'function' ){
	(function(w,l,r){function s(a,c){var d=c.getBoundingClientRect();return{x:Math.max(Math.min(a.clientX-d.left,c.clientWidth),0),y:Math.max(Math.min(a.clientY-d.top,c.clientHeight),0)}}function f(a,c,d){a=l.createElementNS("http://www.w3.org/2000/svg",a);for(var b in c)a.setAttribute(b,c[b]);Array.isArray(d)||(d=[d]);c=0;for(b=d[0]&&d.length||0;c<b;c++)a.appendChild(d[c]);return a}function k(a){var c,d,b,e,h=a.h%360/60;e=a.v*a.s;b=e*(1-Math.abs(h%2-1));c=d=a=a.v-e;h=~~h;c+=[e,b,0,0,b,e][h];d+=[b,e,
	e,b,0,0][h];a+=[0,0,b,e,e,b][h];b=Math.floor(255*c);d=Math.floor(255*d);a=Math.floor(255*a);return{r:b,g:d,b:a,hex:"#"+(16777216|a|d<<8|b<<16).toString(16).slice(1)}}function m(a){var c=a.r,d=a.g,b=a.b;if(1<a.r||1<a.g||1<a.b)c/=255,d/=255,b/=255;var e;a=Math.max(c,d,b);e=a-Math.min(c,d,b);c=(0==e?0:a==c?(d-b)/e+(d<b?6:0):a==d?(b-c)/e+2:(c-d)/e+4)%6*60;return{h:c,s:0==e?0:e/a,v:a}}function x(a,c,d){return function(b){b=s(b,c);a.h=b.y/c.offsetHeight*360;var e=k({h:a.h,s:1,v:1}),h=k({h:a.h,s:a.s,v:a.v});
	d.style.backgroundColor=e.hex;a.callback&&a.callback(h.hex,{h:a.h,s:a.s,v:a.v},{r:h.r,g:h.g,b:h.b},r,b)}}function y(a,c){return function(d){d=s(d,c);var b=c.offsetHeight;a.s=d.x/c.offsetWidth;a.v=(b-d.y)/b;b=k(a);a.callback&&a.callback(b.hex,{h:a.h,s:a.s,v:a.v},{r:b.r,g:b.g,b:b.b},d)}}function g(a,c,d){if(!(this instanceof g))return new g(a,c,d);this.h=0;this.v=this.s=1;d?(this.callback=d,this.pickerElement=c,this.slideElement=a):(a.innerHTML='<div class="picker-wrapper"><div class="picker"></div><div class="picker-indicator"></div></div><div class="slide-wrapper"><div class="slide"></div><div class="slide-indicator"></div></div>',
	this.slideElement=a.getElementsByClassName("slide")[0],this.pickerElement=a.getElementsByClassName("picker")[0],this.slideIndicator=a.getElementsByClassName("slide-indicator")[0],this.pickerIndicator=a.getElementsByClassName("picker-indicator")[0],g.positionIndicators(this.slideIndicator,this.pickerIndicator,{x:0,y:0},{x:0,y:0}),this.callback=function(a,b,d,e,f){g.positionIndicators(this.slideIndicator,this.pickerIndicator,f,e);c(a,b,d)});this.slide_listener=x(this,this.slideElement,this.pickerElement);
	this.picker_listener=y(this,this.pickerElement);d||this.fixIndicators(this.slideIndicator,this.pickerIndicator);a=t.cloneNode(!0);d=u.cloneNode(!0);var b=a.getElementsByTagName("defs")[0].firstChild,e=a.getElementsByTagName("rect")[0];b.id="gradient-hsv-"+n;e.setAttribute("fill","url(#"+b.id+")");b=d.getElementsByTagName("defs")[0];b=[b.firstChild,b.lastChild];e=d.getElementsByTagName("rect");b[0].id="gradient-black-"+n;b[1].id="gradient-white-"+n;e[0].setAttribute("fill","url(#"+b[1].id+")");e[1].setAttribute("fill",
	"url(#"+b[0].id+")");this.slideElement.appendChild(a);this.pickerElement.appendChild(d);n++;p(this.slideElement,this.slide_listener);p(this.pickerElement,this.picker_listener)}function p(a,c){function d(a){e&&c(a)}function b(a){d(a);e=!1;l.removeEventListener("mouseup",b,!1);l.removeEventListener("mousemove",d,!1)}var e=!1;a.addEventListener("mousedown",function(a){e=!0;a.preventDefault();l.addEventListener("mouseup",b,!0);l.addEventListener("mousemove",d,!1)},!1)}function q(a,c,d,b){a.h=c.h%360;
	a.s=c.s;a.v=c.v;c=k(a);var e={y:a.h*a.slideElement.offsetHeight/360,x:0},f=a.pickerElement.offsetHeight,f={x:a.s*a.pickerElement.offsetWidth,y:f-a.v*f};a.pickerElement.style.backgroundColor=k({h:a.h,s:1,v:1}).hex;a.callback&&a.callback(b||c.hex,{h:a.h,s:a.s,v:a.v},d||{r:c.r,g:c.g,b:c.b},f,e);return a}var u,t,v={xmlns:"http://www.w3.org/2000/svg",version:"1.1",width:"100%",height:"100%"};t=f("svg",v,[f("defs",{},f("linearGradient",{id:"gradient-hsv",x1:"0%",y1:"100%",x2:"0%",y2:"0%"},[f("stop",{offset:"0%",
	"stop-color":"#FF0000","stop-opacity":"1"}),f("stop",{offset:"13%","stop-color":"#FF00FF","stop-opacity":"1"}),f("stop",{offset:"25%","stop-color":"#8000FF","stop-opacity":"1"}),f("stop",{offset:"38%","stop-color":"#0040FF","stop-opacity":"1"}),f("stop",{offset:"50%","stop-color":"#00FFFF","stop-opacity":"1"}),f("stop",{offset:"63%","stop-color":"#00FF40","stop-opacity":"1"}),f("stop",{offset:"75%","stop-color":"#0BED00","stop-opacity":"1"}),f("stop",{offset:"88%","stop-color":"#FFFF00","stop-opacity":"1"}),
	f("stop",{offset:"100%","stop-color":"#FF0000","stop-opacity":"1"})])),f("rect",{x:"0",y:"0",width:"100%",height:"100%",fill:"url(#gradient-hsv)"})]);u=f("svg",v,[f("defs",{},[f("linearGradient",{id:"gradient-black",x1:"0%",y1:"100%",x2:"0%",y2:"0%"},[f("stop",{offset:"0%","stop-color":"#000000","stop-opacity":"1"}),f("stop",{offset:"100%","stop-color":"#CC9A81","stop-opacity":"0"})]),f("linearGradient",{id:"gradient-white",x1:"0%",y1:"100%",x2:"100%",y2:"100%"},[f("stop",{offset:"0%","stop-color":"#FFFFFF",
	"stop-opacity":"1"}),f("stop",{offset:"100%","stop-color":"#CC9A81","stop-opacity":"0"})])]),f("rect",{x:"0",y:"0",width:"100%",height:"100%",fill:"url(#gradient-white)"}),f("rect",{x:"0",y:"0",width:"100%",height:"100%",fill:"url(#gradient-black)"})]);var n=0;g.hsv2rgb=function(a){a=k(a);delete a.hex;return a};g.hsv2hex=function(a){return k(a).hex};g.rgb2hsv=m;g.rgb2hex=function(a){return k(m(a)).hex};g.hex2hsv=function(a){return m(g.hex2rgb(a))};g.hex2rgb=function(a){return{r:parseInt(a.substr(1,
	2),16),g:parseInt(a.substr(3,2),16),b:parseInt(a.substr(5,2),16)}};g.prototype.setHsv=function(a){return q(this,a)};g.prototype.setRgb=function(a){return q(this,m(a),a)};g.prototype.setHex=function(a){return q(this,g.hex2hsv(a),r,a)};g.positionIndicators=function(a,c,d,b){d&&(a.style.top=d.y-a.offsetHeight/2+"px");b&&(c.style.top=b.y-c.offsetHeight/2+"px",c.style.left=b.x-c.offsetWidth/2+"px")};g.prototype.fixIndicators=function(a,c){p(a,this.slide_listener);p(c,this.picker_listener)};w.ColorPicker=
	g})(window,window.document);
	}

/***/ }),
/* 16 */
/***/ (function(module, exports) {

	/**
	 * @author mrdoob / http://mrdoob.com/
	 * The MIT License, Copyright &copy; 2010-2016 three.js authors
	 */
	
	// TODO changes by Alexander S. Rose
	// - more events and properties
	// - ctrlKey modifier for Number and Integer
	// - UI.Element.prototype.getBox()
	// - UI.Element.prototype.dispose()
	// - UI.Element.prototype.setTitle()
	// - UI.Element.prototype.getStyle()
	
	var UI = {}
	
	UI.Element = function () {}
	
	UI.Element.prototype = {
	
	  setId: function (id) {
	    this.dom.id = id
	
	    return this
	  },
	
	  setTitle: function (title) {
	    this.dom.title = title
	
	    return this
	  },
	
	  setClass: function (name) {
	    this.dom.className = name
	
	    return this
	  },
	
	  setStyle: function (style, array) {
	    for (var i = 0; i < array.length; i++) {
	      this.dom.style[ style ] = array[ i ]
	    }
	  },
	
	  getStyle: function (style) {
	    return this.dom.style[ style ]
	  },
	
	  getBox: function () {
	    return this.dom.getBoundingClientRect()
	  },
	
	  setDisabled: function (value) {
	    this.dom.disabled = value
	
	    return this
	  },
	
	  setTextContent: function (value) {
	    this.dom.textContent = value
	
	    return this
	  },
	
	  dispose: function () {
	    this.dom.parentNode.removeChild(this.dom)
	  }
	
	}
	
	// properties
	
	var properties = [
	  'position', 'left', 'top', 'right', 'bottom', 'width', 'height', 'border',
	  'borderLeft', 'borderTop', 'borderRight', 'borderBottom', 'borderColor',
	  'display', 'overflow', 'overflowX', 'overflowY', 'margin', 'marginLeft',
	  'marginTop', 'marginRight',
	  'marginBottom', 'padding', 'paddingLeft', 'paddingTop', 'paddingRight',
	  'paddingBottom', 'color', 'backgroundColor', 'opacity', 'fontSize',
	  'fontWeight', 'fontStyle', 'fontFamily', 'textTransform', 'cursor',
	  'verticalAlign', 'clear', 'float', 'zIndex', 'minHeight', 'maxHeight',
	  'minWidth', 'maxWidth', 'wordBreak', 'wordWrap', 'spellcheck',
	  'lineHeight', 'whiteSpace', 'textOverflow', 'textAlign', 'pointerEvents'
	]
	
	properties.forEach(function (property) {
	  var methodSuffix = property.substr(0, 1).toUpperCase() +
	                        property.substr(1, property.length)
	
	  UI.Element.prototype[ 'set' + methodSuffix ] = function () {
	    this.setStyle(property, arguments)
	    return this
	  }
	
	  UI.Element.prototype[ 'get' + methodSuffix ] = function () {
	    return this.getStyle(property)
	  }
	})
	
	// events
	
	var events = [
	  'KeyUp', 'KeyDown', 'KeyPress',
	  'MouseOver', 'MouseOut', 'MouseDown', 'MouseUp', 'MouseMove',
	  'Click', 'Change', 'Input', 'Scroll'
	]
	
	events.forEach(function (event) {
	  var method = 'on' + event
	
	  UI.Element.prototype[ method ] = function (callback) {
	    this.dom.addEventListener(event.toLowerCase(), callback.bind(this), false)
	
	    return this
	  }
	})
	
	// Panel
	
	UI.Panel = function () {
	  UI.Element.call(this)
	
	  var dom = document.createElement('div')
	  dom.className = 'Panel'
	
	  this.dom = dom
	  this.children = []
	
	  return this
	}
	
	UI.Panel.prototype = Object.create(UI.Element.prototype)
	
	UI.Panel.prototype.add = function () {
	  for (var i = 0; i < arguments.length; i++) {
	    this.dom.appendChild(arguments[ i ].dom)
	    this.children.push(arguments[ i ])
	  }
	
	  return this
	}
	
	UI.Panel.prototype.remove = function () {
	  for (var i = 0; i < arguments.length; i++) {
	    this.dom.removeChild(arguments[ i ].dom)
	
	    var idx = this.children.indexOf(arguments[ i ])
	    if (idx !== -1) this.children.splice(idx, 1)
	  }
	
	  return this
	}
	
	UI.Panel.prototype.clear = function () {
	  while (this.dom.children.length) {
	    this.dom.removeChild(this.dom.lastChild)
	  }
	
	  this.children.length = 0
	
	  return this
	}
	
	// Collapsible Panel
	
	UI.CollapsiblePanel = function () {
	  UI.Panel.call(this)
	
	  this.dom.className = 'Panel CollapsiblePanel'
	
	  this.button = document.createElement('div')
	  this.button.className = 'CollapsiblePanelButton'
	  this.dom.appendChild(this.button)
	
	  var scope = this
	  this.button.addEventListener('click', function (event) {
	    scope.toggle()
	  }, false)
	
	  this.content = document.createElement('div')
	  this.content.className = 'CollapsibleContent'
	  this.dom.appendChild(this.content)
	
	  this.isCollapsed = false
	
	  return this
	}
	
	UI.CollapsiblePanel.prototype = Object.create(UI.Panel.prototype)
	
	UI.CollapsiblePanel.prototype.addStatic = function () {
	  for (var i = 0; i < arguments.length; i++) {
	    this.dom.insertBefore(arguments[ i ].dom, this.content)
	  }
	
	  return this
	}
	
	UI.CollapsiblePanel.prototype.removeStatic = UI.Panel.prototype.remove
	
	UI.CollapsiblePanel.prototype.clearStatic = function () {
	  this.dom.childNodes.forEach(function (child) {
	    if (child !== this.content) {
	      this.dom.removeChild(child)
	    }
	  })
	}
	
	UI.CollapsiblePanel.prototype.add = function () {
	  for (var i = 0; i < arguments.length; i++) {
	    this.content.appendChild(arguments[ i ].dom)
	  }
	
	  return this
	}
	
	UI.CollapsiblePanel.prototype.remove = function () {
	  for (var i = 0; i < arguments.length; i++) {
	    this.content.removeChild(arguments[ i ].dom)
	  }
	
	  return this
	}
	
	UI.CollapsiblePanel.prototype.clear = function () {
	  while (this.content.children.length) {
	    this.content.removeChild(this.content.lastChild)
	  }
	}
	
	UI.CollapsiblePanel.prototype.toggle = function () {
	  this.setCollapsed(!this.isCollapsed)
	}
	
	UI.CollapsiblePanel.prototype.collapse = function () {
	  this.setCollapsed(true)
	}
	
	UI.CollapsiblePanel.prototype.expand = function () {
	  this.setCollapsed(false)
	}
	
	UI.CollapsiblePanel.prototype.setCollapsed = function (setCollapsed) {
	  if (setCollapsed) {
	    this.dom.classList.add('collapsed')
	  } else {
	    this.dom.classList.remove('collapsed')
	  }
	
	  this.isCollapsed = setCollapsed
	}
	
	// Text
	
	UI.Text = function (text) {
	  UI.Element.call(this)
	
	  var dom = document.createElement('span')
	  dom.className = 'Text'
	  dom.style.display = 'inline-block'
	  dom.style.verticalAlign = 'middle'
	
	  this.dom = dom
	  this.setValue(text)
	
	  return this
	}
	
	UI.Text.prototype = Object.create(UI.Element.prototype)
	
	UI.Text.prototype.setValue = function (value) {
	  if (value !== undefined) {
	    this.dom.textContent = value
	  }
	
	  return this
	}
	
	UI.Text.prototype.setName = function (value) {
	  this.dom.name = value
	
	  return this
	}
	// Input
	
	UI.Input = function (value) {
	  UI.Element.call(this)
	
	  var scope = this
	
	  var dom = document.createElement('input')
	  dom.className = 'Input'
	  dom.style.padding = '2px'
	  dom.style.border = '1px solid #ccc'
	
	  dom.addEventListener('keydown', function (event) {
	    event.stopPropagation()
	  }, false)
	
	  this.dom = dom
	  this.setValue(value || '')
	
	  return this
	}
	
	UI.Input.prototype = Object.create(UI.Element.prototype)
	
	UI.Input.prototype.getValue = function () {
	  return this.dom.value
	}
	
	UI.Input.prototype.setValue = function (value) {
	  this.dom.value = value
	
	  return this
	}
	
	UI.Input.prototype.setName = function (value) {
	  this.dom.name = value
	
	  return this
	}
	
	// TextArea
	
	UI.TextArea = function () {
	  UI.Element.call(this)
	
	  var scope = this
	
	  var dom = document.createElement('textarea')
	  dom.className = 'TextArea'
	  dom.style.padding = '2px'
	  dom.style.border = '1px solid #ccc'
	
	  dom.addEventListener('keydown', function (event) {
	    event.stopPropagation()
	  }, false)
	
	  this.dom = dom
	
	  return this
	}
	
	UI.TextArea.prototype = Object.create(UI.Element.prototype)
	
	UI.TextArea.prototype.getValue = function () {
	  return this.dom.value
	}
	
	UI.TextArea.prototype.setValue = function (value) {
	  this.dom.value = value
	
	  return this
	}
	
	// Select
	
	UI.Select = function () {
	  UI.Element.call(this)
	
	  var scope = this
	
	  var dom = document.createElement('select')
	  dom.className = 'Select'
	  dom.style.width = '64px'
	  dom.style.height = '16px'
	  dom.style.border = '0px'
	  dom.style.padding = '0px'
	
	  this.dom = dom
	
	  return this
	}
	
	UI.Select.prototype = Object.create(UI.Element.prototype)
	
	UI.Select.prototype.setMultiple = function (boolean) {
	  this.dom.multiple = boolean
	
	  return this
	}
	
	UI.Select.prototype.setOptions = function (options) {
	  var selected = this.dom.value
	
	  while (this.dom.children.length > 0) {
	    this.dom.removeChild(this.dom.firstChild)
	  }
	
	  for (var key in options) {
	    var option = document.createElement('option')
	    option.value = key
	    option.innerHTML = options[ key ]
	    this.dom.appendChild(option)
	  }
	
	  this.dom.value = selected
	
	  return this
	}
	
	UI.Select.prototype.getValue = function () {
	  return this.dom.value
	}
	
	UI.Select.prototype.setValue = function (value) {
	  this.dom.value = value
	
	  return this
	}
	
	UI.Select.prototype.setName = function (value) {
	  this.dom.name = value
	
	  return this
	}
	
	// FancySelect
	
	UI.FancySelect = function () {
	  UI.Element.call(this)
	
	  var scope = this
	
	  var dom = document.createElement('div')
	  dom.className = 'FancySelect'
	  dom.tabIndex = 0 // keyup event is ignored without setting tabIndex
	
	  // Broadcast for object selection after arrow navigation
	  var changeEvent = document.createEvent('HTMLEvents')
	  changeEvent.initEvent('change', true, true)
	
	  // Prevent native scroll behavior
	  dom.addEventListener('keydown', function (event) {
	    switch (event.keyCode) {
	      case 38: // up
	      case 40: // down
	        event.preventDefault()
	        event.stopPropagation()
	        break
	    }
	  }, false)
	
	  // Keybindings to support arrow navigation
	  dom.addEventListener('keyup', function (event) {
	    switch (event.keyCode) {
	      case 38: // up
	      case 40: // down
	        scope.selectedIndex += (event.keyCode == 38) ? -1 : 1
	
	        if (scope.selectedIndex >= 0 && scope.selectedIndex < scope.options.length) {
	          // Highlight selected dom elem and scroll parent if needed
	          scope.setValue(scope.options[ scope.selectedIndex ].value)
	
	          scope.dom.dispatchEvent(changeEvent)
	        }
	
	        break
	    }
	  }, false)
	
	  this.dom = dom
	
	  this.options = []
	  this.selectedIndex = -1
	  this.selectedValue = null
	
	  return this
	}
	
	UI.FancySelect.prototype = Object.create(UI.Element.prototype)
	
	UI.FancySelect.prototype.setOptions = function (options) {
	  var scope = this
	
	  var changeEvent = document.createEvent('HTMLEvents')
	  changeEvent.initEvent('change', true, true)
	
	  while (scope.dom.children.length > 0) {
	    scope.dom.removeChild(scope.dom.firstChild)
	  }
	
	  scope.options = []
	
	  for (var i = 0; i < options.length; i++) {
	    var option = options[ i ]
	
	    var div = document.createElement('div')
	    div.className = 'option'
	    div.innerHTML = option.html
	    div.value = option.value
	    scope.dom.appendChild(div)
	
	    scope.options.push(div)
	
	    div.addEventListener('click', function (event) {
	      scope.setValue(this.value)
	      scope.dom.dispatchEvent(changeEvent)
	    }, false)
	  }
	
	  return scope
	}
	
	UI.FancySelect.prototype.getValue = function () {
	  return this.selectedValue
	}
	
	UI.FancySelect.prototype.setValue = function (value) {
	  for (var i = 0; i < this.options.length; i++) {
	    var element = this.options[ i ]
	
	    if (element.value === value) {
	      element.classList.add('active')
	
	      // scroll into view
	
	      var y = element.offsetTop - this.dom.offsetTop
	      var bottomY = y + element.offsetHeight
	      var minScroll = bottomY - this.dom.offsetHeight
	
	      if (this.dom.scrollTop > y) {
	        this.dom.scrollTop = y
	      } else if (this.dom.scrollTop < minScroll) {
	        this.dom.scrollTop = minScroll
	      }
	
	      this.selectedIndex = i
	    } else {
	      element.classList.remove('active')
	    }
	  }
	
	  this.selectedValue = value
	
	  return this
	}
	
	// Checkbox
	
	UI.Checkbox = function (boolean) {
	  UI.Element.call(this)
	
	  var scope = this
	
	  var dom = document.createElement('input')
	  dom.className = 'Checkbox'
	  dom.type = 'checkbox'
	
	  this.dom = dom
	  this.setValue(boolean)
	
	  return this
	}
	
	UI.Checkbox.prototype = Object.create(UI.Element.prototype)
	
	UI.Checkbox.prototype.getValue = function () {
	  return this.dom.checked
	}
	
	UI.Checkbox.prototype.setValue = function (value) {
	  if (value !== undefined) {
	    this.dom.checked = value
	  }
	
	  return this
	}
	
	UI.Checkbox.prototype.setName = function (value) {
	  this.dom.name = value
	
	  return this
	}
	// Color
	
	UI.Color = function () {
	  UI.Element.call(this)
	
	  var scope = this
	
	  var dom = document.createElement('input')
	  dom.className = 'Color'
	  dom.style.width = '64px'
	  dom.style.height = '16px'
	  dom.style.border = '0px'
	  dom.style.padding = '0px'
	  dom.style.backgroundColor = 'transparent'
	
	  try {
	    dom.type = 'color'
	    dom.value = '#ffffff'
	  } catch (exception) {}
	
	  this.dom = dom
	
	  return this
	}
	
	UI.Color.prototype = Object.create(UI.Element.prototype)
	
	UI.Color.prototype.getValue = function () {
	  return this.dom.value
	}
	
	UI.Color.prototype.getHexValue = function () {
	  return parseInt(this.dom.value.substr(1), 16)
	}
	
	UI.Color.prototype.setValue = function (value) {
	  this.dom.value = value
	
	  return this
	}
	
	UI.Color.prototype.setHexValue = function (hex) {
	  this.dom.value = '#' + ('000000' + hex.toString(16)).slice(-6)
	
	  return this
	}
	
	// Number
	
	UI.Number = function (number) {
	  UI.Element.call(this)
	
	  var scope = this
	
	  var dom = document.createElement('input')
	  dom.className = 'Number'
	  dom.value = '0.00'
	
	  dom.addEventListener('keydown', function (event) {
	    event.stopPropagation()
	
	    if (event.keyCode === 13) dom.blur()
	  }, false)
	
	  this.min = -Infinity
	  this.max = Infinity
	
	  this.precision = 2
	  this.step = 1
	
	  this.dom = dom
	  this.setValue(number)
	
	  var changeEvent = document.createEvent('HTMLEvents')
	  changeEvent.initEvent('change', true, true)
	
	  var distance = 0
	  var onMouseDownValue = 0
	
	  var pointer = [ 0, 0 ]
	  var prevPointer = [ 0, 0 ]
	
	  var onMouseDown = function (event) {
	    event.preventDefault()
	
	    distance = 0
	
	    onMouseDownValue = parseFloat(dom.value)
	
	    prevPointer = [ event.clientX, event.clientY ]
	
	    document.addEventListener('mousemove', onMouseMove, false)
	    document.addEventListener('mouseup', onMouseUp, false)
	  }
	
	  var onMouseMove = function (event) {
	    var currentValue = dom.value
	
	    pointer = [ event.clientX, event.clientY ]
	
	    distance += (pointer[ 0 ] - prevPointer[ 0 ]) - (pointer[ 1 ] - prevPointer[ 1 ])
	
	    var modifier = 50
	    if (event.shiftKey) modifier = 5
	    if (event.ctrlKey) modifier = 500
	
	    var number = onMouseDownValue + (distance / modifier) * scope.step
	
	    dom.value = Math.min(scope.max, Math.max(scope.min, number)).toFixed(scope.precision)
	
	    if (currentValue !== dom.value) dom.dispatchEvent(changeEvent)
	
	    prevPointer = [ event.clientX, event.clientY ]
	  }
	
	  var onMouseUp = function (event) {
	    document.removeEventListener('mousemove', onMouseMove, false)
	    document.removeEventListener('mouseup', onMouseUp, false)
	
	    if (Math.abs(distance) < 2) {
	      dom.focus()
	      dom.select()
	    }
	  }
	
	  var onChange = function (event) {
	    var number = parseFloat(dom.value)
	
	    dom.value = isNaN(number) === false ? number : 0
	  }
	
	  var onFocus = function (event) {
	    dom.style.backgroundColor = ''
	    dom.style.borderColor = '#ccc'
	    dom.style.cursor = ''
	  }
	
	  var onBlur = function (event) {
	    dom.style.backgroundColor = 'transparent'
	    dom.style.borderColor = 'transparent'
	    dom.style.cursor = 'col-resize'
	  }
	
	  dom.addEventListener('mousedown', onMouseDown, false)
	  dom.addEventListener('change', onChange, false)
	  dom.addEventListener('focus', onFocus, false)
	  dom.addEventListener('blur', onBlur, false)
	
	  return this
	}
	
	UI.Number.prototype = Object.create(UI.Element.prototype)
	
	UI.Number.prototype.getValue = function () {
	  return parseFloat(this.dom.value)
	}
	
	UI.Number.prototype.setValue = function (value) {
	  if (isNaN(value)) {
	    this.dom.value = NaN
	  } else if (value !== undefined) {
	    this.dom.value = value.toFixed(this.precision)
	  }
	
	  return this
	}
	
	UI.Number.prototype.setRange = function (min, max) {
	  this.min = min
	  this.max = max
	
	  return this
	}
	
	UI.Number.prototype.setPrecision = function (precision) {
	  this.precision = precision
	  this.setValue(parseFloat(this.dom.value))
	
	  return this
	}
	
	UI.Number.prototype.setName = function (value) {
	  this.dom.name = value
	
	  return this
	}
	// Integer
	
	UI.Integer = function (number) {
	  UI.Element.call(this)
	
	  var scope = this
	
	  var dom = document.createElement('input')
	  dom.className = 'Number'
	  dom.value = '0.00'
	
	  dom.addEventListener('keydown', function (event) {
	    event.stopPropagation()
	  }, false)
	
	  this.min = -Infinity
	  this.max = Infinity
	
	  this.step = 1
	
	  this.dom = dom
	  this.setValue(number)
	
	  var changeEvent = document.createEvent('HTMLEvents')
	  changeEvent.initEvent('change', true, true)
	
	  var distance = 0
	  var onMouseDownValue = 0
	
	  var pointer = [ 0, 0 ]
	  var prevPointer = [ 0, 0 ]
	
	  var onMouseDown = function (event) {
	    event.preventDefault()
	
	    distance = 0
	
	    onMouseDownValue = parseFloat(dom.value)
	
	    prevPointer = [ event.clientX, event.clientY ]
	
	    document.addEventListener('mousemove', onMouseMove, false)
	    document.addEventListener('mouseup', onMouseUp, false)
	  }
	
	  var onMouseMove = function (event) {
	    var currentValue = dom.value
	
	    pointer = [ event.clientX, event.clientY ]
	
	    distance += (pointer[ 0 ] - prevPointer[ 0 ]) - (pointer[ 1 ] - prevPointer[ 1 ])
	
	    var modifier = 50
	    if (event.shiftKey) modifier = 5
	    if (event.ctrlKey) modifier = 500
	
	    var number = onMouseDownValue + (distance / modifier) * scope.step
	
	    dom.value = Math.min(scope.max, Math.max(scope.min, number)) | 0
	
	    if (currentValue !== dom.value) dom.dispatchEvent(changeEvent)
	
	    prevPointer = [ event.clientX, event.clientY ]
	  }
	
	  var onMouseUp = function (event) {
	    document.removeEventListener('mousemove', onMouseMove, false)
	    document.removeEventListener('mouseup', onMouseUp, false)
	
	    if (Math.abs(distance) < 2) {
	      dom.focus()
	      dom.select()
	    }
	  }
	
	  var onChange = function (event) {
	    var number = parseInt(dom.value)
	
	    if (isNaN(number) === false) {
	      dom.value = number
	    }
	  }
	
	  var onFocus = function (event) {
	    dom.style.backgroundColor = ''
	    dom.style.borderColor = '#ccc'
	    dom.style.cursor = ''
	  }
	
	  var onBlur = function (event) {
	    dom.style.backgroundColor = 'transparent'
	    dom.style.borderColor = 'transparent'
	    dom.style.cursor = 'col-resize'
	  }
	
	  dom.addEventListener('mousedown', onMouseDown, false)
	  dom.addEventListener('change', onChange, false)
	  dom.addEventListener('focus', onFocus, false)
	  dom.addEventListener('blur', onBlur, false)
	
	  return this
	}
	
	UI.Integer.prototype = Object.create(UI.Element.prototype)
	
	UI.Integer.prototype.getValue = function () {
	  return parseInt(this.dom.value)
	}
	
	UI.Integer.prototype.setValue = function (value) {
	  if (value !== undefined) {
	    this.dom.value = value | 0
	  }
	
	  return this
	}
	
	UI.Integer.prototype.setRange = function (min, max) {
	  this.min = min
	  this.max = max
	
	  return this
	}
	
	UI.Integer.prototype.setName = function (value) {
	  this.dom.name = value
	
	  return this
	}
	
	UI.Integer.prototype.setStep = function (step) {
	  this.step = step
	
	  return this
	}
	// Break
	
	UI.Break = function () {
	  UI.Element.call(this)
	
	  var dom = document.createElement('br')
	  dom.className = 'Break'
	
	  this.dom = dom
	
	  return this
	}
	
	UI.Break.prototype = Object.create(UI.Element.prototype)
	
	// HorizontalRule
	
	UI.HorizontalRule = function () {
	  UI.Element.call(this)
	
	  var dom = document.createElement('hr')
	  dom.className = 'HorizontalRule'
	
	  this.dom = dom
	
	  return this
	}
	
	UI.HorizontalRule.prototype = Object.create(UI.Element.prototype)
	
	// Button
	
	UI.Button = function (value) {
	  UI.Element.call(this)
	
	  var scope = this
	
	  var dom = document.createElement('button')
	  dom.className = 'Button'
	
	  this.dom = dom
	  this.dom.textContent = value
	
	  return this
	}
	
	UI.Button.prototype = Object.create(UI.Element.prototype)
	
	UI.Button.prototype.setLabel = function (value) {
	  this.dom.textContent = value
	
	  return this
	}
	
	// Helper
	
	UI.MenubarHelper = {
	
	  createMenuContainer: function (name, optionsPanel) {
	    var container = new UI.Panel()
	    var title = new UI.Panel()
	    title.setClass('title')
	
	    title.setTextContent(name)
	    title.setMargin('0px')
	    title.setPadding('8px')
	
	    container.setClass('menu')
	    container.add(title)
	    container.add(optionsPanel)
	
	    return container
	  },
	
	  createOption: function (name, callbackHandler, icon) {
	    var option = new UI.Panel()
	    option.setClass('option')
	
	    if (icon) {
	      option.add(new UI.Icon(icon).setWidth('20px'))
	      option.add(new UI.Text(name))
	    } else {
	      option.setTextContent(name)
	    }
	
	    option.onClick(callbackHandler)
	
	    return option
	  },
	
	  createOptionsPanel: function (menuConfig) {
	    var options = new UI.Panel()
	    options.setClass('options')
	
	    menuConfig.forEach(function (option) {
	      options.add(option)
	    })
	
	    return options
	  },
	
	  createInput: function (name, callbackHandler) {
	    var panel = new UI.Panel()
	      .setClass('option')
	
	    var text = new UI.Text()
	      .setWidth('70px')
	      .setValue(name)
	
	    var input = new UI.Input()
	      .setWidth('40px')
	      .onKeyDown(callbackHandler)
	
	    panel.add(text)
	    panel.add(input)
	
	    return panel
	  },
	
	  createCheckbox: function (name, value, callbackHandler) {
	    var panel = new UI.Panel()
	      .setClass('option')
	
	    var text = new UI.Text()
	      .setWidth('70px')
	      .setValue(name)
	
	    var checkbox = new UI.Checkbox()
	      .setValue(value)
	      .onClick(callbackHandler)
	
	    panel.add(checkbox)
	    panel.add(text)
	
	    return panel
	  },
	
	  createDivider: function () {
	    return new UI.HorizontalRule()
	  }
	
	}
	
	module.exports = {
	    "UI": UI
	}


/***/ }),
/* 17 */
/***/ (function(module, exports, __webpack_require__) {

	/**
	 * @author Alexander Rose <alexander.rose@weirdbyte.de>
	 */
	
	// Html
	
	var UI = __webpack_require__(16).UI;
	__webpack_require__(14)
	
	UI.Html = function (html) {
	  UI.Element.call(this)
	
	  var dom = document.createElement('span')
	  dom.className = 'Html'
	  dom.style.cursor = 'default'
	  dom.style.display = 'inline-block'
	  dom.style.verticalAlign = 'middle'
	
	  this.dom = dom
	  this.setValue(html)
	
	  return this
	}
	
	UI.Html.prototype = Object.create(UI.Element.prototype)
	
	UI.Html.prototype.setValue = function (value) {
	  if (value !== undefined) {
	    this.dom.innerHTML = value
	  }
	
	  return this
	}
	
	// Form
	
	UI.Form = function () {
	  UI.Panel.call(this)
	
	  var dom = document.createElement('form')
	  dom.className = 'Form'
	  dom.method = 'post'
	  dom.action = ''
	  dom.target = '_blank'
	  dom.enctype = 'multipart/form-data'
	
	  this.dom = dom
	
	  return this
	}
	
	UI.Form.prototype = Object.create(UI.Panel.prototype)
	
	UI.Form.prototype.setMethod = function (value) {
	  this.dom.method = value
	
	  return this
	}
	
	UI.Form.prototype.setAction = function (value) {
	  this.dom.action = value
	
	  return this
	}
	
	UI.Form.prototype.setTarget = function (value) {
	  this.dom.target = value
	
	  return this
	}
	
	UI.Form.prototype.setEnctype = function (value) {
	  this.dom.enctype = value
	
	  return this
	}
	
	// File
	
	UI.File = function () {
	  UI.Input.call(this)
	
	  this.dom.className = 'File'
	  this.dom.type = 'file'
	  this.dom.multiple = false
	
	  return this
	}
	
	UI.File.prototype = Object.create(UI.Input.prototype)
	
	UI.File.prototype.setMultiple = function (value) {
	  this.dom.multiple = value
	
	  return this
	}
	
	UI.File.prototype.getFiles = function (value) {
	  return this.dom.files
	}
	
	// Hidden
	
	UI.Hidden = function () {
	  UI.Input.call(this)
	
	  this.dom.type = 'hidden'
	
	  return this
	}
	
	UI.Hidden.prototype = Object.create(UI.Input.prototype)
	
	// Toggle Button
	
	UI.ToggleButton = function (labelA, labelB, callbackA, callbackB) {
	  UI.Button.call(this, labelB)
	
	  var flag = true
	
	  this.onClick(function () {
	    if (flag) {
	      flag = false
	      this.setLabel(labelA)
	      callbackB()
	    } else {
	      flag = true
	      this.setLabel(labelB)
	      callbackA()
	    }
	  }.bind(this))
	
	  return this
	}
	
	UI.ToggleButton.prototype = Object.create(UI.Button.prototype)
	
	// Ellipsis Text
	
	UI.EllipsisText = function (text) {
	  UI.Text.call(this, text)
	
	  this.setWhiteSpace('nowrap')
	  this.setOverflow('hidden')
	  this.setTextOverflow('ellipsis')
	
	  return this
	}
	
	UI.EllipsisText.prototype = Object.create(UI.Text.prototype)
	
	UI.EllipsisText.prototype.setValue = function (value) {
	  if (value !== undefined) {
	    this.dom.textContent = value
	    this.setTitle(value)
	  }
	
	  return this
	}
	
	// Ellipsis Multiline Text
	
	UI.EllipsisMultilineText = function (text) {
	  // http://www.mobify.com/blog/multiline-ellipsis-in-pure-css/
	
	  UI.Element.call(this)
	
	  var dom = document.createElement('span')
	  dom.className = 'EllipsisMultilineText'
	  dom.style.cursor = 'default'
	  dom.style.display = 'inline-block'
	  dom.style.verticalAlign = 'middle'
	
	  var content = document.createElement('p')
	  dom.appendChild(content)
	
	  this.dom = dom
	  this.content = content
	
	  this.setValue(text)
	
	  return this
	}
	
	UI.EllipsisMultilineText.prototype = Object.create(UI.Element.prototype)
	
	UI.EllipsisMultilineText.prototype.setValue = function (value) {
	  if (value !== undefined) {
	    this.content.textContent = value
	    this.setTitle(value)
	  }
	
	  return this
	}
	
	// Overlay Panel
	
	UI.OverlayPanel = function () {
	  UI.Panel.call(this)
	
	  this.dom.className = 'Panel OverlayPanel'
	  this.dom.tabIndex = '-1'
	  this.dom.style.outline = 'none'
	
	  return this
	}
	
	UI.OverlayPanel.prototype = Object.create(UI.Panel.prototype)
	
	UI.OverlayPanel.prototype.attach = function (node) {
	  node = node || document.body
	
	  node.appendChild(this.dom)
	
	  return this
	}
	
	// Icon (requires font awesome)
	
	UI.Icon = function (value) {
	  UI.Panel.call(this)
	
	  var dom = document.createElement('span')
	  dom.className = 'Icon fa'
	
	  this.dom = dom
	
	  if (value) this.addClass.apply(this, arguments)
	
	  return this
	}
	
	UI.Icon.prototype = Object.create(UI.Panel.prototype)
	
	UI.Icon.prototype.hasClass = function (value) {
	  return this.dom.classList.contains('fa-' + value)
	}
	
	UI.Icon.prototype.addClass = function (value) {
	  for (var i = 0; i < arguments.length; i++) {
	    this.dom.classList.add('fa-' + arguments[ i ])
	  }
	
	  return this
	}
	
	UI.Icon.prototype.setClass = function (value) {
	  this.dom.className = 'Icon fa'
	
	  for (var i = 0; i < arguments.length; i++) {
	    this.dom.classList.add('fa-' + arguments[ i ])
	  }
	
	  return this
	}
	
	UI.Icon.prototype.removeClass = function (value) {
	  for (var i = 0; i < arguments.length; i++) {
	    this.dom.classList.remove('fa-' + arguments[ i ])
	  }
	
	  return this
	}
	
	UI.Icon.prototype.switchClass = function (newValue, oldValue) {
	  this.removeClass(oldValue, newValue)
	  this.addClass(newValue)
	
	  return this
	}
	
	// Toggle Icon
	
	UI.ToggleIcon = function (value, classTrue, classFalse) {
	  UI.Icon.call(this, value ? classTrue : classFalse)
	
	  this.value = value
	  this.classTrue = classTrue
	  this.classFalse = classFalse
	
	  return this
	}
	
	UI.ToggleIcon.prototype = Object.create(UI.Icon.prototype)
	
	UI.ToggleIcon.prototype.setValue = function (value) {
	  this.value = value
	
	  if (value) {
	    this.switchClass(this.classTrue, this.classFalse)
	  } else {
	    this.switchClass(this.classFalse, this.classTrue)
	  }
	
	  return this
	}
	
	UI.ToggleIcon.prototype.getValue = function () {
	  return this.value
	}
	
	// Dispose Icon
	
	UI.DisposeIcon = function () {
	  UI.Icon.call(this, 'trash-o')
	
	  var flag = false
	  var scope = this
	
	  this.setTitle('delete')
	  this.setCursor('pointer')
	
	  this.onClick(function () {
	    if (flag === true) {
	      if (typeof scope.disposeFunction === 'function') {
	        scope.disposeFunction()
	      }
	    } else {
	      scope.setColor('rgb(178, 34, 34)')
	      scope.dom.classList.add('deleteInfo')
	      flag = true
	
	      setTimeout(function () {
	        scope.setColor('#888')
	        scope.dom.classList.remove('deleteInfo')
	        flag = false
	      }, 1500)
	    }
	  })
	
	  return this
	}
	
	UI.DisposeIcon.prototype = Object.create(UI.Icon.prototype)
	
	UI.DisposeIcon.prototype.setDisposeFunction = function (fn) {
	  this.disposeFunction = fn
	
	  return this
	}
	
	// Progress
	
	UI.Progress = function (max, value) {
	  UI.Element.call(this)
	
	  var dom = document.createElement('progress')
	  dom.className = 'Progress'
	
	  dom.max = max || 1.0
	  if (value !== undefined) dom.value = value
	
	  this.dom = dom
	
	  return this
	}
	
	UI.Progress.prototype = Object.create(UI.Element.prototype)
	
	UI.Progress.prototype.getValue = function () {
	  return this.dom.value
	}
	
	UI.Progress.prototype.setValue = function (value) {
	  this.dom.value = value
	
	  return this
	}
	
	UI.Progress.prototype.setMax = function (value) {
	  this.dom.max = value
	
	  return this
	}
	
	UI.Progress.prototype.setIndeterminate = function () {
	  this.dom.removeAttribute('value')
	
	  return this
	}
	
	// Range
	
	UI.Range = function (min, max, value, step) {
	  UI.Element.call(this)
	
	  var dom = document.createElement('input')
	  dom.className = 'Range'
	  dom.type = 'range'
	
	  dom.min = min.toPrecision(3)
	  dom.max = max.toPrecision(3)
	  dom.value = value.toPrecision(3)
	  dom.step = step.toPrecision(3)
	
	  this.dom = dom
	
	  return this
	}
	
	UI.Range.prototype = Object.create(UI.Element.prototype)
	
	UI.Range.prototype.getValue = function () {
	  return parseFloat(this.dom.value)
	}
	
	UI.Range.prototype.setRange = function (min, max) {
	  this.dom.min = min
	  this.dom.max = max
	
	  return this
	}
	
	UI.Range.prototype.setValue = function (value) {
	  this.dom.value = value
	
	  return this
	}
	
	UI.Range.prototype.setStep = function (value) {
	  this.dom.step = value
	
	  return this
	}
	
	// AdaptiveTextArea
	
	UI.AdaptiveTextArea = function () {
	  // http://www.brianchu.com/blog/2013/11/02/creating-an-auto-growing-text-input/
	
	  UI.Element.call(this)
	
	  var container = document.createElement('div')
	  container.className = 'AdaptiveTextAreaContainer'
	
	  var textarea = document.createElement('textarea')
	  textarea.className = 'AdaptiveTextArea'
	
	  var size = document.createElement('div')
	  size.className = 'AdaptiveTextAreaSize'
	
	  container.appendChild(textarea)
	  container.appendChild(size)
	
	  textarea.addEventListener('input', function (event) {
	    size.innerHTML = textarea.value + '\n'
	  }, false)
	
	  this.textarea = textarea
	  this.size = size
	  this.dom = container
	
	  return this
	}
	
	UI.AdaptiveTextArea.prototype = Object.create(UI.Element.prototype)
	
	UI.AdaptiveTextArea.prototype.getValue = function () {
	  return this.textarea.value
	}
	
	UI.AdaptiveTextArea.prototype.setValue = function (value) {
	  this.textarea.value = value
	  this.size.innerHTML = value + '\n'
	
	  return this
	}
	
	UI.AdaptiveTextArea.prototype.setSpellcheck = function (value) {
	  this.textarea.spellcheck = value
	
	  return this
	}
	
	UI.AdaptiveTextArea.prototype.setBackgroundColor = function (value) {
	  this.textarea.style.backgroundColor = value
	
	  return this
	}
	
	// Virtual List
	
	UI.VirtualList = function (items, itemHeight, height, generatorFn) {
	  // based on Virtual DOM List
	  // https://github.com/sergi/virtual-list
	  // The MIT License (MIT)
	  // Copyright (C) 2013 Sergi Mansilla
	
	  UI.Element.call(this)
	
	  items = items || []
	  itemHeight = itemHeight || 20
	  height = height || 300
	  generatorFn = generatorFn || function () {}
	
	  var dom = document.createElement('div')
	  dom.className = 'VirtualList'
	  dom.style.height = height + 'px'
	
	  var totalRows = items.length
	  var screenItemsCount = Math.ceil(height / itemHeight)
	  var cachedItemsCount = screenItemsCount * 3
	  var lastRepaintY
	  var maxBuffer = screenItemsCount * itemHeight
	  var lastScrolled = 0
	  var renderChunkCallback = function () {}
	
	  var list = document.createElement('div')
	  list.style.width = '100%'
	  list.style.height = height + 'px'
	  list.style[ 'overflow-y' ] = 'auto'
	  list.style.position = 'relative'
	  list.style.padding = 0
	
	  var scroller = document.createElement('div')
	  scroller.style.opacity = 0
	  scroller.style.position = 'absolute'
	  scroller.style.top = 0
	  scroller.style.left = 0
	  scroller.style.width = '1px'
	  scroller.style.height = (itemHeight * totalRows) + 'px'
	
	  function createRow (i) {
	    var item = generatorFn(i)
	    item.classList.add('VirtualListRow')
	    item.style.height = itemHeight + 'px'
	    item.style.top = (i * itemHeight) + 'px'
	    return item
	  }
	
	  function renderChunk (from) {
	    var finalItem = Math.min(totalRows, from + cachedItemsCount)
	    renderChunkCallback(from, finalItem)
	    // Append all the new rows in a document fragment
	    // that we will later append to the parent node
	    var fragment = document.createDocumentFragment()
	    for (var i = from; i < finalItem; i++) {
	      fragment.appendChild(createRow(i))
	    }
	    // Hide and mark obsolete nodes for deletion.
	    for (var j = 1, l = list.childNodes.length; j < l; j++) {
	      list.childNodes[ j ].style.display = 'none'
	      list.childNodes[ j ].setAttribute('data-rm', '1')
	    }
	    list.appendChild(fragment)
	  };
	
	  // As soon as scrolling has stopped, this interval asynchronously
	  // removes all the nodes that are not used anymore
	  var rmNodeInterval = setInterval(function () {
	    // check if list is still attached to dom
	    var element = dom
	    while (element !== document && element.parentNode) {
	      element = element.parentNode
	    }
	    // if list not attached to dom, clear interval
	    if (element !== document) {
	      clearInterval(rmNodeInterval)
	    }
	    // remove tagged nodes
	    if (Date.now() - lastScrolled > 100) {
	      var badNodes = list.querySelectorAll('[data-rm="1"]')
	      for (var i = 0, l = badNodes.length; i < l; i++) {
	        list.removeChild(badNodes[ i ])
	      }
	    }
	  }, 500)
	
	  function onScroll (e) {
	    var scrollTop = e.target.scrollTop // Triggers reflow
	    if (!lastRepaintY || Math.abs(scrollTop - lastRepaintY) > maxBuffer) {
	      var first = Math.floor(scrollTop / itemHeight)
	      renderChunk(Math.max(0, first - screenItemsCount))
	      lastRepaintY = scrollTop
	    }
	    lastScrolled = Date.now()
	    e.preventDefault && e.preventDefault()
	  }
	
	  // API
	
	  this.setItems = function (value) {
	    items = value
	    totalRows = items.length
	    scroller.style.height = (itemHeight * totalRows) + 'px'
	    renderChunk(0)
	    return this
	  }
	
	  this.setItemHeight = function (value) {
	    itemHeight = value
	    screenItemsCount = Math.ceil(height / itemHeight)
	    cachedItemsCount = screenItemsCount * 3
	    maxBuffer = screenItemsCount * itemHeight
	    scroller.style.height = (itemHeight * totalRows) + 'px'
	    renderChunk(0)
	    return this
	  }
	
	  this.setHeight = function (value) {
	    UI.Element.prototype.setHeight.call(this, value + 'px')
	    height = value
	    screenItemsCount = Math.ceil(height / itemHeight)
	    cachedItemsCount = screenItemsCount * 3
	    maxBuffer = screenItemsCount * itemHeight
	    list.style.height = height + 'px'
	    scroller.style.height = height + 'px'
	    renderChunk(0)
	    return this
	  }
	
	  this.setGeneratorFn = function (value) {
	    generatorFn = value
	    renderChunk(0)
	    return this
	  }
	
	  this.setRenderChunkCallback = function (value) {
	    renderChunkCallback = value
	  }
	
	  this.redraw = function () {
	    var first = Math.floor(list.scrollTop / itemHeight)
	    renderChunk(Math.max(0, first - screenItemsCount))
	    lastRepaintY = list.scrollTop
	    return this
	  }
	
	  //
	
	  list.appendChild(scroller)
	  dom.appendChild(list)
	  list.addEventListener('scroll', onScroll)
	  renderChunk(0)
	
	  this.dom = dom
	
	  return this
	}
	
	UI.VirtualList.prototype = Object.create(UI.Element.prototype)
	
	// Virtual Table
	
	UI.VirtualTable = function (items, itemHeight, height, columns, params) {
	  var p = params || {}
	
	  UI.Panel.call(this)
	
	  // this.setOverflow( "scroll" );
	
	  var defaultWidth = p.defaultWidth !== undefined ? p.defaultWidth : 30
	  var defaultMargin = p.defaultMargin !== undefined ? p.defaultMargin : 5
	  var defaultAlign = p.defaultAlign !== undefined ? p.defaultAlign : 'left'
	  var onRowSelect = p.onRowSelect
	
	  // header
	
	  var header = new UI.Panel()
	    .setWhiteSpace('nowrap')
	    .setDisplay('inline-block')
	    .setOverflow('')
	    .setWidth('100%')
	
	  var fullWidth = 0
	
	  var selected = []
	
	  var numericalSort = function (a, b) {
	    return a - b
	  }
	
	  var lexicalSort = function (a, b) {
	    return a.localeCompare(b)
	  }
	
	  var sortColumn = function (idx, flag) {
	    var sort
	    if (typeof items[ 0 ][ idx ] === 'string') {
	      sort = lexicalSort
	    } else {
	      sort = numericalSort
	    }
	    items.sort(function (a, b) {
	      if (flag) {
	        return sort(b[ idx ], a[ idx ])
	      } else {
	        return sort(a[ idx ], b[ idx ])
	      }
	    })
	    virtualList.redraw()
	    return this
	  }
	
	  var selectRow = function (event, idx) {
	    selected.length = 0
	    if (onRowSelect) onRowSelect(event, idx)
	    if (idx !== undefined) {
	      selected.push(items[ idx ][ 0 ])
	    }
	    virtualList.redraw()
	    return this
	  }
	
	  columns.forEach(function (col) {
	    var width = col.width || defaultWidth
	    var margin = col.margin || defaultMargin
	
	    var text = new UI.EllipsisText()
	      .setValue(col.name)
	      .setWidth(width + 'px')
	      .setTextAlign(col.align || defaultAlign)
	      .setMarginLeft(margin + 'px')
	      .setMarginRight(margin + 'px')
	      .setCursor('pointer')
	      .onClick(function (e) {
	        var flag = col.__sortFlag === 'ASC'
	        sortColumn(col.index, flag)
	        if (flag) {
	          col.__sortFlag = 'DESC'
	        } else {
	          col.__sortFlag = 'ASC'
	        }
	      })
	
	    header.add(text)
	
	    fullWidth += width + 2 * margin
	  })
	
	  // list
	
	  var generatorFn = function (index) {
	    var panel = new UI.Panel()
	
	    columns.forEach(function (col) {
	      var value = items[ index ][ col.index ]
	      if (col.format) value = col.format(value)
	
	      var width = col.width || defaultWidth
	      var margin = col.margin || defaultMargin
	
	      var element
	      if (typeof value === 'object') {
	        element = value
	      } else {
	        element = new UI.Text()
	          .setValue(value)
	      }
	
	      element
	        .setWidth(width + 'px')
	        .setTextAlign(col.align || defaultAlign)
	        .setMarginLeft(margin + 'px')
	        .setMarginRight(margin + 'px')
	        .onClick(function (event) {
	          if (typeof col.onClick === 'function') {
	            col.onClick(event, index, value)
	          }
	        })
	        .onMouseOver(function (event) {
	          if (typeof col.onMouseOver === 'function') {
	            col.onMouseOver(event, index, value)
	          }
	        })
	        .onMouseOut(function (event) {
	          if (typeof col.onMouseOut === 'function') {
	            col.onMouseOut(event, index, value)
	          }
	        })
	
	      panel.add(element)
	    })
	
	    panel
	      .setCursor('pointer')
	      .onClick(function (event) {
	        selectRow(event, index)
	      })
	
	    if (selected.indexOf(items[ index ][ 0 ]) !== -1) {
	      panel.dom.classList.add('highlight')
	    }
	
	    return panel.dom
	  }
	
	  var virtualList = new UI.VirtualList(
	    items, itemHeight, height, generatorFn
	  ).setWidth((fullWidth + 20) + 'px')
	
	  //
	
	  this.add(header, virtualList)
	
	  // API
	
	  this.header = header
	  this.list = virtualList
	  this.sortColumn = sortColumn
	  this.selectRow = function (idx) {
	    selectRow(undefined, idx)
	  }
	
	  return this
	}
	
	UI.VirtualTable.prototype = Object.create(UI.Panel.prototype)
	
	// Popup Menu (requires Tether)
	
	UI.PopupMenu = function (iconClass, heading, constraintTo) {
	  constraintTo = constraintTo || 'scrollParent'
	
	  UI.Panel.call(this)
	
	  var entryLabelWidth = '100px'
	
	  var icon = new UI.Icon(iconClass || 'bars')
	
	  var panel = new UI.OverlayPanel()
	    .setDisplay('none')
	    .attach(this.dom)
	
	  var xOffset = 0
	  var yOffset = 0
	
	  var prevX = 0
	  var prevY = 0
	
	  function onMousemove (e) {
	    if (prevX === 0) {
	      prevX = e.clientX
	      prevY = e.clientY
	    }
	    xOffset += prevX - e.clientX
	    yOffset += prevY - e.clientY
	    prevX = e.clientX
	    prevY = e.clientY
	    tether.setOptions({
	      element: panel.dom,
	      target: icon.dom,
	      attachment: 'top right',
	      targetAttachment: 'top left',
	      offset: yOffset + 'px ' + xOffset + 'px',
	      constraints: [{
	        to: constraintTo,
	        pin: ['top', 'bottom']
	      }]
	    })
	    tether.position()
	  }
	
	  var headingPanel = new UI.Panel()
	    .setBorderBottom('1px solid #555')
	    .setMarginBottom('10px')
	    .setHeight('25px')
	    .setCursor('move')
	    .onMouseDown(function (e) {
	      if (e.which === 1) {
	        document.addEventListener('mousemove', onMousemove)
	      }
	      document.addEventListener('mouseup', function (e) {
	        document.removeEventListener('mousemove', onMousemove)
	      })
	    })
	
	  headingPanel
	    .add(
	      new UI.Icon('times')
	        .setFloat('right')
	        .setCursor('pointer')
	        .onClick(function () {
	          this.setMenuDisplay('none')
	        }.bind(this))
	    )
	    .add(
	      new UI.Text(heading)
	    )
	
	  panel.add(headingPanel)
	
	  var tether
	
	  icon.setTitle('menu')
	  icon.setCursor('pointer')
	  icon.onClick(function (e) {
	    if (panel.getDisplay() === 'block') {
	      this.setMenuDisplay('none')
	      tether.destroy()
	      return
	    }
	
	    panel.setMaxHeight((window.innerHeight / 1.2) + 'px')
	    this.setMenuDisplay('block')
	
	    xOffset = 5
	    yOffset = 0
	
	    tether = new Tether({
	      element: panel.dom,
	      target: icon.dom,
	      attachment: 'top right',
	      targetAttachment: 'top left',
	      offset: '0px 5px',
	      constraints: [{
	        to: constraintTo,
	        attachment: 'element',
	        pin: ['top', 'bottom']
	      }]
	    })
	
	    tether.position()
	  }.bind(this))
	
	  this.add(icon)
	
	  this.setClass('')
	    .setDisplay('inline')
	
	  this.icon = icon
	  this.panel = panel
	  this.entryLabelWidth = entryLabelWidth
	
	  return this
	}
	
	UI.PopupMenu.prototype = Object.create(UI.Panel.prototype)
	
	UI.PopupMenu.prototype.addEntry = function (label, entry) {
	  this.panel
	    .add(new UI.Text(label)
	      // .setWhiteSpace( "nowrap" )
	      .setWidth(this.entryLabelWidth))
	    .add(entry || new UI.Panel())
	    .add(new UI.Break())
	
	  return this
	}
	
	UI.PopupMenu.prototype.setEntryLabelWidth = function (value) {
	  this.entryLabelWidth = value
	
	  return this
	}
	
	UI.PopupMenu.prototype.setMenuDisplay = function (value) {
	  this.panel.setDisplay(value)
	
	  if (value !== 'none') this.panel.dom.focus()
	
	  return this
	}
	
	UI.PopupMenu.prototype.setIconTitle = function (value) {
	  this.icon.setTitle(value)
	
	  return this
	}
	
	UI.PopupMenu.prototype.dispose = function () {
	  this.panel.dispose()
	
	  UI.Element.prototype.dispose.call(this)
	}
	
	// Collapsible Icon Panel
	
	UI.CollapsibleIconPanel = function (iconClass1, iconClass2) {
	  UI.Panel.call(this)
	
	  this.dom.className = 'Panel CollapsiblePanel'
	
	  if (iconClass1 === undefined) {
	    // iconClass1 = iconClass1 || "plus-square";
	    // iconClass2 = iconClass2 || "minus-square";
	
	    iconClass1 = iconClass1 || 'chevron-down'
	    iconClass2 = iconClass2 || 'chevron-right'
	  }
	
	  this.button = new UI.Icon(iconClass1)
	    .setTitle('expand/collapse')
	    .setCursor('pointer')
	    .setWidth('12px')
	    .setMarginRight('6px')
	  this.addStatic(this.button)
	
	  var scope = this
	  this.button.dom.addEventListener('click', function (event) {
	    scope.toggle()
	  }, false)
	
	  this.content = document.createElement('div')
	  this.content.className = 'CollapsibleContent'
	  this.dom.appendChild(this.content)
	
	  this.isCollapsed = false
	
	  this.iconClass1 = iconClass1
	  this.iconClass2 = iconClass2
	
	  return this
	}
	
	UI.CollapsibleIconPanel.prototype = Object.create(UI.CollapsiblePanel.prototype)
	
	UI.CollapsibleIconPanel.prototype.setCollapsed = function (setCollapsed) {
	  if (setCollapsed) {
	    this.dom.classList.add('collapsed')
	
	    if (this.iconClass2) {
	      this.button.switchClass(this.iconClass2, this.iconClass1)
	    } else {
	      this.button.addClass('rotate-90')
	    }
	  } else {
	    this.dom.classList.remove('collapsed')
	
	    if (this.iconClass2) {
	      this.button.switchClass(this.iconClass1, this.iconClass2)
	    } else {
	      this.button.removeClass('rotate-90')
	    }
	  }
	
	  this.isCollapsed = setCollapsed
	}
	
	// Color picker (requires FlexiColorPicker)
	// https://github.com/DavidDurman/FlexiColorPicker
	// https://github.com/zvin/FlexiColorPicker
	
	UI.ColorPicker = function () {
	  var scope = this
	
	  UI.Panel.call(this)
	
	  // slider
	
	  this.slideWrapper = new UI.Panel()
	    .setClass('slide-wrapper')
	
	  this.sliderIndicator = new UI.Panel()
	    .setClass('slide-indicator')
	
	  this.slider = new UI.Panel()
	    .setClass('slide')
	    .setWidth('25px')
	    .setHeight('80px')
	
	  this.slideWrapper.add(
	    this.slider,
	    this.sliderIndicator
	  )
	
	  // picker
	
	  this.pickerWrapper = new UI.Panel()
	    .setClass('picker-wrapper')
	
	  this.pickerIndicator = new UI.Panel()
	    .setClass('picker-indicator')
	
	  this.picker = new UI.Panel()
	    .setClass('picker')
	    .setWidth('130px')
	    .setHeight('80px')
	
	  this.pickerWrapper.add(
	    this.picker,
	    this.pickerIndicator
	  )
	
	  // event
	
	  var changeEvent = document.createEvent('Event')
	  changeEvent.initEvent('change', true, true)
	
	  // finalize
	
	  this.add(
	    this.pickerWrapper,
	    this.slideWrapper
	  )
	
	  this.colorPicker = ColorPicker(
	
	    this.slider.dom,
	    this.picker.dom,
	
	    function (hex, hsv, rgb, pickerCoordinate, sliderCoordinate) {
	      if (!pickerCoordinate && sliderCoordinate && hsv.s < 0.05) {
	        hsv.s = 0.5
	        hsv.v = 0.7
	        scope.colorPicker.setHsv(hsv)
	
	        return
	      }
	
	      ColorPicker.positionIndicators(
	        scope.sliderIndicator.dom, scope.pickerIndicator.dom,
	        sliderCoordinate, pickerCoordinate
	      )
	
	      scope.hex = hex
	      scope.hsv = hsv
	      scope.rgb = rgb
	
	      if (!scope._settingValue) {
	        scope.dom.dispatchEvent(changeEvent)
	      }
	    }
	
	  )
	
	  this.colorPicker.fixIndicators(
	    this.sliderIndicator.dom,
	    this.pickerIndicator.dom
	  )
	
	  return this
	}
	
	UI.ColorPicker.prototype = Object.create(UI.Panel.prototype)
	
	UI.ColorPicker.prototype.setValue = function (value) {
	  if (value !== this.hex) {
	    this._settingValue = true
	    this.colorPicker.setHex(value)
	    this._settingValue = false
	  }
	
	  return this
	}
	
	UI.ColorPicker.prototype.getValue = function () {
	  return this.hex
	}
	
	module.exports = {
	    "UI": UI
	}


/***/ }),
/* 18 */
/***/ (function(module, exports, __webpack_require__) {

	/**
	 * @file UI NGL
	 * @author Alexander Rose <alexander.rose@weirdbyte.de>
	 */
	
	// Color
	
	var NGL = __webpack_require__(3);
	var UI = __webpack_require__(17).UI;
	
	UI.ColorPopupMenu = function () {
	  var scope = this
	
	  UI.Panel.call(this)
	
	  this.iconText = new UI.Text('')
	    .setCursor('pointer')
	    .setClass('fa-stack-1x')
	    .setFontFamily('Arial, sans-serif')
	    .setColor('#111')
	
	  this.iconSquare = new UI.Icon('square', 'stack-1x')
	  // .setMarginTop( "0.05em" );
	
	  this.menu = new UI.PopupMenu('stack', 'Color')
	
	  this.menu.icon
	    .setTitle('color')
	    .setWidth('1em').setHeight('1em').setLineHeight('1em')
	    .add(this.iconSquare)
	    .add(this.iconText)
	
	  var changeEvent = document.createEvent('Event')
	  changeEvent.initEvent('change', true, true)
	
	  this.colorInput = new UI.Input()
	    .onChange(function () {
	      scope.setColor(scope.colorInput.getValue())
	      scope.dom.dispatchEvent(changeEvent)
	    })
	
	  this.colorPicker = new UI.ColorPicker()
	    .setDisplay('inline-block')
	    .onChange(function (e) {
	      scope.setColor(scope.colorPicker.getValue())
	      scope.dom.dispatchEvent(changeEvent)
	    })
	
	  this.menu
	    .addEntry('Input', this.colorInput)
	    .addEntry('Picker', this.colorPicker)
	
	  this.add(this.menu)
	
	  this.setClass('')
	    .setDisplay('inline')
	
	  return this
	}
	
	UI.ColorPopupMenu.prototype = Object.create(UI.Panel.prototype)
	
	UI.ColorPopupMenu.prototype.setColor = (function () {
	  var c = new NGL.Color()
	
	  return function (value) {
	    c.set(value)
	    value = '#' + c.getHexString()
	
	    this.colorInput
	      .setBackgroundColor(value)
	      .setValue(value)
	
	    this.colorPicker.setValue(value)
	
	    this.iconSquare.setColor(value)
	
	    // perceived brightness (http://alienryderflex.com/hsp.html)
	    var brightness = Math.sqrt(
	      c.r * 255 * c.r * 255 * 0.241 +
	              c.g * 255 * c.g * 255 * 0.691 +
	              c.b * 255 * c.b * 255 * 0.068
	    )
	
	    if (brightness > 130) {
	      this.iconText.setColor('#000000')
	      this.colorInput.setColor('#000000')
	    } else {
	      this.iconText.setColor('#FFFFFF')
	      this.colorInput.setColor('#FFFFFF')
	    }
	
	    return this
	  }
	}())
	
	UI.ColorPopupMenu.prototype.getColor = function () {
	  return this.colorInput.getValue()
	}
	
	UI.ColorPopupMenu.prototype.getValue = function () {
	  return this.getColor()
	}
	
	UI.ColorPopupMenu.prototype.setValue = function (value) {
	  this.setColor(value)
	
	  return this
	}
	
	UI.ColorPopupMenu.prototype.dispose = function () {
	  this.menu.dispose()
	
	  UI.Panel.prototype.dispose.call(this)
	}
	
	// Vector3
	
	UI.Vector3 = function (value) {
	  UI.Panel.call(this).setDisplay('inline-block')
	
	  this.xNumber = new UI.Number(0).setWidth('40px')
	  this.yNumber = new UI.Number(0).setWidth('40px')
	  this.zNumber = new UI.Number(0).setWidth('40px')
	
	  this.add(this.xNumber, this.yNumber, this.zNumber)
	  this.setValue(value)
	
	  var changeEvent = document.createEvent('Event')
	  changeEvent.initEvent('change', true, true)
	
	  this.xNumber.onChange(function () {
	    this.dom.dispatchEvent(changeEvent)
	  }.bind(this))
	  this.yNumber.onChange(function () {
	    this.dom.dispatchEvent(changeEvent)
	  }.bind(this))
	  this.zNumber.onChange(function () {
	    this.dom.dispatchEvent(changeEvent)
	  }.bind(this))
	
	  return this
	}
	
	UI.Vector3.prototype = Object.create(UI.Panel.prototype)
	
	UI.Vector3.prototype.getValue = function () {
	  return {
	    x: this.xNumber.getValue(),
	    y: this.yNumber.getValue(),
	    z: this.zNumber.getValue()
	  }
	}
	
	UI.Vector3.prototype.setValue = function (value) {
	  if (value) {
	    this.xNumber.setValue(value.x)
	    this.yNumber.setValue(value.y)
	    this.zNumber.setValue(value.z)
	  }
	
	  return this
	}
	
	UI.Vector3.prototype.setPrecision = function (precision) {
	  this.xNumber.setPrecision(precision)
	  this.yNumber.setPrecision(precision)
	  this.zNumber.setPrecision(precision)
	
	  return this
	}
	
	UI.Vector3.prototype.setRange = function (min, max) {
	  this.xNumber.setRange(min, max)
	  this.yNumber.setRange(min, max)
	  this.zNumber.setRange(min, max)
	
	  return this
	}
	
	// Selection
	
	UI.SelectionInput = function (selection) {
	  UI.AdaptiveTextArea.call(this)
	
	  this.setSpellcheck(false)
	
	  if (!(selection.type === 'selection')) {
	    NGL.error('UI.SelectionInput: not a selection', selection)
	
	    return this
	  }
	
	  this.setValue(selection.string)
	
	  this.selection = selection
	
	  var scope = this
	
	  var signals = selection.signals
	
	  signals.stringChanged.add(function (string) {
	    scope.setValue(string)
	  })
	
	  this.onEnter()
	
	  return this
	}
	
	UI.SelectionInput.prototype = Object.create(UI.AdaptiveTextArea.prototype)
	
	UI.SelectionInput.prototype.setValue = function (value) {
	  UI.AdaptiveTextArea.prototype.setValue.call(this, value)
	
	  return this
	}
	
	UI.SelectionInput.prototype.onEnter = function (callback) {
	  // TODO more a private method
	
	  var scope = this
	
	  var check = function (string) {
	    var selection = new NGL.Selection(string)
	
	    return !selection.selection[ 'error' ]
	  }
	
	  this.onKeyPress(function (e) {
	    var value = scope.getValue()
	    var character = String.fromCharCode(e.which)
	
	    if (e.keyCode === 13) {
	      e.preventDefault()
	
	      if (check(value)) {
	        if (typeof callback === 'function') {
	          callback(value)
	        } else {
	          scope.selection.setString(value)
	        }
	
	        scope.setBackgroundColor('white')
	      } else {
	        scope.setBackgroundColor('tomato')
	      }
	    } else if (scope.selection.string !== value + character) {
	      scope.setBackgroundColor('skyblue')
	    } else {
	      scope.setBackgroundColor('white')
	    }
	  })
	
	  this.onKeyUp(function (e) {
	    var value = scope.getValue()
	
	    if (!check(value)) {
	      scope.setBackgroundColor('tomato')
	    } else if (scope.selection.string === scope.getValue()) {
	      scope.setBackgroundColor('white')
	    } else {
	      scope.setBackgroundColor('skyblue')
	    }
	  })
	
	  return this
	}
	
	UI.SelectionPanel = function (selection) {
	  UI.Panel.call(this)
	
	  this.icon = new UI.Icon('filter')
	    .setTitle('filter selection')
	    .addClass('lg')
	    .setMarginRight('10px')
	
	  this.input = new UI.SelectionInput(selection)
	
	  this.add(this.icon, this.input)
	
	  return this
	}
	
	UI.SelectionPanel.prototype = Object.create(UI.Panel.prototype)
	
	UI.SelectionPanel.prototype.setInputWidth = function (value) {
	  this.input.setWidth(value)
	
	  return this
	}
	
	// Component
	
	UI.ComponentPanel = function (component) {
	  UI.Panel.call(this)
	
	  var stage = component.stage
	  var signals = component.signals
	
	  signals.nameChanged.add(function (value) {
	    name.setValue(value)
	  })
	
	  signals.visibilityChanged.add(function (value) {
	    toggle.setValue(value)
	  })
	
	  signals.disposed.add(function () {
	    menu.dispose()
	  })
	
	  // Name
	
	  var name = new UI.EllipsisText(component.name)
	    .setWidth('100px')
	
	    // Actions
	
	  var toggle = new UI.ToggleIcon(component.visible, 'eye', 'eye-slash')
	    .setTitle('hide/show')
	    .setCursor('pointer')
	    .setMarginLeft('25px')
	    .onClick(function () {
	      component.setVisibility(!component.visible)
	    })
	
	  var center = new UI.Icon('bullseye')
	    .setTitle('center')
	    .setCursor('pointer')
	    .setMarginLeft('10px')
	    .onClick(function () {
	      component.autoView(1000)
	    })
	
	  var dispose = new UI.DisposeIcon()
	    .setMarginLeft('10px')
	    .setDisposeFunction(function () {
	      stage.removeComponent(component)
	    })
	
	    // Menu
	
	  var menu = new UI.PopupMenu('bars', component.type)
	    .setMarginLeft('46px')
	    .setEntryLabelWidth('110px')
	
	    //
	
	  this.add(name, toggle, center, dispose, menu)
	
	  //
	
	  this.menu = menu
	
	  return this
	}
	
	UI.ComponentPanel.prototype = Object.create(UI.Panel.prototype)
	
	UI.ComponentPanel.prototype.addMenuEntry = function (label, entry) {
	  this.menu.addEntry(label, entry)
	
	  return this
	}
	
	UI.ComponentPanel.prototype.setMenuDisplay = function (value) {
	  this.menu.setMenuDisplay(value)
	
	  return this
	}
	
	
	module.exports = {
	    "UI": UI
	}


/***/ }),
/* 19 */
/***/ (function(module, exports, __webpack_require__) {

	/**
	 * @file  Gui
	 * @author Alexander Rose <alexander.rose@weirdbyte.de>
	 */
	var NGL = __webpack_require__(3);
	var UI = __webpack_require__(16).UI;
	var signals = __webpack_require__(13);
	
	
	HTMLElement.prototype.getBoundingClientRect = (function () {
	  // workaround for ie11 behavior with disconnected dom nodes
	
	  var _getBoundingClientRect = HTMLElement.prototype.getBoundingClientRect
	
	  return function getBoundingClientRect () {
	    try {
	      return _getBoundingClientRect.apply(this, arguments)
	    } catch (e) {
	      return {
	        top: 0,
	        left: 0,
	        width: this.width,
	        height: this.height
	      }
	    }
	  }
	}())
	
	NGL.Widget = function () {
	
	}
	
	NGL.Widget.prototype = {
	  constructor: NGL.Widget
	}
	
	NGL.createParameterInput = function (p, v) {
	  if (!p) return
	
	  var value = v === undefined ? p.value : v
	  var input
	
	  if (p.type === 'number') {
	    input = new UI.Number(0)
	      .setRange(p.min, p.max)
	      .setPrecision(p.precision)
	      .setValue(parseFloat(value))
	  } else if (p.type === 'integer') {
	    input = new UI.Integer(parseInt(value))
	      .setRange(p.min, p.max)
	  } else if (p.type === 'range') {
	    input = new UI.Range(p.min, p.max, value, p.step)
	      .setValue(parseFloat(value))
	  } else if (p.type === 'boolean') {
	    input = new UI.Checkbox(value)
	  } else if (p.type === 'text') {
	    input = new UI.Input(value)
	  } else if (p.type === 'select') {
	    input = new UI.Select()
	      .setWidth('')
	      .setOptions(p.options)
	      .setValue(value)
	  } else if (p.type === 'color') {
	    input = new UI.ColorPopupMenu(p.label)
	      .setValue(value)
	  } else if (p.type === 'vector3') {
	    input = new UI.Vector3(value)
	      .setPrecision(p.precision)
	  } else if (p.type === 'hidden') {
	
	    // nothing to display
	
	  } else {
	    console.warn(
	      'NGL.createParameterInput: unknown parameter type ' +
	      "'" + p.type + "'"
	    )
	  }
	
	  return input
	}
	
	/// /////////////
	// Preferences
	
	NGL.Preferences = function (id, defaultParams) {
	  this.signals = {
	    keyChanged: new signals.Signal()
	  }
	
	  this.id = id || 'ngl-gui'
	  var dp = Object.assign({}, defaultParams)
	
	  this.storage = {
	    impostor: true,
	    quality: 'auto',
	    sampleLevel: 0,
	    theme: 'dark',
	    backgroundColor: 'black',
	    overview: false,
	    rotateSpeed: 2.0,
	    zoomSpeed: 1.2,
	    panSpeed: 0.8,
	    clipNear: 0,
	    clipFar: 100,
	    clipDist: 10,
	    fogNear: 50,
	    fogFar: 100,
	    cameraFov: 40,
	    cameraType: 'perspective',
	    lightColor: 0xdddddd,
	    lightIntensity: 1.0,
	    ambientColor: 0xdddddd,
	    ambientIntensity: 0.2,
	    hoverTimeout: 0
	  }
	
	  // overwrite default values with params
	  for (var key in this.storage) {
	    if (dp[ key ] !== undefined) {
	      this.storage[ key ] = dp[ key ]
	    }
	  }
	}
	
	NGL.Preferences.prototype = {
	
	  constructor: NGL.Preferences,
	
	  getKey: function (key) {
	    return this.storage[ key ]
	  },
	
	  setKey: function (key, value) {
	    this.storage[ key ] = value
	    this.signals.keyChanged.dispatch(key, value)
	  },
	}
	
	// Stage
	
	StageWidget = function (view) {
	  // view: NGLView of NGLModel
	  if (view.options.parent){
	      el = view.el.parentElement
	  }else{
	      el = view.el
	  }
	  stage = view.stage
	  var viewport = new UI.Panel()
	  viewport.setPosition("absolute")
	  viewport.dom = stage.viewer.container
	  this.el = el
	  this.widgetList = []
	
	  // Turn off in Jupyter notebook so user can run the next cell.
	  // ensure initial focus on viewer canvas for key-stroke listening
	  // stage.viewer.renderer.domElement.focus()
	
	  var preferences = new NGL.Preferences('ngl-stage-widget', stage.getParameters())
	
	  var pp = {}
	  for (var name in preferences.storage) {
	    pp[ name ] = preferences.getKey(name)
	  }
	  stage.setParameters(pp)
	
	  preferences.signals.keyChanged.add(function (key, value) {
	    var sp = {}
	    sp[ key ] = value
	    stage.setParameters(sp)
	    // FIXME: remove?
	    // if (key === 'theme') {
	    //   setTheme(value)
	    // }
	  }, this)
	
	  //
	
	  var cssLinkElement = document.createElement('link')
	  cssLinkElement.rel = 'stylesheet'
	  cssLinkElement.id = 'theme'
	
	  function setTheme (value) {
	    var cssPath, bgColor
	    if (value === 'light') {
	      cssPath = NGL.cssDirectory + 'light.css'
	      bgColor = 'white'
	    } else {
	      cssPath = NGL.cssDirectory + 'dark.css'
	      bgColor = 'black'
	    }
	    cssLinkElement.href = cssPath
	    stage.setParameters({ backgroundColor: bgColor })
	  }
	
	  // FIXME: remove?
	  // setTheme(preferences.getKey('theme'))
	  el.appendChild(cssLinkElement)
	
	  //
	
	  var toolbar = new NGL.ToolbarWidget(stage).setId('toolbar_ngl')
	  el.appendChild(toolbar.dom)
	
	  var menubar = new NGL.MenubarWidget(stage, preferences).setId('menubar_ngl')
	  el.appendChild(menubar.dom)
	
	  var sidebar = new NGL.SidebarWidget(stage).setId('sidebar_ngl')
	  el.appendChild(sidebar.dom)
	
	  this.widgetList.push(toolbar)
	  this.widgetList.push(menubar)
	  this.widgetList.push(sidebar)
	
	  //
	
	  // el.body.style.touchAction = 'none'
	  el.style.touchAction = 'none'
	
	  //
	
	  stage.handleResize()
	  // FIXME hack for ie11
	  setTimeout(function () { stage.handleResize() }, 500)
	
	  //
	
	  var doResizeLeft = false
	  var movedResizeLeft = false
	  var minResizeLeft = false
	  var handleResizeInNotebook
	
	  var handleResizeLeft = function (clientX) {
	    if (clientX >= 50 && clientX <= window.innerWidth - 10) {
	      sidebar.setWidth(window.innerWidth - clientX + 'px')
	      viewport.setWidth(clientX + 'px')
	      toolbar.setWidth(clientX + 'px')
	      stage.handleResize()
	    }
	    var sidebarWidth = sidebar.dom.getBoundingClientRect().width
	    if (clientX === undefined) {
	      var mainWidth = window.innerWidth - sidebarWidth
	      viewport.setWidth(mainWidth + 'px')
	      toolbar.setWidth(mainWidth + 'px')
	      stage.handleResize()
	    }
	    if (sidebarWidth <= 10) {
	      minResizeLeft = true
	    } else {
	      minResizeLeft = false
	    }
	    handleResizeInNotebook();
	  }
	  handleResizeLeft = NGL.throttle(
	    handleResizeLeft, 50, { leading: true, trailing: true }
	  )
	
	  var handleResizeInNotebook = function(){
	      // FIXME
	      var sw = sidebar.dom.getBoundingClientRect().width
	      var ew = el.getBoundingClientRect().width
	      var w = ew - sw + 'px'
	
	      stage.viewer.container.style.width = w 
	      stage.handleResize()
	  }
	
	  var resizeLeft = new UI.Panel()
	    .setClass('ResizeLeft')
	    .onMouseDown(function () {
	      doResizeLeft = true
	      movedResizeLeft = false
	    })
	    .onClick(function () {
	      if (minResizeLeft) {
	        handleResizeLeft(window.innerWidth - 300)
	      } else if (!doResizeLeft && !movedResizeLeft) {
	        handleResizeLeft(window.innerWidth - 10)
	      }
	    })
	
	  sidebar.add(resizeLeft)
	  this.viewport = viewport
	  this.toolbar = toolbar
	  this.menubar = menubar
	  this.sidebar = sidebar
	
	  handleResizeInNotebook()
	
	  stage.signals.fullscreenChanged.add(function (isFullscreen) {
	    const box = stage.viewer.container.parentElement.getBoundingClientRect()
	    console.log("in StageWidget")
	    stage.setSize(box.width+"px", isFullscreen?box.height+'px':'300px')
	    view.handleResize()
	  })
	
	  window.addEventListener(
	    'mousemove', function (event) {
	      if (doResizeLeft) {
	        document.body.style.cursor = 'col-resize'
	        movedResizeLeft = true
	        handleResizeLeft(event.clientX)
	      }
	    }, false
	  )
	
	  window.addEventListener(
	    'mouseup', function (event) {
	      doResizeLeft = false
	      document.body.style.cursor = ''
	    }, false
	  )
	
	  window.addEventListener(
	    'resize', function (event) {
	      handleResizeLeft()
	    }, false
	  )
	
	  //
	
	  document.addEventListener('dragover', function (e) {
	    e.stopPropagation()
	    e.preventDefault()
	    e.dataTransfer.dropEffect = 'none'
	  }, false)
	
	  document.addEventListener('drop', function (e) {
	    e.stopPropagation()
	    e.preventDefault()
	  }, false)
	
	  return this
	}
	
	StageWidget.prototype = {
	   constructor: StageWidget,
	
	   dispose: function(){
	       for (var i in this.widgetList){
	           this.widgetList[i].dispose()
	       }
	   },
	}
	
	// Viewport
	
	NGL.ViewportWidget = function (stage) {
	  var viewer = stage.viewer
	  var renderer = viewer.renderer
	
	  var container = new UI.Panel()
	  container.dom = viewer.container
	  container.setPosition('absolute')
	
	  var fileTypesOpen = NGL.flatten([
	    NGL.ParserRegistry.getStructureExtensions(),
	    NGL.ParserRegistry.getVolumeExtensions(),
	    NGL.ParserRegistry.getSurfaceExtensions(),
	    NGL.DecompressorRegistry.names
	  ])
	
	  // event handlers
	
	  container.dom.addEventListener('dragover', function (e) {
	    e.stopPropagation()
	    e.preventDefault()
	    e.dataTransfer.dropEffect = 'copy'
	  }, false)
	
	  container.dom.addEventListener('drop', function (e) {
	    e.stopPropagation()
	    e.preventDefault()
	
	    var fn = function (file, callback) {
	      var ext = file.name.split('.').pop().toLowerCase()
	      if (NGL.ScriptExtensions.includes(ext)) {
	        stage.loadScript(file).then(callback)
	      } else if (fileTypesOpen.includes(ext)) {
	        stage.loadFile(file, { defaultRepresentation: true }).then(callback)
	      } else {
	        console.error('unknown filetype: ' + ext)
	        callback()
	      }
	    }
	    var queue = new NGL.Queue(fn, e.dataTransfer.files)
	  }, false)
	
	  return container
	}
	
	// Toolbar
	
	NGL.ToolbarWidget = function (stage) {
	  var container = new UI.Panel()
	
	  var messageText = new UI.Text()
	  var messagePanel = new UI.Panel()
	    .setDisplay('inline')
	    .setFloat('left')
	    .add(messageText)
	
	  var statsText = new UI.Text()
	  var statsPanel = new UI.Panel()
	    .setDisplay('inline')
	    .setFloat('right')
	    .add(statsText)
	
	  stage.signals.clicked.add(function (pickingProxy) {
	    messageText.setValue(pickingProxy ? pickingProxy.getLabel() : 'nothing')
	  })
	
	  stage.viewer.stats.signals.updated.add(function () {
	    if (NGL.Debug) {
	      statsText.setValue(
	        stage.viewer.stats.lastDuration.toFixed(2) + ' ms | ' +
	        stage.viewer.stats.lastFps + ' fps'
	      )
	    } else {
	      statsText.setValue('')
	    }
	  })
	
	  container.add(messagePanel, statsPanel)
	
	  return container
	}
	
	// Menubar
	
	NGL.MenubarWidget = function (stage, preferences) {
	  var container = new UI.Panel()
	
	  container.add(new NGL.MenubarFileWidget(stage))
	  container.add(new NGL.MenubarViewWidget(stage, preferences))
	  if (NGL.examplesListUrl && NGL.examplesScriptUrl) {
	    container.add(new NGL.MenubarExamplesWidget(stage))
	  }
	  container.add(new NGL.MenubarHelpWidget(stage, preferences))
	
	  container.add(
	    new UI.Panel().setClass('menu').setFloat('right').add(
	      new UI.Text('NGL Viewer ' + NGL.Version).setClass('title')
	    )
	  )
	
	  return container
	}
	
	NGL.MenubarFileWidget = function (stage) {
	  var fileTypesOpen = NGL.flatten([
	    NGL.ParserRegistry.getStructureExtensions(),
	    NGL.ParserRegistry.getVolumeExtensions(),
	    NGL.ParserRegistry.getSurfaceExtensions(),
	    NGL.DecompressorRegistry.names,
	    NGL.ScriptExtensions
	  ])
	
	  function fileInputOnChange (e) {
	    var fn = function (file, callback) {
	      var ext = file.name.split('.').pop().toLowerCase()
	      if (NGL.ScriptExtensions.includes(ext)) {
	        stage.loadScript(file).then(callback)
	      } else if (fileTypesOpen.includes(ext)) {
	        stage.loadFile(file, { defaultRepresentation: true }).then(callback)
	      } else {
	        console.error('unknown filetype: ' + ext)
	        callback()
	      }
	    }
	    var queue = new NGL.Queue(fn, e.target.files)
	  }
	
	  var fileInput = document.createElement('input')
	  fileInput.type = 'file'
	  fileInput.multiple = true
	  fileInput.style.display = 'none'
	  fileInput.accept = '.' + fileTypesOpen.join(',.')
	  fileInput.addEventListener('change', fileInputOnChange, false)
	
	  // export image
	
	  var exportImageWidget = new NGL.ExportImageWidget(stage)
	    .setDisplay('none')
	    .attach(stage.viewer.container.parentElement)
	
	  // event handlers
	
	  function onOpenOptionClick () {
	    fileInput.click()
	  }
	
	  function onImportOptionClick () {
	    var dirWidget
	    function onListingClick (info) {
	      var ext = info.path.split('.').pop().toLowerCase()
	      if (NGL.ScriptExtensions.includes(ext)) {
	        stage.loadScript(NGL.ListingDatasource.getUrl(info.path))
	        dirWidget.dispose()
	      } else if (fileTypesOpen.includes(ext)) {
	        stage.loadFile(NGL.ListingDatasource.getUrl(info.path), {
	          defaultRepresentation: true
	        })
	        dirWidget.dispose()
	      } else {
	        console.error('unknown filetype: ' + ext)
	      }
	    }
	
	    dirWidget = new NGL.DirectoryListingWidget(
	      NGL.ListingDatasource, stage, 'Import file',
	      fileTypesOpen, onListingClick
	    )
	
	    dirWidget
	      .setOpacity('0.9')
	      .setLeft('50px')
	      .setTop('80px')
	      .attach()
	  }
	
	  function onExportImageOptionClick () {
	    exportImageWidget
	      .setOpacity('0.9')
	      .setLeft('50px')
	      .setTop('80px')
	      .setDisplay('block')
	  }
	
	  function onScreenshotOptionClick () {
	    stage.makeImage({
	      factor: 1,
	      antialias: true,
	      trim: false,
	      transparent: false
	    }).then(function (blob) {
	      NGL.download(blob, 'screenshot.png')
	    })
	  }
	
	  function onPdbInputKeyDown (e) {
	    if (e.keyCode === 13) {
	      stage.loadFile('rcsb://' + e.target.value.trim(), {
	        defaultRepresentation: true
	      })
	      e.target.value = ''
	    }
	  }
	
	  function onFirstModelOnlyChange (e) {
	    stage.defaultFileParams.firstModelOnly = e.target.checked
	  }
	
	  function onCAlphaOnlyChange (e) {
	    stage.defaultFileParams.cAlphaOnly = e.target.checked
	  }
	
	  // configure menu contents
	
	  var createOption = UI.MenubarHelper.createOption
	  var createInput = UI.MenubarHelper.createInput
	  var createCheckbox = UI.MenubarHelper.createCheckbox
	  var createDivider = UI.MenubarHelper.createDivider
	
	  var menuConfig = [
	    createOption('Open...', onOpenOptionClick),
	    createInput('PDB', onPdbInputKeyDown),
	    createCheckbox('firstModelOnly', false, onFirstModelOnlyChange),
	    createCheckbox('cAlphaOnly', false, onCAlphaOnlyChange),
	    createDivider(),
	    createOption('Screenshot', onScreenshotOptionClick, 'camera'),
	    createOption('Export image...', onExportImageOptionClick)
	  ]
	
	  if (NGL.ListingDatasource) {
	    menuConfig.splice(
	      1, 0, createOption('Import...', onImportOptionClick)
	    )
	  }
	
	  var optionsPanel = UI.MenubarHelper.createOptionsPanel(menuConfig)
	  optionsPanel.dom.appendChild(fileInput)
	
	  return UI.MenubarHelper.createMenuContainer('File', optionsPanel)
	}
	
	NGL.MenubarViewWidget = function (stage, preferences) {
	  // event handlers
	
	  function onLightThemeOptionClick () {
	    preferences.setKey('theme', 'light')
	  }
	
	  function onDarkThemeOptionClick () {
	    preferences.setKey('theme', 'dark')
	  }
	
	  function onPerspectiveCameraOptionClick () {
	    stage.setParameters({ cameraType: 'perspective' })
	  }
	
	  function onOrthographicCameraOptionClick () {
	    stage.setParameters({ cameraType: 'orthographic' })
	  }
	
	  function onStereoCameraOptionClick () {
	    stage.setParameters({ cameraType: 'stereo' })
	  }
	
	  function onFullScreenOptionClick () {
	    stage.toggleFullscreen(stage.viewer.container.parentElement);
	  }
	
	  function onCenterOptionClick () {
	    stage.autoView(1000)
	  }
	
	  function onToggleSpinClick () {
	    stage.toggleSpin()
	  }
	
	  function onToggleRockClick () {
	    stage.toggleRock()
	  }
	
	  function onGetOrientationClick () {
	    window.prompt(
	      'Get orientation',
	      JSON.stringify(
	        stage.viewerControls.getOrientation().toArray(),
	        function (k, v) {
	          return v.toFixed ? Number(v.toFixed(2)) : v
	        }
	      )
	    )
	  }
	
	  function onSetOrientationClick () {
	    stage.viewerControls.orient(
	      JSON.parse(window.prompt('Set orientation'))
	    )
	  }
	
	  var that = this;
	  stage.signals.fullscreenChanged.add(function (isFullscreen) {
	    // const box = stage.viewer.container.parentElement.getBoundingClientRect()
	    // stage.setSize(box.width+"px", box.height+"px")
	    // stage.handleResize()
	    var icon = menuConfig[ 4 ].children[ 0 ]
	    if (isFullscreen) {
	      icon.switchClass('compress', 'expand')
	    } else {
	      icon.switchClass('expand', 'compress')
	    }
	  })
	
	  // configure menu contents
	
	  var createOption = UI.MenubarHelper.createOption
	  var createDivider = UI.MenubarHelper.createDivider
	
	  var menuConfig = [
	    // createOption('Light theme', onLightThemeOptionClick),
	    // createOption('Dark theme', onDarkThemeOptionClick),
	    // createDivider(),
	    createOption('Perspective', onPerspectiveCameraOptionClick),
	    createOption('Orthographic', onOrthographicCameraOptionClick),
	    createOption('Stereo', onStereoCameraOptionClick),
	    createDivider(),
	    createOption('Full screen', onFullScreenOptionClick, 'expand'),
	    createOption('Center', onCenterOptionClick, 'bullseye'),
	    createDivider(),
	    createOption('Toggle spin', onToggleSpinClick),
	    createOption('Toggle rock', onToggleRockClick),
	    // createDivider(),
	    // createOption('Get orientation', onGetOrientationClick),
	    // createOption('Set orientation', onSetOrientationClick)
	  ]
	
	  var optionsPanel = UI.MenubarHelper.createOptionsPanel(menuConfig)
	
	  return UI.MenubarHelper.createMenuContainer('View', optionsPanel)
	}
	
	NGL.MenubarExamplesWidget = function (stage) {
	  // configure menu contents
	
	  var createOption = UI.MenubarHelper.createOption
	  var optionsPanel = UI.MenubarHelper.createOptionsPanel([])
	  optionsPanel.setWidth('300px')
	
	  var xhr = new XMLHttpRequest()
	  xhr.open('GET', NGL.examplesListUrl)
	  xhr.responseType = 'json'
	  xhr.onload = function (e) {
	    var response = this.response
	    if (typeof response === 'string') {
	      // for ie11
	      response = JSON.parse(response)
	    }
	    response.sort().forEach(function (name) {
	      var option = createOption(name, function () {
	        stage.loadScript(NGL.examplesScriptUrl + name + '.js')
	      })
	      optionsPanel.add(option)
	    })
	  }
	  xhr.send()
	
	  return UI.MenubarHelper.createMenuContainer('Examples', optionsPanel)
	}
	
	NGL.MenubarHelpWidget = function (stage, preferences) {
	  // event handlers
	
	  function onOverviewOptionClick () {
	    overviewWidget
	      .setOpacity('0.9')
	      .setDisplay('block')
	      .setWidgetPosition(50, 80)
	  }
	
	  function onDocOptionClick () {
	    window.open(NGL.documentationUrl, '_blank')
	  }
	
	  function onDebugOnClick () {
	    NGL.setDebug(true)
	    stage.viewer.updateHelper()
	    stage.viewer.requestRender()
	  }
	
	  function onDebugOffClick () {
	    NGL.setDebug(false)
	    stage.viewer.updateHelper()
	    stage.viewer.requestRender()
	  }
	
	  function onPreferencesOptionClick () {
	    preferencesWidget
	      .setOpacity('0.9')
	      .setDisplay('block')
	      .setWidgetPosition(50, 80)
	  }
	
	  // export image
	
	  var preferencesWidget = new NGL.PreferencesWidget(stage, preferences)
	    .setDisplay('none')
	    .attach(stage.viewer.container.parentElement)
	
	  // overview
	
	  var overviewWidget = new NGL.OverviewWidget(stage, preferences)
	    .setDisplay('none')
	    .attach(stage.viewer.container.parentElement)
	
	  if (preferences.getKey('overview')) {
	    onOverviewOptionClick()
	  }
	
	  // configure menu contents
	
	  var createOption = UI.MenubarHelper.createOption
	  var createDivider = UI.MenubarHelper.createDivider
	
	  var menuConfig = [
	    createOption('Overview', onOverviewOptionClick),
	    // createOption('Documentation', onDocOptionClick),
	    // createDivider(),
	    // createOption('Debug on', onDebugOnClick),
	    // createOption('Debug off', onDebugOffClick),
	    // createDivider(),
	    createOption('Preferences', onPreferencesOptionClick, 'sliders')
	  ]
	
	  var optionsPanel = UI.MenubarHelper.createOptionsPanel(menuConfig)
	
	  return UI.MenubarHelper.createMenuContainer('Help', optionsPanel)
	}
	
	// Overview
	
	NGL.OverviewWidget = function (stage, preferences) {
	  var container = new UI.OverlayPanel()
	
	  var xOffset = 0
	  var yOffset = 0
	
	  var prevX = 0
	  var prevY = 0
	
	  function onMousemove (e) {
	    if (prevX === 0) {
	      prevX = e.clientX
	      prevY = e.clientY
	    }
	    xOffset -= prevX - e.clientX
	    yOffset -= prevY - e.clientY
	    prevX = e.clientX
	    prevY = e.clientY
	    container.dom.style.top = yOffset + 'px'
	    container.dom.style.left = xOffset + 'px'
	  }
	
	  function setWidgetPosition (left, top) {
	    xOffset = left
	    yOffset = top
	    prevX = 0
	    prevY = 0
	    container.dom.style.top = yOffset + 'px'
	    container.dom.style.left = xOffset + 'px'
	  }
	  container.setWidgetPosition = setWidgetPosition
	
	  var headingPanel = new UI.Panel()
	    .setBorderBottom('1px solid #555')
	    .setHeight('25px')
	    .setCursor('move')
	    .onMouseDown(function (e) {
	      if (e.which === 1) {
	        document.addEventListener('mousemove', onMousemove)
	      }
	      document.addEventListener('mouseup', function (e) {
	        document.removeEventListener('mousemove', onMousemove)
	      })
	    })
	
	  var listingPanel = new UI.Panel()
	    .setMarginTop('10px')
	    .setMinHeight('100px')
	    .setMaxHeight('500px')
	    .setMaxWidth('600px')
	    .setOverflow('auto')
	
	  headingPanel.add(
	    new UI.Text('NGL Viewer').setFontStyle('italic'),
	    new UI.Html('&nbsp;&mdash;&nbsp;Overview')
	  )
	  headingPanel.add(
	    new UI.Icon('times')
	      .setCursor('pointer')
	      .setMarginLeft('20px')
	      .setFloat('right')
	      .onClick(function () {
	        container.setDisplay('none')
	      })
	  )
	
	  container.add(headingPanel)
	  container.add(listingPanel)
	
	  //
	
	  function addIcon (name, text) {
	    var panel = new UI.Panel()
	
	    var icon = new UI.Icon(name)
	      .setWidth('20px')
	      .setFloat('left')
	
	    var label = new UI.Text(text)
	      .setDisplay('inline')
	      .setMarginLeft('5px')
	
	    panel
	      .setMarginLeft('20px')
	      .add(icon, label)
	    listingPanel.add(panel)
	  }
	
	  listingPanel
	    .add(new UI.Panel().add(new UI.Html("To load a new structure use the <i>File</i> menu in the top left via drag'n'drop.")))
	    .add(new UI.Break())
	
	  listingPanel
	    .add(new UI.Panel().add(new UI.Text('A number of clickable icons provide common actions. Most icons can be clicked on, just try it or hover the mouse pointer over it to see a tooltip.')))
	    .add(new UI.Break())
	
	  addIcon('eye', 'Controls the visibility of a component.')
	  addIcon('trash-o', 'Deletes a component. Note that a second click is required to confirm the action.')
	  addIcon('bullseye', 'Centers a component.')
	  addIcon('bars', 'Opens a menu with further options.')
	  addIcon('square', 'Opens a menu with coloring options.')
	  addIcon('filter', 'Indicates atom-selection input fields.')
	
	  listingPanel
	    .add(new UI.Text('Mouse controls'))
	    .add(new UI.Html(
	      '<ul>' +
	          '<li>Left button hold and move to rotate camera around center.</li>' +
	          '<li>Left button click to pick atom.</li>' +
	          '<li>Middle button hold and move to zoom camera in and out.</li>' +
	          '<li>Middle button click to center camera on atom.</li>' +
	          '<li>Right button hold and move to translate camera in the screen plane.</li>' +
	      '</ul>'
	    ))
	
	  listingPanel
	    .add(new UI.Panel().add(new UI.Html(
	      'For more information please visit the ' +
	      "<a href='" + NGL.documentationUrl + "' target='_blank'>documentation pages</a>."
	    )))
	
	  var overview = preferences.getKey('overview')
	  var showOverviewCheckbox = new UI.Checkbox(overview)
	    .onClick(function () {
	      preferences.setKey(
	        'overview',
	        showOverviewCheckbox.getValue()
	      )
	    })
	
	  listingPanel
	    .add(new UI.HorizontalRule()
	      .setBorderTop('1px solid #555')
	      .setMarginTop('15px')
	    )
	    .add(new UI.Panel().add(
	      showOverviewCheckbox,
	      new UI.Text(
	        'Show on startup. Always available from Menu > Help > Overview.'
	      ).setMarginLeft('5px')
	    ))
	
	  return container
	}
	
	// Preferences
	
	NGL.PreferencesWidget = function (stage, preferences) {
	  var container = new UI.OverlayPanel()
	
	  var xOffset = 0
	  var yOffset = 0
	
	  var prevX = 0
	  var prevY = 0
	
	  function onMousemove (e) {
	    if (prevX === 0) {
	      prevX = e.clientX
	      prevY = e.clientY
	    }
	    xOffset -= prevX - e.clientX
	    yOffset -= prevY - e.clientY
	    prevX = e.clientX
	    prevY = e.clientY
	    container.dom.style.top = yOffset + 'px'
	    container.dom.style.left = xOffset + 'px'
	  }
	
	  function setWidgetPosition (left, top) {
	    xOffset = left
	    yOffset = top
	    prevX = 0
	    prevY = 0
	    container.dom.style.top = yOffset + 'px'
	    container.dom.style.left = xOffset + 'px'
	  }
	  container.setWidgetPosition = setWidgetPosition
	
	  var headingPanel = new UI.Panel()
	    .setBorderBottom('1px solid #555')
	    .setHeight('25px')
	    .setCursor('move')
	    .onMouseDown(function (e) {
	      if (e.which === 1) {
	        document.addEventListener('mousemove', onMousemove)
	      }
	      document.addEventListener('mouseup', function (e) {
	        document.removeEventListener('mousemove', onMousemove)
	      })
	    })
	
	  var listingPanel = new UI.Panel()
	    .setMarginTop('10px')
	    .setMinHeight('100px')
	    .setMaxHeight('500px')
	    .setOverflow('auto')
	
	  headingPanel.add(new UI.Text('Preferences'))
	  headingPanel.add(
	    new UI.Icon('times')
	      .setCursor('pointer')
	      .setMarginLeft('20px')
	      .setFloat('right')
	      .onClick(function () {
	        container.setDisplay('none')
	      })
	  )
	
	  container.add(headingPanel)
	  container.add(listingPanel)
	
	  //
	
	  Object.keys(NGL.UIStageParameters).forEach(function (name) {
	    var p = NGL.UIStageParameters[ name ]
	    if (p.label === undefined) p.label = name
	    var input = NGL.createParameterInput(p, stage.parameters[ name ])
	
	    if (!input) return
	
	    preferences.signals.keyChanged.add(function (key, value) {
	      if (key === name) input.setValue(value)
	    })
	
	    function setParam () {
	      var sp = {}
	      sp[ name ] = input.getValue()
	      preferences.setKey(name, sp[ name ])
	    }
	
	    var ua = navigator.userAgent
	    if (p.type === 'range' && !/Trident/.test(ua) && !/MSIE/.test(ua)) {
	      input.onInput(setParam)
	    } else {
	      input.onChange(setParam)
	    }
	
	    listingPanel
	      .add(new UI.Text(name).setWidth('120px'))
	      .add(input)
	      .add(new UI.Break())
	  })
	
	  return container
	}
	
	// Export image
	
	NGL.ExportImageWidget = function (stage) {
	  var container = new UI.OverlayPanel()
	
	  var headingPanel = new UI.Panel()
	    .setBorderBottom('1px solid #555')
	    .setHeight('25px')
	
	  var listingPanel = new UI.Panel()
	    .setMarginTop('10px')
	    .setMinHeight('100px')
	    .setMaxHeight('500px')
	    .setOverflow('auto')
	
	  headingPanel.add(new UI.Text('Image export'))
	  headingPanel.add(
	    new UI.Icon('times')
	      .setCursor('pointer')
	      .setMarginLeft('20px')
	      .setFloat('right')
	      .onClick(function () {
	        container.setDisplay('none')
	      })
	  )
	
	  container.add(headingPanel)
	  container.add(listingPanel)
	
	  var factorSelect = new UI.Select()
	    .setOptions({
	      '1': '1x',
	      '2': '2x',
	      '3': '3x',
	      '4': '4x',
	      '5': '5x',
	      '6': '6x',
	      '7': '7x',
	      '8': '8x',
	      '9': '9x',
	      '10': '10x'
	    })
	    .setValue('4')
	
	  var antialiasCheckbox = new UI.Checkbox()
	    .setValue(true)
	
	  var trimCheckbox = new UI.Checkbox()
	    .setValue(false)
	
	  var transparentCheckbox = new UI.Checkbox()
	    .setValue(false)
	
	  var progress = new UI.Progress()
	    .setDisplay('none')
	
	  var exportButton = new UI.Button('export')
	    .onClick(function () {
	      exportButton.setDisplay('none')
	      progress.setDisplay('inline-block')
	      function onProgress (i, n, finished) {
	        if (i === 1) {
	          progress.setMax(n)
	        }
	        if (i >= n) {
	          progress.setIndeterminate()
	        } else {
	          progress.setValue(i)
	        }
	        if (finished) {
	          progress.setDisplay('none')
	          exportButton.setDisplay('inline-block')
	        }
	      }
	
	      setTimeout(function () {
	        stage.makeImage({
	          factor: parseInt(factorSelect.getValue()),
	          antialias: antialiasCheckbox.getValue(),
	          trim: trimCheckbox.getValue(),
	          transparent: transparentCheckbox.getValue(),
	          onProgress: onProgress
	        }).then(function (blob) {
	          NGL.download(blob, 'screenshot.png')
	        })
	      }, 50)
	    })
	
	  function addEntry (label, entry) {
	    listingPanel
	      .add(new UI.Text(label).setWidth('80px'))
	      .add(entry || new UI.Panel())
	      .add(new UI.Break())
	  }
	
	  addEntry('scale', factorSelect)
	  addEntry('antialias', antialiasCheckbox)
	  addEntry('trim', trimCheckbox)
	  addEntry('transparent', transparentCheckbox)
	
	  listingPanel.add(
	    new UI.Break(),
	    exportButton, progress
	  )
	
	  return container
	}
	
	// Sidebar
	
	NGL.SidebarWidget = function (stage) {
	  var signals = stage.signals
	  var container = new UI.Panel()
	
	  var widgetContainer = new UI.Panel()
	    .setClass('Content')
	
	  var compList = []
	  var widgetList = []
	
	  function handleComponent(component) {
	    var widget
	
	    switch (component.type) {
	      case 'structure':
	        widget = new NGL.StructureComponentWidget(component, stage)
	        break
	
	      case 'surface':
	        widget = new NGL.SurfaceComponentWidget(component, stage)
	        break
	
	      case 'volume':
	        widget = new NGL.VolumeComponentWidget(component, stage)
	        break
	
	      case 'shape':
	        widget = new NGL.ShapeComponentWidget(component, stage)
	        break
	
	      default:
	        console.warn('NGL.SidebarWidget: component type unknown', component)
	        return
	    }
	
	    widgetContainer.add(widget)
	
	    compList.push(component)
	    widgetList.push(widget)
	
	  }
	
	  // In case user adds components directly from notebook
	  stage.compList.forEach(function(comp){
	      handleComponent(comp)
	  })
	
	  signals.componentAdded.add(handleComponent)
	
	  signals.componentRemoved.add(function (component) {
	    var idx = compList.indexOf(component)
	
	    if (idx !== -1) {
	      widgetList[ idx ].dispose()
	
	      compList.splice(idx, 1)
	      widgetList.splice(idx, 1)
	    }
	  })
	
	  // actions
	
	  var expandAll = new UI.Icon('plus-square')
	    .setTitle('expand all')
	    .setCursor('pointer')
	    .onClick(function () {
	      widgetList.forEach(function (widget) {
	        widget.expand()
	      })
	    })
	
	  var collapseAll = new UI.Icon('minus-square')
	    .setTitle('collapse all')
	    .setCursor('pointer')
	    .setMarginLeft('10px')
	    .onClick(function () {
	      widgetList.forEach(function (widget) {
	        widget.collapse()
	      })
	    })
	
	  var centerAll = new UI.Icon('bullseye')
	    .setTitle('center all')
	    .setCursor('pointer')
	    .setMarginLeft('10px')
	    .onClick(function () {
	      stage.autoView(1000)
	    })
	
	  var disposeAll = new UI.DisposeIcon()
	    .setMarginLeft('10px')
	    .setDisposeFunction(function () {
	      stage.removeAllComponents()
	    })
	
	  var settingsMenu = new UI.PopupMenu('cogs', 'Settings', 'window')
	    .setIconTitle('settings')
	    .setMarginLeft('10px')
	  settingsMenu.entryLabelWidth = '120px'
	
	  // Busy indicator
	
	  var busy = new UI.Panel()
	    .setDisplay('inline')
	    .add(
	      new UI.Icon('spinner')
	        .addClass('spin')
	        .setMarginLeft('45px')
	    )
	
	  stage.tasks.signals.countChanged.add(function (delta, count) {
	    if (count > 0) {
	      actions.add(busy)
	    } else {
	      try {
	        actions.remove(busy)
	      } catch (e) {
	        // already removed
	      }
	    }
	  })
	
	  var paramNames = [
	    'clipNear', 'clipFar', 'clipDist', 'fogNear', 'fogFar',
	    'lightColor', 'lightIntensity', 'ambientColor', 'ambientIntensity'
	  ]
	
	  paramNames.forEach(function (name) {
	    var p = NGL.UIStageParameters[ name ]
	    if (p.label === undefined) p.label = name
	    var input = NGL.createParameterInput(p, stage.parameters[ name ])
	
	    if (!input) return
	
	    stage.signals.parametersChanged.add(function (params) {
	      input.setValue(params[ name ])
	    })
	
	    function setParam () {
	      var sp = {}
	      sp[ name ] = input.getValue()
	      stage.setParameters(sp)
	    }
	
	    var ua = navigator.userAgent
	    if (p.type === 'range' && !/Trident/.test(ua) && !/MSIE/.test(ua)) {
	      input.onInput(setParam)
	    } else {
	      input.onChange(setParam)
	    }
	
	    settingsMenu.addEntry(name, input)
	  })
	
	  //
	
	  var actions = new UI.Panel()
	    .setClass('Panel Sticky')
	    .add(
	      expandAll,
	      collapseAll,
	      centerAll,
	      disposeAll,
	      settingsMenu
	    )
	
	  container.add(
	    actions,
	    widgetContainer
	  )
	
	  return container
	}
	
	// Component
	
	NGL.StructureComponentWidget = function (component, stage) {
	  var signals = component.signals
	  var container = new UI.CollapsibleIconPanel('minus-square', 'plus-square')
	
	  var reprContainer = new UI.Panel()
	  var trajContainer = new UI.Panel()
	
	  function handleRepr(repr){
	    reprContainer.add(
	      new NGL.RepresentationElementWidget(repr, stage)
	    )
	  }
	
	  component.reprList.forEach(function(repr){
	      handleRepr(repr)
	  })
	
	  signals.representationAdded.add(handleRepr)
	
	  signals.trajectoryAdded.add(function (traj) {
	    trajContainer.add(new NGL.TrajectoryElementWidget(traj, stage))
	  })
	
	  signals.defaultAssemblyChanged.add(function () {
	    assembly.setValue(component.parameters.defaultAssembly)
	  })
	
	  // Selection
	
	  container.add(
	    new UI.SelectionPanel(component.selection)
	      .setMarginLeft('20px')
	      .setInputWidth('214px')
	  )
	
	  // Export PDB
	
	  var pdb = new UI.Button('export').onClick(function () {
	    var pdbWriter = new NGL.PdbWriter(component.structure)
	    pdbWriter.download('structure')
	    componentPanel.setMenuDisplay('none')
	  })
	
	  // Add representation
	
	  var repr = new UI.Select()
	    .setColor('#444')
	    .setOptions((function () {
	      var reprOptions = { '': '[ add ]' }
	      NGL.RepresentationRegistry.names.forEach(function (key) {
	        reprOptions[ key ] = key
	      })
	      return reprOptions
	    })())
	    .onChange(function () {
	      component.addRepresentation(repr.getValue())
	      repr.setValue('')
	      componentPanel.setMenuDisplay('none')
	    })
	
	  // Assembly
	
	  var assembly = new UI.Select()
	    .setColor('#444')
	    .setOptions((function () {
	      var biomolDict = component.structure.biomolDict
	      var assemblyOptions = {
	        '': (component.structure.unitcell ? 'AU' : 'FULL')
	      }
	      Object.keys(biomolDict).forEach(function (k) {
	        assemblyOptions[ k ] = k
	      })
	      return assemblyOptions
	    })())
	    .setValue(component.parameters.defaultAssembly)
	    .onChange(function () {
	      component.setDefaultAssembly(assembly.getValue())
	      componentPanel.setMenuDisplay('none')
	    })
	
	  // Open trajectory
	
	  var trajExt = []
	  NGL.ParserRegistry.getTrajectoryExtensions().forEach(function (ext) {
	    trajExt.push('.' + ext, '.' + ext + '.gz')
	  })
	
	  function framesInputOnChange (e) {
	    var fn = function (file, callback) {
	      NGL.autoLoad(file).then(function (frames) {
	        component.addTrajectory(frames)
	        callback()
	      })
	    }
	    var queue = new NGL.Queue(fn, e.target.files)
	    e.target.value = ''
	  }
	
	  var framesInput = document.createElement('input')
	  framesInput.type = 'file'
	  framesInput.multiple = true
	  framesInput.style.display = 'none'
	  framesInput.accept = trajExt.join(',')
	  framesInput.addEventListener('change', framesInputOnChange, false)
	
	  var traj = new UI.Button('open').onClick(function () {
	    framesInput.click()
	    componentPanel.setMenuDisplay('none')
	  })
	
	  // Import remote trajectory
	
	  var remoteTraj = new UI.Button('import').onClick(function () {
	    componentPanel.setMenuDisplay('none')
	
	    // TODO list of extensions should be provided by trajectory datasource
	    var remoteTrajExt = [
	      'xtc', 'trr', 'netcdf', 'dcd', 'ncdf', 'nc', 'gro', 'pdb',
	      'lammpstrj', 'xyz', 'mdcrd', 'gz', 'binpos', 'h5', 'dtr',
	      'arc', 'tng', 'trj', 'trz'
	    ]
	    var dirWidget
	
	    function onListingClick (info) {
	      var ext = info.path.split('.').pop().toLowerCase()
	      if (remoteTrajExt.indexOf(ext) !== -1) {
	        component.addTrajectory(info.path + '?struc=' + component.structure.path)
	        dirWidget.dispose()
	      } else {
	        NGL.log('unknown trajectory type: ' + ext)
	      }
	    }
	
	    dirWidget = new NGL.DirectoryListingWidget(
	      NGL.ListingDatasource, stage, 'Import trajectory',
	      remoteTrajExt, onListingClick
	    )
	
	    dirWidget
	      .setOpacity('0.9')
	      .setLeft('50px')
	      .setTop('80px')
	      .attach()
	  })
	
	  // Superpose
	
	  function setSuperposeOptions () {
	    var superposeOptions = { '': '[ structure ]' }
	    stage.eachComponent(function (o, i) {
	      if (o !== component) {
	        superposeOptions[ i ] = o.name
	      }
	    }, NGL.StructureComponent)
	    superpose.setOptions(superposeOptions)
	  }
	
	  stage.signals.componentAdded.add(setSuperposeOptions)
	  stage.signals.componentRemoved.add(setSuperposeOptions)
	
	  var superpose = new UI.Select()
	    .setColor('#444')
	    .onChange(function () {
	      component.superpose(
	        stage.compList[ superpose.getValue() ],
	        true
	      )
	      component.autoView(1000)
	      superpose.setValue('')
	      componentPanel.setMenuDisplay('none')
	    })
	
	  setSuperposeOptions()
	
	  // Principal axes
	
	  var alignAxes = new UI.Button('align').onClick(function () {
	    var pa = component.structure.getPrincipalAxes()
	    var q = pa.getRotationQuaternion()
	    q.multiply(component.quaternion.clone().inverse())
	    stage.animationControls.rotate(q)
	    stage.animationControls.move(component.getCenter())
	  })
	
	  // Measurements removal
	
	  var removeMeasurements = new UI.Button('remove').onClick(function () {
	    component.removeAllMeasurements()
	  })
	
	  // Annotations visibility
	
	  var showAnnotations = new UI.Button('show').onClick(function () {
	    component.annotationList.forEach(function (annotation) {
	      annotation.setVisibility(true)
	    })
	  })
	
	  var hideAnnotations = new UI.Button('hide').onClick(function () {
	    component.annotationList.forEach(function (annotation) {
	      annotation.setVisibility(false)
	    })
	  })
	
	  var annotationButtons = new UI.Panel()
	    .setDisplay('inline-block')
	    .add(showAnnotations, hideAnnotations)
	
	  // Open validation
	
	  function validationInputOnChange (e) {
	    var fn = function (file, callback) {
	      NGL.autoLoad(file, { ext: 'validation' }).then(function (validation) {
	        component.structure.validation = validation
	        callback()
	      })
	    }
	    var queue = new NGL.Queue(fn, e.target.files)
	  }
	
	  var validationInput = document.createElement('input')
	  validationInput.type = 'file'
	  validationInput.style.display = 'none'
	  validationInput.accept = '.xml'
	  validationInput.addEventListener('change', validationInputOnChange, false)
	
	  var vali = new UI.Button('open').onClick(function () {
	    validationInput.click()
	    componentPanel.setMenuDisplay('none')
	  })
	
	  // Position
	
	  var position = new UI.Vector3()
	    .onChange(function () {
	      component.setPosition(position.getValue())
	    })
	
	  // Rotation
	
	  var q = new NGL.Quaternion()
	  var e = new NGL.Euler()
	  var rotation = new UI.Vector3()
	    .setRange(-6.28, 6.28)
	    .onChange(function () {
	      e.setFromVector3(rotation.getValue())
	      q.setFromEuler(e)
	      component.setRotation(q)
	    })
	
	  // Scale
	
	  var scale = new UI.Number(1)
	    .setRange(0.01, 100)
	    .onChange(function () {
	      component.setScale(scale.getValue())
	    })
	
	  // Matrix
	
	  signals.matrixChanged.add(function () {
	    position.setValue(component.position)
	    rotation.setValue(e.setFromQuaternion(component.quaternion))
	    scale.setValue(component.scale.x)
	  })
	
	  // Component panel
	
	  var componentPanel = new UI.ComponentPanel(component)
	    .setDisplay('inline-block')
	    .setMargin('0px')
	    .addMenuEntry('PDB file', pdb)
	    .addMenuEntry('Representation', repr)
	    .addMenuEntry('Assembly', assembly)
	    .addMenuEntry('Superpose', superpose)
	    .addMenuEntry(
	      'File', new UI.Text(component.structure.path)
	        .setMaxWidth('100px')
	        .setOverflow('auto')
	      // .setWordWrap( "break-word" )
	    )
	    .addMenuEntry('Trajectory', traj)
	    .addMenuEntry('Principal axes', alignAxes)
	    .addMenuEntry('Measurements', removeMeasurements)
	    .addMenuEntry('Annotations', annotationButtons)
	    .addMenuEntry('Validation', vali)
	    .addMenuEntry('Position', position)
	    .addMenuEntry('Rotation', rotation)
	    .addMenuEntry('Scale', scale)
	
	  if (NGL.ListingDatasource && NGL.TrajectoryDatasource) {
	    componentPanel.addMenuEntry('Remote trajectory', remoteTraj)
	  }
	
	  // Fill container
	
	  container
	    .addStatic(componentPanel)
	    .add(trajContainer)
	    .add(reprContainer)
	
	  return container
	}
	
	NGL.SurfaceComponentWidget = function (component, stage) {
	  var signals = component.signals
	  var container = new UI.CollapsibleIconPanel('minus-square', 'plus-square')
	
	  var reprContainer = new UI.Panel()
	
	  signals.representationAdded.add(function (repr) {
	    reprContainer.add(
	      new NGL.RepresentationElementWidget(repr, stage)
	    )
	  })
	
	  // Add representation
	
	  var repr = new UI.Select()
	    .setColor('#444')
	    .setOptions((function () {
	      var reprOptions = {
	        '': '[ add ]',
	        'surface': 'surface',
	        'dot': 'dot'
	      }
	      return reprOptions
	    })())
	    .onChange(function () {
	      component.addRepresentation(repr.getValue())
	      repr.setValue('')
	      componentPanel.setMenuDisplay('none')
	    })
	
	  // Position
	
	  var position = new UI.Vector3()
	    .onChange(function () {
	      component.setPosition(position.getValue())
	    })
	
	  // Rotation
	
	  var q = new NGL.Quaternion()
	  var e = new NGL.Euler()
	  var rotation = new UI.Vector3()
	    .setRange(-6.28, 6.28)
	    .onChange(function () {
	      e.setFromVector3(rotation.getValue())
	      q.setFromEuler(e)
	      component.setRotation(q)
	    })
	
	  // Scale
	
	  var scale = new UI.Number(1)
	    .setRange(0.01, 100)
	    .onChange(function () {
	      component.setScale(scale.getValue())
	    })
	
	  // Matrix
	
	  signals.matrixChanged.add(function () {
	    position.setValue(component.position)
	    rotation.setValue(e.setFromQuaternion(component.quaternion))
	    scale.setValue(component.scale.x)
	  })
	
	  // Component panel
	
	  var componentPanel = new UI.ComponentPanel(component)
	    .setDisplay('inline-block')
	    .setMargin('0px')
	    .addMenuEntry('Representation', repr)
	    .addMenuEntry(
	      'File', new UI.Text(component.surface.path)
	        .setMaxWidth('100px')
	        .setWordWrap('break-word'))
	    .addMenuEntry('Position', position)
	    .addMenuEntry('Rotation', rotation)
	    .addMenuEntry('Scale', scale)
	
	  // Fill container
	
	  container
	    .addStatic(componentPanel)
	    .add(reprContainer)
	
	  return container
	}
	
	NGL.VolumeComponentWidget = function (component, stage) {
	  var signals = component.signals
	  var container = new UI.CollapsibleIconPanel('minus-square', 'plus-square')
	
	  var reprContainer = new UI.Panel()
	
	  signals.representationAdded.add(function (repr) {
	    reprContainer.add(
	      new NGL.RepresentationElementWidget(repr, stage)
	    )
	  })
	
	  // Add representation
	
	  var repr = new UI.Select()
	    .setColor('#444')
	    .setOptions((function () {
	      var reprOptions = {
	        '': '[ add ]',
	        'surface': 'surface',
	        'dot': 'dot',
	        'slice': 'slice'
	      }
	      return reprOptions
	    })())
	    .onChange(function () {
	      component.addRepresentation(repr.getValue())
	      repr.setValue('')
	      componentPanel.setMenuDisplay('none')
	    })
	
	  // Position
	
	  var position = new UI.Vector3()
	    .onChange(function () {
	      component.setPosition(position.getValue())
	    })
	
	  // Rotation
	
	  var q = new NGL.Quaternion()
	  var e = new NGL.Euler()
	  var rotation = new UI.Vector3()
	    .setRange(-6.28, 6.28)
	    .onChange(function () {
	      e.setFromVector3(rotation.getValue())
	      q.setFromEuler(e)
	      component.setRotation(q)
	    })
	
	  // Scale
	
	  var scale = new UI.Number(1)
	    .setRange(0.01, 100)
	    .onChange(function () {
	      component.setScale(scale.getValue())
	    })
	
	  // Matrix
	
	  signals.matrixChanged.add(function () {
	    position.setValue(component.position)
	    rotation.setValue(e.setFromQuaternion(component.quaternion))
	    scale.setValue(component.scale.x)
	  })
	
	  // Component panel
	
	  var componentPanel = new UI.ComponentPanel(component)
	    .setDisplay('inline-block')
	    .setMargin('0px')
	    .addMenuEntry('Representation', repr)
	    .addMenuEntry(
	      'File', new UI.Text(component.volume.path)
	        .setMaxWidth('100px')
	        .setWordWrap('break-word'))
	    .addMenuEntry('Position', position)
	    .addMenuEntry('Rotation', rotation)
	    .addMenuEntry('Scale', scale)
	
	  // Fill container
	
	  container
	    .addStatic(componentPanel)
	    .add(reprContainer)
	
	  return container
	}
	
	NGL.ShapeComponentWidget = function (component, stage) {
	  var signals = component.signals
	  var container = new UI.CollapsibleIconPanel('minus-square', 'plus-square')
	
	  var reprContainer = new UI.Panel()
	
	  signals.representationAdded.add(function (repr) {
	    reprContainer.add(
	      new NGL.RepresentationElementWidget(repr, stage)
	    )
	  })
	
	  // Add representation
	
	  var repr = new UI.Select()
	    .setColor('#444')
	    .setOptions((function () {
	      var reprOptions = {
	        '': '[ add ]',
	        'buffer': 'buffer'
	      }
	      return reprOptions
	    })())
	    .onChange(function () {
	      component.addRepresentation(repr.getValue())
	      repr.setValue('')
	      componentPanel.setMenuDisplay('none')
	    })
	
	  // Position
	
	  var position = new UI.Vector3()
	    .onChange(function () {
	      component.setPosition(position.getValue())
	    })
	
	    // Rotation
	
	  var q = new NGL.Quaternion()
	  var e = new NGL.Euler()
	  var rotation = new UI.Vector3()
	    .setRange(-6.28, 6.28)
	    .onChange(function () {
	      e.setFromVector3(rotation.getValue())
	      q.setFromEuler(e)
	      component.setRotation(q)
	    })
	
	  // Scale
	
	  var scale = new UI.Number(1)
	    .setRange(0.01, 100)
	    .onChange(function () {
	      component.setScale(scale.getValue())
	    })
	
	  // Matrix
	
	  signals.matrixChanged.add(function () {
	    position.setValue(component.position)
	    rotation.setValue(e.setFromQuaternion(component.quaternion))
	    scale.setValue(component.scale.x)
	  })
	
	  // Component panel
	
	  var componentPanel = new UI.ComponentPanel(component)
	    .setDisplay('inline-block')
	    .setMargin('0px')
	    .addMenuEntry('Representation', repr)
	    .addMenuEntry(
	      'File', new UI.Text(component.shape.path)
	        .setMaxWidth('100px')
	        .setWordWrap('break-word'))
	    .addMenuEntry('Position', position)
	    .addMenuEntry('Rotation', rotation)
	    .addMenuEntry('Scale', scale)
	
	  // Fill container
	
	  container
	    .addStatic(componentPanel)
	    .add(reprContainer)
	
	  return container
	}
	
	// Representation
	
	NGL.RepresentationElementWidget = function (element, stage) {
	  var signals = element.signals
	
	  var container = new UI.CollapsibleIconPanel('minus-square', 'plus-square')
	    .setMarginLeft('20px')
	
	  signals.visibilityChanged.add(function (value) {
	    toggle.setValue(value)
	  })
	
	  signals.nameChanged.add(function (value) {
	    name.setValue(value)
	  })
	
	  signals.disposed.add(function () {
	    menu.dispose()
	    container.dispose()
	  })
	
	  // Name
	
	  var name = new UI.EllipsisText(element.name)
	    .setWidth('103px')
	
	    // Actions
	
	  var toggle = new UI.ToggleIcon(element.visible, 'eye', 'eye-slash')
	    .setTitle('hide/show')
	    .setCursor('pointer')
	    .setMarginLeft('25px')
	    .onClick(function () {
	      element.setVisibility(!element.visible)
	    })
	
	  var disposeIcon = new UI.DisposeIcon()
	    .setMarginLeft('10px')
	    .setDisposeFunction(function () {
	      element.dispose()
	    })
	
	  container
	    .addStatic(name)
	    .addStatic(toggle)
	    .addStatic(disposeIcon)
	
	  // Selection
	
	  if ((element.parent.type === 'structure' ||
	          element.parent.type === 'trajectory') &&
	        element.repr.selection && element.repr.selection.type === 'selection'
	  ) {
	    container.add(
	      new UI.SelectionPanel(element.repr.selection)
	        .setMarginLeft('20px')
	        .setInputWidth('194px')
	    )
	  }
	
	  // Menu
	
	  var menu = new UI.PopupMenu('bars', 'Representation')
	    .setMarginLeft('45px')
	    .setEntryLabelWidth('190px')
	
	  menu.addEntry('type', new UI.Text(element.repr.type))
	
	  // Parameters
	
	  var repr = element.repr
	  var rp = repr.getParameters()
	
	  Object.keys(repr.parameters).forEach(function (name) {
	    if (!repr.parameters[ name ]) return
	    var p = Object.assign({}, repr.parameters[ name ])
	    p.value = rp[ name ]
	    if (p.label === undefined) p.label = name
	    var input = NGL.createParameterInput(p)
	
	    if (!input) return
	
	    signals.parametersChanged.add(function (params) {
	      if (typeof input.setValue === 'function') {
	        input.setValue(params[ name ])
	      }
	    })
	
	    function setParam () {
	      var po = {}
	      po[ name ] = input.getValue()
	      element.setParameters(po)
	      stage.viewer.requestRender()
	    }
	
	    var ua = navigator.userAgent
	    if (p.type === 'range' && !/Trident/.test(ua) && !/MSIE/.test(ua)) {
	      input.onInput(setParam)
	    } else {
	      input.onChange(setParam)
	    }
	
	    menu.addEntry(name, input)
	  })
	
	  container
	    .addStatic(menu)
	
	  return container
	}
	
	// Trajectory
	
	NGL.TrajectoryElementWidget = function (element, stage) {
	  var signals = element.signals
	  var traj = element.trajectory
	
	  var container = new UI.CollapsibleIconPanel('minus-square', 'plus-square')
	    .setMarginLeft('20px')
	
	  signals.disposed.add(function () {
	    menu.dispose()
	    container.dispose()
	  })
	
	  var frameCount = new UI.Panel()
	    .setDisplay('inline')
	    .add(new UI.Icon('spinner')
	      .addClass('spin')
	      .setMarginRight('99px')
	    )
	
	  var frameTime = new UI.Panel()
	    .setMarginLeft('5px')
	    .setDisplay('inline')
	
	  function setFrame (value) {
	    frame.setValue(value)
	    if (traj.deltaTime && value >= 0) {
	      var t = traj.getFrameTime(value) / 1000
	      time.setValue(t.toFixed(9).replace(/\.?0+$/g, '') + 'ns')
	    } else {
	      time.setValue('')
	    }
	    frameRange.setValue(value)
	    frameCount.clear().add(frame.setWidth('40px'))
	    frameTime.clear().add(time.setWidth('90px'))
	  }
	
	  function init (value) {
	    frame.setRange(-1, value - 1)
	    frameRange.setRange(-1, value - 1)
	
	    setFrame(traj.currentFrame)
	
	    if (element.parameters.defaultStep !== undefined) {
	      step.setValue(element.parameters.defaultStep)
	    } else {
	      // 1000 = n / step
	      step.setValue(Math.ceil((value + 1) / 100))
	    }
	
	    player.setParameters({step: step.getValue()})
	    player.setParameters({end: value - 1})
	  }
	
	  signals.countChanged.add(init)
	  signals.frameChanged.add(setFrame)
	
	  // Name
	
	  var name = new UI.EllipsisText(element.parameters.name)
	    .setWidth('103px')
	
	  signals.nameChanged.add(function (value) {
	    name.setValue(value)
	  })
	
	  container.addStatic(name)
	  container.addStatic(frameTime)
	
	  // frames
	
	  var frame = new UI.Integer(-1)
	    .setWidth('40px')
	    .setTextAlign('right')
	    .setMarginLeft('5px')
	    .setRange(-1, -1)
	    .onChange(function (e) {
	      traj.setFrame(frame.getValue())
	      menu.setMenuDisplay('none')
	    })
	
	  var time = new UI.Text()
	    .setTextAlign('right')
	    .setWidth('90px')
	
	  var step = new UI.Integer(1)
	    .setWidth('50px')
	    .setRange(1, 10000)
	    .onChange(function () {
	      player.setParameters({step: step.getValue()})
	    })
	
	  var frameRow = new UI.Panel()
	
	  var frameRange = new UI.Range(-1, -1, -1, 1)
	    .setWidth('147px')
	    .setMargin('0px')
	    .setPadding('0px')
	    .setBorder('0px')
	    .onInput(function (e) {
	      var value = frameRange.getValue()
	
	      if (value === traj.currentFrame) {
	        return
	      }
	
	      if (traj.player && traj.player.isRunning) {
	        traj.setPlayer()
	        traj.setFrame(value)
	      } else if (!traj.inProgress) {
	        traj.setFrame(value)
	      }
	    })
	
	  var interpolateType = new UI.Select()
	    .setColor('#444')
	    .setOptions({
	      '': 'none',
	      'linear': 'linear',
	      'spline': 'spline'
	    })
	    .setValue(element.parameters.defaultInterpolateType)
	    .onChange(function () {
	      player.setParameters({interpolateType: interpolateType.getValue()})
	    })
	
	  var interpolateStep = new UI.Integer(element.parameters.defaultInterpolateStep)
	    .setWidth('30px')
	    .setRange(1, 50)
	    .onChange(function () {
	      player.setParameters({interpolateStep: interpolateStep.getValue()})
	    })
	
	  var playDirection = new UI.Select()
	    .setColor('#444')
	    .setOptions({
	      'forward': 'forward',
	      'backward': 'backward',
	      'bounce': 'bounce'
	    })
	    .setValue(element.parameters.defaultDirection)
	    .onChange(function () {
	      player.setParameters({direction: playDirection.getValue()})
	    })
	
	  var playMode = new UI.Select()
	    .setColor('#444')
	    .setOptions({
	      'loop': 'loop',
	      'once': 'once'
	    })
	    .setValue(element.parameters.defaultMode)
	    .onChange(function () {
	      player.setParameters({mode: playMode.getValue()})
	    })
	
	  // player
	
	  var timeout = new UI.Integer(element.parameters.defaultTimeout)
	    .setWidth('30px')
	    .setRange(10, 1000)
	    .onChange(function () {
	      player.setParameters({timeout: timeout.getValue()})
	    })
	
	  var player = new NGL.TrajectoryPlayer(traj, {
	    step: step.getValue(),
	    timeout: timeout.getValue(),
	    start: 0,
	    end: traj.frameCount - 1,
	    interpolateType: interpolateType.getValue(),
	    interpolateStep: interpolateStep.getValue(),
	    direction: playDirection.getValue(),
	    mode: playMode.getValue()
	  })
	  traj.setPlayer(player)
	
	  var playerButton = new UI.ToggleIcon(true, 'play', 'pause')
	    .setMarginRight('10px')
	    .setMarginLeft('20px')
	    .setCursor('pointer')
	    .setWidth('12px')
	    .setTitle('play')
	    .onClick(function () {
	      player.toggle()
	    })
	
	  player.signals.startedRunning.add(function () {
	    playerButton
	      .setTitle('pause')
	      .setValue(false)
	  })
	
	  player.signals.haltedRunning.add(function () {
	    playerButton
	      .setTitle('play')
	      .setValue(true)
	  })
	
	  frameRow.add(playerButton, frameRange, frameCount)
	
	  // Selection
	
	  container.add(
	    new UI.SelectionPanel(traj.selection)
	      .setMarginLeft('20px')
	      .setInputWidth('194px')
	  )
	
	  // Options
	
	  var setCenterPbc = new UI.Checkbox(traj.centerPbc)
	    .onChange(function () {
	      element.setParameters({
	        'centerPbc': setCenterPbc.getValue()
	      })
	    })
	
	  var setRemovePeriodicity = new UI.Checkbox(traj.removePeriodicity)
	    .onChange(function () {
	      element.setParameters({
	        'removePeriodicity': setRemovePeriodicity.getValue()
	      })
	    })
	
	  var setRemovePbc = new UI.Checkbox(traj.removePbc)
	    .onChange(function () {
	      element.setParameters({
	        'removePbc': setRemovePbc.getValue()
	      })
	    })
	
	  var setSuperpose = new UI.Checkbox(traj.superpose)
	    .onChange(function () {
	      element.setParameters({
	        'superpose': setSuperpose.getValue()
	      })
	    })
	
	  var setDeltaTime = new UI.Number(traj.deltaTime)
	    .setWidth('55px')
	    .setRange(0, 1000000)
	    .onChange(function () {
	      element.setParameters({
	        'deltaTime': setDeltaTime.getValue()
	      })
	    })
	
	  var setTimeOffset = new UI.Number(traj.timeOffset)
	    .setWidth('55px')
	    .setRange(0, 1000000000)
	    .onChange(function () {
	      element.setParameters({
	        'timeOffset': setTimeOffset.getValue()
	      })
	    })
	
	  signals.parametersChanged.add(function (params) {
	    setCenterPbc.setValue(traj.centerPbc)
	    setRemovePeriodicity.setValue(traj.removePeriodicity)
	    setRemovePbc.setValue(traj.removePbc)
	    setSuperpose.setValue(traj.superpose)
	    setDeltaTime.setValue(traj.deltaTime)
	    setTimeOffset.setValue(traj.timeOffset)
	    traj.setFrame(frame.getValue())
	  })
	
	  // Dispose
	
	  var dispose = new UI.DisposeIcon()
	    .setDisposeFunction(function () {
	      element.parent.removeTrajectory(element)
	    })
	
	  //
	
	  if (traj.frameCount) {
	    init(traj.frameCount)
	  }
	
	  // Menu
	
	  var menu = new UI.PopupMenu('bars', 'Trajectory')
	    .setMarginLeft('10px')
	    .setEntryLabelWidth('130px')
	    .addEntry('Center', setCenterPbc)
	    .addEntry('Remove Periodicity', setRemovePeriodicity)
	    .addEntry('Remove PBC', setRemovePbc)
	    .addEntry('Superpose', setSuperpose)
	    .addEntry('Step size', step)
	    .addEntry('Interpolation type', interpolateType)
	    .addEntry('Interpolation steps', interpolateStep)
	    .addEntry('Play timeout', timeout)
	    .addEntry('Play direction', playDirection)
	    .addEntry('Play mode', playMode)
	    .addEntry('Delta time [ps]', setDeltaTime)
	    .addEntry('Time offset [ps]', setTimeOffset)
	    .addEntry('File',
	      new UI.Text(traj.trajPath)
	        .setMaxWidth('100px')
	        .setWordWrap('break-word'))
	    .addEntry('Dispose', dispose)
	
	  container
	    .addStatic(menu)
	
	  container
	    .add(frameRow)
	
	  return container
	}
	
	// Listing
	
	NGL.DirectoryListingWidget = function (datasource, stage, heading, filter, callback) {
	  // from http://stackoverflow.com/a/20463021/1435042
	  function fileSizeSI (a, b, c, d, e) {
	    return (b = Math, c = b.log, d = 1e3, e = c(a) / c(d) | 0, a / b.pow(d, e)).toFixed(2) +
	            String.fromCharCode(160) + (e ? 'kMGTPEZY'[--e] + 'B' : 'Bytes')
	  }
	
	  function getFolderDict (path) {
	    path = path || ''
	    var options = { '': '' }
	    var full = []
	    path.split('/').forEach(function (chunk) {
	      full.push(chunk)
	      options[ full.join('/') ] = chunk
	    })
	    return options
	  }
	
	  var container = new UI.OverlayPanel()
	
	  var headingPanel = new UI.Panel()
	    .setBorderBottom('1px solid #555')
	    .setHeight('30px')
	
	  var listingPanel = new UI.Panel()
	    .setMarginTop('10px')
	    .setMinHeight('100px')
	    .setMaxHeight('500px')
	    .setPaddingRight('15px')
	    .setOverflow('auto')
	
	  var folderSelect = new UI.Select()
	    .setColor('#444')
	    .setMarginLeft('20px')
	    .setWidth('')
	    .setMaxWidth('200px')
	    .setOptions(getFolderDict())
	    .onChange(function () {
	      datasource.getListing(folderSelect.getValue())
	        .then(onListingLoaded)
	    })
	
	  heading = heading || 'Directoy listing'
	
	  headingPanel.add(new UI.Text(heading))
	  headingPanel.add(folderSelect)
	  headingPanel.add(
	    new UI.Icon('times')
	      .setCursor('pointer')
	      .setMarginLeft('20px')
	      .setFloat('right')
	      .onClick(function () {
	        container.dispose()
	      })
	  )
	
	  container.add(headingPanel)
	  container.add(listingPanel)
	
	  function onListingLoaded (listing) {
	    var folder = listing.path
	    var data = listing.data
	
	    NGL.lastUsedDirectory = folder
	    listingPanel.clear()
	
	    folderSelect
	      .setOptions(getFolderDict(folder))
	      .setValue(folder)
	
	    data.forEach(function (info) {
	      var ext = info.path.split('.').pop().toLowerCase()
	      if (filter && !info.dir && filter.indexOf(ext) === -1) {
	        return
	      }
	
	      var icon, name
	      if (info.dir) {
	        icon = 'folder-o'
	        name = info.name
	      } else {
	        icon = 'file-o'
	        name = info.name + String.fromCharCode(160) +
	                '(' + fileSizeSI(info.size) + ')'
	      }
	
	      var pathRow = new UI.Panel()
	        .setDisplay('block')
	        .setWhiteSpace('nowrap')
	        .add(new UI.Icon(icon).setWidth('20px'))
	        .add(new UI.Text(name))
	        .onClick(function () {
	          if (info.dir) {
	            datasource.getListing(info.path)
	              .then(onListingLoaded)
	          } else {
	            callback(info)
	          }
	        })
	
	      if (info.restricted) {
	        pathRow.add(new UI.Icon('lock').setMarginLeft('5px'))
	      }
	
	      listingPanel.add(pathRow)
	    })
	  }
	
	  datasource.getListing(NGL.lastUsedDirectory)
	    .then(onListingLoaded)
	
	  return container
	}
	
	module.exports = {
	    "StageWidget": StageWidget
	}


/***/ }),
/* 20 */
/***/ (function(module, exports, __webpack_require__) {

	var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!
	 * jQuery UI Dialog 1.12.1
	 * http://jqueryui.com
	 *
	 * Copyright jQuery Foundation and other contributors
	 * Released under the MIT license.
	 * http://jquery.org/license
	 */
	
	//>>label: Dialog
	//>>group: Widgets
	//>>description: Displays customizable dialog windows.
	//>>docs: http://api.jqueryui.com/dialog/
	//>>demos: http://jqueryui.com/dialog/
	//>>css.structure: ../../themes/base/core.css
	//>>css.structure: ../../themes/base/dialog.css
	//>>css.theme: ../../themes/base/theme.css
	
	( function( factory ) {
		if ( true ) {
	
			// AMD. Register as an anonymous module.
			!(__WEBPACK_AMD_DEFINE_ARRAY__ = [
				__webpack_require__(12),
				__webpack_require__(21),
				__webpack_require__(31),
				__webpack_require__(32),
				__webpack_require__(39),
				__webpack_require__(41),
				__webpack_require__(30),
				__webpack_require__(42),
				__webpack_require__(36),
				__webpack_require__(37),
				__webpack_require__(43),
				__webpack_require__(44),
				__webpack_require__(24),
				__webpack_require__(23)
			], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
		} else {
	
			// Browser globals
			factory( jQuery );
		}
	}( function( $ ) {
	
	$.widget( "ui.dialog", {
		version: "1.12.1",
		options: {
			appendTo: "body",
			autoOpen: true,
			buttons: [],
			classes: {
				"ui-dialog": "ui-corner-all",
				"ui-dialog-titlebar": "ui-corner-all"
			},
			closeOnEscape: true,
			closeText: "Close",
			draggable: true,
			hide: null,
			height: "auto",
			maxHeight: null,
			maxWidth: null,
			minHeight: 150,
			minWidth: 150,
			modal: false,
			position: {
				my: "center",
				at: "center",
				of: window,
				collision: "fit",
	
				// Ensure the titlebar is always visible
				using: function( pos ) {
					var topOffset = $( this ).css( pos ).offset().top;
					if ( topOffset < 0 ) {
						$( this ).css( "top", pos.top - topOffset );
					}
				}
			},
			resizable: true,
			show: null,
			title: null,
			width: 300,
	
			// Callbacks
			beforeClose: null,
			close: null,
			drag: null,
			dragStart: null,
			dragStop: null,
			focus: null,
			open: null,
			resize: null,
			resizeStart: null,
			resizeStop: null
		},
	
		sizeRelatedOptions: {
			buttons: true,
			height: true,
			maxHeight: true,
			maxWidth: true,
			minHeight: true,
			minWidth: true,
			width: true
		},
	
		resizableRelatedOptions: {
			maxHeight: true,
			maxWidth: true,
			minHeight: true,
			minWidth: true
		},
	
		_create: function() {
			this.originalCss = {
				display: this.element[ 0 ].style.display,
				width: this.element[ 0 ].style.width,
				minHeight: this.element[ 0 ].style.minHeight,
				maxHeight: this.element[ 0 ].style.maxHeight,
				height: this.element[ 0 ].style.height
			};
			this.originalPosition = {
				parent: this.element.parent(),
				index: this.element.parent().children().index( this.element )
			};
			this.originalTitle = this.element.attr( "title" );
			if ( this.options.title == null && this.originalTitle != null ) {
				this.options.title = this.originalTitle;
			}
	
			// Dialogs can't be disabled
			if ( this.options.disabled ) {
				this.options.disabled = false;
			}
	
			this._createWrapper();
	
			this.element
				.show()
				.removeAttr( "title" )
				.appendTo( this.uiDialog );
	
			this._addClass( "ui-dialog-content", "ui-widget-content" );
	
			this._createTitlebar();
			this._createButtonPane();
	
			if ( this.options.draggable && $.fn.draggable ) {
				this._makeDraggable();
			}
			if ( this.options.resizable && $.fn.resizable ) {
				this._makeResizable();
			}
	
			this._isOpen = false;
	
			this._trackFocus();
		},
	
		_init: function() {
			if ( this.options.autoOpen ) {
				this.open();
			}
		},
	
		_appendTo: function() {
			var element = this.options.appendTo;
			if ( element && ( element.jquery || element.nodeType ) ) {
				return $( element );
			}
			return this.document.find( element || "body" ).eq( 0 );
		},
	
		_destroy: function() {
			var next,
				originalPosition = this.originalPosition;
	
			this._untrackInstance();
			this._destroyOverlay();
	
			this.element
				.removeUniqueId()
				.css( this.originalCss )
	
				// Without detaching first, the following becomes really slow
				.detach();
	
			this.uiDialog.remove();
	
			if ( this.originalTitle ) {
				this.element.attr( "title", this.originalTitle );
			}
	
			next = originalPosition.parent.children().eq( originalPosition.index );
	
			// Don't try to place the dialog next to itself (#8613)
			if ( next.length && next[ 0 ] !== this.element[ 0 ] ) {
				next.before( this.element );
			} else {
				originalPosition.parent.append( this.element );
			}
		},
	
		widget: function() {
			return this.uiDialog;
		},
	
		disable: $.noop,
		enable: $.noop,
	
		close: function( event ) {
			var that = this;
	
			if ( !this._isOpen || this._trigger( "beforeClose", event ) === false ) {
				return;
			}
	
			this._isOpen = false;
			this._focusedElement = null;
			this._destroyOverlay();
			this._untrackInstance();
	
			if ( !this.opener.filter( ":focusable" ).trigger( "focus" ).length ) {
	
				// Hiding a focused element doesn't trigger blur in WebKit
				// so in case we have nothing to focus on, explicitly blur the active element
				// https://bugs.webkit.org/show_bug.cgi?id=47182
				$.ui.safeBlur( $.ui.safeActiveElement( this.document[ 0 ] ) );
			}
	
			this._hide( this.uiDialog, this.options.hide, function() {
				that._trigger( "close", event );
			} );
		},
	
		isOpen: function() {
			return this._isOpen;
		},
	
		moveToTop: function() {
			this._moveToTop();
		},
	
		_moveToTop: function( event, silent ) {
			var moved = false,
				zIndices = this.uiDialog.siblings( ".ui-front:visible" ).map( function() {
					return +$( this ).css( "z-index" );
				} ).get(),
				zIndexMax = Math.max.apply( null, zIndices );
	
			if ( zIndexMax >= +this.uiDialog.css( "z-index" ) ) {
				this.uiDialog.css( "z-index", zIndexMax + 1 );
				moved = true;
			}
	
			if ( moved && !silent ) {
				this._trigger( "focus", event );
			}
			return moved;
		},
	
		open: function() {
			var that = this;
			if ( this._isOpen ) {
				if ( this._moveToTop() ) {
					this._focusTabbable();
				}
				return;
			}
	
			this._isOpen = true;
			this.opener = $( $.ui.safeActiveElement( this.document[ 0 ] ) );
	
			this._size();
			this._position();
			this._createOverlay();
			this._moveToTop( null, true );
	
			// Ensure the overlay is moved to the top with the dialog, but only when
			// opening. The overlay shouldn't move after the dialog is open so that
			// modeless dialogs opened after the modal dialog stack properly.
			if ( this.overlay ) {
				this.overlay.css( "z-index", this.uiDialog.css( "z-index" ) - 1 );
			}
	
			this._show( this.uiDialog, this.options.show, function() {
				that._focusTabbable();
				that._trigger( "focus" );
			} );
	
			// Track the dialog immediately upon openening in case a focus event
			// somehow occurs outside of the dialog before an element inside the
			// dialog is focused (#10152)
			this._makeFocusTarget();
	
			this._trigger( "open" );
		},
	
		_focusTabbable: function() {
	
			// Set focus to the first match:
			// 1. An element that was focused previously
			// 2. First element inside the dialog matching [autofocus]
			// 3. Tabbable element inside the content element
			// 4. Tabbable element inside the buttonpane
			// 5. The close button
			// 6. The dialog itself
			var hasFocus = this._focusedElement;
			if ( !hasFocus ) {
				hasFocus = this.element.find( "[autofocus]" );
			}
			if ( !hasFocus.length ) {
				hasFocus = this.element.find( ":tabbable" );
			}
			if ( !hasFocus.length ) {
				hasFocus = this.uiDialogButtonPane.find( ":tabbable" );
			}
			if ( !hasFocus.length ) {
				hasFocus = this.uiDialogTitlebarClose.filter( ":tabbable" );
			}
			if ( !hasFocus.length ) {
				hasFocus = this.uiDialog;
			}
			hasFocus.eq( 0 ).trigger( "focus" );
		},
	
		_keepFocus: function( event ) {
			function checkFocus() {
				var activeElement = $.ui.safeActiveElement( this.document[ 0 ] ),
					isActive = this.uiDialog[ 0 ] === activeElement ||
						$.contains( this.uiDialog[ 0 ], activeElement );
				if ( !isActive ) {
					this._focusTabbable();
				}
			}
			event.preventDefault();
			checkFocus.call( this );
	
			// support: IE
			// IE <= 8 doesn't prevent moving focus even with event.preventDefault()
			// so we check again later
			this._delay( checkFocus );
		},
	
		_createWrapper: function() {
			this.uiDialog = $( "<div>" )
				.hide()
				.attr( {
	
					// Setting tabIndex makes the div focusable
					tabIndex: -1,
					role: "dialog"
				} )
				.appendTo( this._appendTo() );
	
			this._addClass( this.uiDialog, "ui-dialog", "ui-widget ui-widget-content ui-front" );
			this._on( this.uiDialog, {
				keydown: function( event ) {
					if ( this.options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&
							event.keyCode === $.ui.keyCode.ESCAPE ) {
						event.preventDefault();
						this.close( event );
						return;
					}
	
					// Prevent tabbing out of dialogs
					if ( event.keyCode !== $.ui.keyCode.TAB || event.isDefaultPrevented() ) {
						return;
					}
					var tabbables = this.uiDialog.find( ":tabbable" ),
						first = tabbables.filter( ":first" ),
						last = tabbables.filter( ":last" );
	
					if ( ( event.target === last[ 0 ] || event.target === this.uiDialog[ 0 ] ) &&
							!event.shiftKey ) {
						this._delay( function() {
							first.trigger( "focus" );
						} );
						event.preventDefault();
					} else if ( ( event.target === first[ 0 ] ||
							event.target === this.uiDialog[ 0 ] ) && event.shiftKey ) {
						this._delay( function() {
							last.trigger( "focus" );
						} );
						event.preventDefault();
					}
				},
				mousedown: function( event ) {
					if ( this._moveToTop( event ) ) {
						this._focusTabbable();
					}
				}
			} );
	
			// We assume that any existing aria-describedby attribute means
			// that the dialog content is marked up properly
			// otherwise we brute force the content as the description
			if ( !this.element.find( "[aria-describedby]" ).length ) {
				this.uiDialog.attr( {
					"aria-describedby": this.element.uniqueId().attr( "id" )
				} );
			}
		},
	
		_createTitlebar: function() {
			var uiDialogTitle;
	
			this.uiDialogTitlebar = $( "<div>" );
			this._addClass( this.uiDialogTitlebar,
				"ui-dialog-titlebar", "ui-widget-header ui-helper-clearfix" );
			this._on( this.uiDialogTitlebar, {
				mousedown: function( event ) {
	
					// Don't prevent click on close button (#8838)
					// Focusing a dialog that is partially scrolled out of view
					// causes the browser to scroll it into view, preventing the click event
					if ( !$( event.target ).closest( ".ui-dialog-titlebar-close" ) ) {
	
						// Dialog isn't getting focus when dragging (#8063)
						this.uiDialog.trigger( "focus" );
					}
				}
			} );
	
			// Support: IE
			// Use type="button" to prevent enter keypresses in textboxes from closing the
			// dialog in IE (#9312)
			this.uiDialogTitlebarClose = $( "<button type='button'></button>" )
				.button( {
					label: $( "<a>" ).text( this.options.closeText ).html(),
					icon: "ui-icon-closethick",
					showLabel: false
				} )
				.appendTo( this.uiDialogTitlebar );
	
			this._addClass( this.uiDialogTitlebarClose, "ui-dialog-titlebar-close" );
			this._on( this.uiDialogTitlebarClose, {
				click: function( event ) {
					event.preventDefault();
					this.close( event );
				}
			} );
	
			uiDialogTitle = $( "<span>" ).uniqueId().prependTo( this.uiDialogTitlebar );
			this._addClass( uiDialogTitle, "ui-dialog-title" );
			this._title( uiDialogTitle );
	
			this.uiDialogTitlebar.prependTo( this.uiDialog );
	
			this.uiDialog.attr( {
				"aria-labelledby": uiDialogTitle.attr( "id" )
			} );
		},
	
		_title: function( title ) {
			if ( this.options.title ) {
				title.text( this.options.title );
			} else {
				title.html( "&#160;" );
			}
		},
	
		_createButtonPane: function() {
			this.uiDialogButtonPane = $( "<div>" );
			this._addClass( this.uiDialogButtonPane, "ui-dialog-buttonpane",
				"ui-widget-content ui-helper-clearfix" );
	
			this.uiButtonSet = $( "<div>" )
				.appendTo( this.uiDialogButtonPane );
			this._addClass( this.uiButtonSet, "ui-dialog-buttonset" );
	
			this._createButtons();
		},
	
		_createButtons: function() {
			var that = this,
				buttons = this.options.buttons;
	
			// If we already have a button pane, remove it
			this.uiDialogButtonPane.remove();
			this.uiButtonSet.empty();
	
			if ( $.isEmptyObject( buttons ) || ( $.isArray( buttons ) && !buttons.length ) ) {
				this._removeClass( this.uiDialog, "ui-dialog-buttons" );
				return;
			}
	
			$.each( buttons, function( name, props ) {
				var click, buttonOptions;
				props = $.isFunction( props ) ?
					{ click: props, text: name } :
					props;
	
				// Default to a non-submitting button
				props = $.extend( { type: "button" }, props );
	
				// Change the context for the click callback to be the main element
				click = props.click;
				buttonOptions = {
					icon: props.icon,
					iconPosition: props.iconPosition,
					showLabel: props.showLabel,
	
					// Deprecated options
					icons: props.icons,
					text: props.text
				};
	
				delete props.click;
				delete props.icon;
				delete props.iconPosition;
				delete props.showLabel;
	
				// Deprecated options
				delete props.icons;
				if ( typeof props.text === "boolean" ) {
					delete props.text;
				}
	
				$( "<button></button>", props )
					.button( buttonOptions )
					.appendTo( that.uiButtonSet )
					.on( "click", function() {
						click.apply( that.element[ 0 ], arguments );
					} );
			} );
			this._addClass( this.uiDialog, "ui-dialog-buttons" );
			this.uiDialogButtonPane.appendTo( this.uiDialog );
		},
	
		_makeDraggable: function() {
			var that = this,
				options = this.options;
	
			function filteredUi( ui ) {
				return {
					position: ui.position,
					offset: ui.offset
				};
			}
	
			this.uiDialog.draggable( {
				cancel: ".ui-dialog-content, .ui-dialog-titlebar-close",
				handle: ".ui-dialog-titlebar",
				containment: "document",
				start: function( event, ui ) {
					that._addClass( $( this ), "ui-dialog-dragging" );
					that._blockFrames();
					that._trigger( "dragStart", event, filteredUi( ui ) );
				},
				drag: function( event, ui ) {
					that._trigger( "drag", event, filteredUi( ui ) );
				},
				stop: function( event, ui ) {
					var left = ui.offset.left - that.document.scrollLeft(),
						top = ui.offset.top - that.document.scrollTop();
	
					options.position = {
						my: "left top",
						at: "left" + ( left >= 0 ? "+" : "" ) + left + " " +
							"top" + ( top >= 0 ? "+" : "" ) + top,
						of: that.window
					};
					that._removeClass( $( this ), "ui-dialog-dragging" );
					that._unblockFrames();
					that._trigger( "dragStop", event, filteredUi( ui ) );
				}
			} );
		},
	
		_makeResizable: function() {
			var that = this,
				options = this.options,
				handles = options.resizable,
	
				// .ui-resizable has position: relative defined in the stylesheet
				// but dialogs have to use absolute or fixed positioning
				position = this.uiDialog.css( "position" ),
				resizeHandles = typeof handles === "string" ?
					handles :
					"n,e,s,w,se,sw,ne,nw";
	
			function filteredUi( ui ) {
				return {
					originalPosition: ui.originalPosition,
					originalSize: ui.originalSize,
					position: ui.position,
					size: ui.size
				};
			}
	
			this.uiDialog.resizable( {
				cancel: ".ui-dialog-content",
				containment: "document",
				alsoResize: this.element,
				maxWidth: options.maxWidth,
				maxHeight: options.maxHeight,
				minWidth: options.minWidth,
				minHeight: this._minHeight(),
				handles: resizeHandles,
				start: function( event, ui ) {
					that._addClass( $( this ), "ui-dialog-resizing" );
					that._blockFrames();
					that._trigger( "resizeStart", event, filteredUi( ui ) );
				},
				resize: function( event, ui ) {
					that._trigger( "resize", event, filteredUi( ui ) );
				},
				stop: function( event, ui ) {
					var offset = that.uiDialog.offset(),
						left = offset.left - that.document.scrollLeft(),
						top = offset.top - that.document.scrollTop();
	
					options.height = that.uiDialog.height();
					options.width = that.uiDialog.width();
					options.position = {
						my: "left top",
						at: "left" + ( left >= 0 ? "+" : "" ) + left + " " +
							"top" + ( top >= 0 ? "+" : "" ) + top,
						of: that.window
					};
					that._removeClass( $( this ), "ui-dialog-resizing" );
					that._unblockFrames();
					that._trigger( "resizeStop", event, filteredUi( ui ) );
				}
			} )
				.css( "position", position );
		},
	
		_trackFocus: function() {
			this._on( this.widget(), {
				focusin: function( event ) {
					this._makeFocusTarget();
					this._focusedElement = $( event.target );
				}
			} );
		},
	
		_makeFocusTarget: function() {
			this._untrackInstance();
			this._trackingInstances().unshift( this );
		},
	
		_untrackInstance: function() {
			var instances = this._trackingInstances(),
				exists = $.inArray( this, instances );
			if ( exists !== -1 ) {
				instances.splice( exists, 1 );
			}
		},
	
		_trackingInstances: function() {
			var instances = this.document.data( "ui-dialog-instances" );
			if ( !instances ) {
				instances = [];
				this.document.data( "ui-dialog-instances", instances );
			}
			return instances;
		},
	
		_minHeight: function() {
			var options = this.options;
	
			return options.height === "auto" ?
				options.minHeight :
				Math.min( options.minHeight, options.height );
		},
	
		_position: function() {
	
			// Need to show the dialog to get the actual offset in the position plugin
			var isVisible = this.uiDialog.is( ":visible" );
			if ( !isVisible ) {
				this.uiDialog.show();
			}
			this.uiDialog.position( this.options.position );
			if ( !isVisible ) {
				this.uiDialog.hide();
			}
		},
	
		_setOptions: function( options ) {
			var that = this,
				resize = false,
				resizableOptions = {};
	
			$.each( options, function( key, value ) {
				that._setOption( key, value );
	
				if ( key in that.sizeRelatedOptions ) {
					resize = true;
				}
				if ( key in that.resizableRelatedOptions ) {
					resizableOptions[ key ] = value;
				}
			} );
	
			if ( resize ) {
				this._size();
				this._position();
			}
			if ( this.uiDialog.is( ":data(ui-resizable)" ) ) {
				this.uiDialog.resizable( "option", resizableOptions );
			}
		},
	
		_setOption: function( key, value ) {
			var isDraggable, isResizable,
				uiDialog = this.uiDialog;
	
			if ( key === "disabled" ) {
				return;
			}
	
			this._super( key, value );
	
			if ( key === "appendTo" ) {
				this.uiDialog.appendTo( this._appendTo() );
			}
	
			if ( key === "buttons" ) {
				this._createButtons();
			}
	
			if ( key === "closeText" ) {
				this.uiDialogTitlebarClose.button( {
	
					// Ensure that we always pass a string
					label: $( "<a>" ).text( "" + this.options.closeText ).html()
				} );
			}
	
			if ( key === "draggable" ) {
				isDraggable = uiDialog.is( ":data(ui-draggable)" );
				if ( isDraggable && !value ) {
					uiDialog.draggable( "destroy" );
				}
	
				if ( !isDraggable && value ) {
					this._makeDraggable();
				}
			}
	
			if ( key === "position" ) {
				this._position();
			}
	
			if ( key === "resizable" ) {
	
				// currently resizable, becoming non-resizable
				isResizable = uiDialog.is( ":data(ui-resizable)" );
				if ( isResizable && !value ) {
					uiDialog.resizable( "destroy" );
				}
	
				// Currently resizable, changing handles
				if ( isResizable && typeof value === "string" ) {
					uiDialog.resizable( "option", "handles", value );
				}
	
				// Currently non-resizable, becoming resizable
				if ( !isResizable && value !== false ) {
					this._makeResizable();
				}
			}
	
			if ( key === "title" ) {
				this._title( this.uiDialogTitlebar.find( ".ui-dialog-title" ) );
			}
		},
	
		_size: function() {
	
			// If the user has resized the dialog, the .ui-dialog and .ui-dialog-content
			// divs will both have width and height set, so we need to reset them
			var nonContentHeight, minContentHeight, maxContentHeight,
				options = this.options;
	
			// Reset content sizing
			this.element.show().css( {
				width: "auto",
				minHeight: 0,
				maxHeight: "none",
				height: 0
			} );
	
			if ( options.minWidth > options.width ) {
				options.width = options.minWidth;
			}
	
			// Reset wrapper sizing
			// determine the height of all the non-content elements
			nonContentHeight = this.uiDialog.css( {
				height: "auto",
				width: options.width
			} )
				.outerHeight();
			minContentHeight = Math.max( 0, options.minHeight - nonContentHeight );
			maxContentHeight = typeof options.maxHeight === "number" ?
				Math.max( 0, options.maxHeight - nonContentHeight ) :
				"none";
	
			if ( options.height === "auto" ) {
				this.element.css( {
					minHeight: minContentHeight,
					maxHeight: maxContentHeight,
					height: "auto"
				} );
			} else {
				this.element.height( Math.max( 0, options.height - nonContentHeight ) );
			}
	
			if ( this.uiDialog.is( ":data(ui-resizable)" ) ) {
				this.uiDialog.resizable( "option", "minHeight", this._minHeight() );
			}
		},
	
		_blockFrames: function() {
			this.iframeBlocks = this.document.find( "iframe" ).map( function() {
				var iframe = $( this );
	
				return $( "<div>" )
					.css( {
						position: "absolute",
						width: iframe.outerWidth(),
						height: iframe.outerHeight()
					} )
					.appendTo( iframe.parent() )
					.offset( iframe.offset() )[ 0 ];
			} );
		},
	
		_unblockFrames: function() {
			if ( this.iframeBlocks ) {
				this.iframeBlocks.remove();
				delete this.iframeBlocks;
			}
		},
	
		_allowInteraction: function( event ) {
			if ( $( event.target ).closest( ".ui-dialog" ).length ) {
				return true;
			}
	
			// TODO: Remove hack when datepicker implements
			// the .ui-front logic (#8989)
			return !!$( event.target ).closest( ".ui-datepicker" ).length;
		},
	
		_createOverlay: function() {
			if ( !this.options.modal ) {
				return;
			}
	
			// We use a delay in case the overlay is created from an
			// event that we're going to be cancelling (#2804)
			var isOpening = true;
			this._delay( function() {
				isOpening = false;
			} );
	
			if ( !this.document.data( "ui-dialog-overlays" ) ) {
	
				// Prevent use of anchors and inputs
				// Using _on() for an event handler shared across many instances is
				// safe because the dialogs stack and must be closed in reverse order
				this._on( this.document, {
					focusin: function( event ) {
						if ( isOpening ) {
							return;
						}
	
						if ( !this._allowInteraction( event ) ) {
							event.preventDefault();
							this._trackingInstances()[ 0 ]._focusTabbable();
						}
					}
				} );
			}
	
			this.overlay = $( "<div>" )
				.appendTo( this._appendTo() );
	
			this._addClass( this.overlay, null, "ui-widget-overlay ui-front" );
			this._on( this.overlay, {
				mousedown: "_keepFocus"
			} );
			this.document.data( "ui-dialog-overlays",
				( this.document.data( "ui-dialog-overlays" ) || 0 ) + 1 );
		},
	
		_destroyOverlay: function() {
			if ( !this.options.modal ) {
				return;
			}
	
			if ( this.overlay ) {
				var overlays = this.document.data( "ui-dialog-overlays" ) - 1;
	
				if ( !overlays ) {
					this._off( this.document, "focusin" );
					this.document.removeData( "ui-dialog-overlays" );
				} else {
					this.document.data( "ui-dialog-overlays", overlays );
				}
	
				this.overlay.remove();
				this.overlay = null;
			}
		}
	} );
	
	// DEPRECATED
	// TODO: switch return back to widget declaration at top of file when this is removed
	if ( $.uiBackCompat !== false ) {
	
		// Backcompat for dialogClass option
		$.widget( "ui.dialog", $.ui.dialog, {
			options: {
				dialogClass: ""
			},
			_createWrapper: function() {
				this._super();
				this.uiDialog.addClass( this.options.dialogClass );
			},
			_setOption: function( key, value ) {
				if ( key === "dialogClass" ) {
					this.uiDialog
						.removeClass( this.options.dialogClass )
						.addClass( value );
				}
				this._superApply( arguments );
			}
		} );
	}
	
	return $.ui.dialog;
	
	} ) );


/***/ }),
/* 21 */
/***/ (function(module, exports, __webpack_require__) {

	var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!
	 * jQuery UI Button 1.12.1
	 * http://jqueryui.com
	 *
	 * Copyright jQuery Foundation and other contributors
	 * Released under the MIT license.
	 * http://jquery.org/license
	 */
	
	//>>label: Button
	//>>group: Widgets
	//>>description: Enhances a form with themeable buttons.
	//>>docs: http://api.jqueryui.com/button/
	//>>demos: http://jqueryui.com/button/
	//>>css.structure: ../../themes/base/core.css
	//>>css.structure: ../../themes/base/button.css
	//>>css.theme: ../../themes/base/theme.css
	
	( function( factory ) {
		if ( true ) {
	
			// AMD. Register as an anonymous module.
			!(__WEBPACK_AMD_DEFINE_ARRAY__ = [
				__webpack_require__(12),
	
				// These are only for backcompat
				// TODO: Remove after 1.12
				__webpack_require__(22),
				__webpack_require__(25),
	
				__webpack_require__(30),
				__webpack_require__(23)
			], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
		} else {
	
			// Browser globals
			factory( jQuery );
		}
	}( function( $ ) {
	
	$.widget( "ui.button", {
		version: "1.12.1",
		defaultElement: "<button>",
		options: {
			classes: {
				"ui-button": "ui-corner-all"
			},
			disabled: null,
			icon: null,
			iconPosition: "beginning",
			label: null,
			showLabel: true
		},
	
		_getCreateOptions: function() {
			var disabled,
	
				// This is to support cases like in jQuery Mobile where the base widget does have
				// an implementation of _getCreateOptions
				options = this._super() || {};
	
			this.isInput = this.element.is( "input" );
	
			disabled = this.element[ 0 ].disabled;
			if ( disabled != null ) {
				options.disabled = disabled;
			}
	
			this.originalLabel = this.isInput ? this.element.val() : this.element.html();
			if ( this.originalLabel ) {
				options.label = this.originalLabel;
			}
	
			return options;
		},
	
		_create: function() {
			if ( !this.option.showLabel & !this.options.icon ) {
				this.options.showLabel = true;
			}
	
			// We have to check the option again here even though we did in _getCreateOptions,
			// because null may have been passed on init which would override what was set in
			// _getCreateOptions
			if ( this.options.disabled == null ) {
				this.options.disabled = this.element[ 0 ].disabled || false;
			}
	
			this.hasTitle = !!this.element.attr( "title" );
	
			// Check to see if the label needs to be set or if its already correct
			if ( this.options.label && this.options.label !== this.originalLabel ) {
				if ( this.isInput ) {
					this.element.val( this.options.label );
				} else {
					this.element.html( this.options.label );
				}
			}
			this._addClass( "ui-button", "ui-widget" );
			this._setOption( "disabled", this.options.disabled );
			this._enhance();
	
			if ( this.element.is( "a" ) ) {
				this._on( {
					"keyup": function( event ) {
						if ( event.keyCode === $.ui.keyCode.SPACE ) {
							event.preventDefault();
	
							// Support: PhantomJS <= 1.9, IE 8 Only
							// If a native click is available use it so we actually cause navigation
							// otherwise just trigger a click event
							if ( this.element[ 0 ].click ) {
								this.element[ 0 ].click();
							} else {
								this.element.trigger( "click" );
							}
						}
					}
				} );
			}
		},
	
		_enhance: function() {
			if ( !this.element.is( "button" ) ) {
				this.element.attr( "role", "button" );
			}
	
			if ( this.options.icon ) {
				this._updateIcon( "icon", this.options.icon );
				this._updateTooltip();
			}
		},
	
		_updateTooltip: function() {
			this.title = this.element.attr( "title" );
	
			if ( !this.options.showLabel && !this.title ) {
				this.element.attr( "title", this.options.label );
			}
		},
	
		_updateIcon: function( option, value ) {
			var icon = option !== "iconPosition",
				position = icon ? this.options.iconPosition : value,
				displayBlock = position === "top" || position === "bottom";
	
			// Create icon
			if ( !this.icon ) {
				this.icon = $( "<span>" );
	
				this._addClass( this.icon, "ui-button-icon", "ui-icon" );
	
				if ( !this.options.showLabel ) {
					this._addClass( "ui-button-icon-only" );
				}
			} else if ( icon ) {
	
				// If we are updating the icon remove the old icon class
				this._removeClass( this.icon, null, this.options.icon );
			}
	
			// If we are updating the icon add the new icon class
			if ( icon ) {
				this._addClass( this.icon, null, value );
			}
	
			this._attachIcon( position );
	
			// If the icon is on top or bottom we need to add the ui-widget-icon-block class and remove
			// the iconSpace if there is one.
			if ( displayBlock ) {
				this._addClass( this.icon, null, "ui-widget-icon-block" );
				if ( this.iconSpace ) {
					this.iconSpace.remove();
				}
			} else {
	
				// Position is beginning or end so remove the ui-widget-icon-block class and add the
				// space if it does not exist
				if ( !this.iconSpace ) {
					this.iconSpace = $( "<span> </span>" );
					this._addClass( this.iconSpace, "ui-button-icon-space" );
				}
				this._removeClass( this.icon, null, "ui-wiget-icon-block" );
				this._attachIconSpace( position );
			}
		},
	
		_destroy: function() {
			this.element.removeAttr( "role" );
	
			if ( this.icon ) {
				this.icon.remove();
			}
			if ( this.iconSpace ) {
				this.iconSpace.remove();
			}
			if ( !this.hasTitle ) {
				this.element.removeAttr( "title" );
			}
		},
	
		_attachIconSpace: function( iconPosition ) {
			this.icon[ /^(?:end|bottom)/.test( iconPosition ) ? "before" : "after" ]( this.iconSpace );
		},
	
		_attachIcon: function( iconPosition ) {
			this.element[ /^(?:end|bottom)/.test( iconPosition ) ? "append" : "prepend" ]( this.icon );
		},
	
		_setOptions: function( options ) {
			var newShowLabel = options.showLabel === undefined ?
					this.options.showLabel :
					options.showLabel,
				newIcon = options.icon === undefined ? this.options.icon : options.icon;
	
			if ( !newShowLabel && !newIcon ) {
				options.showLabel = true;
			}
			this._super( options );
		},
	
		_setOption: function( key, value ) {
			if ( key === "icon" ) {
				if ( value ) {
					this._updateIcon( key, value );
				} else if ( this.icon ) {
					this.icon.remove();
					if ( this.iconSpace ) {
						this.iconSpace.remove();
					}
				}
			}
	
			if ( key === "iconPosition" ) {
				this._updateIcon( key, value );
			}
	
			// Make sure we can't end up with a button that has neither text nor icon
			if ( key === "showLabel" ) {
					this._toggleClass( "ui-button-icon-only", null, !value );
					this._updateTooltip();
			}
	
			if ( key === "label" ) {
				if ( this.isInput ) {
					this.element.val( value );
				} else {
	
					// If there is an icon, append it, else nothing then append the value
					// this avoids removal of the icon when setting label text
					this.element.html( value );
					if ( this.icon ) {
						this._attachIcon( this.options.iconPosition );
						this._attachIconSpace( this.options.iconPosition );
					}
				}
			}
	
			this._super( key, value );
	
			if ( key === "disabled" ) {
				this._toggleClass( null, "ui-state-disabled", value );
				this.element[ 0 ].disabled = value;
				if ( value ) {
					this.element.blur();
				}
			}
		},
	
		refresh: function() {
	
			// Make sure to only check disabled if its an element that supports this otherwise
			// check for the disabled class to determine state
			var isDisabled = this.element.is( "input, button" ) ?
				this.element[ 0 ].disabled : this.element.hasClass( "ui-button-disabled" );
	
			if ( isDisabled !== this.options.disabled ) {
				this._setOptions( { disabled: isDisabled } );
			}
	
			this._updateTooltip();
		}
	} );
	
	// DEPRECATED
	if ( $.uiBackCompat !== false ) {
	
		// Text and Icons options
		$.widget( "ui.button", $.ui.button, {
			options: {
				text: true,
				icons: {
					primary: null,
					secondary: null
				}
			},
	
			_create: function() {
				if ( this.options.showLabel && !this.options.text ) {
					this.options.showLabel = this.options.text;
				}
				if ( !this.options.showLabel && this.options.text ) {
					this.options.text = this.options.showLabel;
				}
				if ( !this.options.icon && ( this.options.icons.primary ||
						this.options.icons.secondary ) ) {
					if ( this.options.icons.primary ) {
						this.options.icon = this.options.icons.primary;
					} else {
						this.options.icon = this.options.icons.secondary;
						this.options.iconPosition = "end";
					}
				} else if ( this.options.icon ) {
					this.options.icons.primary = this.options.icon;
				}
				this._super();
			},
	
			_setOption: function( key, value ) {
				if ( key === "text" ) {
					this._super( "showLabel", value );
					return;
				}
				if ( key === "showLabel" ) {
					this.options.text = value;
				}
				if ( key === "icon" ) {
					this.options.icons.primary = value;
				}
				if ( key === "icons" ) {
					if ( value.primary ) {
						this._super( "icon", value.primary );
						this._super( "iconPosition", "beginning" );
					} else if ( value.secondary ) {
						this._super( "icon", value.secondary );
						this._super( "iconPosition", "end" );
					}
				}
				this._superApply( arguments );
			}
		} );
	
		$.fn.button = ( function( orig ) {
			return function() {
				if ( !this.length || ( this.length && this[ 0 ].tagName !== "INPUT" ) ||
						( this.length && this[ 0 ].tagName === "INPUT" && (
							this.attr( "type" ) !== "checkbox" && this.attr( "type" ) !== "radio"
						) ) ) {
					return orig.apply( this, arguments );
				}
				if ( !$.ui.checkboxradio ) {
					$.error( "Checkboxradio widget missing" );
				}
				if ( arguments.length === 0 ) {
					return this.checkboxradio( {
						"icon": false
					} );
				}
				return this.checkboxradio.apply( this, arguments );
			};
		} )( $.fn.button );
	
		$.fn.buttonset = function() {
			if ( !$.ui.controlgroup ) {
				$.error( "Controlgroup widget missing" );
			}
			if ( arguments[ 0 ] === "option" && arguments[ 1 ] === "items" && arguments[ 2 ] ) {
				return this.controlgroup.apply( this,
					[ arguments[ 0 ], "items.button", arguments[ 2 ] ] );
			}
			if ( arguments[ 0 ] === "option" && arguments[ 1 ] === "items" ) {
				return this.controlgroup.apply( this, [ arguments[ 0 ], "items.button" ] );
			}
			if ( typeof arguments[ 0 ] === "object" && arguments[ 0 ].items ) {
				arguments[ 0 ].items = {
					button: arguments[ 0 ].items
				};
			}
			return this.controlgroup.apply( this, arguments );
		};
	}
	
	return $.ui.button;
	
	} ) );


/***/ }),
/* 22 */
/***/ (function(module, exports, __webpack_require__) {

	var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!
	 * jQuery UI Controlgroup 1.12.1
	 * http://jqueryui.com
	 *
	 * Copyright jQuery Foundation and other contributors
	 * Released under the MIT license.
	 * http://jquery.org/license
	 */
	
	//>>label: Controlgroup
	//>>group: Widgets
	//>>description: Visually groups form control widgets
	//>>docs: http://api.jqueryui.com/controlgroup/
	//>>demos: http://jqueryui.com/controlgroup/
	//>>css.structure: ../../themes/base/core.css
	//>>css.structure: ../../themes/base/controlgroup.css
	//>>css.theme: ../../themes/base/theme.css
	
	( function( factory ) {
		if ( true ) {
	
			// AMD. Register as an anonymous module.
			!(__WEBPACK_AMD_DEFINE_ARRAY__ = [
				__webpack_require__(12),
				__webpack_require__(23)
			], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
		} else {
	
			// Browser globals
			factory( jQuery );
		}
	}( function( $ ) {
	var controlgroupCornerRegex = /ui-corner-([a-z]){2,6}/g;
	
	return $.widget( "ui.controlgroup", {
		version: "1.12.1",
		defaultElement: "<div>",
		options: {
			direction: "horizontal",
			disabled: null,
			onlyVisible: true,
			items: {
				"button": "input[type=button], input[type=submit], input[type=reset], button, a",
				"controlgroupLabel": ".ui-controlgroup-label",
				"checkboxradio": "input[type='checkbox'], input[type='radio']",
				"selectmenu": "select",
				"spinner": ".ui-spinner-input"
			}
		},
	
		_create: function() {
			this._enhance();
		},
	
		// To support the enhanced option in jQuery Mobile, we isolate DOM manipulation
		_enhance: function() {
			this.element.attr( "role", "toolbar" );
			this.refresh();
		},
	
		_destroy: function() {
			this._callChildMethod( "destroy" );
			this.childWidgets.removeData( "ui-controlgroup-data" );
			this.element.removeAttr( "role" );
			if ( this.options.items.controlgroupLabel ) {
				this.element
					.find( this.options.items.controlgroupLabel )
					.find( ".ui-controlgroup-label-contents" )
					.contents().unwrap();
			}
		},
	
		_initWidgets: function() {
			var that = this,
				childWidgets = [];
	
			// First we iterate over each of the items options
			$.each( this.options.items, function( widget, selector ) {
				var labels;
				var options = {};
	
				// Make sure the widget has a selector set
				if ( !selector ) {
					return;
				}
	
				if ( widget === "controlgroupLabel" ) {
					labels = that.element.find( selector );
					labels.each( function() {
						var element = $( this );
	
						if ( element.children( ".ui-controlgroup-label-contents" ).length ) {
							return;
						}
						element.contents()
							.wrapAll( "<span class='ui-controlgroup-label-contents'></span>" );
					} );
					that._addClass( labels, null, "ui-widget ui-widget-content ui-state-default" );
					childWidgets = childWidgets.concat( labels.get() );
					return;
				}
	
				// Make sure the widget actually exists
				if ( !$.fn[ widget ] ) {
					return;
				}
	
				// We assume everything is in the middle to start because we can't determine
				// first / last elements until all enhancments are done.
				if ( that[ "_" + widget + "Options" ] ) {
					options = that[ "_" + widget + "Options" ]( "middle" );
				} else {
					options = { classes: {} };
				}
	
				// Find instances of this widget inside controlgroup and init them
				that.element
					.find( selector )
					.each( function() {
						var element = $( this );
						var instance = element[ widget ]( "instance" );
	
						// We need to clone the default options for this type of widget to avoid
						// polluting the variable options which has a wider scope than a single widget.
						var instanceOptions = $.widget.extend( {}, options );
	
						// If the button is the child of a spinner ignore it
						// TODO: Find a more generic solution
						if ( widget === "button" && element.parent( ".ui-spinner" ).length ) {
							return;
						}
	
						// Create the widget if it doesn't exist
						if ( !instance ) {
							instance = element[ widget ]()[ widget ]( "instance" );
						}
						if ( instance ) {
							instanceOptions.classes =
								that._resolveClassesValues( instanceOptions.classes, instance );
						}
						element[ widget ]( instanceOptions );
	
						// Store an instance of the controlgroup to be able to reference
						// from the outermost element for changing options and refresh
						var widgetElement = element[ widget ]( "widget" );
						$.data( widgetElement[ 0 ], "ui-controlgroup-data",
							instance ? instance : element[ widget ]( "instance" ) );
	
						childWidgets.push( widgetElement[ 0 ] );
					} );
			} );
	
			this.childWidgets = $( $.unique( childWidgets ) );
			this._addClass( this.childWidgets, "ui-controlgroup-item" );
		},
	
		_callChildMethod: function( method ) {
			this.childWidgets.each( function() {
				var element = $( this ),
					data = element.data( "ui-controlgroup-data" );
				if ( data && data[ method ] ) {
					data[ method ]();
				}
			} );
		},
	
		_updateCornerClass: function( element, position ) {
			var remove = "ui-corner-top ui-corner-bottom ui-corner-left ui-corner-right ui-corner-all";
			var add = this._buildSimpleOptions( position, "label" ).classes.label;
	
			this._removeClass( element, null, remove );
			this._addClass( element, null, add );
		},
	
		_buildSimpleOptions: function( position, key ) {
			var direction = this.options.direction === "vertical";
			var result = {
				classes: {}
			};
			result.classes[ key ] = {
				"middle": "",
				"first": "ui-corner-" + ( direction ? "top" : "left" ),
				"last": "ui-corner-" + ( direction ? "bottom" : "right" ),
				"only": "ui-corner-all"
			}[ position ];
	
			return result;
		},
	
		_spinnerOptions: function( position ) {
			var options = this._buildSimpleOptions( position, "ui-spinner" );
	
			options.classes[ "ui-spinner-up" ] = "";
			options.classes[ "ui-spinner-down" ] = "";
	
			return options;
		},
	
		_buttonOptions: function( position ) {
			return this._buildSimpleOptions( position, "ui-button" );
		},
	
		_checkboxradioOptions: function( position ) {
			return this._buildSimpleOptions( position, "ui-checkboxradio-label" );
		},
	
		_selectmenuOptions: function( position ) {
			var direction = this.options.direction === "vertical";
			return {
				width: direction ? "auto" : false,
				classes: {
					middle: {
						"ui-selectmenu-button-open": "",
						"ui-selectmenu-button-closed": ""
					},
					first: {
						"ui-selectmenu-button-open": "ui-corner-" + ( direction ? "top" : "tl" ),
						"ui-selectmenu-button-closed": "ui-corner-" + ( direction ? "top" : "left" )
					},
					last: {
						"ui-selectmenu-button-open": direction ? "" : "ui-corner-tr",
						"ui-selectmenu-button-closed": "ui-corner-" + ( direction ? "bottom" : "right" )
					},
					only: {
						"ui-selectmenu-button-open": "ui-corner-top",
						"ui-selectmenu-button-closed": "ui-corner-all"
					}
	
				}[ position ]
			};
		},
	
		_resolveClassesValues: function( classes, instance ) {
			var result = {};
			$.each( classes, function( key ) {
				var current = instance.options.classes[ key ] || "";
				current = $.trim( current.replace( controlgroupCornerRegex, "" ) );
				result[ key ] = ( current + " " + classes[ key ] ).replace( /\s+/g, " " );
			} );
			return result;
		},
	
		_setOption: function( key, value ) {
			if ( key === "direction" ) {
				this._removeClass( "ui-controlgroup-" + this.options.direction );
			}
	
			this._super( key, value );
			if ( key === "disabled" ) {
				this._callChildMethod( value ? "disable" : "enable" );
				return;
			}
	
			this.refresh();
		},
	
		refresh: function() {
			var children,
				that = this;
	
			this._addClass( "ui-controlgroup ui-controlgroup-" + this.options.direction );
	
			if ( this.options.direction === "horizontal" ) {
				this._addClass( null, "ui-helper-clearfix" );
			}
			this._initWidgets();
	
			children = this.childWidgets;
	
			// We filter here because we need to track all childWidgets not just the visible ones
			if ( this.options.onlyVisible ) {
				children = children.filter( ":visible" );
			}
	
			if ( children.length ) {
	
				// We do this last because we need to make sure all enhancment is done
				// before determining first and last
				$.each( [ "first", "last" ], function( index, value ) {
					var instance = children[ value ]().data( "ui-controlgroup-data" );
	
					if ( instance && that[ "_" + instance.widgetName + "Options" ] ) {
						var options = that[ "_" + instance.widgetName + "Options" ](
							children.length === 1 ? "only" : value
						);
						options.classes = that._resolveClassesValues( options.classes, instance );
						instance.element[ instance.widgetName ]( options );
					} else {
						that._updateCornerClass( children[ value ](), value );
					}
				} );
	
				// Finally call the refresh method on each of the child widgets.
				this._callChildMethod( "refresh" );
			}
		}
	} );
	} ) );


/***/ }),
/* 23 */
/***/ (function(module, exports, __webpack_require__) {

	var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!
	 * jQuery UI Widget 1.12.1
	 * http://jqueryui.com
	 *
	 * Copyright jQuery Foundation and other contributors
	 * Released under the MIT license.
	 * http://jquery.org/license
	 */
	
	//>>label: Widget
	//>>group: Core
	//>>description: Provides a factory for creating stateful widgets with a common API.
	//>>docs: http://api.jqueryui.com/jQuery.widget/
	//>>demos: http://jqueryui.com/widget/
	
	( function( factory ) {
		if ( true ) {
	
			// AMD. Register as an anonymous module.
			!(__WEBPACK_AMD_DEFINE_ARRAY__ = [ __webpack_require__(12), __webpack_require__(24) ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
		} else {
	
			// Browser globals
			factory( jQuery );
		}
	}( function( $ ) {
	
	var widgetUuid = 0;
	var widgetSlice = Array.prototype.slice;
	
	$.cleanData = ( function( orig ) {
		return function( elems ) {
			var events, elem, i;
			for ( i = 0; ( elem = elems[ i ] ) != null; i++ ) {
				try {
	
					// Only trigger remove when necessary to save time
					events = $._data( elem, "events" );
					if ( events && events.remove ) {
						$( elem ).triggerHandler( "remove" );
					}
	
				// Http://bugs.jquery.com/ticket/8235
				} catch ( e ) {}
			}
			orig( elems );
		};
	} )( $.cleanData );
	
	$.widget = function( name, base, prototype ) {
		var existingConstructor, constructor, basePrototype;
	
		// ProxiedPrototype allows the provided prototype to remain unmodified
		// so that it can be used as a mixin for multiple widgets (#8876)
		var proxiedPrototype = {};
	
		var namespace = name.split( "." )[ 0 ];
		name = name.split( "." )[ 1 ];
		var fullName = namespace + "-" + name;
	
		if ( !prototype ) {
			prototype = base;
			base = $.Widget;
		}
	
		if ( $.isArray( prototype ) ) {
			prototype = $.extend.apply( null, [ {} ].concat( prototype ) );
		}
	
		// Create selector for plugin
		$.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) {
			return !!$.data( elem, fullName );
		};
	
		$[ namespace ] = $[ namespace ] || {};
		existingConstructor = $[ namespace ][ name ];
		constructor = $[ namespace ][ name ] = function( options, element ) {
	
			// Allow instantiation without "new" keyword
			if ( !this._createWidget ) {
				return new constructor( options, element );
			}
	
			// Allow instantiation without initializing for simple inheritance
			// must use "new" keyword (the code above always passes args)
			if ( arguments.length ) {
				this._createWidget( options, element );
			}
		};
	
		// Extend with the existing constructor to carry over any static properties
		$.extend( constructor, existingConstructor, {
			version: prototype.version,
	
			// Copy the object used to create the prototype in case we need to
			// redefine the widget later
			_proto: $.extend( {}, prototype ),
	
			// Track widgets that inherit from this widget in case this widget is
			// redefined after a widget inherits from it
			_childConstructors: []
		} );
	
		basePrototype = new base();
	
		// We need to make the options hash a property directly on the new instance
		// otherwise we'll modify the options hash on the prototype that we're
		// inheriting from
		basePrototype.options = $.widget.extend( {}, basePrototype.options );
		$.each( prototype, function( prop, value ) {
			if ( !$.isFunction( value ) ) {
				proxiedPrototype[ prop ] = value;
				return;
			}
			proxiedPrototype[ prop ] = ( function() {
				function _super() {
					return base.prototype[ prop ].apply( this, arguments );
				}
	
				function _superApply( args ) {
					return base.prototype[ prop ].apply( this, args );
				}
	
				return function() {
					var __super = this._super;
					var __superApply = this._superApply;
					var returnValue;
	
					this._super = _super;
					this._superApply = _superApply;
	
					returnValue = value.apply( this, arguments );
	
					this._super = __super;
					this._superApply = __superApply;
	
					return returnValue;
				};
			} )();
		} );
		constructor.prototype = $.widget.extend( basePrototype, {
	
			// TODO: remove support for widgetEventPrefix
			// always use the name + a colon as the prefix, e.g., draggable:start
			// don't prefix for widgets that aren't DOM-based
			widgetEventPrefix: existingConstructor ? ( basePrototype.widgetEventPrefix || name ) : name
		}, proxiedPrototype, {
			constructor: constructor,
			namespace: namespace,
			widgetName: name,
			widgetFullName: fullName
		} );
	
		// If this widget is being redefined then we need to find all widgets that
		// are inheriting from it and redefine all of them so that they inherit from
		// the new version of this widget. We're essentially trying to replace one
		// level in the prototype chain.
		if ( existingConstructor ) {
			$.each( existingConstructor._childConstructors, function( i, child ) {
				var childPrototype = child.prototype;
	
				// Redefine the child widget using the same prototype that was
				// originally used, but inherit from the new version of the base
				$.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor,
					child._proto );
			} );
	
			// Remove the list of existing child constructors from the old constructor
			// so the old child constructors can be garbage collected
			delete existingConstructor._childConstructors;
		} else {
			base._childConstructors.push( constructor );
		}
	
		$.widget.bridge( name, constructor );
	
		return constructor;
	};
	
	$.widget.extend = function( target ) {
		var input = widgetSlice.call( arguments, 1 );
		var inputIndex = 0;
		var inputLength = input.length;
		var key;
		var value;
	
		for ( ; inputIndex < inputLength; inputIndex++ ) {
			for ( key in input[ inputIndex ] ) {
				value = input[ inputIndex ][ key ];
				if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {
	
					// Clone objects
					if ( $.isPlainObject( value ) ) {
						target[ key ] = $.isPlainObject( target[ key ] ) ?
							$.widget.extend( {}, target[ key ], value ) :
	
							// Don't extend strings, arrays, etc. with objects
							$.widget.extend( {}, value );
	
					// Copy everything else by reference
					} else {
						target[ key ] = value;
					}
				}
			}
		}
		return target;
	};
	
	$.widget.bridge = function( name, object ) {
		var fullName = object.prototype.widgetFullName || name;
		$.fn[ name ] = function( options ) {
			var isMethodCall = typeof options === "string";
			var args = widgetSlice.call( arguments, 1 );
			var returnValue = this;
	
			if ( isMethodCall ) {
	
				// If this is an empty collection, we need to have the instance method
				// return undefined instead of the jQuery instance
				if ( !this.length && options === "instance" ) {
					returnValue = undefined;
				} else {
					this.each( function() {
						var methodValue;
						var instance = $.data( this, fullName );
	
						if ( options === "instance" ) {
							returnValue = instance;
							return false;
						}
	
						if ( !instance ) {
							return $.error( "cannot call methods on " + name +
								" prior to initialization; " +
								"attempted to call method '" + options + "'" );
						}
	
						if ( !$.isFunction( instance[ options ] ) || options.charAt( 0 ) === "_" ) {
							return $.error( "no such method '" + options + "' for " + name +
								" widget instance" );
						}
	
						methodValue = instance[ options ].apply( instance, args );
	
						if ( methodValue !== instance && methodValue !== undefined ) {
							returnValue = methodValue && methodValue.jquery ?
								returnValue.pushStack( methodValue.get() ) :
								methodValue;
							return false;
						}
					} );
				}
			} else {
	
				// Allow multiple hashes to be passed on init
				if ( args.length ) {
					options = $.widget.extend.apply( null, [ options ].concat( args ) );
				}
	
				this.each( function() {
					var instance = $.data( this, fullName );
					if ( instance ) {
						instance.option( options || {} );
						if ( instance._init ) {
							instance._init();
						}
					} else {
						$.data( this, fullName, new object( options, this ) );
					}
				} );
			}
	
			return returnValue;
		};
	};
	
	$.Widget = function( /* options, element */ ) {};
	$.Widget._childConstructors = [];
	
	$.Widget.prototype = {
		widgetName: "widget",
		widgetEventPrefix: "",
		defaultElement: "<div>",
	
		options: {
			classes: {},
			disabled: false,
	
			// Callbacks
			create: null
		},
	
		_createWidget: function( options, element ) {
			element = $( element || this.defaultElement || this )[ 0 ];
			this.element = $( element );
			this.uuid = widgetUuid++;
			this.eventNamespace = "." + this.widgetName + this.uuid;
	
			this.bindings = $();
			this.hoverable = $();
			this.focusable = $();
			this.classesElementLookup = {};
	
			if ( element !== this ) {
				$.data( element, this.widgetFullName, this );
				this._on( true, this.element, {
					remove: function( event ) {
						if ( event.target === element ) {
							this.destroy();
						}
					}
				} );
				this.document = $( element.style ?
	
					// Element within the document
					element.ownerDocument :
	
					// Element is window or document
					element.document || element );
				this.window = $( this.document[ 0 ].defaultView || this.document[ 0 ].parentWindow );
			}
	
			this.options = $.widget.extend( {},
				this.options,
				this._getCreateOptions(),
				options );
	
			this._create();
	
			if ( this.options.disabled ) {
				this._setOptionDisabled( this.options.disabled );
			}
	
			this._trigger( "create", null, this._getCreateEventData() );
			this._init();
		},
	
		_getCreateOptions: function() {
			return {};
		},
	
		_getCreateEventData: $.noop,
	
		_create: $.noop,
	
		_init: $.noop,
	
		destroy: function() {
			var that = this;
	
			this._destroy();
			$.each( this.classesElementLookup, function( key, value ) {
				that._removeClass( value, key );
			} );
	
			// We can probably remove the unbind calls in 2.0
			// all event bindings should go through this._on()
			this.element
				.off( this.eventNamespace )
				.removeData( this.widgetFullName );
			this.widget()
				.off( this.eventNamespace )
				.removeAttr( "aria-disabled" );
	
			// Clean up events and states
			this.bindings.off( this.eventNamespace );
		},
	
		_destroy: $.noop,
	
		widget: function() {
			return this.element;
		},
	
		option: function( key, value ) {
			var options = key;
			var parts;
			var curOption;
			var i;
	
			if ( arguments.length === 0 ) {
	
				// Don't return a reference to the internal hash
				return $.widget.extend( {}, this.options );
			}
	
			if ( typeof key === "string" ) {
	
				// Handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } }
				options = {};
				parts = key.split( "." );
				key = parts.shift();
				if ( parts.length ) {
					curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );
					for ( i = 0; i < parts.length - 1; i++ ) {
						curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};
						curOption = curOption[ parts[ i ] ];
					}
					key = parts.pop();
					if ( arguments.length === 1 ) {
						return curOption[ key ] === undefined ? null : curOption[ key ];
					}
					curOption[ key ] = value;
				} else {
					if ( arguments.length === 1 ) {
						return this.options[ key ] === undefined ? null : this.options[ key ];
					}
					options[ key ] = value;
				}
			}
	
			this._setOptions( options );
	
			return this;
		},
	
		_setOptions: function( options ) {
			var key;
	
			for ( key in options ) {
				this._setOption( key, options[ key ] );
			}
	
			return this;
		},
	
		_setOption: function( key, value ) {
			if ( key === "classes" ) {
				this._setOptionClasses( value );
			}
	
			this.options[ key ] = value;
	
			if ( key === "disabled" ) {
				this._setOptionDisabled( value );
			}
	
			return this;
		},
	
		_setOptionClasses: function( value ) {
			var classKey, elements, currentElements;
	
			for ( classKey in value ) {
				currentElements = this.classesElementLookup[ classKey ];
				if ( value[ classKey ] === this.options.classes[ classKey ] ||
						!currentElements ||
						!currentElements.length ) {
					continue;
				}
	
				// We are doing this to create a new jQuery object because the _removeClass() call
				// on the next line is going to destroy the reference to the current elements being
				// tracked. We need to save a copy of this collection so that we can add the new classes
				// below.
				elements = $( currentElements.get() );
				this._removeClass( currentElements, classKey );
	
				// We don't use _addClass() here, because that uses this.options.classes
				// for generating the string of classes. We want to use the value passed in from
				// _setOption(), this is the new value of the classes option which was passed to
				// _setOption(). We pass this value directly to _classes().
				elements.addClass( this._classes( {
					element: elements,
					keys: classKey,
					classes: value,
					add: true
				} ) );
			}
		},
	
		_setOptionDisabled: function( value ) {
			this._toggleClass( this.widget(), this.widgetFullName + "-disabled", null, !!value );
	
			// If the widget is becoming disabled, then nothing is interactive
			if ( value ) {
				this._removeClass( this.hoverable, null, "ui-state-hover" );
				this._removeClass( this.focusable, null, "ui-state-focus" );
			}
		},
	
		enable: function() {
			return this._setOptions( { disabled: false } );
		},
	
		disable: function() {
			return this._setOptions( { disabled: true } );
		},
	
		_classes: function( options ) {
			var full = [];
			var that = this;
	
			options = $.extend( {
				element: this.element,
				classes: this.options.classes || {}
			}, options );
	
			function processClassString( classes, checkOption ) {
				var current, i;
				for ( i = 0; i < classes.length; i++ ) {
					current = that.classesElementLookup[ classes[ i ] ] || $();
					if ( options.add ) {
						current = $( $.unique( current.get().concat( options.element.get() ) ) );
					} else {
						current = $( current.not( options.element ).get() );
					}
					that.classesElementLookup[ classes[ i ] ] = current;
					full.push( classes[ i ] );
					if ( checkOption && options.classes[ classes[ i ] ] ) {
						full.push( options.classes[ classes[ i ] ] );
					}
				}
			}
	
			this._on( options.element, {
				"remove": "_untrackClassesElement"
			} );
	
			if ( options.keys ) {
				processClassString( options.keys.match( /\S+/g ) || [], true );
			}
			if ( options.extra ) {
				processClassString( options.extra.match( /\S+/g ) || [] );
			}
	
			return full.join( " " );
		},
	
		_untrackClassesElement: function( event ) {
			var that = this;
			$.each( that.classesElementLookup, function( key, value ) {
				if ( $.inArray( event.target, value ) !== -1 ) {
					that.classesElementLookup[ key ] = $( value.not( event.target ).get() );
				}
			} );
		},
	
		_removeClass: function( element, keys, extra ) {
			return this._toggleClass( element, keys, extra, false );
		},
	
		_addClass: function( element, keys, extra ) {
			return this._toggleClass( element, keys, extra, true );
		},
	
		_toggleClass: function( element, keys, extra, add ) {
			add = ( typeof add === "boolean" ) ? add : extra;
			var shift = ( typeof element === "string" || element === null ),
				options = {
					extra: shift ? keys : extra,
					keys: shift ? element : keys,
					element: shift ? this.element : element,
					add: add
				};
			options.element.toggleClass( this._classes( options ), add );
			return this;
		},
	
		_on: function( suppressDisabledCheck, element, handlers ) {
			var delegateElement;
			var instance = this;
	
			// No suppressDisabledCheck flag, shuffle arguments
			if ( typeof suppressDisabledCheck !== "boolean" ) {
				handlers = element;
				element = suppressDisabledCheck;
				suppressDisabledCheck = false;
			}
	
			// No element argument, shuffle and use this.element
			if ( !handlers ) {
				handlers = element;
				element = this.element;
				delegateElement = this.widget();
			} else {
				element = delegateElement = $( element );
				this.bindings = this.bindings.add( element );
			}
	
			$.each( handlers, function( event, handler ) {
				function handlerProxy() {
	
					// Allow widgets to customize the disabled handling
					// - disabled as an array instead of boolean
					// - disabled class as method for disabling individual parts
					if ( !suppressDisabledCheck &&
							( instance.options.disabled === true ||
							$( this ).hasClass( "ui-state-disabled" ) ) ) {
						return;
					}
					return ( typeof handler === "string" ? instance[ handler ] : handler )
						.apply( instance, arguments );
				}
	
				// Copy the guid so direct unbinding works
				if ( typeof handler !== "string" ) {
					handlerProxy.guid = handler.guid =
						handler.guid || handlerProxy.guid || $.guid++;
				}
	
				var match = event.match( /^([\w:-]*)\s*(.*)$/ );
				var eventName = match[ 1 ] + instance.eventNamespace;
				var selector = match[ 2 ];
	
				if ( selector ) {
					delegateElement.on( eventName, selector, handlerProxy );
				} else {
					element.on( eventName, handlerProxy );
				}
			} );
		},
	
		_off: function( element, eventName ) {
			eventName = ( eventName || "" ).split( " " ).join( this.eventNamespace + " " ) +
				this.eventNamespace;
			element.off( eventName ).off( eventName );
	
			// Clear the stack to avoid memory leaks (#10056)
			this.bindings = $( this.bindings.not( element ).get() );
			this.focusable = $( this.focusable.not( element ).get() );
			this.hoverable = $( this.hoverable.not( element ).get() );
		},
	
		_delay: function( handler, delay ) {
			function handlerProxy() {
				return ( typeof handler === "string" ? instance[ handler ] : handler )
					.apply( instance, arguments );
			}
			var instance = this;
			return setTimeout( handlerProxy, delay || 0 );
		},
	
		_hoverable: function( element ) {
			this.hoverable = this.hoverable.add( element );
			this._on( element, {
				mouseenter: function( event ) {
					this._addClass( $( event.currentTarget ), null, "ui-state-hover" );
				},
				mouseleave: function( event ) {
					this._removeClass( $( event.currentTarget ), null, "ui-state-hover" );
				}
			} );
		},
	
		_focusable: function( element ) {
			this.focusable = this.focusable.add( element );
			this._on( element, {
				focusin: function( event ) {
					this._addClass( $( event.currentTarget ), null, "ui-state-focus" );
				},
				focusout: function( event ) {
					this._removeClass( $( event.currentTarget ), null, "ui-state-focus" );
				}
			} );
		},
	
		_trigger: function( type, event, data ) {
			var prop, orig;
			var callback = this.options[ type ];
	
			data = data || {};
			event = $.Event( event );
			event.type = ( type === this.widgetEventPrefix ?
				type :
				this.widgetEventPrefix + type ).toLowerCase();
	
			// The original event may come from any element
			// so we need to reset the target on the new event
			event.target = this.element[ 0 ];
	
			// Copy original event properties over to the new event
			orig = event.originalEvent;
			if ( orig ) {
				for ( prop in orig ) {
					if ( !( prop in event ) ) {
						event[ prop ] = orig[ prop ];
					}
				}
			}
	
			this.element.trigger( event, data );
			return !( $.isFunction( callback ) &&
				callback.apply( this.element[ 0 ], [ event ].concat( data ) ) === false ||
				event.isDefaultPrevented() );
		}
	};
	
	$.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) {
		$.Widget.prototype[ "_" + method ] = function( element, options, callback ) {
			if ( typeof options === "string" ) {
				options = { effect: options };
			}
	
			var hasOptions;
			var effectName = !options ?
				method :
				options === true || typeof options === "number" ?
					defaultEffect :
					options.effect || defaultEffect;
	
			options = options || {};
			if ( typeof options === "number" ) {
				options = { duration: options };
			}
	
			hasOptions = !$.isEmptyObject( options );
			options.complete = callback;
	
			if ( options.delay ) {
				element.delay( options.delay );
			}
	
			if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {
				element[ method ]( options );
			} else if ( effectName !== method && element[ effectName ] ) {
				element[ effectName ]( options.duration, options.easing, callback );
			} else {
				element.queue( function( next ) {
					$( this )[ method ]();
					if ( callback ) {
						callback.call( element[ 0 ] );
					}
					next();
				} );
			}
		};
	} );
	
	return $.widget;
	
	} ) );


/***/ }),
/* 24 */
/***/ (function(module, exports, __webpack_require__) {

	var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;( function( factory ) {
		if ( true ) {
	
			// AMD. Register as an anonymous module.
			!(__WEBPACK_AMD_DEFINE_ARRAY__ = [ __webpack_require__(12) ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
		} else {
	
			// Browser globals
			factory( jQuery );
		}
	} ( function( $ ) {
	
	$.ui = $.ui || {};
	
	return $.ui.version = "1.12.1";
	
	} ) );


/***/ }),
/* 25 */
/***/ (function(module, exports, __webpack_require__) {

	var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!
	 * jQuery UI Checkboxradio 1.12.1
	 * http://jqueryui.com
	 *
	 * Copyright jQuery Foundation and other contributors
	 * Released under the MIT license.
	 * http://jquery.org/license
	 */
	
	//>>label: Checkboxradio
	//>>group: Widgets
	//>>description: Enhances a form with multiple themeable checkboxes or radio buttons.
	//>>docs: http://api.jqueryui.com/checkboxradio/
	//>>demos: http://jqueryui.com/checkboxradio/
	//>>css.structure: ../../themes/base/core.css
	//>>css.structure: ../../themes/base/button.css
	//>>css.structure: ../../themes/base/checkboxradio.css
	//>>css.theme: ../../themes/base/theme.css
	
	( function( factory ) {
		if ( true ) {
	
			// AMD. Register as an anonymous module.
			!(__WEBPACK_AMD_DEFINE_ARRAY__ = [
				__webpack_require__(12),
				__webpack_require__(26),
				__webpack_require__(27),
				__webpack_require__(29),
				__webpack_require__(23)
			], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
		} else {
	
			// Browser globals
			factory( jQuery );
		}
	}( function( $ ) {
	
	$.widget( "ui.checkboxradio", [ $.ui.formResetMixin, {
		version: "1.12.1",
		options: {
			disabled: null,
			label: null,
			icon: true,
			classes: {
				"ui-checkboxradio-label": "ui-corner-all",
				"ui-checkboxradio-icon": "ui-corner-all"
			}
		},
	
		_getCreateOptions: function() {
			var disabled, labels;
			var that = this;
			var options = this._super() || {};
	
			// We read the type here, because it makes more sense to throw a element type error first,
			// rather then the error for lack of a label. Often if its the wrong type, it
			// won't have a label (e.g. calling on a div, btn, etc)
			this._readType();
	
			labels = this.element.labels();
	
			// If there are multiple labels, use the last one
			this.label = $( labels[ labels.length - 1 ] );
			if ( !this.label.length ) {
				$.error( "No label found for checkboxradio widget" );
			}
	
			this.originalLabel = "";
	
			// We need to get the label text but this may also need to make sure it does not contain the
			// input itself.
			this.label.contents().not( this.element[ 0 ] ).each( function() {
	
				// The label contents could be text, html, or a mix. We concat each element to get a
				// string representation of the label, without the input as part of it.
				that.originalLabel += this.nodeType === 3 ? $( this ).text() : this.outerHTML;
			} );
	
			// Set the label option if we found label text
			if ( this.originalLabel ) {
				options.label = this.originalLabel;
			}
	
			disabled = this.element[ 0 ].disabled;
			if ( disabled != null ) {
				options.disabled = disabled;
			}
			return options;
		},
	
		_create: function() {
			var checked = this.element[ 0 ].checked;
	
			this._bindFormResetHandler();
	
			if ( this.options.disabled == null ) {
				this.options.disabled = this.element[ 0 ].disabled;
			}
	
			this._setOption( "disabled", this.options.disabled );
			this._addClass( "ui-checkboxradio", "ui-helper-hidden-accessible" );
			this._addClass( this.label, "ui-checkboxradio-label", "ui-button ui-widget" );
	
			if ( this.type === "radio" ) {
				this._addClass( this.label, "ui-checkboxradio-radio-label" );
			}
	
			if ( this.options.label && this.options.label !== this.originalLabel ) {
				this._updateLabel();
			} else if ( this.originalLabel ) {
				this.options.label = this.originalLabel;
			}
	
			this._enhance();
	
			if ( checked ) {
				this._addClass( this.label, "ui-checkboxradio-checked", "ui-state-active" );
				if ( this.icon ) {
					this._addClass( this.icon, null, "ui-state-hover" );
				}
			}
	
			this._on( {
				change: "_toggleClasses",
				focus: function() {
					this._addClass( this.label, null, "ui-state-focus ui-visual-focus" );
				},
				blur: function() {
					this._removeClass( this.label, null, "ui-state-focus ui-visual-focus" );
				}
			} );
		},
	
		_readType: function() {
			var nodeName = this.element[ 0 ].nodeName.toLowerCase();
			this.type = this.element[ 0 ].type;
			if ( nodeName !== "input" || !/radio|checkbox/.test( this.type ) ) {
				$.error( "Can't create checkboxradio on element.nodeName=" + nodeName +
					" and element.type=" + this.type );
			}
		},
	
		// Support jQuery Mobile enhanced option
		_enhance: function() {
			this._updateIcon( this.element[ 0 ].checked );
		},
	
		widget: function() {
			return this.label;
		},
	
		_getRadioGroup: function() {
			var group;
			var name = this.element[ 0 ].name;
			var nameSelector = "input[name='" + $.ui.escapeSelector( name ) + "']";
	
			if ( !name ) {
				return $( [] );
			}
	
			if ( this.form.length ) {
				group = $( this.form[ 0 ].elements ).filter( nameSelector );
			} else {
	
				// Not inside a form, check all inputs that also are not inside a form
				group = $( nameSelector ).filter( function() {
					return $( this ).form().length === 0;
				} );
			}
	
			return group.not( this.element );
		},
	
		_toggleClasses: function() {
			var checked = this.element[ 0 ].checked;
			this._toggleClass( this.label, "ui-checkboxradio-checked", "ui-state-active", checked );
	
			if ( this.options.icon && this.type === "checkbox" ) {
				this._toggleClass( this.icon, null, "ui-icon-check ui-state-checked", checked )
					._toggleClass( this.icon, null, "ui-icon-blank", !checked );
			}
	
			if ( this.type === "radio" ) {
				this._getRadioGroup()
					.each( function() {
						var instance = $( this ).checkboxradio( "instance" );
	
						if ( instance ) {
							instance._removeClass( instance.label,
								"ui-checkboxradio-checked", "ui-state-active" );
						}
					} );
			}
		},
	
		_destroy: function() {
			this._unbindFormResetHandler();
	
			if ( this.icon ) {
				this.icon.remove();
				this.iconSpace.remove();
			}
		},
	
		_setOption: function( key, value ) {
	
			// We don't allow the value to be set to nothing
			if ( key === "label" && !value ) {
				return;
			}
	
			this._super( key, value );
	
			if ( key === "disabled" ) {
				this._toggleClass( this.label, null, "ui-state-disabled", value );
				this.element[ 0 ].disabled = value;
	
				// Don't refresh when setting disabled
				return;
			}
			this.refresh();
		},
	
		_updateIcon: function( checked ) {
			var toAdd = "ui-icon ui-icon-background ";
	
			if ( this.options.icon ) {
				if ( !this.icon ) {
					this.icon = $( "<span>" );
					this.iconSpace = $( "<span> </span>" );
					this._addClass( this.iconSpace, "ui-checkboxradio-icon-space" );
				}
	
				if ( this.type === "checkbox" ) {
					toAdd += checked ? "ui-icon-check ui-state-checked" : "ui-icon-blank";
					this._removeClass( this.icon, null, checked ? "ui-icon-blank" : "ui-icon-check" );
				} else {
					toAdd += "ui-icon-blank";
				}
				this._addClass( this.icon, "ui-checkboxradio-icon", toAdd );
				if ( !checked ) {
					this._removeClass( this.icon, null, "ui-icon-check ui-state-checked" );
				}
				this.icon.prependTo( this.label ).after( this.iconSpace );
			} else if ( this.icon !== undefined ) {
				this.icon.remove();
				this.iconSpace.remove();
				delete this.icon;
			}
		},
	
		_updateLabel: function() {
	
			// Remove the contents of the label ( minus the icon, icon space, and input )
			var contents = this.label.contents().not( this.element[ 0 ] );
			if ( this.icon ) {
				contents = contents.not( this.icon[ 0 ] );
			}
			if ( this.iconSpace ) {
				contents = contents.not( this.iconSpace[ 0 ] );
			}
			contents.remove();
	
			this.label.append( this.options.label );
		},
	
		refresh: function() {
			var checked = this.element[ 0 ].checked,
				isDisabled = this.element[ 0 ].disabled;
	
			this._updateIcon( checked );
			this._toggleClass( this.label, "ui-checkboxradio-checked", "ui-state-active", checked );
			if ( this.options.label !== null ) {
				this._updateLabel();
			}
	
			if ( isDisabled !== this.options.disabled ) {
				this._setOptions( { "disabled": isDisabled } );
			}
		}
	
	} ] );
	
	return $.ui.checkboxradio;
	
	} ) );


/***/ }),
/* 26 */
/***/ (function(module, exports, __webpack_require__) {

	var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;( function( factory ) {
		if ( true ) {
	
			// AMD. Register as an anonymous module.
			!(__WEBPACK_AMD_DEFINE_ARRAY__ = [ __webpack_require__(12), __webpack_require__(24) ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
		} else {
	
			// Browser globals
			factory( jQuery );
		}
	} ( function( $ ) {
	
	// Internal use only
	return $.ui.escapeSelector = ( function() {
		var selectorEscape = /([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;
		return function( selector ) {
			return selector.replace( selectorEscape, "\\$1" );
		};
	} )();
	
	} ) );


/***/ }),
/* 27 */
/***/ (function(module, exports, __webpack_require__) {

	var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!
	 * jQuery UI Form Reset Mixin 1.12.1
	 * http://jqueryui.com
	 *
	 * Copyright jQuery Foundation and other contributors
	 * Released under the MIT license.
	 * http://jquery.org/license
	 */
	
	//>>label: Form Reset Mixin
	//>>group: Core
	//>>description: Refresh input widgets when their form is reset
	//>>docs: http://api.jqueryui.com/form-reset-mixin/
	
	( function( factory ) {
		if ( true ) {
	
			// AMD. Register as an anonymous module.
			!(__WEBPACK_AMD_DEFINE_ARRAY__ = [
				__webpack_require__(12),
				__webpack_require__(28),
				__webpack_require__(24)
			], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
		} else {
	
			// Browser globals
			factory( jQuery );
		}
	}( function( $ ) {
	
	return $.ui.formResetMixin = {
		_formResetHandler: function() {
			var form = $( this );
	
			// Wait for the form reset to actually happen before refreshing
			setTimeout( function() {
				var instances = form.data( "ui-form-reset-instances" );
				$.each( instances, function() {
					this.refresh();
				} );
			} );
		},
	
		_bindFormResetHandler: function() {
			this.form = this.element.form();
			if ( !this.form.length ) {
				return;
			}
	
			var instances = this.form.data( "ui-form-reset-instances" ) || [];
			if ( !instances.length ) {
	
				// We don't use _on() here because we use a single event handler per form
				this.form.on( "reset.ui-form-reset", this._formResetHandler );
			}
			instances.push( this );
			this.form.data( "ui-form-reset-instances", instances );
		},
	
		_unbindFormResetHandler: function() {
			if ( !this.form.length ) {
				return;
			}
	
			var instances = this.form.data( "ui-form-reset-instances" );
			instances.splice( $.inArray( this, instances ), 1 );
			if ( instances.length ) {
				this.form.data( "ui-form-reset-instances", instances );
			} else {
				this.form
					.removeData( "ui-form-reset-instances" )
					.off( "reset.ui-form-reset" );
			}
		}
	};
	
	} ) );


/***/ }),
/* 28 */
/***/ (function(module, exports, __webpack_require__) {

	var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;( function( factory ) {
		if ( true ) {
	
			// AMD. Register as an anonymous module.
			!(__WEBPACK_AMD_DEFINE_ARRAY__ = [ __webpack_require__(12), __webpack_require__(24) ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
		} else {
	
			// Browser globals
			factory( jQuery );
		}
	} ( function( $ ) {
	
	// Support: IE8 Only
	// IE8 does not support the form attribute and when it is supplied. It overwrites the form prop
	// with a string, so we need to find the proper form.
	return $.fn.form = function() {
		return typeof this[ 0 ].form === "string" ? this.closest( "form" ) : $( this[ 0 ].form );
	};
	
	} ) );


/***/ }),
/* 29 */
/***/ (function(module, exports, __webpack_require__) {

	var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!
	 * jQuery UI Labels 1.12.1
	 * http://jqueryui.com
	 *
	 * Copyright jQuery Foundation and other contributors
	 * Released under the MIT license.
	 * http://jquery.org/license
	 */
	
	//>>label: labels
	//>>group: Core
	//>>description: Find all the labels associated with a given input
	//>>docs: http://api.jqueryui.com/labels/
	
	( function( factory ) {
		if ( true ) {
	
			// AMD. Register as an anonymous module.
			!(__WEBPACK_AMD_DEFINE_ARRAY__ = [ __webpack_require__(12), __webpack_require__(24), __webpack_require__(26) ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
		} else {
	
			// Browser globals
			factory( jQuery );
		}
	} ( function( $ ) {
	
	return $.fn.labels = function() {
		var ancestor, selector, id, labels, ancestors;
	
		// Check control.labels first
		if ( this[ 0 ].labels && this[ 0 ].labels.length ) {
			return this.pushStack( this[ 0 ].labels );
		}
	
		// Support: IE <= 11, FF <= 37, Android <= 2.3 only
		// Above browsers do not support control.labels. Everything below is to support them
		// as well as document fragments. control.labels does not work on document fragments
		labels = this.eq( 0 ).parents( "label" );
	
		// Look for the label based on the id
		id = this.attr( "id" );
		if ( id ) {
	
			// We don't search against the document in case the element
			// is disconnected from the DOM
			ancestor = this.eq( 0 ).parents().last();
	
			// Get a full set of top level ancestors
			ancestors = ancestor.add( ancestor.length ? ancestor.siblings() : this.siblings() );
	
			// Create a selector for the label based on the id
			selector = "label[for='" + $.ui.escapeSelector( id ) + "']";
	
			labels = labels.add( ancestors.find( selector ).addBack( selector ) );
	
		}
	
		// Return whatever we have found for labels
		return this.pushStack( labels );
	};
	
	} ) );


/***/ }),
/* 30 */
/***/ (function(module, exports, __webpack_require__) {

	var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!
	 * jQuery UI Keycode 1.12.1
	 * http://jqueryui.com
	 *
	 * Copyright jQuery Foundation and other contributors
	 * Released under the MIT license.
	 * http://jquery.org/license
	 */
	
	//>>label: Keycode
	//>>group: Core
	//>>description: Provide keycodes as keynames
	//>>docs: http://api.jqueryui.com/jQuery.ui.keyCode/
	
	( function( factory ) {
		if ( true ) {
	
			// AMD. Register as an anonymous module.
			!(__WEBPACK_AMD_DEFINE_ARRAY__ = [ __webpack_require__(12), __webpack_require__(24) ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
		} else {
	
			// Browser globals
			factory( jQuery );
		}
	} ( function( $ ) {
	return $.ui.keyCode = {
		BACKSPACE: 8,
		COMMA: 188,
		DELETE: 46,
		DOWN: 40,
		END: 35,
		ENTER: 13,
		ESCAPE: 27,
		HOME: 36,
		LEFT: 37,
		PAGE_DOWN: 34,
		PAGE_UP: 33,
		PERIOD: 190,
		RIGHT: 39,
		SPACE: 32,
		TAB: 9,
		UP: 38
	};
	
	} ) );


/***/ }),
/* 31 */
/***/ (function(module, exports, __webpack_require__) {

	var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!
	 * jQuery UI Draggable 1.12.1
	 * http://jqueryui.com
	 *
	 * Copyright jQuery Foundation and other contributors
	 * Released under the MIT license.
	 * http://jquery.org/license
	 */
	
	//>>label: Draggable
	//>>group: Interactions
	//>>description: Enables dragging functionality for any element.
	//>>docs: http://api.jqueryui.com/draggable/
	//>>demos: http://jqueryui.com/draggable/
	//>>css.structure: ../../themes/base/draggable.css
	
	( function( factory ) {
		if ( true ) {
	
			// AMD. Register as an anonymous module.
			!(__WEBPACK_AMD_DEFINE_ARRAY__ = [
				__webpack_require__(12),
				__webpack_require__(32),
				__webpack_require__(34),
				__webpack_require__(35),
				__webpack_require__(36),
				__webpack_require__(37),
				__webpack_require__(38),
				__webpack_require__(24),
				__webpack_require__(23)
			], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
		} else {
	
			// Browser globals
			factory( jQuery );
		}
	}( function( $ ) {
	
	$.widget( "ui.draggable", $.ui.mouse, {
		version: "1.12.1",
		widgetEventPrefix: "drag",
		options: {
			addClasses: true,
			appendTo: "parent",
			axis: false,
			connectToSortable: false,
			containment: false,
			cursor: "auto",
			cursorAt: false,
			grid: false,
			handle: false,
			helper: "original",
			iframeFix: false,
			opacity: false,
			refreshPositions: false,
			revert: false,
			revertDuration: 500,
			scope: "default",
			scroll: true,
			scrollSensitivity: 20,
			scrollSpeed: 20,
			snap: false,
			snapMode: "both",
			snapTolerance: 20,
			stack: false,
			zIndex: false,
	
			// Callbacks
			drag: null,
			start: null,
			stop: null
		},
		_create: function() {
	
			if ( this.options.helper === "original" ) {
				this._setPositionRelative();
			}
			if ( this.options.addClasses ) {
				this._addClass( "ui-draggable" );
			}
			this._setHandleClassName();
	
			this._mouseInit();
		},
	
		_setOption: function( key, value ) {
			this._super( key, value );
			if ( key === "handle" ) {
				this._removeHandleClassName();
				this._setHandleClassName();
			}
		},
	
		_destroy: function() {
			if ( ( this.helper || this.element ).is( ".ui-draggable-dragging" ) ) {
				this.destroyOnClear = true;
				return;
			}
			this._removeHandleClassName();
			this._mouseDestroy();
		},
	
		_mouseCapture: function( event ) {
			var o = this.options;
	
			// Among others, prevent a drag on a resizable-handle
			if ( this.helper || o.disabled ||
					$( event.target ).closest( ".ui-resizable-handle" ).length > 0 ) {
				return false;
			}
	
			//Quit if we're not on a valid handle
			this.handle = this._getHandle( event );
			if ( !this.handle ) {
				return false;
			}
	
			this._blurActiveElement( event );
	
			this._blockFrames( o.iframeFix === true ? "iframe" : o.iframeFix );
	
			return true;
	
		},
	
		_blockFrames: function( selector ) {
			this.iframeBlocks = this.document.find( selector ).map( function() {
				var iframe = $( this );
	
				return $( "<div>" )
					.css( "position", "absolute" )
					.appendTo( iframe.parent() )
					.outerWidth( iframe.outerWidth() )
					.outerHeight( iframe.outerHeight() )
					.offset( iframe.offset() )[ 0 ];
			} );
		},
	
		_unblockFrames: function() {
			if ( this.iframeBlocks ) {
				this.iframeBlocks.remove();
				delete this.iframeBlocks;
			}
		},
	
		_blurActiveElement: function( event ) {
			var activeElement = $.ui.safeActiveElement( this.document[ 0 ] ),
				target = $( event.target );
	
			// Don't blur if the event occurred on an element that is within
			// the currently focused element
			// See #10527, #12472
			if ( target.closest( activeElement ).length ) {
				return;
			}
	
			// Blur any element that currently has focus, see #4261
			$.ui.safeBlur( activeElement );
		},
	
		_mouseStart: function( event ) {
	
			var o = this.options;
	
			//Create and append the visible helper
			this.helper = this._createHelper( event );
	
			this._addClass( this.helper, "ui-draggable-dragging" );
	
			//Cache the helper size
			this._cacheHelperProportions();
	
			//If ddmanager is used for droppables, set the global draggable
			if ( $.ui.ddmanager ) {
				$.ui.ddmanager.current = this;
			}
	
			/*
			 * - Position generation -
			 * This block generates everything position related - it's the core of draggables.
			 */
	
			//Cache the margins of the original element
			this._cacheMargins();
	
			//Store the helper's css position
			this.cssPosition = this.helper.css( "position" );
			this.scrollParent = this.helper.scrollParent( true );
			this.offsetParent = this.helper.offsetParent();
			this.hasFixedAncestor = this.helper.parents().filter( function() {
					return $( this ).css( "position" ) === "fixed";
				} ).length > 0;
	
			//The element's absolute position on the page minus margins
			this.positionAbs = this.element.offset();
			this._refreshOffsets( event );
	
			//Generate the original position
			this.originalPosition = this.position = this._generatePosition( event, false );
			this.originalPageX = event.pageX;
			this.originalPageY = event.pageY;
	
			//Adjust the mouse offset relative to the helper if "cursorAt" is supplied
			( o.cursorAt && this._adjustOffsetFromHelper( o.cursorAt ) );
	
			//Set a containment if given in the options
			this._setContainment();
	
			//Trigger event + callbacks
			if ( this._trigger( "start", event ) === false ) {
				this._clear();
				return false;
			}
	
			//Recache the helper size
			this._cacheHelperProportions();
	
			//Prepare the droppable offsets
			if ( $.ui.ddmanager && !o.dropBehaviour ) {
				$.ui.ddmanager.prepareOffsets( this, event );
			}
	
			// Execute the drag once - this causes the helper not to be visible before getting its
			// correct position
			this._mouseDrag( event, true );
	
			// If the ddmanager is used for droppables, inform the manager that dragging has started
			// (see #5003)
			if ( $.ui.ddmanager ) {
				$.ui.ddmanager.dragStart( this, event );
			}
	
			return true;
		},
	
		_refreshOffsets: function( event ) {
			this.offset = {
				top: this.positionAbs.top - this.margins.top,
				left: this.positionAbs.left - this.margins.left,
				scroll: false,
				parent: this._getParentOffset(),
				relative: this._getRelativeOffset()
			};
	
			this.offset.click = {
				left: event.pageX - this.offset.left,
				top: event.pageY - this.offset.top
			};
		},
	
		_mouseDrag: function( event, noPropagation ) {
	
			// reset any necessary cached properties (see #5009)
			if ( this.hasFixedAncestor ) {
				this.offset.parent = this._getParentOffset();
			}
	
			//Compute the helpers position
			this.position = this._generatePosition( event, true );
			this.positionAbs = this._convertPositionTo( "absolute" );
	
			//Call plugins and callbacks and use the resulting position if something is returned
			if ( !noPropagation ) {
				var ui = this._uiHash();
				if ( this._trigger( "drag", event, ui ) === false ) {
					this._mouseUp( new $.Event( "mouseup", event ) );
					return false;
				}
				this.position = ui.position;
			}
	
			this.helper[ 0 ].style.left = this.position.left + "px";
			this.helper[ 0 ].style.top = this.position.top + "px";
	
			if ( $.ui.ddmanager ) {
				$.ui.ddmanager.drag( this, event );
			}
	
			return false;
		},
	
		_mouseStop: function( event ) {
	
			//If we are using droppables, inform the manager about the drop
			var that = this,
				dropped = false;
			if ( $.ui.ddmanager && !this.options.dropBehaviour ) {
				dropped = $.ui.ddmanager.drop( this, event );
			}
	
			//if a drop comes from outside (a sortable)
			if ( this.dropped ) {
				dropped = this.dropped;
				this.dropped = false;
			}
	
			if ( ( this.options.revert === "invalid" && !dropped ) ||
					( this.options.revert === "valid" && dropped ) ||
					this.options.revert === true || ( $.isFunction( this.options.revert ) &&
					this.options.revert.call( this.element, dropped ) )
			) {
				$( this.helper ).animate(
					this.originalPosition,
					parseInt( this.options.revertDuration, 10 ),
					function() {
						if ( that._trigger( "stop", event ) !== false ) {
							that._clear();
						}
					}
				);
			} else {
				if ( this._trigger( "stop", event ) !== false ) {
					this._clear();
				}
			}
	
			return false;
		},
	
		_mouseUp: function( event ) {
			this._unblockFrames();
	
			// If the ddmanager is used for droppables, inform the manager that dragging has stopped
			// (see #5003)
			if ( $.ui.ddmanager ) {
				$.ui.ddmanager.dragStop( this, event );
			}
	
			// Only need to focus if the event occurred on the draggable itself, see #10527
			if ( this.handleElement.is( event.target ) ) {
	
				// The interaction is over; whether or not the click resulted in a drag,
				// focus the element
				this.element.trigger( "focus" );
			}
	
			return $.ui.mouse.prototype._mouseUp.call( this, event );
		},
	
		cancel: function() {
	
			if ( this.helper.is( ".ui-draggable-dragging" ) ) {
				this._mouseUp( new $.Event( "mouseup", { target: this.element[ 0 ] } ) );
			} else {
				this._clear();
			}
	
			return this;
	
		},
	
		_getHandle: function( event ) {
			return this.options.handle ?
				!!$( event.target ).closest( this.element.find( this.options.handle ) ).length :
				true;
		},
	
		_setHandleClassName: function() {
			this.handleElement = this.options.handle ?
				this.element.find( this.options.handle ) : this.element;
			this._addClass( this.handleElement, "ui-draggable-handle" );
		},
	
		_removeHandleClassName: function() {
			this._removeClass( this.handleElement, "ui-draggable-handle" );
		},
	
		_createHelper: function( event ) {
	
			var o = this.options,
				helperIsFunction = $.isFunction( o.helper ),
				helper = helperIsFunction ?
					$( o.helper.apply( this.element[ 0 ], [ event ] ) ) :
					( o.helper === "clone" ?
						this.element.clone().removeAttr( "id" ) :
						this.element );
	
			if ( !helper.parents( "body" ).length ) {
				helper.appendTo( ( o.appendTo === "parent" ?
					this.element[ 0 ].parentNode :
					o.appendTo ) );
			}
	
			// Http://bugs.jqueryui.com/ticket/9446
			// a helper function can return the original element
			// which wouldn't have been set to relative in _create
			if ( helperIsFunction && helper[ 0 ] === this.element[ 0 ] ) {
				this._setPositionRelative();
			}
	
			if ( helper[ 0 ] !== this.element[ 0 ] &&
					!( /(fixed|absolute)/ ).test( helper.css( "position" ) ) ) {
				helper.css( "position", "absolute" );
			}
	
			return helper;
	
		},
	
		_setPositionRelative: function() {
			if ( !( /^(?:r|a|f)/ ).test( this.element.css( "position" ) ) ) {
				this.element[ 0 ].style.position = "relative";
			}
		},
	
		_adjustOffsetFromHelper: function( obj ) {
			if ( typeof obj === "string" ) {
				obj = obj.split( " " );
			}
			if ( $.isArray( obj ) ) {
				obj = { left: +obj[ 0 ], top: +obj[ 1 ] || 0 };
			}
			if ( "left" in obj ) {
				this.offset.click.left = obj.left + this.margins.left;
			}
			if ( "right" in obj ) {
				this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
			}
			if ( "top" in obj ) {
				this.offset.click.top = obj.top + this.margins.top;
			}
			if ( "bottom" in obj ) {
				this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
			}
		},
	
		_isRootNode: function( element ) {
			return ( /(html|body)/i ).test( element.tagName ) || element === this.document[ 0 ];
		},
	
		_getParentOffset: function() {
	
			//Get the offsetParent and cache its position
			var po = this.offsetParent.offset(),
				document = this.document[ 0 ];
	
			// This is a special case where we need to modify a offset calculated on start, since the
			// following happened:
			// 1. The position of the helper is absolute, so it's position is calculated based on the
			// next positioned parent
			// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't
			// the document, which means that the scroll is included in the initial calculation of the
			// offset of the parent, and never recalculated upon drag
			if ( this.cssPosition === "absolute" && this.scrollParent[ 0 ] !== document &&
					$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) {
				po.left += this.scrollParent.scrollLeft();
				po.top += this.scrollParent.scrollTop();
			}
	
			if ( this._isRootNode( this.offsetParent[ 0 ] ) ) {
				po = { top: 0, left: 0 };
			}
	
			return {
				top: po.top + ( parseInt( this.offsetParent.css( "borderTopWidth" ), 10 ) || 0 ),
				left: po.left + ( parseInt( this.offsetParent.css( "borderLeftWidth" ), 10 ) || 0 )
			};
	
		},
	
		_getRelativeOffset: function() {
			if ( this.cssPosition !== "relative" ) {
				return { top: 0, left: 0 };
			}
	
			var p = this.element.position(),
				scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] );
	
			return {
				top: p.top - ( parseInt( this.helper.css( "top" ), 10 ) || 0 ) +
					( !scrollIsRootNode ? this.scrollParent.scrollTop() : 0 ),
				left: p.left - ( parseInt( this.helper.css( "left" ), 10 ) || 0 ) +
					( !scrollIsRootNode ? this.scrollParent.scrollLeft() : 0 )
			};
	
		},
	
		_cacheMargins: function() {
			this.margins = {
				left: ( parseInt( this.element.css( "marginLeft" ), 10 ) || 0 ),
				top: ( parseInt( this.element.css( "marginTop" ), 10 ) || 0 ),
				right: ( parseInt( this.element.css( "marginRight" ), 10 ) || 0 ),
				bottom: ( parseInt( this.element.css( "marginBottom" ), 10 ) || 0 )
			};
		},
	
		_cacheHelperProportions: function() {
			this.helperProportions = {
				width: this.helper.outerWidth(),
				height: this.helper.outerHeight()
			};
		},
	
		_setContainment: function() {
	
			var isUserScrollable, c, ce,
				o = this.options,
				document = this.document[ 0 ];
	
			this.relativeContainer = null;
	
			if ( !o.containment ) {
				this.containment = null;
				return;
			}
	
			if ( o.containment === "window" ) {
				this.containment = [
					$( window ).scrollLeft() - this.offset.relative.left - this.offset.parent.left,
					$( window ).scrollTop() - this.offset.relative.top - this.offset.parent.top,
					$( window ).scrollLeft() + $( window ).width() -
						this.helperProportions.width - this.margins.left,
					$( window ).scrollTop() +
						( $( window ).height() || document.body.parentNode.scrollHeight ) -
						this.helperProportions.height - this.margins.top
				];
				return;
			}
	
			if ( o.containment === "document" ) {
				this.containment = [
					0,
					0,
					$( document ).width() - this.helperProportions.width - this.margins.left,
					( $( document ).height() || document.body.parentNode.scrollHeight ) -
						this.helperProportions.height - this.margins.top
				];
				return;
			}
	
			if ( o.containment.constructor === Array ) {
				this.containment = o.containment;
				return;
			}
	
			if ( o.containment === "parent" ) {
				o.containment = this.helper[ 0 ].parentNode;
			}
	
			c = $( o.containment );
			ce = c[ 0 ];
	
			if ( !ce ) {
				return;
			}
	
			isUserScrollable = /(scroll|auto)/.test( c.css( "overflow" ) );
	
			this.containment = [
				( parseInt( c.css( "borderLeftWidth" ), 10 ) || 0 ) +
					( parseInt( c.css( "paddingLeft" ), 10 ) || 0 ),
				( parseInt( c.css( "borderTopWidth" ), 10 ) || 0 ) +
					( parseInt( c.css( "paddingTop" ), 10 ) || 0 ),
				( isUserScrollable ? Math.max( ce.scrollWidth, ce.offsetWidth ) : ce.offsetWidth ) -
					( parseInt( c.css( "borderRightWidth" ), 10 ) || 0 ) -
					( parseInt( c.css( "paddingRight" ), 10 ) || 0 ) -
					this.helperProportions.width -
					this.margins.left -
					this.margins.right,
				( isUserScrollable ? Math.max( ce.scrollHeight, ce.offsetHeight ) : ce.offsetHeight ) -
					( parseInt( c.css( "borderBottomWidth" ), 10 ) || 0 ) -
					( parseInt( c.css( "paddingBottom" ), 10 ) || 0 ) -
					this.helperProportions.height -
					this.margins.top -
					this.margins.bottom
			];
			this.relativeContainer = c;
		},
	
		_convertPositionTo: function( d, pos ) {
	
			if ( !pos ) {
				pos = this.position;
			}
	
			var mod = d === "absolute" ? 1 : -1,
				scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] );
	
			return {
				top: (
	
					// The absolute mouse position
					pos.top	+
	
					// Only for relative positioned nodes: Relative offset from element to offset parent
					this.offset.relative.top * mod +
	
					// The offsetParent's offset without borders (offset + border)
					this.offset.parent.top * mod -
					( ( this.cssPosition === "fixed" ?
						-this.offset.scroll.top :
						( scrollIsRootNode ? 0 : this.offset.scroll.top ) ) * mod )
				),
				left: (
	
					// The absolute mouse position
					pos.left +
	
					// Only for relative positioned nodes: Relative offset from element to offset parent
					this.offset.relative.left * mod +
	
					// The offsetParent's offset without borders (offset + border)
					this.offset.parent.left * mod	-
					( ( this.cssPosition === "fixed" ?
						-this.offset.scroll.left :
						( scrollIsRootNode ? 0 : this.offset.scroll.left ) ) * mod )
				)
			};
	
		},
	
		_generatePosition: function( event, constrainPosition ) {
	
			var containment, co, top, left,
				o = this.options,
				scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] ),
				pageX = event.pageX,
				pageY = event.pageY;
	
			// Cache the scroll
			if ( !scrollIsRootNode || !this.offset.scroll ) {
				this.offset.scroll = {
					top: this.scrollParent.scrollTop(),
					left: this.scrollParent.scrollLeft()
				};
			}
	
			/*
			 * - Position constraining -
			 * Constrain the position to a mix of grid, containment.
			 */
	
			// If we are not dragging yet, we won't check for options
			if ( constrainPosition ) {
				if ( this.containment ) {
					if ( this.relativeContainer ) {
						co = this.relativeContainer.offset();
						containment = [
							this.containment[ 0 ] + co.left,
							this.containment[ 1 ] + co.top,
							this.containment[ 2 ] + co.left,
							this.containment[ 3 ] + co.top
						];
					} else {
						containment = this.containment;
					}
	
					if ( event.pageX - this.offset.click.left < containment[ 0 ] ) {
						pageX = containment[ 0 ] + this.offset.click.left;
					}
					if ( event.pageY - this.offset.click.top < containment[ 1 ] ) {
						pageY = containment[ 1 ] + this.offset.click.top;
					}
					if ( event.pageX - this.offset.click.left > containment[ 2 ] ) {
						pageX = containment[ 2 ] + this.offset.click.left;
					}
					if ( event.pageY - this.offset.click.top > containment[ 3 ] ) {
						pageY = containment[ 3 ] + this.offset.click.top;
					}
				}
	
				if ( o.grid ) {
	
					//Check for grid elements set to 0 to prevent divide by 0 error causing invalid
					// argument errors in IE (see ticket #6950)
					top = o.grid[ 1 ] ? this.originalPageY + Math.round( ( pageY -
						this.originalPageY ) / o.grid[ 1 ] ) * o.grid[ 1 ] : this.originalPageY;
					pageY = containment ? ( ( top - this.offset.click.top >= containment[ 1 ] ||
						top - this.offset.click.top > containment[ 3 ] ) ?
							top :
							( ( top - this.offset.click.top >= containment[ 1 ] ) ?
								top - o.grid[ 1 ] : top + o.grid[ 1 ] ) ) : top;
	
					left = o.grid[ 0 ] ? this.originalPageX +
						Math.round( ( pageX - this.originalPageX ) / o.grid[ 0 ] ) * o.grid[ 0 ] :
						this.originalPageX;
					pageX = containment ? ( ( left - this.offset.click.left >= containment[ 0 ] ||
						left - this.offset.click.left > containment[ 2 ] ) ?
							left :
							( ( left - this.offset.click.left >= containment[ 0 ] ) ?
								left - o.grid[ 0 ] : left + o.grid[ 0 ] ) ) : left;
				}
	
				if ( o.axis === "y" ) {
					pageX = this.originalPageX;
				}
	
				if ( o.axis === "x" ) {
					pageY = this.originalPageY;
				}
			}
	
			return {
				top: (
	
					// The absolute mouse position
					pageY -
	
					// Click offset (relative to the element)
					this.offset.click.top -
	
					// Only for relative positioned nodes: Relative offset from element to offset parent
					this.offset.relative.top -
	
					// The offsetParent's offset without borders (offset + border)
					this.offset.parent.top +
					( this.cssPosition === "fixed" ?
						-this.offset.scroll.top :
						( scrollIsRootNode ? 0 : this.offset.scroll.top ) )
				),
				left: (
	
					// The absolute mouse position
					pageX -
	
					// Click offset (relative to the element)
					this.offset.click.left -
	
					// Only for relative positioned nodes: Relative offset from element to offset parent
					this.offset.relative.left -
	
					// The offsetParent's offset without borders (offset + border)
					this.offset.parent.left +
					( this.cssPosition === "fixed" ?
						-this.offset.scroll.left :
						( scrollIsRootNode ? 0 : this.offset.scroll.left ) )
				)
			};
	
		},
	
		_clear: function() {
			this._removeClass( this.helper, "ui-draggable-dragging" );
			if ( this.helper[ 0 ] !== this.element[ 0 ] && !this.cancelHelperRemoval ) {
				this.helper.remove();
			}
			this.helper = null;
			this.cancelHelperRemoval = false;
			if ( this.destroyOnClear ) {
				this.destroy();
			}
		},
	
		// From now on bulk stuff - mainly helpers
	
		_trigger: function( type, event, ui ) {
			ui = ui || this._uiHash();
			$.ui.plugin.call( this, type, [ event, ui, this ], true );
	
			// Absolute position and offset (see #6884 ) have to be recalculated after plugins
			if ( /^(drag|start|stop)/.test( type ) ) {
				this.positionAbs = this._convertPositionTo( "absolute" );
				ui.offset = this.positionAbs;
			}
			return $.Widget.prototype._trigger.call( this, type, event, ui );
		},
	
		plugins: {},
	
		_uiHash: function() {
			return {
				helper: this.helper,
				position: this.position,
				originalPosition: this.originalPosition,
				offset: this.positionAbs
			};
		}
	
	} );
	
	$.ui.plugin.add( "draggable", "connectToSortable", {
		start: function( event, ui, draggable ) {
			var uiSortable = $.extend( {}, ui, {
				item: draggable.element
			} );
	
			draggable.sortables = [];
			$( draggable.options.connectToSortable ).each( function() {
				var sortable = $( this ).sortable( "instance" );
	
				if ( sortable && !sortable.options.disabled ) {
					draggable.sortables.push( sortable );
	
					// RefreshPositions is called at drag start to refresh the containerCache
					// which is used in drag. This ensures it's initialized and synchronized
					// with any changes that might have happened on the page since initialization.
					sortable.refreshPositions();
					sortable._trigger( "activate", event, uiSortable );
				}
			} );
		},
		stop: function( event, ui, draggable ) {
			var uiSortable = $.extend( {}, ui, {
				item: draggable.element
			} );
	
			draggable.cancelHelperRemoval = false;
	
			$.each( draggable.sortables, function() {
				var sortable = this;
	
				if ( sortable.isOver ) {
					sortable.isOver = 0;
	
					// Allow this sortable to handle removing the helper
					draggable.cancelHelperRemoval = true;
					sortable.cancelHelperRemoval = false;
	
					// Use _storedCSS To restore properties in the sortable,
					// as this also handles revert (#9675) since the draggable
					// may have modified them in unexpected ways (#8809)
					sortable._storedCSS = {
						position: sortable.placeholder.css( "position" ),
						top: sortable.placeholder.css( "top" ),
						left: sortable.placeholder.css( "left" )
					};
	
					sortable._mouseStop( event );
	
					// Once drag has ended, the sortable should return to using
					// its original helper, not the shared helper from draggable
					sortable.options.helper = sortable.options._helper;
				} else {
	
					// Prevent this Sortable from removing the helper.
					// However, don't set the draggable to remove the helper
					// either as another connected Sortable may yet handle the removal.
					sortable.cancelHelperRemoval = true;
	
					sortable._trigger( "deactivate", event, uiSortable );
				}
			} );
		},
		drag: function( event, ui, draggable ) {
			$.each( draggable.sortables, function() {
				var innermostIntersecting = false,
					sortable = this;
	
				// Copy over variables that sortable's _intersectsWith uses
				sortable.positionAbs = draggable.positionAbs;
				sortable.helperProportions = draggable.helperProportions;
				sortable.offset.click = draggable.offset.click;
	
				if ( sortable._intersectsWith( sortable.containerCache ) ) {
					innermostIntersecting = true;
	
					$.each( draggable.sortables, function() {
	
						// Copy over variables that sortable's _intersectsWith uses
						this.positionAbs = draggable.positionAbs;
						this.helperProportions = draggable.helperProportions;
						this.offset.click = draggable.offset.click;
	
						if ( this !== sortable &&
								this._intersectsWith( this.containerCache ) &&
								$.contains( sortable.element[ 0 ], this.element[ 0 ] ) ) {
							innermostIntersecting = false;
						}
	
						return innermostIntersecting;
					} );
				}
	
				if ( innermostIntersecting ) {
	
					// If it intersects, we use a little isOver variable and set it once,
					// so that the move-in stuff gets fired only once.
					if ( !sortable.isOver ) {
						sortable.isOver = 1;
	
						// Store draggable's parent in case we need to reappend to it later.
						draggable._parent = ui.helper.parent();
	
						sortable.currentItem = ui.helper
							.appendTo( sortable.element )
							.data( "ui-sortable-item", true );
	
						// Store helper option to later restore it
						sortable.options._helper = sortable.options.helper;
	
						sortable.options.helper = function() {
							return ui.helper[ 0 ];
						};
	
						// Fire the start events of the sortable with our passed browser event,
						// and our own helper (so it doesn't create a new one)
						event.target = sortable.currentItem[ 0 ];
						sortable._mouseCapture( event, true );
						sortable._mouseStart( event, true, true );
	
						// Because the browser event is way off the new appended portlet,
						// modify necessary variables to reflect the changes
						sortable.offset.click.top = draggable.offset.click.top;
						sortable.offset.click.left = draggable.offset.click.left;
						sortable.offset.parent.left -= draggable.offset.parent.left -
							sortable.offset.parent.left;
						sortable.offset.parent.top -= draggable.offset.parent.top -
							sortable.offset.parent.top;
	
						draggable._trigger( "toSortable", event );
	
						// Inform draggable that the helper is in a valid drop zone,
						// used solely in the revert option to handle "valid/invalid".
						draggable.dropped = sortable.element;
	
						// Need to refreshPositions of all sortables in the case that
						// adding to one sortable changes the location of the other sortables (#9675)
						$.each( draggable.sortables, function() {
							this.refreshPositions();
						} );
	
						// Hack so receive/update callbacks work (mostly)
						draggable.currentItem = draggable.element;
						sortable.fromOutside = draggable;
					}
	
					if ( sortable.currentItem ) {
						sortable._mouseDrag( event );
	
						// Copy the sortable's position because the draggable's can potentially reflect
						// a relative position, while sortable is always absolute, which the dragged
						// element has now become. (#8809)
						ui.position = sortable.position;
					}
				} else {
	
					// If it doesn't intersect with the sortable, and it intersected before,
					// we fake the drag stop of the sortable, but make sure it doesn't remove
					// the helper by using cancelHelperRemoval.
					if ( sortable.isOver ) {
	
						sortable.isOver = 0;
						sortable.cancelHelperRemoval = true;
	
						// Calling sortable's mouseStop would trigger a revert,
						// so revert must be temporarily false until after mouseStop is called.
						sortable.options._revert = sortable.options.revert;
						sortable.options.revert = false;
	
						sortable._trigger( "out", event, sortable._uiHash( sortable ) );
						sortable._mouseStop( event, true );
	
						// Restore sortable behaviors that were modfied
						// when the draggable entered the sortable area (#9481)
						sortable.options.revert = sortable.options._revert;
						sortable.options.helper = sortable.options._helper;
	
						if ( sortable.placeholder ) {
							sortable.placeholder.remove();
						}
	
						// Restore and recalculate the draggable's offset considering the sortable
						// may have modified them in unexpected ways. (#8809, #10669)
						ui.helper.appendTo( draggable._parent );
						draggable._refreshOffsets( event );
						ui.position = draggable._generatePosition( event, true );
	
						draggable._trigger( "fromSortable", event );
	
						// Inform draggable that the helper is no longer in a valid drop zone
						draggable.dropped = false;
	
						// Need to refreshPositions of all sortables just in case removing
						// from one sortable changes the location of other sortables (#9675)
						$.each( draggable.sortables, function() {
							this.refreshPositions();
						} );
					}
				}
			} );
		}
	} );
	
	$.ui.plugin.add( "draggable", "cursor", {
		start: function( event, ui, instance ) {
			var t = $( "body" ),
				o = instance.options;
	
			if ( t.css( "cursor" ) ) {
				o._cursor = t.css( "cursor" );
			}
			t.css( "cursor", o.cursor );
		},
		stop: function( event, ui, instance ) {
			var o = instance.options;
			if ( o._cursor ) {
				$( "body" ).css( "cursor", o._cursor );
			}
		}
	} );
	
	$.ui.plugin.add( "draggable", "opacity", {
		start: function( event, ui, instance ) {
			var t = $( ui.helper ),
				o = instance.options;
			if ( t.css( "opacity" ) ) {
				o._opacity = t.css( "opacity" );
			}
			t.css( "opacity", o.opacity );
		},
		stop: function( event, ui, instance ) {
			var o = instance.options;
			if ( o._opacity ) {
				$( ui.helper ).css( "opacity", o._opacity );
			}
		}
	} );
	
	$.ui.plugin.add( "draggable", "scroll", {
		start: function( event, ui, i ) {
			if ( !i.scrollParentNotHidden ) {
				i.scrollParentNotHidden = i.helper.scrollParent( false );
			}
	
			if ( i.scrollParentNotHidden[ 0 ] !== i.document[ 0 ] &&
					i.scrollParentNotHidden[ 0 ].tagName !== "HTML" ) {
				i.overflowOffset = i.scrollParentNotHidden.offset();
			}
		},
		drag: function( event, ui, i  ) {
	
			var o = i.options,
				scrolled = false,
				scrollParent = i.scrollParentNotHidden[ 0 ],
				document = i.document[ 0 ];
	
			if ( scrollParent !== document && scrollParent.tagName !== "HTML" ) {
				if ( !o.axis || o.axis !== "x" ) {
					if ( ( i.overflowOffset.top + scrollParent.offsetHeight ) - event.pageY <
							o.scrollSensitivity ) {
						scrollParent.scrollTop = scrolled = scrollParent.scrollTop + o.scrollSpeed;
					} else if ( event.pageY - i.overflowOffset.top < o.scrollSensitivity ) {
						scrollParent.scrollTop = scrolled = scrollParent.scrollTop - o.scrollSpeed;
					}
				}
	
				if ( !o.axis || o.axis !== "y" ) {
					if ( ( i.overflowOffset.left + scrollParent.offsetWidth ) - event.pageX <
							o.scrollSensitivity ) {
						scrollParent.scrollLeft = scrolled = scrollParent.scrollLeft + o.scrollSpeed;
					} else if ( event.pageX - i.overflowOffset.left < o.scrollSensitivity ) {
						scrollParent.scrollLeft = scrolled = scrollParent.scrollLeft - o.scrollSpeed;
					}
				}
	
			} else {
	
				if ( !o.axis || o.axis !== "x" ) {
					if ( event.pageY - $( document ).scrollTop() < o.scrollSensitivity ) {
						scrolled = $( document ).scrollTop( $( document ).scrollTop() - o.scrollSpeed );
					} else if ( $( window ).height() - ( event.pageY - $( document ).scrollTop() ) <
							o.scrollSensitivity ) {
						scrolled = $( document ).scrollTop( $( document ).scrollTop() + o.scrollSpeed );
					}
				}
	
				if ( !o.axis || o.axis !== "y" ) {
					if ( event.pageX - $( document ).scrollLeft() < o.scrollSensitivity ) {
						scrolled = $( document ).scrollLeft(
							$( document ).scrollLeft() - o.scrollSpeed
						);
					} else if ( $( window ).width() - ( event.pageX - $( document ).scrollLeft() ) <
							o.scrollSensitivity ) {
						scrolled = $( document ).scrollLeft(
							$( document ).scrollLeft() + o.scrollSpeed
						);
					}
				}
	
			}
	
			if ( scrolled !== false && $.ui.ddmanager && !o.dropBehaviour ) {
				$.ui.ddmanager.prepareOffsets( i, event );
			}
	
		}
	} );
	
	$.ui.plugin.add( "draggable", "snap", {
		start: function( event, ui, i ) {
	
			var o = i.options;
	
			i.snapElements = [];
	
			$( o.snap.constructor !== String ? ( o.snap.items || ":data(ui-draggable)" ) : o.snap )
				.each( function() {
					var $t = $( this ),
						$o = $t.offset();
					if ( this !== i.element[ 0 ] ) {
						i.snapElements.push( {
							item: this,
							width: $t.outerWidth(), height: $t.outerHeight(),
							top: $o.top, left: $o.left
						} );
					}
				} );
	
		},
		drag: function( event, ui, inst ) {
	
			var ts, bs, ls, rs, l, r, t, b, i, first,
				o = inst.options,
				d = o.snapTolerance,
				x1 = ui.offset.left, x2 = x1 + inst.helperProportions.width,
				y1 = ui.offset.top, y2 = y1 + inst.helperProportions.height;
	
			for ( i = inst.snapElements.length - 1; i >= 0; i-- ) {
	
				l = inst.snapElements[ i ].left - inst.margins.left;
				r = l + inst.snapElements[ i ].width;
				t = inst.snapElements[ i ].top - inst.margins.top;
				b = t + inst.snapElements[ i ].height;
	
				if ( x2 < l - d || x1 > r + d || y2 < t - d || y1 > b + d ||
						!$.contains( inst.snapElements[ i ].item.ownerDocument,
						inst.snapElements[ i ].item ) ) {
					if ( inst.snapElements[ i ].snapping ) {
						( inst.options.snap.release &&
							inst.options.snap.release.call(
								inst.element,
								event,
								$.extend( inst._uiHash(), { snapItem: inst.snapElements[ i ].item } )
							) );
					}
					inst.snapElements[ i ].snapping = false;
					continue;
				}
	
				if ( o.snapMode !== "inner" ) {
					ts = Math.abs( t - y2 ) <= d;
					bs = Math.abs( b - y1 ) <= d;
					ls = Math.abs( l - x2 ) <= d;
					rs = Math.abs( r - x1 ) <= d;
					if ( ts ) {
						ui.position.top = inst._convertPositionTo( "relative", {
							top: t - inst.helperProportions.height,
							left: 0
						} ).top;
					}
					if ( bs ) {
						ui.position.top = inst._convertPositionTo( "relative", {
							top: b,
							left: 0
						} ).top;
					}
					if ( ls ) {
						ui.position.left = inst._convertPositionTo( "relative", {
							top: 0,
							left: l - inst.helperProportions.width
						} ).left;
					}
					if ( rs ) {
						ui.position.left = inst._convertPositionTo( "relative", {
							top: 0,
							left: r
						} ).left;
					}
				}
	
				first = ( ts || bs || ls || rs );
	
				if ( o.snapMode !== "outer" ) {
					ts = Math.abs( t - y1 ) <= d;
					bs = Math.abs( b - y2 ) <= d;
					ls = Math.abs( l - x1 ) <= d;
					rs = Math.abs( r - x2 ) <= d;
					if ( ts ) {
						ui.position.top = inst._convertPositionTo( "relative", {
							top: t,
							left: 0
						} ).top;
					}
					if ( bs ) {
						ui.position.top = inst._convertPositionTo( "relative", {
							top: b - inst.helperProportions.height,
							left: 0
						} ).top;
					}
					if ( ls ) {
						ui.position.left = inst._convertPositionTo( "relative", {
							top: 0,
							left: l
						} ).left;
					}
					if ( rs ) {
						ui.position.left = inst._convertPositionTo( "relative", {
							top: 0,
							left: r - inst.helperProportions.width
						} ).left;
					}
				}
	
				if ( !inst.snapElements[ i ].snapping && ( ts || bs || ls || rs || first ) ) {
					( inst.options.snap.snap &&
						inst.options.snap.snap.call(
							inst.element,
							event,
							$.extend( inst._uiHash(), {
								snapItem: inst.snapElements[ i ].item
							} ) ) );
				}
				inst.snapElements[ i ].snapping = ( ts || bs || ls || rs || first );
	
			}
	
		}
	} );
	
	$.ui.plugin.add( "draggable", "stack", {
		start: function( event, ui, instance ) {
			var min,
				o = instance.options,
				group = $.makeArray( $( o.stack ) ).sort( function( a, b ) {
					return ( parseInt( $( a ).css( "zIndex" ), 10 ) || 0 ) -
						( parseInt( $( b ).css( "zIndex" ), 10 ) || 0 );
				} );
	
			if ( !group.length ) { return; }
	
			min = parseInt( $( group[ 0 ] ).css( "zIndex" ), 10 ) || 0;
			$( group ).each( function( i ) {
				$( this ).css( "zIndex", min + i );
			} );
			this.css( "zIndex", ( min + group.length ) );
		}
	} );
	
	$.ui.plugin.add( "draggable", "zIndex", {
		start: function( event, ui, instance ) {
			var t = $( ui.helper ),
				o = instance.options;
	
			if ( t.css( "zIndex" ) ) {
				o._zIndex = t.css( "zIndex" );
			}
			t.css( "zIndex", o.zIndex );
		},
		stop: function( event, ui, instance ) {
			var o = instance.options;
	
			if ( o._zIndex ) {
				$( ui.helper ).css( "zIndex", o._zIndex );
			}
		}
	} );
	
	return $.ui.draggable;
	
	} ) );


/***/ }),
/* 32 */
/***/ (function(module, exports, __webpack_require__) {

	var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!
	 * jQuery UI Mouse 1.12.1
	 * http://jqueryui.com
	 *
	 * Copyright jQuery Foundation and other contributors
	 * Released under the MIT license.
	 * http://jquery.org/license
	 */
	
	//>>label: Mouse
	//>>group: Widgets
	//>>description: Abstracts mouse-based interactions to assist in creating certain widgets.
	//>>docs: http://api.jqueryui.com/mouse/
	
	( function( factory ) {
		if ( true ) {
	
			// AMD. Register as an anonymous module.
			!(__WEBPACK_AMD_DEFINE_ARRAY__ = [
				__webpack_require__(12),
				__webpack_require__(33),
				__webpack_require__(24),
				__webpack_require__(23)
			], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
		} else {
	
			// Browser globals
			factory( jQuery );
		}
	}( function( $ ) {
	
	var mouseHandled = false;
	$( document ).on( "mouseup", function() {
		mouseHandled = false;
	} );
	
	return $.widget( "ui.mouse", {
		version: "1.12.1",
		options: {
			cancel: "input, textarea, button, select, option",
			distance: 1,
			delay: 0
		},
		_mouseInit: function() {
			var that = this;
	
			this.element
				.on( "mousedown." + this.widgetName, function( event ) {
					return that._mouseDown( event );
				} )
				.on( "click." + this.widgetName, function( event ) {
					if ( true === $.data( event.target, that.widgetName + ".preventClickEvent" ) ) {
						$.removeData( event.target, that.widgetName + ".preventClickEvent" );
						event.stopImmediatePropagation();
						return false;
					}
				} );
	
			this.started = false;
		},
	
		// TODO: make sure destroying one instance of mouse doesn't mess with
		// other instances of mouse
		_mouseDestroy: function() {
			this.element.off( "." + this.widgetName );
			if ( this._mouseMoveDelegate ) {
				this.document
					.off( "mousemove." + this.widgetName, this._mouseMoveDelegate )
					.off( "mouseup." + this.widgetName, this._mouseUpDelegate );
			}
		},
	
		_mouseDown: function( event ) {
	
			// don't let more than one widget handle mouseStart
			if ( mouseHandled ) {
				return;
			}
	
			this._mouseMoved = false;
	
			// We may have missed mouseup (out of window)
			( this._mouseStarted && this._mouseUp( event ) );
	
			this._mouseDownEvent = event;
	
			var that = this,
				btnIsLeft = ( event.which === 1 ),
	
				// event.target.nodeName works around a bug in IE 8 with
				// disabled inputs (#7620)
				elIsCancel = ( typeof this.options.cancel === "string" && event.target.nodeName ?
					$( event.target ).closest( this.options.cancel ).length : false );
			if ( !btnIsLeft || elIsCancel || !this._mouseCapture( event ) ) {
				return true;
			}
	
			this.mouseDelayMet = !this.options.delay;
			if ( !this.mouseDelayMet ) {
				this._mouseDelayTimer = setTimeout( function() {
					that.mouseDelayMet = true;
				}, this.options.delay );
			}
	
			if ( this._mouseDistanceMet( event ) && this._mouseDelayMet( event ) ) {
				this._mouseStarted = ( this._mouseStart( event ) !== false );
				if ( !this._mouseStarted ) {
					event.preventDefault();
					return true;
				}
			}
	
			// Click event may never have fired (Gecko & Opera)
			if ( true === $.data( event.target, this.widgetName + ".preventClickEvent" ) ) {
				$.removeData( event.target, this.widgetName + ".preventClickEvent" );
			}
	
			// These delegates are required to keep context
			this._mouseMoveDelegate = function( event ) {
				return that._mouseMove( event );
			};
			this._mouseUpDelegate = function( event ) {
				return that._mouseUp( event );
			};
	
			this.document
				.on( "mousemove." + this.widgetName, this._mouseMoveDelegate )
				.on( "mouseup." + this.widgetName, this._mouseUpDelegate );
	
			event.preventDefault();
	
			mouseHandled = true;
			return true;
		},
	
		_mouseMove: function( event ) {
	
			// Only check for mouseups outside the document if you've moved inside the document
			// at least once. This prevents the firing of mouseup in the case of IE<9, which will
			// fire a mousemove event if content is placed under the cursor. See #7778
			// Support: IE <9
			if ( this._mouseMoved ) {
	
				// IE mouseup check - mouseup happened when mouse was out of window
				if ( $.ui.ie && ( !document.documentMode || document.documentMode < 9 ) &&
						!event.button ) {
					return this._mouseUp( event );
	
				// Iframe mouseup check - mouseup occurred in another document
				} else if ( !event.which ) {
	
					// Support: Safari <=8 - 9
					// Safari sets which to 0 if you press any of the following keys
					// during a drag (#14461)
					if ( event.originalEvent.altKey || event.originalEvent.ctrlKey ||
							event.originalEvent.metaKey || event.originalEvent.shiftKey ) {
						this.ignoreMissingWhich = true;
					} else if ( !this.ignoreMissingWhich ) {
						return this._mouseUp( event );
					}
				}
			}
	
			if ( event.which || event.button ) {
				this._mouseMoved = true;
			}
	
			if ( this._mouseStarted ) {
				this._mouseDrag( event );
				return event.preventDefault();
			}
	
			if ( this._mouseDistanceMet( event ) && this._mouseDelayMet( event ) ) {
				this._mouseStarted =
					( this._mouseStart( this._mouseDownEvent, event ) !== false );
				( this._mouseStarted ? this._mouseDrag( event ) : this._mouseUp( event ) );
			}
	
			return !this._mouseStarted;
		},
	
		_mouseUp: function( event ) {
			this.document
				.off( "mousemove." + this.widgetName, this._mouseMoveDelegate )
				.off( "mouseup." + this.widgetName, this._mouseUpDelegate );
	
			if ( this._mouseStarted ) {
				this._mouseStarted = false;
	
				if ( event.target === this._mouseDownEvent.target ) {
					$.data( event.target, this.widgetName + ".preventClickEvent", true );
				}
	
				this._mouseStop( event );
			}
	
			if ( this._mouseDelayTimer ) {
				clearTimeout( this._mouseDelayTimer );
				delete this._mouseDelayTimer;
			}
	
			this.ignoreMissingWhich = false;
			mouseHandled = false;
			event.preventDefault();
		},
	
		_mouseDistanceMet: function( event ) {
			return ( Math.max(
					Math.abs( this._mouseDownEvent.pageX - event.pageX ),
					Math.abs( this._mouseDownEvent.pageY - event.pageY )
				) >= this.options.distance
			);
		},
	
		_mouseDelayMet: function( /* event */ ) {
			return this.mouseDelayMet;
		},
	
		// These are placeholder methods, to be overriden by extending plugin
		_mouseStart: function( /* event */ ) {},
		_mouseDrag: function( /* event */ ) {},
		_mouseStop: function( /* event */ ) {},
		_mouseCapture: function( /* event */ ) { return true; }
	} );
	
	} ) );


/***/ }),
/* 33 */
/***/ (function(module, exports, __webpack_require__) {

	var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;( function( factory ) {
		if ( true ) {
	
			// AMD. Register as an anonymous module.
			!(__WEBPACK_AMD_DEFINE_ARRAY__ = [ __webpack_require__(12), __webpack_require__(24) ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
		} else {
	
			// Browser globals
			factory( jQuery );
		}
	} ( function( $ ) {
	
	// This file is deprecated
	return $.ui.ie = !!/msie [\w.]+/.exec( navigator.userAgent.toLowerCase() );
	} ) );


/***/ }),
/* 34 */
/***/ (function(module, exports, __webpack_require__) {

	var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!
	 * jQuery UI :data 1.12.1
	 * http://jqueryui.com
	 *
	 * Copyright jQuery Foundation and other contributors
	 * Released under the MIT license.
	 * http://jquery.org/license
	 */
	
	//>>label: :data Selector
	//>>group: Core
	//>>description: Selects elements which have data stored under the specified key.
	//>>docs: http://api.jqueryui.com/data-selector/
	
	( function( factory ) {
		if ( true ) {
	
			// AMD. Register as an anonymous module.
			!(__WEBPACK_AMD_DEFINE_ARRAY__ = [ __webpack_require__(12), __webpack_require__(24) ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
		} else {
	
			// Browser globals
			factory( jQuery );
		}
	} ( function( $ ) {
	return $.extend( $.expr[ ":" ], {
		data: $.expr.createPseudo ?
			$.expr.createPseudo( function( dataName ) {
				return function( elem ) {
					return !!$.data( elem, dataName );
				};
			} ) :
	
			// Support: jQuery <1.8
			function( elem, i, match ) {
				return !!$.data( elem, match[ 3 ] );
			}
	} );
	} ) );


/***/ }),
/* 35 */
/***/ (function(module, exports, __webpack_require__) {

	var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;( function( factory ) {
		if ( true ) {
	
			// AMD. Register as an anonymous module.
			!(__WEBPACK_AMD_DEFINE_ARRAY__ = [ __webpack_require__(12), __webpack_require__(24) ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
		} else {
	
			// Browser globals
			factory( jQuery );
		}
	} ( function( $ ) {
	
	// $.ui.plugin is deprecated. Use $.widget() extensions instead.
	return $.ui.plugin = {
		add: function( module, option, set ) {
			var i,
				proto = $.ui[ module ].prototype;
			for ( i in set ) {
				proto.plugins[ i ] = proto.plugins[ i ] || [];
				proto.plugins[ i ].push( [ option, set[ i ] ] );
			}
		},
		call: function( instance, name, args, allowDisconnected ) {
			var i,
				set = instance.plugins[ name ];
	
			if ( !set ) {
				return;
			}
	
			if ( !allowDisconnected && ( !instance.element[ 0 ].parentNode ||
					instance.element[ 0 ].parentNode.nodeType === 11 ) ) {
				return;
			}
	
			for ( i = 0; i < set.length; i++ ) {
				if ( instance.options[ set[ i ][ 0 ] ] ) {
					set[ i ][ 1 ].apply( instance.element, args );
				}
			}
		}
	};
	
	} ) );


/***/ }),
/* 36 */
/***/ (function(module, exports, __webpack_require__) {

	var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;( function( factory ) {
		if ( true ) {
	
			// AMD. Register as an anonymous module.
			!(__WEBPACK_AMD_DEFINE_ARRAY__ = [ __webpack_require__(12), __webpack_require__(24) ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
		} else {
	
			// Browser globals
			factory( jQuery );
		}
	} ( function( $ ) {
	return $.ui.safeActiveElement = function( document ) {
		var activeElement;
	
		// Support: IE 9 only
		// IE9 throws an "Unspecified error" accessing document.activeElement from an <iframe>
		try {
			activeElement = document.activeElement;
		} catch ( error ) {
			activeElement = document.body;
		}
	
		// Support: IE 9 - 11 only
		// IE may return null instead of an element
		// Interestingly, this only seems to occur when NOT in an iframe
		if ( !activeElement ) {
			activeElement = document.body;
		}
	
		// Support: IE 11 only
		// IE11 returns a seemingly empty object in some cases when accessing
		// document.activeElement from an <iframe>
		if ( !activeElement.nodeName ) {
			activeElement = document.body;
		}
	
		return activeElement;
	};
	
	} ) );


/***/ }),
/* 37 */
/***/ (function(module, exports, __webpack_require__) {

	var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;( function( factory ) {
		if ( true ) {
	
			// AMD. Register as an anonymous module.
			!(__WEBPACK_AMD_DEFINE_ARRAY__ = [ __webpack_require__(12), __webpack_require__(24) ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
		} else {
	
			// Browser globals
			factory( jQuery );
		}
	} ( function( $ ) {
	return $.ui.safeBlur = function( element ) {
	
		// Support: IE9 - 10 only
		// If the <body> is blurred, IE will switch windows, see #9420
		if ( element && element.nodeName.toLowerCase() !== "body" ) {
			$( element ).trigger( "blur" );
		}
	};
	
	} ) );


/***/ }),
/* 38 */
/***/ (function(module, exports, __webpack_require__) {

	var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!
	 * jQuery UI Scroll Parent 1.12.1
	 * http://jqueryui.com
	 *
	 * Copyright jQuery Foundation and other contributors
	 * Released under the MIT license.
	 * http://jquery.org/license
	 */
	
	//>>label: scrollParent
	//>>group: Core
	//>>description: Get the closest ancestor element that is scrollable.
	//>>docs: http://api.jqueryui.com/scrollParent/
	
	( function( factory ) {
		if ( true ) {
	
			// AMD. Register as an anonymous module.
			!(__WEBPACK_AMD_DEFINE_ARRAY__ = [ __webpack_require__(12), __webpack_require__(24) ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
		} else {
	
			// Browser globals
			factory( jQuery );
		}
	} ( function( $ ) {
	
	return $.fn.scrollParent = function( includeHidden ) {
		var position = this.css( "position" ),
			excludeStaticParent = position === "absolute",
			overflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/,
			scrollParent = this.parents().filter( function() {
				var parent = $( this );
				if ( excludeStaticParent && parent.css( "position" ) === "static" ) {
					return false;
				}
				return overflowRegex.test( parent.css( "overflow" ) + parent.css( "overflow-y" ) +
					parent.css( "overflow-x" ) );
			} ).eq( 0 );
	
		return position === "fixed" || !scrollParent.length ?
			$( this[ 0 ].ownerDocument || document ) :
			scrollParent;
	};
	
	} ) );


/***/ }),
/* 39 */
/***/ (function(module, exports, __webpack_require__) {

	var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!
	 * jQuery UI Resizable 1.12.1
	 * http://jqueryui.com
	 *
	 * Copyright jQuery Foundation and other contributors
	 * Released under the MIT license.
	 * http://jquery.org/license
	 */
	
	//>>label: Resizable
	//>>group: Interactions
	//>>description: Enables resize functionality for any element.
	//>>docs: http://api.jqueryui.com/resizable/
	//>>demos: http://jqueryui.com/resizable/
	//>>css.structure: ../../themes/base/core.css
	//>>css.structure: ../../themes/base/resizable.css
	//>>css.theme: ../../themes/base/theme.css
	
	( function( factory ) {
		if ( true ) {
	
			// AMD. Register as an anonymous module.
			!(__WEBPACK_AMD_DEFINE_ARRAY__ = [
				__webpack_require__(12),
				__webpack_require__(32),
				__webpack_require__(40),
				__webpack_require__(35),
				__webpack_require__(24),
				__webpack_require__(23)
			], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
		} else {
	
			// Browser globals
			factory( jQuery );
		}
	}( function( $ ) {
	
	$.widget( "ui.resizable", $.ui.mouse, {
		version: "1.12.1",
		widgetEventPrefix: "resize",
		options: {
			alsoResize: false,
			animate: false,
			animateDuration: "slow",
			animateEasing: "swing",
			aspectRatio: false,
			autoHide: false,
			classes: {
				"ui-resizable-se": "ui-icon ui-icon-gripsmall-diagonal-se"
			},
			containment: false,
			ghost: false,
			grid: false,
			handles: "e,s,se",
			helper: false,
			maxHeight: null,
			maxWidth: null,
			minHeight: 10,
			minWidth: 10,
	
			// See #7960
			zIndex: 90,
	
			// Callbacks
			resize: null,
			start: null,
			stop: null
		},
	
		_num: function( value ) {
			return parseFloat( value ) || 0;
		},
	
		_isNumber: function( value ) {
			return !isNaN( parseFloat( value ) );
		},
	
		_hasScroll: function( el, a ) {
	
			if ( $( el ).css( "overflow" ) === "hidden" ) {
				return false;
			}
	
			var scroll = ( a && a === "left" ) ? "scrollLeft" : "scrollTop",
				has = false;
	
			if ( el[ scroll ] > 0 ) {
				return true;
			}
	
			// TODO: determine which cases actually cause this to happen
			// if the element doesn't have the scroll set, see if it's possible to
			// set the scroll
			el[ scroll ] = 1;
			has = ( el[ scroll ] > 0 );
			el[ scroll ] = 0;
			return has;
		},
	
		_create: function() {
	
			var margins,
				o = this.options,
				that = this;
			this._addClass( "ui-resizable" );
	
			$.extend( this, {
				_aspectRatio: !!( o.aspectRatio ),
				aspectRatio: o.aspectRatio,
				originalElement: this.element,
				_proportionallyResizeElements: [],
				_helper: o.helper || o.ghost || o.animate ? o.helper || "ui-resizable-helper" : null
			} );
	
			// Wrap the element if it cannot hold child nodes
			if ( this.element[ 0 ].nodeName.match( /^(canvas|textarea|input|select|button|img)$/i ) ) {
	
				this.element.wrap(
					$( "<div class='ui-wrapper' style='overflow: hidden;'></div>" ).css( {
						position: this.element.css( "position" ),
						width: this.element.outerWidth(),
						height: this.element.outerHeight(),
						top: this.element.css( "top" ),
						left: this.element.css( "left" )
					} )
				);
	
				this.element = this.element.parent().data(
					"ui-resizable", this.element.resizable( "instance" )
				);
	
				this.elementIsWrapper = true;
	
				margins = {
					marginTop: this.originalElement.css( "marginTop" ),
					marginRight: this.originalElement.css( "marginRight" ),
					marginBottom: this.originalElement.css( "marginBottom" ),
					marginLeft: this.originalElement.css( "marginLeft" )
				};
	
				this.element.css( margins );
				this.originalElement.css( "margin", 0 );
	
				// support: Safari
				// Prevent Safari textarea resize
				this.originalResizeStyle = this.originalElement.css( "resize" );
				this.originalElement.css( "resize", "none" );
	
				this._proportionallyResizeElements.push( this.originalElement.css( {
					position: "static",
					zoom: 1,
					display: "block"
				} ) );
	
				// Support: IE9
				// avoid IE jump (hard set the margin)
				this.originalElement.css( margins );
	
				this._proportionallyResize();
			}
	
			this._setupHandles();
	
			if ( o.autoHide ) {
				$( this.element )
					.on( "mouseenter", function() {
						if ( o.disabled ) {
							return;
						}
						that._removeClass( "ui-resizable-autohide" );
						that._handles.show();
					} )
					.on( "mouseleave", function() {
						if ( o.disabled ) {
							return;
						}
						if ( !that.resizing ) {
							that._addClass( "ui-resizable-autohide" );
							that._handles.hide();
						}
					} );
			}
	
			this._mouseInit();
		},
	
		_destroy: function() {
	
			this._mouseDestroy();
	
			var wrapper,
				_destroy = function( exp ) {
					$( exp )
						.removeData( "resizable" )
						.removeData( "ui-resizable" )
						.off( ".resizable" )
						.find( ".ui-resizable-handle" )
							.remove();
				};
	
			// TODO: Unwrap at same DOM position
			if ( this.elementIsWrapper ) {
				_destroy( this.element );
				wrapper = this.element;
				this.originalElement.css( {
					position: wrapper.css( "position" ),
					width: wrapper.outerWidth(),
					height: wrapper.outerHeight(),
					top: wrapper.css( "top" ),
					left: wrapper.css( "left" )
				} ).insertAfter( wrapper );
				wrapper.remove();
			}
	
			this.originalElement.css( "resize", this.originalResizeStyle );
			_destroy( this.originalElement );
	
			return this;
		},
	
		_setOption: function( key, value ) {
			this._super( key, value );
	
			switch ( key ) {
			case "handles":
				this._removeHandles();
				this._setupHandles();
				break;
			default:
				break;
			}
		},
	
		_setupHandles: function() {
			var o = this.options, handle, i, n, hname, axis, that = this;
			this.handles = o.handles ||
				( !$( ".ui-resizable-handle", this.element ).length ?
					"e,s,se" : {
						n: ".ui-resizable-n",
						e: ".ui-resizable-e",
						s: ".ui-resizable-s",
						w: ".ui-resizable-w",
						se: ".ui-resizable-se",
						sw: ".ui-resizable-sw",
						ne: ".ui-resizable-ne",
						nw: ".ui-resizable-nw"
					} );
	
			this._handles = $();
			if ( this.handles.constructor === String ) {
	
				if ( this.handles === "all" ) {
					this.handles = "n,e,s,w,se,sw,ne,nw";
				}
	
				n = this.handles.split( "," );
				this.handles = {};
	
				for ( i = 0; i < n.length; i++ ) {
	
					handle = $.trim( n[ i ] );
					hname = "ui-resizable-" + handle;
					axis = $( "<div>" );
					this._addClass( axis, "ui-resizable-handle " + hname );
	
					axis.css( { zIndex: o.zIndex } );
	
					this.handles[ handle ] = ".ui-resizable-" + handle;
					this.element.append( axis );
				}
	
			}
	
			this._renderAxis = function( target ) {
	
				var i, axis, padPos, padWrapper;
	
				target = target || this.element;
	
				for ( i in this.handles ) {
	
					if ( this.handles[ i ].constructor === String ) {
						this.handles[ i ] = this.element.children( this.handles[ i ] ).first().show();
					} else if ( this.handles[ i ].jquery || this.handles[ i ].nodeType ) {
						this.handles[ i ] = $( this.handles[ i ] );
						this._on( this.handles[ i ], { "mousedown": that._mouseDown } );
					}
	
					if ( this.elementIsWrapper &&
							this.originalElement[ 0 ]
								.nodeName
								.match( /^(textarea|input|select|button)$/i ) ) {
						axis = $( this.handles[ i ], this.element );
	
						padWrapper = /sw|ne|nw|se|n|s/.test( i ) ?
							axis.outerHeight() :
							axis.outerWidth();
	
						padPos = [ "padding",
							/ne|nw|n/.test( i ) ? "Top" :
							/se|sw|s/.test( i ) ? "Bottom" :
							/^e$/.test( i ) ? "Right" : "Left" ].join( "" );
	
						target.css( padPos, padWrapper );
	
						this._proportionallyResize();
					}
	
					this._handles = this._handles.add( this.handles[ i ] );
				}
			};
	
			// TODO: make renderAxis a prototype function
			this._renderAxis( this.element );
	
			this._handles = this._handles.add( this.element.find( ".ui-resizable-handle" ) );
			this._handles.disableSelection();
	
			this._handles.on( "mouseover", function() {
				if ( !that.resizing ) {
					if ( this.className ) {
						axis = this.className.match( /ui-resizable-(se|sw|ne|nw|n|e|s|w)/i );
					}
					that.axis = axis && axis[ 1 ] ? axis[ 1 ] : "se";
				}
			} );
	
			if ( o.autoHide ) {
				this._handles.hide();
				this._addClass( "ui-resizable-autohide" );
			}
		},
	
		_removeHandles: function() {
			this._handles.remove();
		},
	
		_mouseCapture: function( event ) {
			var i, handle,
				capture = false;
	
			for ( i in this.handles ) {
				handle = $( this.handles[ i ] )[ 0 ];
				if ( handle === event.target || $.contains( handle, event.target ) ) {
					capture = true;
				}
			}
	
			return !this.options.disabled && capture;
		},
	
		_mouseStart: function( event ) {
	
			var curleft, curtop, cursor,
				o = this.options,
				el = this.element;
	
			this.resizing = true;
	
			this._renderProxy();
	
			curleft = this._num( this.helper.css( "left" ) );
			curtop = this._num( this.helper.css( "top" ) );
	
			if ( o.containment ) {
				curleft += $( o.containment ).scrollLeft() || 0;
				curtop += $( o.containment ).scrollTop() || 0;
			}
	
			this.offset = this.helper.offset();
			this.position = { left: curleft, top: curtop };
	
			this.size = this._helper ? {
					width: this.helper.width(),
					height: this.helper.height()
				} : {
					width: el.width(),
					height: el.height()
				};
	
			this.originalSize = this._helper ? {
					width: el.outerWidth(),
					height: el.outerHeight()
				} : {
					width: el.width(),
					height: el.height()
				};
	
			this.sizeDiff = {
				width: el.outerWidth() - el.width(),
				height: el.outerHeight() - el.height()
			};
	
			this.originalPosition = { left: curleft, top: curtop };
			this.originalMousePosition = { left: event.pageX, top: event.pageY };
	
			this.aspectRatio = ( typeof o.aspectRatio === "number" ) ?
				o.aspectRatio :
				( ( this.originalSize.width / this.originalSize.height ) || 1 );
	
			cursor = $( ".ui-resizable-" + this.axis ).css( "cursor" );
			$( "body" ).css( "cursor", cursor === "auto" ? this.axis + "-resize" : cursor );
	
			this._addClass( "ui-resizable-resizing" );
			this._propagate( "start", event );
			return true;
		},
	
		_mouseDrag: function( event ) {
	
			var data, props,
				smp = this.originalMousePosition,
				a = this.axis,
				dx = ( event.pageX - smp.left ) || 0,
				dy = ( event.pageY - smp.top ) || 0,
				trigger = this._change[ a ];
	
			this._updatePrevProperties();
	
			if ( !trigger ) {
				return false;
			}
	
			data = trigger.apply( this, [ event, dx, dy ] );
	
			this._updateVirtualBoundaries( event.shiftKey );
			if ( this._aspectRatio || event.shiftKey ) {
				data = this._updateRatio( data, event );
			}
	
			data = this._respectSize( data, event );
	
			this._updateCache( data );
	
			this._propagate( "resize", event );
	
			props = this._applyChanges();
	
			if ( !this._helper && this._proportionallyResizeElements.length ) {
				this._proportionallyResize();
			}
	
			if ( !$.isEmptyObject( props ) ) {
				this._updatePrevProperties();
				this._trigger( "resize", event, this.ui() );
				this._applyChanges();
			}
	
			return false;
		},
	
		_mouseStop: function( event ) {
	
			this.resizing = false;
			var pr, ista, soffseth, soffsetw, s, left, top,
				o = this.options, that = this;
	
			if ( this._helper ) {
	
				pr = this._proportionallyResizeElements;
				ista = pr.length && ( /textarea/i ).test( pr[ 0 ].nodeName );
				soffseth = ista && this._hasScroll( pr[ 0 ], "left" ) ? 0 : that.sizeDiff.height;
				soffsetw = ista ? 0 : that.sizeDiff.width;
	
				s = {
					width: ( that.helper.width()  - soffsetw ),
					height: ( that.helper.height() - soffseth )
				};
				left = ( parseFloat( that.element.css( "left" ) ) +
					( that.position.left - that.originalPosition.left ) ) || null;
				top = ( parseFloat( that.element.css( "top" ) ) +
					( that.position.top - that.originalPosition.top ) ) || null;
	
				if ( !o.animate ) {
					this.element.css( $.extend( s, { top: top, left: left } ) );
				}
	
				that.helper.height( that.size.height );
				that.helper.width( that.size.width );
	
				if ( this._helper && !o.animate ) {
					this._proportionallyResize();
				}
			}
	
			$( "body" ).css( "cursor", "auto" );
	
			this._removeClass( "ui-resizable-resizing" );
	
			this._propagate( "stop", event );
	
			if ( this._helper ) {
				this.helper.remove();
			}
	
			return false;
	
		},
	
		_updatePrevProperties: function() {
			this.prevPosition = {
				top: this.position.top,
				left: this.position.left
			};
			this.prevSize = {
				width: this.size.width,
				height: this.size.height
			};
		},
	
		_applyChanges: function() {
			var props = {};
	
			if ( this.position.top !== this.prevPosition.top ) {
				props.top = this.position.top + "px";
			}
			if ( this.position.left !== this.prevPosition.left ) {
				props.left = this.position.left + "px";
			}
			if ( this.size.width !== this.prevSize.width ) {
				props.width = this.size.width + "px";
			}
			if ( this.size.height !== this.prevSize.height ) {
				props.height = this.size.height + "px";
			}
	
			this.helper.css( props );
	
			return props;
		},
	
		_updateVirtualBoundaries: function( forceAspectRatio ) {
			var pMinWidth, pMaxWidth, pMinHeight, pMaxHeight, b,
				o = this.options;
	
			b = {
				minWidth: this._isNumber( o.minWidth ) ? o.minWidth : 0,
				maxWidth: this._isNumber( o.maxWidth ) ? o.maxWidth : Infinity,
				minHeight: this._isNumber( o.minHeight ) ? o.minHeight : 0,
				maxHeight: this._isNumber( o.maxHeight ) ? o.maxHeight : Infinity
			};
	
			if ( this._aspectRatio || forceAspectRatio ) {
				pMinWidth = b.minHeight * this.aspectRatio;
				pMinHeight = b.minWidth / this.aspectRatio;
				pMaxWidth = b.maxHeight * this.aspectRatio;
				pMaxHeight = b.maxWidth / this.aspectRatio;
	
				if ( pMinWidth > b.minWidth ) {
					b.minWidth = pMinWidth;
				}
				if ( pMinHeight > b.minHeight ) {
					b.minHeight = pMinHeight;
				}
				if ( pMaxWidth < b.maxWidth ) {
					b.maxWidth = pMaxWidth;
				}
				if ( pMaxHeight < b.maxHeight ) {
					b.maxHeight = pMaxHeight;
				}
			}
			this._vBoundaries = b;
		},
	
		_updateCache: function( data ) {
			this.offset = this.helper.offset();
			if ( this._isNumber( data.left ) ) {
				this.position.left = data.left;
			}
			if ( this._isNumber( data.top ) ) {
				this.position.top = data.top;
			}
			if ( this._isNumber( data.height ) ) {
				this.size.height = data.height;
			}
			if ( this._isNumber( data.width ) ) {
				this.size.width = data.width;
			}
		},
	
		_updateRatio: function( data ) {
	
			var cpos = this.position,
				csize = this.size,
				a = this.axis;
	
			if ( this._isNumber( data.height ) ) {
				data.width = ( data.height * this.aspectRatio );
			} else if ( this._isNumber( data.width ) ) {
				data.height = ( data.width / this.aspectRatio );
			}
	
			if ( a === "sw" ) {
				data.left = cpos.left + ( csize.width - data.width );
				data.top = null;
			}
			if ( a === "nw" ) {
				data.top = cpos.top + ( csize.height - data.height );
				data.left = cpos.left + ( csize.width - data.width );
			}
	
			return data;
		},
	
		_respectSize: function( data ) {
	
			var o = this._vBoundaries,
				a = this.axis,
				ismaxw = this._isNumber( data.width ) && o.maxWidth && ( o.maxWidth < data.width ),
				ismaxh = this._isNumber( data.height ) && o.maxHeight && ( o.maxHeight < data.height ),
				isminw = this._isNumber( data.width ) && o.minWidth && ( o.minWidth > data.width ),
				isminh = this._isNumber( data.height ) && o.minHeight && ( o.minHeight > data.height ),
				dw = this.originalPosition.left + this.originalSize.width,
				dh = this.originalPosition.top + this.originalSize.height,
				cw = /sw|nw|w/.test( a ), ch = /nw|ne|n/.test( a );
			if ( isminw ) {
				data.width = o.minWidth;
			}
			if ( isminh ) {
				data.height = o.minHeight;
			}
			if ( ismaxw ) {
				data.width = o.maxWidth;
			}
			if ( ismaxh ) {
				data.height = o.maxHeight;
			}
	
			if ( isminw && cw ) {
				data.left = dw - o.minWidth;
			}
			if ( ismaxw && cw ) {
				data.left = dw - o.maxWidth;
			}
			if ( isminh && ch ) {
				data.top = dh - o.minHeight;
			}
			if ( ismaxh && ch ) {
				data.top = dh - o.maxHeight;
			}
	
			// Fixing jump error on top/left - bug #2330
			if ( !data.width && !data.height && !data.left && data.top ) {
				data.top = null;
			} else if ( !data.width && !data.height && !data.top && data.left ) {
				data.left = null;
			}
	
			return data;
		},
	
		_getPaddingPlusBorderDimensions: function( element ) {
			var i = 0,
				widths = [],
				borders = [
					element.css( "borderTopWidth" ),
					element.css( "borderRightWidth" ),
					element.css( "borderBottomWidth" ),
					element.css( "borderLeftWidth" )
				],
				paddings = [
					element.css( "paddingTop" ),
					element.css( "paddingRight" ),
					element.css( "paddingBottom" ),
					element.css( "paddingLeft" )
				];
	
			for ( ; i < 4; i++ ) {
				widths[ i ] = ( parseFloat( borders[ i ] ) || 0 );
				widths[ i ] += ( parseFloat( paddings[ i ] ) || 0 );
			}
	
			return {
				height: widths[ 0 ] + widths[ 2 ],
				width: widths[ 1 ] + widths[ 3 ]
			};
		},
	
		_proportionallyResize: function() {
	
			if ( !this._proportionallyResizeElements.length ) {
				return;
			}
	
			var prel,
				i = 0,
				element = this.helper || this.element;
	
			for ( ; i < this._proportionallyResizeElements.length; i++ ) {
	
				prel = this._proportionallyResizeElements[ i ];
	
				// TODO: Seems like a bug to cache this.outerDimensions
				// considering that we are in a loop.
				if ( !this.outerDimensions ) {
					this.outerDimensions = this._getPaddingPlusBorderDimensions( prel );
				}
	
				prel.css( {
					height: ( element.height() - this.outerDimensions.height ) || 0,
					width: ( element.width() - this.outerDimensions.width ) || 0
				} );
	
			}
	
		},
	
		_renderProxy: function() {
	
			var el = this.element, o = this.options;
			this.elementOffset = el.offset();
	
			if ( this._helper ) {
	
				this.helper = this.helper || $( "<div style='overflow:hidden;'></div>" );
	
				this._addClass( this.helper, this._helper );
				this.helper.css( {
					width: this.element.outerWidth(),
					height: this.element.outerHeight(),
					position: "absolute",
					left: this.elementOffset.left + "px",
					top: this.elementOffset.top + "px",
					zIndex: ++o.zIndex //TODO: Don't modify option
				} );
	
				this.helper
					.appendTo( "body" )
					.disableSelection();
	
			} else {
				this.helper = this.element;
			}
	
		},
	
		_change: {
			e: function( event, dx ) {
				return { width: this.originalSize.width + dx };
			},
			w: function( event, dx ) {
				var cs = this.originalSize, sp = this.originalPosition;
				return { left: sp.left + dx, width: cs.width - dx };
			},
			n: function( event, dx, dy ) {
				var cs = this.originalSize, sp = this.originalPosition;
				return { top: sp.top + dy, height: cs.height - dy };
			},
			s: function( event, dx, dy ) {
				return { height: this.originalSize.height + dy };
			},
			se: function( event, dx, dy ) {
				return $.extend( this._change.s.apply( this, arguments ),
					this._change.e.apply( this, [ event, dx, dy ] ) );
			},
			sw: function( event, dx, dy ) {
				return $.extend( this._change.s.apply( this, arguments ),
					this._change.w.apply( this, [ event, dx, dy ] ) );
			},
			ne: function( event, dx, dy ) {
				return $.extend( this._change.n.apply( this, arguments ),
					this._change.e.apply( this, [ event, dx, dy ] ) );
			},
			nw: function( event, dx, dy ) {
				return $.extend( this._change.n.apply( this, arguments ),
					this._change.w.apply( this, [ event, dx, dy ] ) );
			}
		},
	
		_propagate: function( n, event ) {
			$.ui.plugin.call( this, n, [ event, this.ui() ] );
			( n !== "resize" && this._trigger( n, event, this.ui() ) );
		},
	
		plugins: {},
	
		ui: function() {
			return {
				originalElement: this.originalElement,
				element: this.element,
				helper: this.helper,
				position: this.position,
				size: this.size,
				originalSize: this.originalSize,
				originalPosition: this.originalPosition
			};
		}
	
	} );
	
	/*
	 * Resizable Extensions
	 */
	
	$.ui.plugin.add( "resizable", "animate", {
	
		stop: function( event ) {
			var that = $( this ).resizable( "instance" ),
				o = that.options,
				pr = that._proportionallyResizeElements,
				ista = pr.length && ( /textarea/i ).test( pr[ 0 ].nodeName ),
				soffseth = ista && that._hasScroll( pr[ 0 ], "left" ) ? 0 : that.sizeDiff.height,
				soffsetw = ista ? 0 : that.sizeDiff.width,
				style = {
					width: ( that.size.width - soffsetw ),
					height: ( that.size.height - soffseth )
				},
				left = ( parseFloat( that.element.css( "left" ) ) +
					( that.position.left - that.originalPosition.left ) ) || null,
				top = ( parseFloat( that.element.css( "top" ) ) +
					( that.position.top - that.originalPosition.top ) ) || null;
	
			that.element.animate(
				$.extend( style, top && left ? { top: top, left: left } : {} ), {
					duration: o.animateDuration,
					easing: o.animateEasing,
					step: function() {
	
						var data = {
							width: parseFloat( that.element.css( "width" ) ),
							height: parseFloat( that.element.css( "height" ) ),
							top: parseFloat( that.element.css( "top" ) ),
							left: parseFloat( that.element.css( "left" ) )
						};
	
						if ( pr && pr.length ) {
							$( pr[ 0 ] ).css( { width: data.width, height: data.height } );
						}
	
						// Propagating resize, and updating values for each animation step
						that._updateCache( data );
						that._propagate( "resize", event );
	
					}
				}
			);
		}
	
	} );
	
	$.ui.plugin.add( "resizable", "containment", {
	
		start: function() {
			var element, p, co, ch, cw, width, height,
				that = $( this ).resizable( "instance" ),
				o = that.options,
				el = that.element,
				oc = o.containment,
				ce = ( oc instanceof $ ) ?
					oc.get( 0 ) :
					( /parent/.test( oc ) ) ? el.parent().get( 0 ) : oc;
	
			if ( !ce ) {
				return;
			}
	
			that.containerElement = $( ce );
	
			if ( /document/.test( oc ) || oc === document ) {
				that.containerOffset = {
					left: 0,
					top: 0
				};
				that.containerPosition = {
					left: 0,
					top: 0
				};
	
				that.parentData = {
					element: $( document ),
					left: 0,
					top: 0,
					width: $( document ).width(),
					height: $( document ).height() || document.body.parentNode.scrollHeight
				};
			} else {
				element = $( ce );
				p = [];
				$( [ "Top", "Right", "Left", "Bottom" ] ).each( function( i, name ) {
					p[ i ] = that._num( element.css( "padding" + name ) );
				} );
	
				that.containerOffset = element.offset();
				that.containerPosition = element.position();
				that.containerSize = {
					height: ( element.innerHeight() - p[ 3 ] ),
					width: ( element.innerWidth() - p[ 1 ] )
				};
	
				co = that.containerOffset;
				ch = that.containerSize.height;
				cw = that.containerSize.width;
				width = ( that._hasScroll ( ce, "left" ) ? ce.scrollWidth : cw );
				height = ( that._hasScroll ( ce ) ? ce.scrollHeight : ch ) ;
	
				that.parentData = {
					element: ce,
					left: co.left,
					top: co.top,
					width: width,
					height: height
				};
			}
		},
	
		resize: function( event ) {
			var woset, hoset, isParent, isOffsetRelative,
				that = $( this ).resizable( "instance" ),
				o = that.options,
				co = that.containerOffset,
				cp = that.position,
				pRatio = that._aspectRatio || event.shiftKey,
				cop = {
					top: 0,
					left: 0
				},
				ce = that.containerElement,
				continueResize = true;
	
			if ( ce[ 0 ] !== document && ( /static/ ).test( ce.css( "position" ) ) ) {
				cop = co;
			}
	
			if ( cp.left < ( that._helper ? co.left : 0 ) ) {
				that.size.width = that.size.width +
					( that._helper ?
						( that.position.left - co.left ) :
						( that.position.left - cop.left ) );
	
				if ( pRatio ) {
					that.size.height = that.size.width / that.aspectRatio;
					continueResize = false;
				}
				that.position.left = o.helper ? co.left : 0;
			}
	
			if ( cp.top < ( that._helper ? co.top : 0 ) ) {
				that.size.height = that.size.height +
					( that._helper ?
						( that.position.top - co.top ) :
						that.position.top );
	
				if ( pRatio ) {
					that.size.width = that.size.height * that.aspectRatio;
					continueResize = false;
				}
				that.position.top = that._helper ? co.top : 0;
			}
	
			isParent = that.containerElement.get( 0 ) === that.element.parent().get( 0 );
			isOffsetRelative = /relative|absolute/.test( that.containerElement.css( "position" ) );
	
			if ( isParent && isOffsetRelative ) {
				that.offset.left = that.parentData.left + that.position.left;
				that.offset.top = that.parentData.top + that.position.top;
			} else {
				that.offset.left = that.element.offset().left;
				that.offset.top = that.element.offset().top;
			}
	
			woset = Math.abs( that.sizeDiff.width +
				( that._helper ?
					that.offset.left - cop.left :
					( that.offset.left - co.left ) ) );
	
			hoset = Math.abs( that.sizeDiff.height +
				( that._helper ?
					that.offset.top - cop.top :
					( that.offset.top - co.top ) ) );
	
			if ( woset + that.size.width >= that.parentData.width ) {
				that.size.width = that.parentData.width - woset;
				if ( pRatio ) {
					that.size.height = that.size.width / that.aspectRatio;
					continueResize = false;
				}
			}
	
			if ( hoset + that.size.height >= that.parentData.height ) {
				that.size.height = that.parentData.height - hoset;
				if ( pRatio ) {
					that.size.width = that.size.height * that.aspectRatio;
					continueResize = false;
				}
			}
	
			if ( !continueResize ) {
				that.position.left = that.prevPosition.left;
				that.position.top = that.prevPosition.top;
				that.size.width = that.prevSize.width;
				that.size.height = that.prevSize.height;
			}
		},
	
		stop: function() {
			var that = $( this ).resizable( "instance" ),
				o = that.options,
				co = that.containerOffset,
				cop = that.containerPosition,
				ce = that.containerElement,
				helper = $( that.helper ),
				ho = helper.offset(),
				w = helper.outerWidth() - that.sizeDiff.width,
				h = helper.outerHeight() - that.sizeDiff.height;
	
			if ( that._helper && !o.animate && ( /relative/ ).test( ce.css( "position" ) ) ) {
				$( this ).css( {
					left: ho.left - cop.left - co.left,
					width: w,
					height: h
				} );
			}
	
			if ( that._helper && !o.animate && ( /static/ ).test( ce.css( "position" ) ) ) {
				$( this ).css( {
					left: ho.left - cop.left - co.left,
					width: w,
					height: h
				} );
			}
		}
	} );
	
	$.ui.plugin.add( "resizable", "alsoResize", {
	
		start: function() {
			var that = $( this ).resizable( "instance" ),
				o = that.options;
	
			$( o.alsoResize ).each( function() {
				var el = $( this );
				el.data( "ui-resizable-alsoresize", {
					width: parseFloat( el.width() ), height: parseFloat( el.height() ),
					left: parseFloat( el.css( "left" ) ), top: parseFloat( el.css( "top" ) )
				} );
			} );
		},
	
		resize: function( event, ui ) {
			var that = $( this ).resizable( "instance" ),
				o = that.options,
				os = that.originalSize,
				op = that.originalPosition,
				delta = {
					height: ( that.size.height - os.height ) || 0,
					width: ( that.size.width - os.width ) || 0,
					top: ( that.position.top - op.top ) || 0,
					left: ( that.position.left - op.left ) || 0
				};
	
				$( o.alsoResize ).each( function() {
					var el = $( this ), start = $( this ).data( "ui-resizable-alsoresize" ), style = {},
						css = el.parents( ui.originalElement[ 0 ] ).length ?
								[ "width", "height" ] :
								[ "width", "height", "top", "left" ];
	
					$.each( css, function( i, prop ) {
						var sum = ( start[ prop ] || 0 ) + ( delta[ prop ] || 0 );
						if ( sum && sum >= 0 ) {
							style[ prop ] = sum || null;
						}
					} );
	
					el.css( style );
				} );
		},
	
		stop: function() {
			$( this ).removeData( "ui-resizable-alsoresize" );
		}
	} );
	
	$.ui.plugin.add( "resizable", "ghost", {
	
		start: function() {
	
			var that = $( this ).resizable( "instance" ), cs = that.size;
	
			that.ghost = that.originalElement.clone();
			that.ghost.css( {
				opacity: 0.25,
				display: "block",
				position: "relative",
				height: cs.height,
				width: cs.width,
				margin: 0,
				left: 0,
				top: 0
			} );
	
			that._addClass( that.ghost, "ui-resizable-ghost" );
	
			// DEPRECATED
			// TODO: remove after 1.12
			if ( $.uiBackCompat !== false && typeof that.options.ghost === "string" ) {
	
				// Ghost option
				that.ghost.addClass( this.options.ghost );
			}
	
			that.ghost.appendTo( that.helper );
	
		},
	
		resize: function() {
			var that = $( this ).resizable( "instance" );
			if ( that.ghost ) {
				that.ghost.css( {
					position: "relative",
					height: that.size.height,
					width: that.size.width
				} );
			}
		},
	
		stop: function() {
			var that = $( this ).resizable( "instance" );
			if ( that.ghost && that.helper ) {
				that.helper.get( 0 ).removeChild( that.ghost.get( 0 ) );
			}
		}
	
	} );
	
	$.ui.plugin.add( "resizable", "grid", {
	
		resize: function() {
			var outerDimensions,
				that = $( this ).resizable( "instance" ),
				o = that.options,
				cs = that.size,
				os = that.originalSize,
				op = that.originalPosition,
				a = that.axis,
				grid = typeof o.grid === "number" ? [ o.grid, o.grid ] : o.grid,
				gridX = ( grid[ 0 ] || 1 ),
				gridY = ( grid[ 1 ] || 1 ),
				ox = Math.round( ( cs.width - os.width ) / gridX ) * gridX,
				oy = Math.round( ( cs.height - os.height ) / gridY ) * gridY,
				newWidth = os.width + ox,
				newHeight = os.height + oy,
				isMaxWidth = o.maxWidth && ( o.maxWidth < newWidth ),
				isMaxHeight = o.maxHeight && ( o.maxHeight < newHeight ),
				isMinWidth = o.minWidth && ( o.minWidth > newWidth ),
				isMinHeight = o.minHeight && ( o.minHeight > newHeight );
	
			o.grid = grid;
	
			if ( isMinWidth ) {
				newWidth += gridX;
			}
			if ( isMinHeight ) {
				newHeight += gridY;
			}
			if ( isMaxWidth ) {
				newWidth -= gridX;
			}
			if ( isMaxHeight ) {
				newHeight -= gridY;
			}
	
			if ( /^(se|s|e)$/.test( a ) ) {
				that.size.width = newWidth;
				that.size.height = newHeight;
			} else if ( /^(ne)$/.test( a ) ) {
				that.size.width = newWidth;
				that.size.height = newHeight;
				that.position.top = op.top - oy;
			} else if ( /^(sw)$/.test( a ) ) {
				that.size.width = newWidth;
				that.size.height = newHeight;
				that.position.left = op.left - ox;
			} else {
				if ( newHeight - gridY <= 0 || newWidth - gridX <= 0 ) {
					outerDimensions = that._getPaddingPlusBorderDimensions( this );
				}
	
				if ( newHeight - gridY > 0 ) {
					that.size.height = newHeight;
					that.position.top = op.top - oy;
				} else {
					newHeight = gridY - outerDimensions.height;
					that.size.height = newHeight;
					that.position.top = op.top + os.height - newHeight;
				}
				if ( newWidth - gridX > 0 ) {
					that.size.width = newWidth;
					that.position.left = op.left - ox;
				} else {
					newWidth = gridX - outerDimensions.width;
					that.size.width = newWidth;
					that.position.left = op.left + os.width - newWidth;
				}
			}
		}
	
	} );
	
	return $.ui.resizable;
	
	} ) );


/***/ }),
/* 40 */
/***/ (function(module, exports, __webpack_require__) {

	var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!
	 * jQuery UI Disable Selection 1.12.1
	 * http://jqueryui.com
	 *
	 * Copyright jQuery Foundation and other contributors
	 * Released under the MIT license.
	 * http://jquery.org/license
	 */
	
	//>>label: disableSelection
	//>>group: Core
	//>>description: Disable selection of text content within the set of matched elements.
	//>>docs: http://api.jqueryui.com/disableSelection/
	
	// This file is deprecated
	( function( factory ) {
		if ( true ) {
	
			// AMD. Register as an anonymous module.
			!(__WEBPACK_AMD_DEFINE_ARRAY__ = [ __webpack_require__(12), __webpack_require__(24) ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
		} else {
	
			// Browser globals
			factory( jQuery );
		}
	} ( function( $ ) {
	
	return $.fn.extend( {
		disableSelection: ( function() {
			var eventType = "onselectstart" in document.createElement( "div" ) ?
				"selectstart" :
				"mousedown";
	
			return function() {
				return this.on( eventType + ".ui-disableSelection", function( event ) {
					event.preventDefault();
				} );
			};
		} )(),
	
		enableSelection: function() {
			return this.off( ".ui-disableSelection" );
		}
	} );
	
	} ) );


/***/ }),
/* 41 */
/***/ (function(module, exports, __webpack_require__) {

	var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!
	 * jQuery UI Focusable 1.12.1
	 * http://jqueryui.com
	 *
	 * Copyright jQuery Foundation and other contributors
	 * Released under the MIT license.
	 * http://jquery.org/license
	 */
	
	//>>label: :focusable Selector
	//>>group: Core
	//>>description: Selects elements which can be focused.
	//>>docs: http://api.jqueryui.com/focusable-selector/
	
	( function( factory ) {
		if ( true ) {
	
			// AMD. Register as an anonymous module.
			!(__WEBPACK_AMD_DEFINE_ARRAY__ = [ __webpack_require__(12), __webpack_require__(24) ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
		} else {
	
			// Browser globals
			factory( jQuery );
		}
	} ( function( $ ) {
	
	// Selectors
	$.ui.focusable = function( element, hasTabindex ) {
		var map, mapName, img, focusableIfVisible, fieldset,
			nodeName = element.nodeName.toLowerCase();
	
		if ( "area" === nodeName ) {
			map = element.parentNode;
			mapName = map.name;
			if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) {
				return false;
			}
			img = $( "img[usemap='#" + mapName + "']" );
			return img.length > 0 && img.is( ":visible" );
		}
	
		if ( /^(input|select|textarea|button|object)$/.test( nodeName ) ) {
			focusableIfVisible = !element.disabled;
	
			if ( focusableIfVisible ) {
	
				// Form controls within a disabled fieldset are disabled.
				// However, controls within the fieldset's legend do not get disabled.
				// Since controls generally aren't placed inside legends, we skip
				// this portion of the check.
				fieldset = $( element ).closest( "fieldset" )[ 0 ];
				if ( fieldset ) {
					focusableIfVisible = !fieldset.disabled;
				}
			}
		} else if ( "a" === nodeName ) {
			focusableIfVisible = element.href || hasTabindex;
		} else {
			focusableIfVisible = hasTabindex;
		}
	
		return focusableIfVisible && $( element ).is( ":visible" ) && visible( $( element ) );
	};
	
	// Support: IE 8 only
	// IE 8 doesn't resolve inherit to visible/hidden for computed values
	function visible( element ) {
		var visibility = element.css( "visibility" );
		while ( visibility === "inherit" ) {
			element = element.parent();
			visibility = element.css( "visibility" );
		}
		return visibility !== "hidden";
	}
	
	$.extend( $.expr[ ":" ], {
		focusable: function( element ) {
			return $.ui.focusable( element, $.attr( element, "tabindex" ) != null );
		}
	} );
	
	return $.ui.focusable;
	
	} ) );


/***/ }),
/* 42 */
/***/ (function(module, exports, __webpack_require__) {

	var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!
	 * jQuery UI Position 1.12.1
	 * http://jqueryui.com
	 *
	 * Copyright jQuery Foundation and other contributors
	 * Released under the MIT license.
	 * http://jquery.org/license
	 *
	 * http://api.jqueryui.com/position/
	 */
	
	//>>label: Position
	//>>group: Core
	//>>description: Positions elements relative to other elements.
	//>>docs: http://api.jqueryui.com/position/
	//>>demos: http://jqueryui.com/position/
	
	( function( factory ) {
		if ( true ) {
	
			// AMD. Register as an anonymous module.
			!(__WEBPACK_AMD_DEFINE_ARRAY__ = [ __webpack_require__(12), __webpack_require__(24) ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
		} else {
	
			// Browser globals
			factory( jQuery );
		}
	}( function( $ ) {
	( function() {
	var cachedScrollbarWidth,
		max = Math.max,
		abs = Math.abs,
		rhorizontal = /left|center|right/,
		rvertical = /top|center|bottom/,
		roffset = /[\+\-]\d+(\.[\d]+)?%?/,
		rposition = /^\w+/,
		rpercent = /%$/,
		_position = $.fn.position;
	
	function getOffsets( offsets, width, height ) {
		return [
			parseFloat( offsets[ 0 ] ) * ( rpercent.test( offsets[ 0 ] ) ? width / 100 : 1 ),
			parseFloat( offsets[ 1 ] ) * ( rpercent.test( offsets[ 1 ] ) ? height / 100 : 1 )
		];
	}
	
	function parseCss( element, property ) {
		return parseInt( $.css( element, property ), 10 ) || 0;
	}
	
	function getDimensions( elem ) {
		var raw = elem[ 0 ];
		if ( raw.nodeType === 9 ) {
			return {
				width: elem.width(),
				height: elem.height(),
				offset: { top: 0, left: 0 }
			};
		}
		if ( $.isWindow( raw ) ) {
			return {
				width: elem.width(),
				height: elem.height(),
				offset: { top: elem.scrollTop(), left: elem.scrollLeft() }
			};
		}
		if ( raw.preventDefault ) {
			return {
				width: 0,
				height: 0,
				offset: { top: raw.pageY, left: raw.pageX }
			};
		}
		return {
			width: elem.outerWidth(),
			height: elem.outerHeight(),
			offset: elem.offset()
		};
	}
	
	$.position = {
		scrollbarWidth: function() {
			if ( cachedScrollbarWidth !== undefined ) {
				return cachedScrollbarWidth;
			}
			var w1, w2,
				div = $( "<div " +
					"style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'>" +
					"<div style='height:100px;width:auto;'></div></div>" ),
				innerDiv = div.children()[ 0 ];
	
			$( "body" ).append( div );
			w1 = innerDiv.offsetWidth;
			div.css( "overflow", "scroll" );
	
			w2 = innerDiv.offsetWidth;
	
			if ( w1 === w2 ) {
				w2 = div[ 0 ].clientWidth;
			}
	
			div.remove();
	
			return ( cachedScrollbarWidth = w1 - w2 );
		},
		getScrollInfo: function( within ) {
			var overflowX = within.isWindow || within.isDocument ? "" :
					within.element.css( "overflow-x" ),
				overflowY = within.isWindow || within.isDocument ? "" :
					within.element.css( "overflow-y" ),
				hasOverflowX = overflowX === "scroll" ||
					( overflowX === "auto" && within.width < within.element[ 0 ].scrollWidth ),
				hasOverflowY = overflowY === "scroll" ||
					( overflowY === "auto" && within.height < within.element[ 0 ].scrollHeight );
			return {
				width: hasOverflowY ? $.position.scrollbarWidth() : 0,
				height: hasOverflowX ? $.position.scrollbarWidth() : 0
			};
		},
		getWithinInfo: function( element ) {
			var withinElement = $( element || window ),
				isWindow = $.isWindow( withinElement[ 0 ] ),
				isDocument = !!withinElement[ 0 ] && withinElement[ 0 ].nodeType === 9,
				hasOffset = !isWindow && !isDocument;
			return {
				element: withinElement,
				isWindow: isWindow,
				isDocument: isDocument,
				offset: hasOffset ? $( element ).offset() : { left: 0, top: 0 },
				scrollLeft: withinElement.scrollLeft(),
				scrollTop: withinElement.scrollTop(),
				width: withinElement.outerWidth(),
				height: withinElement.outerHeight()
			};
		}
	};
	
	$.fn.position = function( options ) {
		if ( !options || !options.of ) {
			return _position.apply( this, arguments );
		}
	
		// Make a copy, we don't want to modify arguments
		options = $.extend( {}, options );
	
		var atOffset, targetWidth, targetHeight, targetOffset, basePosition, dimensions,
			target = $( options.of ),
			within = $.position.getWithinInfo( options.within ),
			scrollInfo = $.position.getScrollInfo( within ),
			collision = ( options.collision || "flip" ).split( " " ),
			offsets = {};
	
		dimensions = getDimensions( target );
		if ( target[ 0 ].preventDefault ) {
	
			// Force left top to allow flipping
			options.at = "left top";
		}
		targetWidth = dimensions.width;
		targetHeight = dimensions.height;
		targetOffset = dimensions.offset;
	
		// Clone to reuse original targetOffset later
		basePosition = $.extend( {}, targetOffset );
	
		// Force my and at to have valid horizontal and vertical positions
		// if a value is missing or invalid, it will be converted to center
		$.each( [ "my", "at" ], function() {
			var pos = ( options[ this ] || "" ).split( " " ),
				horizontalOffset,
				verticalOffset;
	
			if ( pos.length === 1 ) {
				pos = rhorizontal.test( pos[ 0 ] ) ?
					pos.concat( [ "center" ] ) :
					rvertical.test( pos[ 0 ] ) ?
						[ "center" ].concat( pos ) :
						[ "center", "center" ];
			}
			pos[ 0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : "center";
			pos[ 1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : "center";
	
			// Calculate offsets
			horizontalOffset = roffset.exec( pos[ 0 ] );
			verticalOffset = roffset.exec( pos[ 1 ] );
			offsets[ this ] = [
				horizontalOffset ? horizontalOffset[ 0 ] : 0,
				verticalOffset ? verticalOffset[ 0 ] : 0
			];
	
			// Reduce to just the positions without the offsets
			options[ this ] = [
				rposition.exec( pos[ 0 ] )[ 0 ],
				rposition.exec( pos[ 1 ] )[ 0 ]
			];
		} );
	
		// Normalize collision option
		if ( collision.length === 1 ) {
			collision[ 1 ] = collision[ 0 ];
		}
	
		if ( options.at[ 0 ] === "right" ) {
			basePosition.left += targetWidth;
		} else if ( options.at[ 0 ] === "center" ) {
			basePosition.left += targetWidth / 2;
		}
	
		if ( options.at[ 1 ] === "bottom" ) {
			basePosition.top += targetHeight;
		} else if ( options.at[ 1 ] === "center" ) {
			basePosition.top += targetHeight / 2;
		}
	
		atOffset = getOffsets( offsets.at, targetWidth, targetHeight );
		basePosition.left += atOffset[ 0 ];
		basePosition.top += atOffset[ 1 ];
	
		return this.each( function() {
			var collisionPosition, using,
				elem = $( this ),
				elemWidth = elem.outerWidth(),
				elemHeight = elem.outerHeight(),
				marginLeft = parseCss( this, "marginLeft" ),
				marginTop = parseCss( this, "marginTop" ),
				collisionWidth = elemWidth + marginLeft + parseCss( this, "marginRight" ) +
					scrollInfo.width,
				collisionHeight = elemHeight + marginTop + parseCss( this, "marginBottom" ) +
					scrollInfo.height,
				position = $.extend( {}, basePosition ),
				myOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() );
	
			if ( options.my[ 0 ] === "right" ) {
				position.left -= elemWidth;
			} else if ( options.my[ 0 ] === "center" ) {
				position.left -= elemWidth / 2;
			}
	
			if ( options.my[ 1 ] === "bottom" ) {
				position.top -= elemHeight;
			} else if ( options.my[ 1 ] === "center" ) {
				position.top -= elemHeight / 2;
			}
	
			position.left += myOffset[ 0 ];
			position.top += myOffset[ 1 ];
	
			collisionPosition = {
				marginLeft: marginLeft,
				marginTop: marginTop
			};
	
			$.each( [ "left", "top" ], function( i, dir ) {
				if ( $.ui.position[ collision[ i ] ] ) {
					$.ui.position[ collision[ i ] ][ dir ]( position, {
						targetWidth: targetWidth,
						targetHeight: targetHeight,
						elemWidth: elemWidth,
						elemHeight: elemHeight,
						collisionPosition: collisionPosition,
						collisionWidth: collisionWidth,
						collisionHeight: collisionHeight,
						offset: [ atOffset[ 0 ] + myOffset[ 0 ], atOffset [ 1 ] + myOffset[ 1 ] ],
						my: options.my,
						at: options.at,
						within: within,
						elem: elem
					} );
				}
			} );
	
			if ( options.using ) {
	
				// Adds feedback as second argument to using callback, if present
				using = function( props ) {
					var left = targetOffset.left - position.left,
						right = left + targetWidth - elemWidth,
						top = targetOffset.top - position.top,
						bottom = top + targetHeight - elemHeight,
						feedback = {
							target: {
								element: target,
								left: targetOffset.left,
								top: targetOffset.top,
								width: targetWidth,
								height: targetHeight
							},
							element: {
								element: elem,
								left: position.left,
								top: position.top,
								width: elemWidth,
								height: elemHeight
							},
							horizontal: right < 0 ? "left" : left > 0 ? "right" : "center",
							vertical: bottom < 0 ? "top" : top > 0 ? "bottom" : "middle"
						};
					if ( targetWidth < elemWidth && abs( left + right ) < targetWidth ) {
						feedback.horizontal = "center";
					}
					if ( targetHeight < elemHeight && abs( top + bottom ) < targetHeight ) {
						feedback.vertical = "middle";
					}
					if ( max( abs( left ), abs( right ) ) > max( abs( top ), abs( bottom ) ) ) {
						feedback.important = "horizontal";
					} else {
						feedback.important = "vertical";
					}
					options.using.call( this, props, feedback );
				};
			}
	
			elem.offset( $.extend( position, { using: using } ) );
		} );
	};
	
	$.ui.position = {
		fit: {
			left: function( position, data ) {
				var within = data.within,
					withinOffset = within.isWindow ? within.scrollLeft : within.offset.left,
					outerWidth = within.width,
					collisionPosLeft = position.left - data.collisionPosition.marginLeft,
					overLeft = withinOffset - collisionPosLeft,
					overRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset,
					newOverRight;
	
				// Element is wider than within
				if ( data.collisionWidth > outerWidth ) {
	
					// Element is initially over the left side of within
					if ( overLeft > 0 && overRight <= 0 ) {
						newOverRight = position.left + overLeft + data.collisionWidth - outerWidth -
							withinOffset;
						position.left += overLeft - newOverRight;
	
					// Element is initially over right side of within
					} else if ( overRight > 0 && overLeft <= 0 ) {
						position.left = withinOffset;
	
					// Element is initially over both left and right sides of within
					} else {
						if ( overLeft > overRight ) {
							position.left = withinOffset + outerWidth - data.collisionWidth;
						} else {
							position.left = withinOffset;
						}
					}
	
				// Too far left -> align with left edge
				} else if ( overLeft > 0 ) {
					position.left += overLeft;
	
				// Too far right -> align with right edge
				} else if ( overRight > 0 ) {
					position.left -= overRight;
	
				// Adjust based on position and margin
				} else {
					position.left = max( position.left - collisionPosLeft, position.left );
				}
			},
			top: function( position, data ) {
				var within = data.within,
					withinOffset = within.isWindow ? within.scrollTop : within.offset.top,
					outerHeight = data.within.height,
					collisionPosTop = position.top - data.collisionPosition.marginTop,
					overTop = withinOffset - collisionPosTop,
					overBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset,
					newOverBottom;
	
				// Element is taller than within
				if ( data.collisionHeight > outerHeight ) {
	
					// Element is initially over the top of within
					if ( overTop > 0 && overBottom <= 0 ) {
						newOverBottom = position.top + overTop + data.collisionHeight - outerHeight -
							withinOffset;
						position.top += overTop - newOverBottom;
	
					// Element is initially over bottom of within
					} else if ( overBottom > 0 && overTop <= 0 ) {
						position.top = withinOffset;
	
					// Element is initially over both top and bottom of within
					} else {
						if ( overTop > overBottom ) {
							position.top = withinOffset + outerHeight - data.collisionHeight;
						} else {
							position.top = withinOffset;
						}
					}
	
				// Too far up -> align with top
				} else if ( overTop > 0 ) {
					position.top += overTop;
	
				// Too far down -> align with bottom edge
				} else if ( overBottom > 0 ) {
					position.top -= overBottom;
	
				// Adjust based on position and margin
				} else {
					position.top = max( position.top - collisionPosTop, position.top );
				}
			}
		},
		flip: {
			left: function( position, data ) {
				var within = data.within,
					withinOffset = within.offset.left + within.scrollLeft,
					outerWidth = within.width,
					offsetLeft = within.isWindow ? within.scrollLeft : within.offset.left,
					collisionPosLeft = position.left - data.collisionPosition.marginLeft,
					overLeft = collisionPosLeft - offsetLeft,
					overRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft,
					myOffset = data.my[ 0 ] === "left" ?
						-data.elemWidth :
						data.my[ 0 ] === "right" ?
							data.elemWidth :
							0,
					atOffset = data.at[ 0 ] === "left" ?
						data.targetWidth :
						data.at[ 0 ] === "right" ?
							-data.targetWidth :
							0,
					offset = -2 * data.offset[ 0 ],
					newOverRight,
					newOverLeft;
	
				if ( overLeft < 0 ) {
					newOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth -
						outerWidth - withinOffset;
					if ( newOverRight < 0 || newOverRight < abs( overLeft ) ) {
						position.left += myOffset + atOffset + offset;
					}
				} else if ( overRight > 0 ) {
					newOverLeft = position.left - data.collisionPosition.marginLeft + myOffset +
						atOffset + offset - offsetLeft;
					if ( newOverLeft > 0 || abs( newOverLeft ) < overRight ) {
						position.left += myOffset + atOffset + offset;
					}
				}
			},
			top: function( position, data ) {
				var within = data.within,
					withinOffset = within.offset.top + within.scrollTop,
					outerHeight = within.height,
					offsetTop = within.isWindow ? within.scrollTop : within.offset.top,
					collisionPosTop = position.top - data.collisionPosition.marginTop,
					overTop = collisionPosTop - offsetTop,
					overBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop,
					top = data.my[ 1 ] === "top",
					myOffset = top ?
						-data.elemHeight :
						data.my[ 1 ] === "bottom" ?
							data.elemHeight :
							0,
					atOffset = data.at[ 1 ] === "top" ?
						data.targetHeight :
						data.at[ 1 ] === "bottom" ?
							-data.targetHeight :
							0,
					offset = -2 * data.offset[ 1 ],
					newOverTop,
					newOverBottom;
				if ( overTop < 0 ) {
					newOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight -
						outerHeight - withinOffset;
					if ( newOverBottom < 0 || newOverBottom < abs( overTop ) ) {
						position.top += myOffset + atOffset + offset;
					}
				} else if ( overBottom > 0 ) {
					newOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset +
						offset - offsetTop;
					if ( newOverTop > 0 || abs( newOverTop ) < overBottom ) {
						position.top += myOffset + atOffset + offset;
					}
				}
			}
		},
		flipfit: {
			left: function() {
				$.ui.position.flip.left.apply( this, arguments );
				$.ui.position.fit.left.apply( this, arguments );
			},
			top: function() {
				$.ui.position.flip.top.apply( this, arguments );
				$.ui.position.fit.top.apply( this, arguments );
			}
		}
	};
	
	} )();
	
	return $.ui.position;
	
	} ) );


/***/ }),
/* 43 */
/***/ (function(module, exports, __webpack_require__) {

	var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!
	 * jQuery UI Tabbable 1.12.1
	 * http://jqueryui.com
	 *
	 * Copyright jQuery Foundation and other contributors
	 * Released under the MIT license.
	 * http://jquery.org/license
	 */
	
	//>>label: :tabbable Selector
	//>>group: Core
	//>>description: Selects elements which can be tabbed to.
	//>>docs: http://api.jqueryui.com/tabbable-selector/
	
	( function( factory ) {
		if ( true ) {
	
			// AMD. Register as an anonymous module.
			!(__WEBPACK_AMD_DEFINE_ARRAY__ = [ __webpack_require__(12), __webpack_require__(24), __webpack_require__(41) ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
		} else {
	
			// Browser globals
			factory( jQuery );
		}
	} ( function( $ ) {
	
	return $.extend( $.expr[ ":" ], {
		tabbable: function( element ) {
			var tabIndex = $.attr( element, "tabindex" ),
				hasTabindex = tabIndex != null;
			return ( !hasTabindex || tabIndex >= 0 ) && $.ui.focusable( element, hasTabindex );
		}
	} );
	
	} ) );


/***/ }),
/* 44 */
/***/ (function(module, exports, __webpack_require__) {

	var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!
	 * jQuery UI Unique ID 1.12.1
	 * http://jqueryui.com
	 *
	 * Copyright jQuery Foundation and other contributors
	 * Released under the MIT license.
	 * http://jquery.org/license
	 */
	
	//>>label: uniqueId
	//>>group: Core
	//>>description: Functions to generate and remove uniqueId's
	//>>docs: http://api.jqueryui.com/uniqueId/
	
	( function( factory ) {
		if ( true ) {
	
			// AMD. Register as an anonymous module.
			!(__WEBPACK_AMD_DEFINE_ARRAY__ = [ __webpack_require__(12), __webpack_require__(24) ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
		} else {
	
			// Browser globals
			factory( jQuery );
		}
	} ( function( $ ) {
	
	return $.fn.extend( {
		uniqueId: ( function() {
			var uuid = 0;
	
			return function() {
				return this.each( function() {
					if ( !this.id ) {
						this.id = "ui-id-" + ( ++uuid );
					}
				} );
			};
		} )(),
	
		removeUniqueId: function() {
			return this.each( function() {
				if ( /^ui-id-\d+$/.test( this.id ) ) {
					$( this ).removeAttr( "id" );
				}
			} );
		}
	} );
	
	} ) );


/***/ }),
/* 45 */
/***/ (function(module, exports, __webpack_require__) {

	// style-loader: Adds some css to the DOM by adding a <style> tag
	
	// load the styles
	var content = __webpack_require__(46);
	if(typeof content === 'string') content = [[module.id, content, '']];
	// add the styles to the DOM
	var update = __webpack_require__(75)(content, {});
	if(content.locals) module.exports = content.locals;
	// Hot Module Replacement
	if(false) {
		// When the styles change, update the <style> tags
		if(!content.locals) {
			module.hot.accept("!!../../../css-loader/index.js!./all.css", function() {
				var newContent = require("!!../../../css-loader/index.js!./all.css");
				if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];
				update(newContent);
			});
		}
		// When the module is disposed, remove the <style> tags
		module.hot.dispose(function() { update(); });
	}

/***/ }),
/* 46 */
/***/ (function(module, exports, __webpack_require__) {

	exports = module.exports = __webpack_require__(47)();
	// imports
	exports.i(__webpack_require__(48), "");
	exports.i(__webpack_require__(68), "");
	
	// module
	exports.push([module.id, "/*!\n * jQuery UI CSS Framework 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/category/theming/\n */\n", ""]);
	
	// exports


/***/ }),
/* 47 */
/***/ (function(module, exports) {

	/*
		MIT License http://www.opensource.org/licenses/mit-license.php
		Author Tobias Koppers @sokra
	*/
	// css base code, injected by the css-loader
	module.exports = function() {
		var list = [];
	
		// return the list of modules as css string
		list.toString = function toString() {
			var result = [];
			for(var i = 0; i < this.length; i++) {
				var item = this[i];
				if(item[2]) {
					result.push("@media " + item[2] + "{" + item[1] + "}");
				} else {
					result.push(item[1]);
				}
			}
			return result.join("");
		};
	
		// import a list of modules into the list
		list.i = function(modules, mediaQuery) {
			if(typeof modules === "string")
				modules = [[null, modules, ""]];
			var alreadyImportedModules = {};
			for(var i = 0; i < this.length; i++) {
				var id = this[i][0];
				if(typeof id === "number")
					alreadyImportedModules[id] = true;
			}
			for(i = 0; i < modules.length; i++) {
				var item = modules[i];
				// skip already imported module
				// this implementation is not 100% perfect for weird media query combinations
				//  when a module is imported multiple times with different media queries.
				//  I hope this will never occur (Hey this way we have smaller bundles)
				if(typeof item[0] !== "number" || !alreadyImportedModules[item[0]]) {
					if(mediaQuery && !item[2]) {
						item[2] = mediaQuery;
					} else if(mediaQuery) {
						item[2] = "(" + item[2] + ") and (" + mediaQuery + ")";
					}
					list.push(item);
				}
			}
		};
		return list;
	};


/***/ }),
/* 48 */
/***/ (function(module, exports, __webpack_require__) {

	exports = module.exports = __webpack_require__(47)();
	// imports
	exports.i(__webpack_require__(49), "");
	exports.i(__webpack_require__(50), "");
	exports.i(__webpack_require__(51), "");
	exports.i(__webpack_require__(52), "");
	exports.i(__webpack_require__(53), "");
	exports.i(__webpack_require__(54), "");
	exports.i(__webpack_require__(55), "");
	exports.i(__webpack_require__(56), "");
	exports.i(__webpack_require__(57), "");
	exports.i(__webpack_require__(58), "");
	exports.i(__webpack_require__(59), "");
	exports.i(__webpack_require__(60), "");
	exports.i(__webpack_require__(61), "");
	exports.i(__webpack_require__(62), "");
	exports.i(__webpack_require__(63), "");
	exports.i(__webpack_require__(64), "");
	exports.i(__webpack_require__(65), "");
	exports.i(__webpack_require__(66), "");
	exports.i(__webpack_require__(67), "");
	
	// module
	exports.push([module.id, "/*!\n * jQuery UI CSS Framework 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/category/theming/\n */\n", ""]);
	
	// exports


/***/ }),
/* 49 */
/***/ (function(module, exports, __webpack_require__) {

	exports = module.exports = __webpack_require__(47)();
	// imports
	
	
	// module
	exports.push([module.id, "/*!\n * jQuery UI CSS Framework 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/category/theming/\n */\n\n/* Layout helpers\n----------------------------------*/\n.ui-helper-hidden {\n\tdisplay: none;\n}\n.ui-helper-hidden-accessible {\n\tborder: 0;\n\tclip: rect(0 0 0 0);\n\theight: 1px;\n\tmargin: -1px;\n\toverflow: hidden;\n\tpadding: 0;\n\tposition: absolute;\n\twidth: 1px;\n}\n.ui-helper-reset {\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n\toutline: 0;\n\tline-height: 1.3;\n\ttext-decoration: none;\n\tfont-size: 100%;\n\tlist-style: none;\n}\n.ui-helper-clearfix:before,\n.ui-helper-clearfix:after {\n\tcontent: \"\";\n\tdisplay: table;\n\tborder-collapse: collapse;\n}\n.ui-helper-clearfix:after {\n\tclear: both;\n}\n.ui-helper-zfix {\n\twidth: 100%;\n\theight: 100%;\n\ttop: 0;\n\tleft: 0;\n\tposition: absolute;\n\topacity: 0;\n\tfilter:Alpha(Opacity=0); /* support: IE8 */\n}\n\n.ui-front {\n\tz-index: 100;\n}\n\n\n/* Interaction Cues\n----------------------------------*/\n.ui-state-disabled {\n\tcursor: default !important;\n\tpointer-events: none;\n}\n\n\n/* Icons\n----------------------------------*/\n.ui-icon {\n\tdisplay: inline-block;\n\tvertical-align: middle;\n\tmargin-top: -.25em;\n\tposition: relative;\n\ttext-indent: -99999px;\n\toverflow: hidden;\n\tbackground-repeat: no-repeat;\n}\n\n.ui-widget-icon-block {\n\tleft: 50%;\n\tmargin-left: -8px;\n\tdisplay: block;\n}\n\n/* Misc visuals\n----------------------------------*/\n\n/* Overlays */\n.ui-widget-overlay {\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\twidth: 100%;\n\theight: 100%;\n}\n", ""]);
	
	// exports


/***/ }),
/* 50 */
/***/ (function(module, exports, __webpack_require__) {

	exports = module.exports = __webpack_require__(47)();
	// imports
	
	
	// module
	exports.push([module.id, "/*!\n * jQuery UI Accordion 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/accordion/#theming\n */\n.ui-accordion .ui-accordion-header {\n\tdisplay: block;\n\tcursor: pointer;\n\tposition: relative;\n\tmargin: 2px 0 0 0;\n\tpadding: .5em .5em .5em .7em;\n\tfont-size: 100%;\n}\n.ui-accordion .ui-accordion-content {\n\tpadding: 1em 2.2em;\n\tborder-top: 0;\n\toverflow: auto;\n}\n", ""]);
	
	// exports


/***/ }),
/* 51 */
/***/ (function(module, exports, __webpack_require__) {

	exports = module.exports = __webpack_require__(47)();
	// imports
	
	
	// module
	exports.push([module.id, "/*!\n * jQuery UI Autocomplete 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/autocomplete/#theming\n */\n.ui-autocomplete {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tcursor: default;\n}\n", ""]);
	
	// exports


/***/ }),
/* 52 */
/***/ (function(module, exports, __webpack_require__) {

	exports = module.exports = __webpack_require__(47)();
	// imports
	
	
	// module
	exports.push([module.id, "/*!\n * jQuery UI Button 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/button/#theming\n */\n.ui-button {\n\tpadding: .4em 1em;\n\tdisplay: inline-block;\n\tposition: relative;\n\tline-height: normal;\n\tmargin-right: .1em;\n\tcursor: pointer;\n\tvertical-align: middle;\n\ttext-align: center;\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n\n\t/* Support: IE <= 11 */\n\toverflow: visible;\n}\n\n.ui-button,\n.ui-button:link,\n.ui-button:visited,\n.ui-button:hover,\n.ui-button:active {\n\ttext-decoration: none;\n}\n\n/* to make room for the icon, a width needs to be set here */\n.ui-button-icon-only {\n\twidth: 2em;\n\tbox-sizing: border-box;\n\ttext-indent: -9999px;\n\twhite-space: nowrap;\n}\n\n/* no icon support for input elements */\ninput.ui-button.ui-button-icon-only {\n\ttext-indent: 0;\n}\n\n/* button icon element(s) */\n.ui-button-icon-only .ui-icon {\n\tposition: absolute;\n\ttop: 50%;\n\tleft: 50%;\n\tmargin-top: -8px;\n\tmargin-left: -8px;\n}\n\n.ui-button.ui-icon-notext .ui-icon {\n\tpadding: 0;\n\twidth: 2.1em;\n\theight: 2.1em;\n\ttext-indent: -9999px;\n\twhite-space: nowrap;\n\n}\n\ninput.ui-button.ui-icon-notext .ui-icon {\n\twidth: auto;\n\theight: auto;\n\ttext-indent: 0;\n\twhite-space: normal;\n\tpadding: .4em 1em;\n}\n\n/* workarounds */\n/* Support: Firefox 5 - 40 */\ninput.ui-button::-moz-focus-inner,\nbutton.ui-button::-moz-focus-inner {\n\tborder: 0;\n\tpadding: 0;\n}\n", ""]);
	
	// exports


/***/ }),
/* 53 */
/***/ (function(module, exports, __webpack_require__) {

	exports = module.exports = __webpack_require__(47)();
	// imports
	
	
	// module
	exports.push([module.id, "/*!\n * jQuery UI Checkboxradio 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/checkboxradio/#theming\n */\n\n.ui-checkboxradio-label .ui-icon-background {\n\tbox-shadow: inset 1px 1px 1px #ccc;\n\tborder-radius: .12em;\n\tborder: none;\n}\n.ui-checkboxradio-radio-label .ui-icon-background {\n\twidth: 16px;\n\theight: 16px;\n\tborder-radius: 1em;\n\toverflow: visible;\n\tborder: none;\n}\n.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,\n.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon {\n\tbackground-image: none;\n\twidth: 8px;\n\theight: 8px;\n\tborder-width: 4px;\n\tborder-style: solid;\n}\n.ui-checkboxradio-disabled {\n\tpointer-events: none;\n}\n", ""]);
	
	// exports


/***/ }),
/* 54 */
/***/ (function(module, exports, __webpack_require__) {

	exports = module.exports = __webpack_require__(47)();
	// imports
	
	
	// module
	exports.push([module.id, "/*!\n * jQuery UI Controlgroup 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/controlgroup/#theming\n */\n\n.ui-controlgroup {\n\tvertical-align: middle;\n\tdisplay: inline-block;\n}\n.ui-controlgroup > .ui-controlgroup-item {\n\tfloat: left;\n\tmargin-left: 0;\n\tmargin-right: 0;\n}\n.ui-controlgroup > .ui-controlgroup-item:focus,\n.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus {\n\tz-index: 9999;\n}\n.ui-controlgroup-vertical > .ui-controlgroup-item {\n\tdisplay: block;\n\tfloat: none;\n\twidth: 100%;\n\tmargin-top: 0;\n\tmargin-bottom: 0;\n\ttext-align: left;\n}\n.ui-controlgroup-vertical .ui-controlgroup-item {\n\tbox-sizing: border-box;\n}\n.ui-controlgroup .ui-controlgroup-label {\n\tpadding: .4em 1em;\n}\n.ui-controlgroup .ui-controlgroup-label span {\n\tfont-size: 80%;\n}\n.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item {\n\tborder-left: none;\n}\n.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item {\n\tborder-top: none;\n}\n.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content {\n\tborder-right: none;\n}\n.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content {\n\tborder-bottom: none;\n}\n\n/* Spinner specific style fixes */\n.ui-controlgroup-vertical .ui-spinner-input {\n\n\t/* Support: IE8 only, Android < 4.4 only */\n\twidth: 75%;\n\twidth: calc( 100% - 2.4em );\n}\n.ui-controlgroup-vertical .ui-spinner .ui-spinner-up {\n\tborder-top-style: solid;\n}\n\n", ""]);
	
	// exports


/***/ }),
/* 55 */
/***/ (function(module, exports, __webpack_require__) {

	exports = module.exports = __webpack_require__(47)();
	// imports
	
	
	// module
	exports.push([module.id, "/*!\n * jQuery UI Datepicker 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/datepicker/#theming\n */\n.ui-datepicker {\n\twidth: 17em;\n\tpadding: .2em .2em 0;\n\tdisplay: none;\n}\n.ui-datepicker .ui-datepicker-header {\n\tposition: relative;\n\tpadding: .2em 0;\n}\n.ui-datepicker .ui-datepicker-prev,\n.ui-datepicker .ui-datepicker-next {\n\tposition: absolute;\n\ttop: 2px;\n\twidth: 1.8em;\n\theight: 1.8em;\n}\n.ui-datepicker .ui-datepicker-prev-hover,\n.ui-datepicker .ui-datepicker-next-hover {\n\ttop: 1px;\n}\n.ui-datepicker .ui-datepicker-prev {\n\tleft: 2px;\n}\n.ui-datepicker .ui-datepicker-next {\n\tright: 2px;\n}\n.ui-datepicker .ui-datepicker-prev-hover {\n\tleft: 1px;\n}\n.ui-datepicker .ui-datepicker-next-hover {\n\tright: 1px;\n}\n.ui-datepicker .ui-datepicker-prev span,\n.ui-datepicker .ui-datepicker-next span {\n\tdisplay: block;\n\tposition: absolute;\n\tleft: 50%;\n\tmargin-left: -8px;\n\ttop: 50%;\n\tmargin-top: -8px;\n}\n.ui-datepicker .ui-datepicker-title {\n\tmargin: 0 2.3em;\n\tline-height: 1.8em;\n\ttext-align: center;\n}\n.ui-datepicker .ui-datepicker-title select {\n\tfont-size: 1em;\n\tmargin: 1px 0;\n}\n.ui-datepicker select.ui-datepicker-month,\n.ui-datepicker select.ui-datepicker-year {\n\twidth: 45%;\n}\n.ui-datepicker table {\n\twidth: 100%;\n\tfont-size: .9em;\n\tborder-collapse: collapse;\n\tmargin: 0 0 .4em;\n}\n.ui-datepicker th {\n\tpadding: .7em .3em;\n\ttext-align: center;\n\tfont-weight: bold;\n\tborder: 0;\n}\n.ui-datepicker td {\n\tborder: 0;\n\tpadding: 1px;\n}\n.ui-datepicker td span,\n.ui-datepicker td a {\n\tdisplay: block;\n\tpadding: .2em;\n\ttext-align: right;\n\ttext-decoration: none;\n}\n.ui-datepicker .ui-datepicker-buttonpane {\n\tbackground-image: none;\n\tmargin: .7em 0 0 0;\n\tpadding: 0 .2em;\n\tborder-left: 0;\n\tborder-right: 0;\n\tborder-bottom: 0;\n}\n.ui-datepicker .ui-datepicker-buttonpane button {\n\tfloat: right;\n\tmargin: .5em .2em .4em;\n\tcursor: pointer;\n\tpadding: .2em .6em .3em .6em;\n\twidth: auto;\n\toverflow: visible;\n}\n.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {\n\tfloat: left;\n}\n\n/* with multiple calendars */\n.ui-datepicker.ui-datepicker-multi {\n\twidth: auto;\n}\n.ui-datepicker-multi .ui-datepicker-group {\n\tfloat: left;\n}\n.ui-datepicker-multi .ui-datepicker-group table {\n\twidth: 95%;\n\tmargin: 0 auto .4em;\n}\n.ui-datepicker-multi-2 .ui-datepicker-group {\n\twidth: 50%;\n}\n.ui-datepicker-multi-3 .ui-datepicker-group {\n\twidth: 33.3%;\n}\n.ui-datepicker-multi-4 .ui-datepicker-group {\n\twidth: 25%;\n}\n.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,\n.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {\n\tborder-left-width: 0;\n}\n.ui-datepicker-multi .ui-datepicker-buttonpane {\n\tclear: left;\n}\n.ui-datepicker-row-break {\n\tclear: both;\n\twidth: 100%;\n\tfont-size: 0;\n}\n\n/* RTL support */\n.ui-datepicker-rtl {\n\tdirection: rtl;\n}\n.ui-datepicker-rtl .ui-datepicker-prev {\n\tright: 2px;\n\tleft: auto;\n}\n.ui-datepicker-rtl .ui-datepicker-next {\n\tleft: 2px;\n\tright: auto;\n}\n.ui-datepicker-rtl .ui-datepicker-prev:hover {\n\tright: 1px;\n\tleft: auto;\n}\n.ui-datepicker-rtl .ui-datepicker-next:hover {\n\tleft: 1px;\n\tright: auto;\n}\n.ui-datepicker-rtl .ui-datepicker-buttonpane {\n\tclear: right;\n}\n.ui-datepicker-rtl .ui-datepicker-buttonpane button {\n\tfloat: left;\n}\n.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,\n.ui-datepicker-rtl .ui-datepicker-group {\n\tfloat: right;\n}\n.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,\n.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {\n\tborder-right-width: 0;\n\tborder-left-width: 1px;\n}\n\n/* Icons */\n.ui-datepicker .ui-icon {\n\tdisplay: block;\n\ttext-indent: -99999px;\n\toverflow: hidden;\n\tbackground-repeat: no-repeat;\n\tleft: .5em;\n\ttop: .3em;\n}\n", ""]);
	
	// exports


/***/ }),
/* 56 */
/***/ (function(module, exports, __webpack_require__) {

	exports = module.exports = __webpack_require__(47)();
	// imports
	
	
	// module
	exports.push([module.id, "/*!\n * jQuery UI Dialog 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/dialog/#theming\n */\n.ui-dialog {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tpadding: .2em;\n\toutline: 0;\n}\n.ui-dialog .ui-dialog-titlebar {\n\tpadding: .4em 1em;\n\tposition: relative;\n}\n.ui-dialog .ui-dialog-title {\n\tfloat: left;\n\tmargin: .1em 0;\n\twhite-space: nowrap;\n\twidth: 90%;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n}\n.ui-dialog .ui-dialog-titlebar-close {\n\tposition: absolute;\n\tright: .3em;\n\ttop: 50%;\n\twidth: 20px;\n\tmargin: -10px 0 0 0;\n\tpadding: 1px;\n\theight: 20px;\n}\n.ui-dialog .ui-dialog-content {\n\tposition: relative;\n\tborder: 0;\n\tpadding: .5em 1em;\n\tbackground: none;\n\toverflow: auto;\n}\n.ui-dialog .ui-dialog-buttonpane {\n\ttext-align: left;\n\tborder-width: 1px 0 0 0;\n\tbackground-image: none;\n\tmargin-top: .5em;\n\tpadding: .3em 1em .5em .4em;\n}\n.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {\n\tfloat: right;\n}\n.ui-dialog .ui-dialog-buttonpane button {\n\tmargin: .5em .4em .5em 0;\n\tcursor: pointer;\n}\n.ui-dialog .ui-resizable-n {\n\theight: 2px;\n\ttop: 0;\n}\n.ui-dialog .ui-resizable-e {\n\twidth: 2px;\n\tright: 0;\n}\n.ui-dialog .ui-resizable-s {\n\theight: 2px;\n\tbottom: 0;\n}\n.ui-dialog .ui-resizable-w {\n\twidth: 2px;\n\tleft: 0;\n}\n.ui-dialog .ui-resizable-se,\n.ui-dialog .ui-resizable-sw,\n.ui-dialog .ui-resizable-ne,\n.ui-dialog .ui-resizable-nw {\n\twidth: 7px;\n\theight: 7px;\n}\n.ui-dialog .ui-resizable-se {\n\tright: 0;\n\tbottom: 0;\n}\n.ui-dialog .ui-resizable-sw {\n\tleft: 0;\n\tbottom: 0;\n}\n.ui-dialog .ui-resizable-ne {\n\tright: 0;\n\ttop: 0;\n}\n.ui-dialog .ui-resizable-nw {\n\tleft: 0;\n\ttop: 0;\n}\n.ui-draggable .ui-dialog-titlebar {\n\tcursor: move;\n}\n", ""]);
	
	// exports


/***/ }),
/* 57 */
/***/ (function(module, exports, __webpack_require__) {

	exports = module.exports = __webpack_require__(47)();
	// imports
	
	
	// module
	exports.push([module.id, "/*!\n * jQuery UI Draggable 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n.ui-draggable-handle {\n\t-ms-touch-action: none;\n\ttouch-action: none;\n}\n", ""]);
	
	// exports


/***/ }),
/* 58 */
/***/ (function(module, exports, __webpack_require__) {

	exports = module.exports = __webpack_require__(47)();
	// imports
	
	
	// module
	exports.push([module.id, "/*!\n * jQuery UI Menu 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/menu/#theming\n */\n.ui-menu {\n\tlist-style: none;\n\tpadding: 0;\n\tmargin: 0;\n\tdisplay: block;\n\toutline: 0;\n}\n.ui-menu .ui-menu {\n\tposition: absolute;\n}\n.ui-menu .ui-menu-item {\n\tmargin: 0;\n\tcursor: pointer;\n\t/* support: IE10, see #8844 */\n\tlist-style-image: url(\"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\");\n}\n.ui-menu .ui-menu-item-wrapper {\n\tposition: relative;\n\tpadding: 3px 1em 3px .4em;\n}\n.ui-menu .ui-menu-divider {\n\tmargin: 5px 0;\n\theight: 0;\n\tfont-size: 0;\n\tline-height: 0;\n\tborder-width: 1px 0 0 0;\n}\n.ui-menu .ui-state-focus,\n.ui-menu .ui-state-active {\n\tmargin: -1px;\n}\n\n/* icon support */\n.ui-menu-icons {\n\tposition: relative;\n}\n.ui-menu-icons .ui-menu-item-wrapper {\n\tpadding-left: 2em;\n}\n\n/* left-aligned */\n.ui-menu .ui-icon {\n\tposition: absolute;\n\ttop: 0;\n\tbottom: 0;\n\tleft: .2em;\n\tmargin: auto 0;\n}\n\n/* right-aligned */\n.ui-menu .ui-menu-icon {\n\tleft: auto;\n\tright: 0;\n}\n", ""]);
	
	// exports


/***/ }),
/* 59 */
/***/ (function(module, exports, __webpack_require__) {

	exports = module.exports = __webpack_require__(47)();
	// imports
	
	
	// module
	exports.push([module.id, "/*!\n * jQuery UI Progressbar 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/progressbar/#theming\n */\n.ui-progressbar {\n\theight: 2em;\n\ttext-align: left;\n\toverflow: hidden;\n}\n.ui-progressbar .ui-progressbar-value {\n\tmargin: -1px;\n\theight: 100%;\n}\n.ui-progressbar .ui-progressbar-overlay {\n\tbackground: url(\"data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==\");\n\theight: 100%;\n\tfilter: alpha(opacity=25); /* support: IE8 */\n\topacity: 0.25;\n}\n.ui-progressbar-indeterminate .ui-progressbar-value {\n\tbackground-image: none;\n}\n", ""]);
	
	// exports


/***/ }),
/* 60 */
/***/ (function(module, exports, __webpack_require__) {

	exports = module.exports = __webpack_require__(47)();
	// imports
	
	
	// module
	exports.push([module.id, "/*!\n * jQuery UI Resizable 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n.ui-resizable {\n\tposition: relative;\n}\n.ui-resizable-handle {\n\tposition: absolute;\n\tfont-size: 0.1px;\n\tdisplay: block;\n\t-ms-touch-action: none;\n\ttouch-action: none;\n}\n.ui-resizable-disabled .ui-resizable-handle,\n.ui-resizable-autohide .ui-resizable-handle {\n\tdisplay: none;\n}\n.ui-resizable-n {\n\tcursor: n-resize;\n\theight: 7px;\n\twidth: 100%;\n\ttop: -5px;\n\tleft: 0;\n}\n.ui-resizable-s {\n\tcursor: s-resize;\n\theight: 7px;\n\twidth: 100%;\n\tbottom: -5px;\n\tleft: 0;\n}\n.ui-resizable-e {\n\tcursor: e-resize;\n\twidth: 7px;\n\tright: -5px;\n\ttop: 0;\n\theight: 100%;\n}\n.ui-resizable-w {\n\tcursor: w-resize;\n\twidth: 7px;\n\tleft: -5px;\n\ttop: 0;\n\theight: 100%;\n}\n.ui-resizable-se {\n\tcursor: se-resize;\n\twidth: 12px;\n\theight: 12px;\n\tright: 1px;\n\tbottom: 1px;\n}\n.ui-resizable-sw {\n\tcursor: sw-resize;\n\twidth: 9px;\n\theight: 9px;\n\tleft: -5px;\n\tbottom: -5px;\n}\n.ui-resizable-nw {\n\tcursor: nw-resize;\n\twidth: 9px;\n\theight: 9px;\n\tleft: -5px;\n\ttop: -5px;\n}\n.ui-resizable-ne {\n\tcursor: ne-resize;\n\twidth: 9px;\n\theight: 9px;\n\tright: -5px;\n\ttop: -5px;\n}\n", ""]);
	
	// exports


/***/ }),
/* 61 */
/***/ (function(module, exports, __webpack_require__) {

	exports = module.exports = __webpack_require__(47)();
	// imports
	
	
	// module
	exports.push([module.id, "/*!\n * jQuery UI Selectable 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n.ui-selectable {\n\t-ms-touch-action: none;\n\ttouch-action: none;\n}\n.ui-selectable-helper {\n\tposition: absolute;\n\tz-index: 100;\n\tborder: 1px dotted black;\n}\n", ""]);
	
	// exports


/***/ }),
/* 62 */
/***/ (function(module, exports, __webpack_require__) {

	exports = module.exports = __webpack_require__(47)();
	// imports
	
	
	// module
	exports.push([module.id, "/*!\n * jQuery UI Selectmenu 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/selectmenu/#theming\n */\n.ui-selectmenu-menu {\n\tpadding: 0;\n\tmargin: 0;\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tdisplay: none;\n}\n.ui-selectmenu-menu .ui-menu {\n\toverflow: auto;\n\toverflow-x: hidden;\n\tpadding-bottom: 1px;\n}\n.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {\n\tfont-size: 1em;\n\tfont-weight: bold;\n\tline-height: 1.5;\n\tpadding: 2px 0.4em;\n\tmargin: 0.5em 0 0 0;\n\theight: auto;\n\tborder: 0;\n}\n.ui-selectmenu-open {\n\tdisplay: block;\n}\n.ui-selectmenu-text {\n\tdisplay: block;\n\tmargin-right: 20px;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n}\n.ui-selectmenu-button.ui-button {\n\ttext-align: left;\n\twhite-space: nowrap;\n\twidth: 14em;\n}\n.ui-selectmenu-icon.ui-icon {\n\tfloat: right;\n\tmargin-top: 0;\n}\n", ""]);
	
	// exports


/***/ }),
/* 63 */
/***/ (function(module, exports, __webpack_require__) {

	exports = module.exports = __webpack_require__(47)();
	// imports
	
	
	// module
	exports.push([module.id, "/*!\n * jQuery UI Sortable 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n.ui-sortable-handle {\n\t-ms-touch-action: none;\n\ttouch-action: none;\n}\n", ""]);
	
	// exports


/***/ }),
/* 64 */
/***/ (function(module, exports, __webpack_require__) {

	exports = module.exports = __webpack_require__(47)();
	// imports
	
	
	// module
	exports.push([module.id, "/*!\n * jQuery UI Slider 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/slider/#theming\n */\n.ui-slider {\n\tposition: relative;\n\ttext-align: left;\n}\n.ui-slider .ui-slider-handle {\n\tposition: absolute;\n\tz-index: 2;\n\twidth: 1.2em;\n\theight: 1.2em;\n\tcursor: default;\n\t-ms-touch-action: none;\n\ttouch-action: none;\n}\n.ui-slider .ui-slider-range {\n\tposition: absolute;\n\tz-index: 1;\n\tfont-size: .7em;\n\tdisplay: block;\n\tborder: 0;\n\tbackground-position: 0 0;\n}\n\n/* support: IE8 - See #6727 */\n.ui-slider.ui-state-disabled .ui-slider-handle,\n.ui-slider.ui-state-disabled .ui-slider-range {\n\tfilter: inherit;\n}\n\n.ui-slider-horizontal {\n\theight: .8em;\n}\n.ui-slider-horizontal .ui-slider-handle {\n\ttop: -.3em;\n\tmargin-left: -.6em;\n}\n.ui-slider-horizontal .ui-slider-range {\n\ttop: 0;\n\theight: 100%;\n}\n.ui-slider-horizontal .ui-slider-range-min {\n\tleft: 0;\n}\n.ui-slider-horizontal .ui-slider-range-max {\n\tright: 0;\n}\n\n.ui-slider-vertical {\n\twidth: .8em;\n\theight: 100px;\n}\n.ui-slider-vertical .ui-slider-handle {\n\tleft: -.3em;\n\tmargin-left: 0;\n\tmargin-bottom: -.6em;\n}\n.ui-slider-vertical .ui-slider-range {\n\tleft: 0;\n\twidth: 100%;\n}\n.ui-slider-vertical .ui-slider-range-min {\n\tbottom: 0;\n}\n.ui-slider-vertical .ui-slider-range-max {\n\ttop: 0;\n}\n", ""]);
	
	// exports


/***/ }),
/* 65 */
/***/ (function(module, exports, __webpack_require__) {

	exports = module.exports = __webpack_require__(47)();
	// imports
	
	
	// module
	exports.push([module.id, "/*!\n * jQuery UI Spinner 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/spinner/#theming\n */\n.ui-spinner {\n\tposition: relative;\n\tdisplay: inline-block;\n\toverflow: hidden;\n\tpadding: 0;\n\tvertical-align: middle;\n}\n.ui-spinner-input {\n\tborder: none;\n\tbackground: none;\n\tcolor: inherit;\n\tpadding: .222em 0;\n\tmargin: .2em 0;\n\tvertical-align: middle;\n\tmargin-left: .4em;\n\tmargin-right: 2em;\n}\n.ui-spinner-button {\n\twidth: 1.6em;\n\theight: 50%;\n\tfont-size: .5em;\n\tpadding: 0;\n\tmargin: 0;\n\ttext-align: center;\n\tposition: absolute;\n\tcursor: default;\n\tdisplay: block;\n\toverflow: hidden;\n\tright: 0;\n}\n/* more specificity required here to override default borders */\n.ui-spinner a.ui-spinner-button {\n\tborder-top-style: none;\n\tborder-bottom-style: none;\n\tborder-right-style: none;\n}\n.ui-spinner-up {\n\ttop: 0;\n}\n.ui-spinner-down {\n\tbottom: 0;\n}\n", ""]);
	
	// exports


/***/ }),
/* 66 */
/***/ (function(module, exports, __webpack_require__) {

	exports = module.exports = __webpack_require__(47)();
	// imports
	
	
	// module
	exports.push([module.id, "/*!\n * jQuery UI Tabs 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/tabs/#theming\n */\n.ui-tabs {\n\tposition: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as \"fixed\") */\n\tpadding: .2em;\n}\n.ui-tabs .ui-tabs-nav {\n\tmargin: 0;\n\tpadding: .2em .2em 0;\n}\n.ui-tabs .ui-tabs-nav li {\n\tlist-style: none;\n\tfloat: left;\n\tposition: relative;\n\ttop: 0;\n\tmargin: 1px .2em 0 0;\n\tborder-bottom-width: 0;\n\tpadding: 0;\n\twhite-space: nowrap;\n}\n.ui-tabs .ui-tabs-nav .ui-tabs-anchor {\n\tfloat: left;\n\tpadding: .5em 1em;\n\ttext-decoration: none;\n}\n.ui-tabs .ui-tabs-nav li.ui-tabs-active {\n\tmargin-bottom: -1px;\n\tpadding-bottom: 1px;\n}\n.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,\n.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,\n.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {\n\tcursor: text;\n}\n.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {\n\tcursor: pointer;\n}\n.ui-tabs .ui-tabs-panel {\n\tdisplay: block;\n\tborder-width: 0;\n\tpadding: 1em 1.4em;\n\tbackground: none;\n}\n", ""]);
	
	// exports


/***/ }),
/* 67 */
/***/ (function(module, exports, __webpack_require__) {

	exports = module.exports = __webpack_require__(47)();
	// imports
	
	
	// module
	exports.push([module.id, "/*!\n * jQuery UI Tooltip 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/tooltip/#theming\n */\n.ui-tooltip {\n\tpadding: 8px;\n\tposition: absolute;\n\tz-index: 9999;\n\tmax-width: 300px;\n}\nbody .ui-tooltip {\n\tborder-width: 2px;\n}\n", ""]);
	
	// exports


/***/ }),
/* 68 */
/***/ (function(module, exports, __webpack_require__) {

	exports = module.exports = __webpack_require__(47)();
	// imports
	
	
	// module
	exports.push([module.id, "/*!\n * jQuery UI CSS Framework 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/category/theming/\n *\n * To view and modify this theme, visit http://jqueryui.com/themeroller/\n */\n\n\n/* Component containers\n----------------------------------*/\n.ui-widget {\n\tfont-family: Arial,Helvetica,sans-serif/*{ffDefault}*/;\n\tfont-size: 1em/*{fsDefault}*/;\n}\n.ui-widget .ui-widget {\n\tfont-size: 1em;\n}\n.ui-widget input,\n.ui-widget select,\n.ui-widget textarea,\n.ui-widget button {\n\tfont-family: Arial,Helvetica,sans-serif/*{ffDefault}*/;\n\tfont-size: 1em;\n}\n.ui-widget.ui-widget-content {\n\tborder: 1px solid #c5c5c5/*{borderColorDefault}*/;\n}\n.ui-widget-content {\n\tborder: 1px solid #dddddd/*{borderColorContent}*/;\n\tbackground: #ffffff/*{bgColorContent}*/ /*{bgImgUrlContent}*/ /*{bgContentXPos}*/ /*{bgContentYPos}*/ /*{bgContentRepeat}*/;\n\tcolor: #333333/*{fcContent}*/;\n}\n.ui-widget-content a {\n\tcolor: #333333/*{fcContent}*/;\n}\n.ui-widget-header {\n\tborder: 1px solid #dddddd/*{borderColorHeader}*/;\n\tbackground: #e9e9e9/*{bgColorHeader}*/ /*{bgImgUrlHeader}*/ /*{bgHeaderXPos}*/ /*{bgHeaderYPos}*/ /*{bgHeaderRepeat}*/;\n\tcolor: #333333/*{fcHeader}*/;\n\tfont-weight: bold;\n}\n.ui-widget-header a {\n\tcolor: #333333/*{fcHeader}*/;\n}\n\n/* Interaction states\n----------------------------------*/\n.ui-state-default,\n.ui-widget-content .ui-state-default,\n.ui-widget-header .ui-state-default,\n.ui-button,\n\n/* We use html here because we need a greater specificity to make sure disabled\nworks properly when clicked or hovered */\nhtml .ui-button.ui-state-disabled:hover,\nhtml .ui-button.ui-state-disabled:active {\n\tborder: 1px solid #c5c5c5/*{borderColorDefault}*/;\n\tbackground: #f6f6f6/*{bgColorDefault}*/ /*{bgImgUrlDefault}*/ /*{bgDefaultXPos}*/ /*{bgDefaultYPos}*/ /*{bgDefaultRepeat}*/;\n\tfont-weight: normal/*{fwDefault}*/;\n\tcolor: #454545/*{fcDefault}*/;\n}\n.ui-state-default a,\n.ui-state-default a:link,\n.ui-state-default a:visited,\na.ui-button,\na:link.ui-button,\na:visited.ui-button,\n.ui-button {\n\tcolor: #454545/*{fcDefault}*/;\n\ttext-decoration: none;\n}\n.ui-state-hover,\n.ui-widget-content .ui-state-hover,\n.ui-widget-header .ui-state-hover,\n.ui-state-focus,\n.ui-widget-content .ui-state-focus,\n.ui-widget-header .ui-state-focus,\n.ui-button:hover,\n.ui-button:focus {\n\tborder: 1px solid #cccccc/*{borderColorHover}*/;\n\tbackground: #ededed/*{bgColorHover}*/ /*{bgImgUrlHover}*/ /*{bgHoverXPos}*/ /*{bgHoverYPos}*/ /*{bgHoverRepeat}*/;\n\tfont-weight: normal/*{fwDefault}*/;\n\tcolor: #2b2b2b/*{fcHover}*/;\n}\n.ui-state-hover a,\n.ui-state-hover a:hover,\n.ui-state-hover a:link,\n.ui-state-hover a:visited,\n.ui-state-focus a,\n.ui-state-focus a:hover,\n.ui-state-focus a:link,\n.ui-state-focus a:visited,\na.ui-button:hover,\na.ui-button:focus {\n\tcolor: #2b2b2b/*{fcHover}*/;\n\ttext-decoration: none;\n}\n\n.ui-visual-focus {\n\tbox-shadow: 0 0 3px 1px rgb(94, 158, 214);\n}\n.ui-state-active,\n.ui-widget-content .ui-state-active,\n.ui-widget-header .ui-state-active,\na.ui-button:active,\n.ui-button:active,\n.ui-button.ui-state-active:hover {\n\tborder: 1px solid #003eff/*{borderColorActive}*/;\n\tbackground: #007fff/*{bgColorActive}*/ /*{bgImgUrlActive}*/ /*{bgActiveXPos}*/ /*{bgActiveYPos}*/ /*{bgActiveRepeat}*/;\n\tfont-weight: normal/*{fwDefault}*/;\n\tcolor: #ffffff/*{fcActive}*/;\n}\n.ui-icon-background,\n.ui-state-active .ui-icon-background {\n\tborder: #003eff/*{borderColorActive}*/;\n\tbackground-color: #ffffff/*{fcActive}*/;\n}\n.ui-state-active a,\n.ui-state-active a:link,\n.ui-state-active a:visited {\n\tcolor: #ffffff/*{fcActive}*/;\n\ttext-decoration: none;\n}\n\n/* Interaction Cues\n----------------------------------*/\n.ui-state-highlight,\n.ui-widget-content .ui-state-highlight,\n.ui-widget-header .ui-state-highlight {\n\tborder: 1px solid #dad55e/*{borderColorHighlight}*/;\n\tbackground: #fffa90/*{bgColorHighlight}*/ /*{bgImgUrlHighlight}*/ /*{bgHighlightXPos}*/ /*{bgHighlightYPos}*/ /*{bgHighlightRepeat}*/;\n\tcolor: #777620/*{fcHighlight}*/;\n}\n.ui-state-checked {\n\tborder: 1px solid #dad55e/*{borderColorHighlight}*/;\n\tbackground: #fffa90/*{bgColorHighlight}*/;\n}\n.ui-state-highlight a,\n.ui-widget-content .ui-state-highlight a,\n.ui-widget-header .ui-state-highlight a {\n\tcolor: #777620/*{fcHighlight}*/;\n}\n.ui-state-error,\n.ui-widget-content .ui-state-error,\n.ui-widget-header .ui-state-error {\n\tborder: 1px solid #f1a899/*{borderColorError}*/;\n\tbackground: #fddfdf/*{bgColorError}*/ /*{bgImgUrlError}*/ /*{bgErrorXPos}*/ /*{bgErrorYPos}*/ /*{bgErrorRepeat}*/;\n\tcolor: #5f3f3f/*{fcError}*/;\n}\n.ui-state-error a,\n.ui-widget-content .ui-state-error a,\n.ui-widget-header .ui-state-error a {\n\tcolor: #5f3f3f/*{fcError}*/;\n}\n.ui-state-error-text,\n.ui-widget-content .ui-state-error-text,\n.ui-widget-header .ui-state-error-text {\n\tcolor: #5f3f3f/*{fcError}*/;\n}\n.ui-priority-primary,\n.ui-widget-content .ui-priority-primary,\n.ui-widget-header .ui-priority-primary {\n\tfont-weight: bold;\n}\n.ui-priority-secondary,\n.ui-widget-content .ui-priority-secondary,\n.ui-widget-header .ui-priority-secondary {\n\topacity: .7;\n\tfilter:Alpha(Opacity=70); /* support: IE8 */\n\tfont-weight: normal;\n}\n.ui-state-disabled,\n.ui-widget-content .ui-state-disabled,\n.ui-widget-header .ui-state-disabled {\n\topacity: .35;\n\tfilter:Alpha(Opacity=35); /* support: IE8 */\n\tbackground-image: none;\n}\n.ui-state-disabled .ui-icon {\n\tfilter:Alpha(Opacity=35); /* support: IE8 - See #6059 */\n}\n\n/* Icons\n----------------------------------*/\n\n/* states and images */\n.ui-icon {\n\twidth: 16px;\n\theight: 16px;\n}\n.ui-icon,\n.ui-widget-content .ui-icon {\n\tbackground-image: url(" + __webpack_require__(69) + ");\n}\n.ui-widget-header .ui-icon {\n\tbackground-image: url(" + __webpack_require__(69) + ");\n}\n.ui-state-hover .ui-icon,\n.ui-state-focus .ui-icon,\n.ui-button:hover .ui-icon,\n.ui-button:focus .ui-icon {\n\tbackground-image: url(" + __webpack_require__(70) + ");\n}\n.ui-state-active .ui-icon,\n.ui-button:active .ui-icon {\n\tbackground-image: url(" + __webpack_require__(71) + ");\n}\n.ui-state-highlight .ui-icon,\n.ui-button .ui-state-highlight.ui-icon {\n\tbackground-image: url(" + __webpack_require__(72) + ");\n}\n.ui-state-error .ui-icon,\n.ui-state-error-text .ui-icon {\n\tbackground-image: url(" + __webpack_require__(73) + ");\n}\n.ui-button .ui-icon {\n\tbackground-image: url(" + __webpack_require__(74) + ");\n}\n\n/* positioning */\n.ui-icon-blank { background-position: 16px 16px; }\n.ui-icon-caret-1-n { background-position: 0 0; }\n.ui-icon-caret-1-ne { background-position: -16px 0; }\n.ui-icon-caret-1-e { background-position: -32px 0; }\n.ui-icon-caret-1-se { background-position: -48px 0; }\n.ui-icon-caret-1-s { background-position: -65px 0; }\n.ui-icon-caret-1-sw { background-position: -80px 0; }\n.ui-icon-caret-1-w { background-position: -96px 0; }\n.ui-icon-caret-1-nw { background-position: -112px 0; }\n.ui-icon-caret-2-n-s { background-position: -128px 0; }\n.ui-icon-caret-2-e-w { background-position: -144px 0; }\n.ui-icon-triangle-1-n { background-position: 0 -16px; }\n.ui-icon-triangle-1-ne { background-position: -16px -16px; }\n.ui-icon-triangle-1-e { background-position: -32px -16px; }\n.ui-icon-triangle-1-se { background-position: -48px -16px; }\n.ui-icon-triangle-1-s { background-position: -65px -16px; }\n.ui-icon-triangle-1-sw { background-position: -80px -16px; }\n.ui-icon-triangle-1-w { background-position: -96px -16px; }\n.ui-icon-triangle-1-nw { background-position: -112px -16px; }\n.ui-icon-triangle-2-n-s { background-position: -128px -16px; }\n.ui-icon-triangle-2-e-w { background-position: -144px -16px; }\n.ui-icon-arrow-1-n { background-position: 0 -32px; }\n.ui-icon-arrow-1-ne { background-position: -16px -32px; }\n.ui-icon-arrow-1-e { background-position: -32px -32px; }\n.ui-icon-arrow-1-se { background-position: -48px -32px; }\n.ui-icon-arrow-1-s { background-position: -65px -32px; }\n.ui-icon-arrow-1-sw { background-position: -80px -32px; }\n.ui-icon-arrow-1-w { background-position: -96px -32px; }\n.ui-icon-arrow-1-nw { background-position: -112px -32px; }\n.ui-icon-arrow-2-n-s { background-position: -128px -32px; }\n.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }\n.ui-icon-arrow-2-e-w { background-position: -160px -32px; }\n.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }\n.ui-icon-arrowstop-1-n { background-position: -192px -32px; }\n.ui-icon-arrowstop-1-e { background-position: -208px -32px; }\n.ui-icon-arrowstop-1-s { background-position: -224px -32px; }\n.ui-icon-arrowstop-1-w { background-position: -240px -32px; }\n.ui-icon-arrowthick-1-n { background-position: 1px -48px; }\n.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }\n.ui-icon-arrowthick-1-e { background-position: -32px -48px; }\n.ui-icon-arrowthick-1-se { background-position: -48px -48px; }\n.ui-icon-arrowthick-1-s { background-position: -64px -48px; }\n.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }\n.ui-icon-arrowthick-1-w { background-position: -96px -48px; }\n.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }\n.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }\n.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }\n.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }\n.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }\n.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }\n.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }\n.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }\n.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }\n.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }\n.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }\n.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }\n.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }\n.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }\n.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }\n.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }\n.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }\n.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }\n.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }\n.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }\n.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }\n.ui-icon-arrow-4 { background-position: 0 -80px; }\n.ui-icon-arrow-4-diag { background-position: -16px -80px; }\n.ui-icon-extlink { background-position: -32px -80px; }\n.ui-icon-newwin { background-position: -48px -80px; }\n.ui-icon-refresh { background-position: -64px -80px; }\n.ui-icon-shuffle { background-position: -80px -80px; }\n.ui-icon-transfer-e-w { background-position: -96px -80px; }\n.ui-icon-transferthick-e-w { background-position: -112px -80px; }\n.ui-icon-folder-collapsed { background-position: 0 -96px; }\n.ui-icon-folder-open { background-position: -16px -96px; }\n.ui-icon-document { background-position: -32px -96px; }\n.ui-icon-document-b { background-position: -48px -96px; }\n.ui-icon-note { background-position: -64px -96px; }\n.ui-icon-mail-closed { background-position: -80px -96px; }\n.ui-icon-mail-open { background-position: -96px -96px; }\n.ui-icon-suitcase { background-position: -112px -96px; }\n.ui-icon-comment { background-position: -128px -96px; }\n.ui-icon-person { background-position: -144px -96px; }\n.ui-icon-print { background-position: -160px -96px; }\n.ui-icon-trash { background-position: -176px -96px; }\n.ui-icon-locked { background-position: -192px -96px; }\n.ui-icon-unlocked { background-position: -208px -96px; }\n.ui-icon-bookmark { background-position: -224px -96px; }\n.ui-icon-tag { background-position: -240px -96px; }\n.ui-icon-home { background-position: 0 -112px; }\n.ui-icon-flag { background-position: -16px -112px; }\n.ui-icon-calendar { background-position: -32px -112px; }\n.ui-icon-cart { background-position: -48px -112px; }\n.ui-icon-pencil { background-position: -64px -112px; }\n.ui-icon-clock { background-position: -80px -112px; }\n.ui-icon-disk { background-position: -96px -112px; }\n.ui-icon-calculator { background-position: -112px -112px; }\n.ui-icon-zoomin { background-position: -128px -112px; }\n.ui-icon-zoomout { background-position: -144px -112px; }\n.ui-icon-search { background-position: -160px -112px; }\n.ui-icon-wrench { background-position: -176px -112px; }\n.ui-icon-gear { background-position: -192px -112px; }\n.ui-icon-heart { background-position: -208px -112px; }\n.ui-icon-star { background-position: -224px -112px; }\n.ui-icon-link { background-position: -240px -112px; }\n.ui-icon-cancel { background-position: 0 -128px; }\n.ui-icon-plus { background-position: -16px -128px; }\n.ui-icon-plusthick { background-position: -32px -128px; }\n.ui-icon-minus { background-position: -48px -128px; }\n.ui-icon-minusthick { background-position: -64px -128px; }\n.ui-icon-close { background-position: -80px -128px; }\n.ui-icon-closethick { background-position: -96px -128px; }\n.ui-icon-key { background-position: -112px -128px; }\n.ui-icon-lightbulb { background-position: -128px -128px; }\n.ui-icon-scissors { background-position: -144px -128px; }\n.ui-icon-clipboard { background-position: -160px -128px; }\n.ui-icon-copy { background-position: -176px -128px; }\n.ui-icon-contact { background-position: -192px -128px; }\n.ui-icon-image { background-position: -208px -128px; }\n.ui-icon-video { background-position: -224px -128px; }\n.ui-icon-script { background-position: -240px -128px; }\n.ui-icon-alert { background-position: 0 -144px; }\n.ui-icon-info { background-position: -16px -144px; }\n.ui-icon-notice { background-position: -32px -144px; }\n.ui-icon-help { background-position: -48px -144px; }\n.ui-icon-check { background-position: -64px -144px; }\n.ui-icon-bullet { background-position: -80px -144px; }\n.ui-icon-radio-on { background-position: -96px -144px; }\n.ui-icon-radio-off { background-position: -112px -144px; }\n.ui-icon-pin-w { background-position: -128px -144px; }\n.ui-icon-pin-s { background-position: -144px -144px; }\n.ui-icon-play { background-position: 0 -160px; }\n.ui-icon-pause { background-position: -16px -160px; }\n.ui-icon-seek-next { background-position: -32px -160px; }\n.ui-icon-seek-prev { background-position: -48px -160px; }\n.ui-icon-seek-end { background-position: -64px -160px; }\n.ui-icon-seek-start { background-position: -80px -160px; }\n/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */\n.ui-icon-seek-first { background-position: -80px -160px; }\n.ui-icon-stop { background-position: -96px -160px; }\n.ui-icon-eject { background-position: -112px -160px; }\n.ui-icon-volume-off { background-position: -128px -160px; }\n.ui-icon-volume-on { background-position: -144px -160px; }\n.ui-icon-power { background-position: 0 -176px; }\n.ui-icon-signal-diag { background-position: -16px -176px; }\n.ui-icon-signal { background-position: -32px -176px; }\n.ui-icon-battery-0 { background-position: -48px -176px; }\n.ui-icon-battery-1 { background-position: -64px -176px; }\n.ui-icon-battery-2 { background-position: -80px -176px; }\n.ui-icon-battery-3 { background-position: -96px -176px; }\n.ui-icon-circle-plus { background-position: 0 -192px; }\n.ui-icon-circle-minus { background-position: -16px -192px; }\n.ui-icon-circle-close { background-position: -32px -192px; }\n.ui-icon-circle-triangle-e { background-position: -48px -192px; }\n.ui-icon-circle-triangle-s { background-position: -64px -192px; }\n.ui-icon-circle-triangle-w { background-position: -80px -192px; }\n.ui-icon-circle-triangle-n { background-position: -96px -192px; }\n.ui-icon-circle-arrow-e { background-position: -112px -192px; }\n.ui-icon-circle-arrow-s { background-position: -128px -192px; }\n.ui-icon-circle-arrow-w { background-position: -144px -192px; }\n.ui-icon-circle-arrow-n { background-position: -160px -192px; }\n.ui-icon-circle-zoomin { background-position: -176px -192px; }\n.ui-icon-circle-zoomout { background-position: -192px -192px; }\n.ui-icon-circle-check { background-position: -208px -192px; }\n.ui-icon-circlesmall-plus { background-position: 0 -208px; }\n.ui-icon-circlesmall-minus { background-position: -16px -208px; }\n.ui-icon-circlesmall-close { background-position: -32px -208px; }\n.ui-icon-squaresmall-plus { background-position: -48px -208px; }\n.ui-icon-squaresmall-minus { background-position: -64px -208px; }\n.ui-icon-squaresmall-close { background-position: -80px -208px; }\n.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }\n.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }\n.ui-icon-grip-solid-vertical { background-position: -32px -224px; }\n.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }\n.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }\n.ui-icon-grip-diagonal-se { background-position: -80px -224px; }\n\n\n/* Misc visuals\n----------------------------------*/\n\n/* Corner radius */\n.ui-corner-all,\n.ui-corner-top,\n.ui-corner-left,\n.ui-corner-tl {\n\tborder-top-left-radius: 3px/*{cornerRadius}*/;\n}\n.ui-corner-all,\n.ui-corner-top,\n.ui-corner-right,\n.ui-corner-tr {\n\tborder-top-right-radius: 3px/*{cornerRadius}*/;\n}\n.ui-corner-all,\n.ui-corner-bottom,\n.ui-corner-left,\n.ui-corner-bl {\n\tborder-bottom-left-radius: 3px/*{cornerRadius}*/;\n}\n.ui-corner-all,\n.ui-corner-bottom,\n.ui-corner-right,\n.ui-corner-br {\n\tborder-bottom-right-radius: 3px/*{cornerRadius}*/;\n}\n\n/* Overlays */\n.ui-widget-overlay {\n\tbackground: #aaaaaa/*{bgColorOverlay}*/ /*{bgImgUrlOverlay}*/ /*{bgOverlayXPos}*/ /*{bgOverlayYPos}*/ /*{bgOverlayRepeat}*/;\n\topacity: .3/*{opacityOverlay}*/;\n\tfilter: Alpha(Opacity=30)/*{opacityFilterOverlay}*/; /* support: IE8 */\n}\n.ui-widget-shadow {\n\t-webkit-box-shadow: 0/*{offsetLeftShadow}*/ 0/*{offsetTopShadow}*/ 5px/*{thicknessShadow}*/ #666666/*{bgColorShadow}*/;\n\tbox-shadow: 0/*{offsetLeftShadow}*/ 0/*{offsetTopShadow}*/ 5px/*{thicknessShadow}*/ #666666/*{bgColorShadow}*/;\n}\n", ""]);
	
	// exports


/***/ }),
/* 69 */
/***/ (function(module, exports, __webpack_require__) {

	module.exports = __webpack_require__.p + "a4c733ec4baef9ad3896d4e34a8a5448.png";

/***/ }),
/* 70 */
/***/ (function(module, exports, __webpack_require__) {

	module.exports = __webpack_require__.p + "971364734f3b603e5d363a2634898b42.png";

/***/ }),
/* 71 */
/***/ (function(module, exports, __webpack_require__) {

	module.exports = __webpack_require__.p + "bf27228a7d3957983584fa7698121ea1.png";

/***/ }),
/* 72 */
/***/ (function(module, exports, __webpack_require__) {

	module.exports = __webpack_require__.p + "208a290102a4ada58a04de354a1354d7.png";

/***/ }),
/* 73 */
/***/ (function(module, exports, __webpack_require__) {

	module.exports = __webpack_require__.p + "0de3b51742ed3ac61435875bccd8973b.png";

/***/ }),
/* 74 */
/***/ (function(module, exports, __webpack_require__) {

	module.exports = __webpack_require__.p + "73a1fd052c9d84c0ee0bea3ee85892ed.png";

/***/ }),
/* 75 */
/***/ (function(module, exports, __webpack_require__) {

	/*
		MIT License http://www.opensource.org/licenses/mit-license.php
		Author Tobias Koppers @sokra
	*/
	var stylesInDom = {},
		memoize = function(fn) {
			var memo;
			return function () {
				if (typeof memo === "undefined") memo = fn.apply(this, arguments);
				return memo;
			};
		},
		isOldIE = memoize(function() {
			return /msie [6-9]\b/.test(self.navigator.userAgent.toLowerCase());
		}),
		getHeadElement = memoize(function () {
			return document.head || document.getElementsByTagName("head")[0];
		}),
		singletonElement = null,
		singletonCounter = 0,
		styleElementsInsertedAtTop = [];
	
	module.exports = function(list, options) {
		if(false) {
			if(typeof document !== "object") throw new Error("The style-loader cannot be used in a non-browser environment");
		}
	
		options = options || {};
		// Force single-tag solution on IE6-9, which has a hard limit on the # of <style>
		// tags it will allow on a page
		if (typeof options.singleton === "undefined") options.singleton = isOldIE();
	
		// By default, add <style> tags to the bottom of <head>.
		if (typeof options.insertAt === "undefined") options.insertAt = "bottom";
	
		var styles = listToStyles(list);
		addStylesToDom(styles, options);
	
		return function update(newList) {
			var mayRemove = [];
			for(var i = 0; i < styles.length; i++) {
				var item = styles[i];
				var domStyle = stylesInDom[item.id];
				domStyle.refs--;
				mayRemove.push(domStyle);
			}
			if(newList) {
				var newStyles = listToStyles(newList);
				addStylesToDom(newStyles, options);
			}
			for(var i = 0; i < mayRemove.length; i++) {
				var domStyle = mayRemove[i];
				if(domStyle.refs === 0) {
					for(var j = 0; j < domStyle.parts.length; j++)
						domStyle.parts[j]();
					delete stylesInDom[domStyle.id];
				}
			}
		};
	}
	
	function addStylesToDom(styles, options) {
		for(var i = 0; i < styles.length; i++) {
			var item = styles[i];
			var domStyle = stylesInDom[item.id];
			if(domStyle) {
				domStyle.refs++;
				for(var j = 0; j < domStyle.parts.length; j++) {
					domStyle.parts[j](item.parts[j]);
				}
				for(; j < item.parts.length; j++) {
					domStyle.parts.push(addStyle(item.parts[j], options));
				}
			} else {
				var parts = [];
				for(var j = 0; j < item.parts.length; j++) {
					parts.push(addStyle(item.parts[j], options));
				}
				stylesInDom[item.id] = {id: item.id, refs: 1, parts: parts};
			}
		}
	}
	
	function listToStyles(list) {
		var styles = [];
		var newStyles = {};
		for(var i = 0; i < list.length; i++) {
			var item = list[i];
			var id = item[0];
			var css = item[1];
			var media = item[2];
			var sourceMap = item[3];
			var part = {css: css, media: media, sourceMap: sourceMap};
			if(!newStyles[id])
				styles.push(newStyles[id] = {id: id, parts: [part]});
			else
				newStyles[id].parts.push(part);
		}
		return styles;
	}
	
	function insertStyleElement(options, styleElement) {
		var head = getHeadElement();
		var lastStyleElementInsertedAtTop = styleElementsInsertedAtTop[styleElementsInsertedAtTop.length - 1];
		if (options.insertAt === "top") {
			if(!lastStyleElementInsertedAtTop) {
				head.insertBefore(styleElement, head.firstChild);
			} else if(lastStyleElementInsertedAtTop.nextSibling) {
				head.insertBefore(styleElement, lastStyleElementInsertedAtTop.nextSibling);
			} else {
				head.appendChild(styleElement);
			}
			styleElementsInsertedAtTop.push(styleElement);
		} else if (options.insertAt === "bottom") {
			head.appendChild(styleElement);
		} else {
			throw new Error("Invalid value for parameter 'insertAt'. Must be 'top' or 'bottom'.");
		}
	}
	
	function removeStyleElement(styleElement) {
		styleElement.parentNode.removeChild(styleElement);
		var idx = styleElementsInsertedAtTop.indexOf(styleElement);
		if(idx >= 0) {
			styleElementsInsertedAtTop.splice(idx, 1);
		}
	}
	
	function createStyleElement(options) {
		var styleElement = document.createElement("style");
		styleElement.type = "text/css";
		insertStyleElement(options, styleElement);
		return styleElement;
	}
	
	function createLinkElement(options) {
		var linkElement = document.createElement("link");
		linkElement.rel = "stylesheet";
		insertStyleElement(options, linkElement);
		return linkElement;
	}
	
	function addStyle(obj, options) {
		var styleElement, update, remove;
	
		if (options.singleton) {
			var styleIndex = singletonCounter++;
			styleElement = singletonElement || (singletonElement = createStyleElement(options));
			update = applyToSingletonTag.bind(null, styleElement, styleIndex, false);
			remove = applyToSingletonTag.bind(null, styleElement, styleIndex, true);
		} else if(obj.sourceMap &&
			typeof URL === "function" &&
			typeof URL.createObjectURL === "function" &&
			typeof URL.revokeObjectURL === "function" &&
			typeof Blob === "function" &&
			typeof btoa === "function") {
			styleElement = createLinkElement(options);
			update = updateLink.bind(null, styleElement);
			remove = function() {
				removeStyleElement(styleElement);
				if(styleElement.href)
					URL.revokeObjectURL(styleElement.href);
			};
		} else {
			styleElement = createStyleElement(options);
			update = applyToTag.bind(null, styleElement);
			remove = function() {
				removeStyleElement(styleElement);
			};
		}
	
		update(obj);
	
		return function updateStyle(newObj) {
			if(newObj) {
				if(newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap)
					return;
				update(obj = newObj);
			} else {
				remove();
			}
		};
	}
	
	var replaceText = (function () {
		var textStore = [];
	
		return function (index, replacement) {
			textStore[index] = replacement;
			return textStore.filter(Boolean).join('\n');
		};
	})();
	
	function applyToSingletonTag(styleElement, index, remove, obj) {
		var css = remove ? "" : obj.css;
	
		if (styleElement.styleSheet) {
			styleElement.styleSheet.cssText = replaceText(index, css);
		} else {
			var cssNode = document.createTextNode(css);
			var childNodes = styleElement.childNodes;
			if (childNodes[index]) styleElement.removeChild(childNodes[index]);
			if (childNodes.length) {
				styleElement.insertBefore(cssNode, childNodes[index]);
			} else {
				styleElement.appendChild(cssNode);
			}
		}
	}
	
	function applyToTag(styleElement, obj) {
		var css = obj.css;
		var media = obj.media;
	
		if(media) {
			styleElement.setAttribute("media", media)
		}
	
		if(styleElement.styleSheet) {
			styleElement.styleSheet.cssText = css;
		} else {
			while(styleElement.firstChild) {
				styleElement.removeChild(styleElement.firstChild);
			}
			styleElement.appendChild(document.createTextNode(css));
		}
	}
	
	function updateLink(linkElement, obj) {
		var css = obj.css;
		var sourceMap = obj.sourceMap;
	
		if(sourceMap) {
			// http://stackoverflow.com/a/26603875
			css += "\n/*# sourceMappingURL=data:application/json;base64," + btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))) + " */";
		}
	
		var blob = new Blob([css], { type: "text/css" });
	
		var oldSrc = linkElement.href;
	
		linkElement.href = URL.createObjectURL(blob);
	
		if(oldSrc)
			URL.revokeObjectURL(oldSrc);
	}


/***/ }),
/* 76 */
/***/ (function(module, exports, __webpack_require__) {

	// style-loader: Adds some css to the DOM by adding a <style> tag
	
	// load the styles
	var content = __webpack_require__(77);
	if(typeof content === 'string') content = [[module.id, content, '']];
	// add the styles to the DOM
	var update = __webpack_require__(75)(content, {});
	if(content.locals) module.exports = content.locals;
	// Hot Module Replacement
	if(false) {
		// When the styles change, update the <style> tags
		if(!content.locals) {
			module.hot.accept("!!../../node_modules/css-loader/index.js!./light.css", function() {
				var newContent = require("!!../../node_modules/css-loader/index.js!./light.css");
				if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];
				update(newContent);
			});
		}
		// When the module is disposed, remove the <style> tags
		module.hot.dispose(function() { update(); });
	}

/***/ }),
/* 77 */
/***/ (function(module, exports, __webpack_require__) {

	exports = module.exports = __webpack_require__(47)();
	// imports
	
	
	// module
	exports.push([module.id, "\n/* text color */\n\n/** Turn this off to avoid affecting Jupyter notebook\n* {\n    color: #555555;\n}\n\ninput,\ntextarea,\nbutton,\nselect,\noption {\n    color: #111111;\n}\n\ninput[type=range]:focus:after {\n    color: #555555;\n}\n\na{\n    color: #1956d8;\n}\n\ninput.Number, input.File {\n    color: #79952e;\n}\n\n\n/* background color */\n\n.OverlayPanel,\n#menubar_ngl,\n#menubar_ngl .menu .options,\n#sidebar_ngl,\n#toolbar_ngl\n{\n    background-color: #e1e4eb;\n}\n\n\n/* border color */\n\n.OverlayPanel,\n#menubar_ngl .menu .options hr,\n#sidebar_ngl > .Panel,\n#sidebar_ngl > .Content > .Panel {\n    border-color: #cccccc;\n}\n\n\n/* special */\n\n#menubar_ngl .menu .options .option:hover,\n.option:hover > .Icon,\n.option:hover > .Text {\n    color: #D8D8D8;\n    background-color: #345a69;\n}\n\n.highlight,\n.highlight > .Icon,\n.highlight > .Text {\n    color: #D8D8D8;\n    background-color: #345a69;\n}\n\n.EllipsisMultilineText:after {\n    background: linear-gradient(to right, rgba(255, 255, 255, 0), #e1e4eb 50%, #e1e4eb);\n}\n", ""]);
	
	// exports


/***/ }),
/* 78 */
/***/ (function(module, exports, __webpack_require__) {

	// style-loader: Adds some css to the DOM by adding a <style> tag
	
	// load the styles
	var content = __webpack_require__(79);
	if(typeof content === 'string') content = [[module.id, content, '']];
	// add the styles to the DOM
	var update = __webpack_require__(75)(content, {});
	if(content.locals) module.exports = content.locals;
	// Hot Module Replacement
	if(false) {
		// When the styles change, update the <style> tags
		if(!content.locals) {
			module.hot.accept("!!../../node_modules/css-loader/index.js!./main.css", function() {
				var newContent = require("!!../../node_modules/css-loader/index.js!./main.css");
				if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];
				update(newContent);
			});
		}
		// When the module is disposed, remove the <style> tags
		module.hot.dispose(function() { update(); });
	}

/***/ }),
/* 79 */
/***/ (function(module, exports, __webpack_require__) {

	exports = module.exports = __webpack_require__(47)();
	// imports
	
	
	// module
	exports.push([module.id, "\n* {\n\tvertical-align: middle;\n}\n\n/* Webkit micro scrollbars */\n\n::-webkit-scrollbar {\n    width:9px;\n    height:9px;\n}\n\n::-webkit-scrollbar-track {\n    -webkit-border-radius:5px;\n    border-radius:5px;\n    background:rgba(140,140,140,0.1);\n}\n\n::-webkit-scrollbar-thumb {\n    -webkit-border-radius:5px;\n    border-radius:5px;\n    background:rgba(140,140,140,0.2);\n}\n\n::-webkit-scrollbar-thumb:hover {\n    background:rgba(140,140,140,0.4);\n}\n\n::-webkit-scrollbar-thumb:window-inactive {\n    background:rgba(140,140,140,0.5);\n}\n\n/* elmement */\n\nbody {\n\tfont-family: Arial, sans-serif;\n\tfont-size: 14px;\n\tmargin: 0;\n\t/* overflow: hidden; */ /*will cause unscroll in notebook embeding*/\n}\n\nhr {\n\tborder: 0px;\n\tborder-top: 1px solid #ccc;\n}\n\nbutton {\n    position: relative;\n    margin-left: 0px;\n}\n\nselect {\n    margin-left: 1px;\n}\n\n/* NOTE (FIXME): turning this on will affect notebook */\n\n/**\ntextarea {\n\twhite-space: pre;\n\tword-wrap: normal;\n}\n\n\ttextarea.success {\n\t\tborder-color: #8b8 !important;\n\t}\n\n\ttextarea.fail {\n\t\tborder-color: #f00 !important;\n\t\tbackground-color: rgba(255,0,0,0.05);\n\t}\n\ntextarea, input { outline: none; } /* osx */\n\ninput.Number {\n    font-size: 12px;                            /** TODO: Use of !imporant is not ideal **/\n    background-color: transparent!important;    /* For now this is a quick fix a rendering issue due to inherited background */\n    border: 1px solid transparent;\n    padding: 2px;\n    cursor: col-resize;\n}\n\ninput.File {\n    border: 0px solid !important;\n    padding: 0px !important;\n}\n\ninput[type=range]:focus:after {\n    position: absolute;\n    transform: translate(-100%,-50% );\n    content: attr(value);\n    font-size: 12px;\n}\n\n/* class */\n\n.deleteInfo:after {\n    position: absolute;\n    transform: translate(-50%,-250% );\n    content: \"double-click to delete\";\n    font-size: 10px;\n    display: block;\n}\n\n.Panel {\n\n    -moz-user-select: none;\n    -webkit-user-select: none;\n    -ms-user-select: none;\n\n    /* No support for these yet */\n    -o-user-select: none;\n    user-select: none;\n}\n\n.OverlayPanel {\n    z-index: 10;\n    position: absolute;\n    padding: 10px;\n    overflow: auto;\n    border: 1px solid;\n}\n\n.OverlayPanel:focus {\n    z-index: 20;\n}\n\n.Text {\n    cursor: default;\n}\n\n.FancySelect {\n    padding: 0;\n    cursor: default;\n    overflow: auto;\n    outline: none;\n}\n\n    .FancySelect .option {\n        padding: 4px;\n        white-space: nowrap;\n    }\n\n.CollapsiblePanel .CollapsiblePanelButton {\n    float: left;\n    margin-right: 6px;\n    width: 0px;\n    height: 0px;\n    border: 6px solid transparent;\n}\n\n.CollapsiblePanel.collapsed > .CollapsiblePanelButton {\n    margin-top: 2px;\n    border-left-color: #555;\n}\n\n.CollapsiblePanel:not(.collapsed) > .CollapsiblePanelButton {\n    margin-top: 6px;\n    border-top-color: #555;\n}\n\n.CollapsiblePanel.collapsed .CollapsibleContent {\n    display: none;\n}\n\n.CollapsiblePanel:not(.collapsed) > .CollapsibleContent {\n    clear: both;\n}\n\n/* http://www.brianchu.com/blog/2013/11/02/creating-an-auto-growing-text-input/ */\n\n.AdaptiveTextAreaContainer {\n    position: relative;\n    display: inline-block;\n    margin-top: 2px;\n    margin-bottom: 2px;\n}\n\n.AdaptiveTextArea, .AdaptiveTextAreaSize {\n    min-height: 21px;\n    /* need to manually set font and font size */\n    font-family: Arial, sans-serif;\n    font-size: 13px;\n    box-sizing: border-box;\n    padding: 2px;\n    border: 1px solid #ccc;\n\n    overflow: hidden;\n    width: 100%;\n}\n\n.AdaptiveTextArea {\n    height: 100%;\n    position: absolute;\n    resize: none;\n\n    /*\n    \"pre\" or \"preline\" or \"normal\" fixes Chrome issue where\n    whitespace at end of lines does not trigger a line break.\n    However, it causes the text to exhibit the behavior seen with\n    \"pre\" that is described below.\n    */\n    white-space: normal;\n    word-wrap: break-word;\n    overflow-wrap: break-word;\n}\n\n.AdaptiveTextAreaSize {\n    visibility: hidden;\n\n    /*\n    Pre-wrap: preserve spacing and newlines, but wrap text.\n    Pre: preserve spacing and newlines but don't wrap text.\n\n    \"pre\" does not wrap well on Firefox, even with word-wrap:break-word.\n    \"pre\" on Chrome works with word-wrap, but exhibits different behavior:\n    Instead of entire words being moved to the next line for wrapping,\n    the browser will cut words in the middle for wrapping.\n    \"pre-line\" has Firefox issues\n    */\n    white-space: pre-wrap;\n    /* Required for wrapping lines in Webkit,\n    but not necessary in Firefox if you have white-space wrapping\n    (pre-wrap, normal, pre-line) already set */\n    word-wrap: break-word;\n    overflow-wrap: break-word;\n}\n\n/* FlexiColorPicker */\n\n.picker-wrapper,\n.slide-wrapper {\n    position: relative;\n    float: left;\n}\n\n.picker-indicator,\n.slide-indicator {\n    position: absolute;\n    left: 0;\n    top: 0;\n    pointer-events: none;\n}\n\n.picker,\n.slide {\n    cursor: crosshair;\n    float: left;\n}\n\n.slide-wrapper {\n    margin-left: 10px;\n}\n\n.picker-indicator {\n    width: 5px;\n    height: 5px;\n    border: 2px solid darkblue;\n    -moz-border-radius: 4px;\n    -o-border-radius: 4px;\n    -webkit-border-radius: 4px;\n    border-radius: 4px;\n    opacity: .5;\n    -ms-filter: \"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)\";\n    filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=50);\n    filter: alpha(opacity=50);\n    background-color: white;\n}\n\n.slide-indicator {\n    width: 100%;\n    height: 10px;\n    left: -4px;\n    opacity: .6;\n    -ms-filter: \"progid:DXImageTransform.Microsoft.Alpha(Opacity=60)\";\n    filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=60);\n    filter: alpha(opacity=60);\n    border: 4px solid lightblue;\n    -moz-border-radius: 4px;\n    -o-border-radius: 4px;\n    -webkit-border-radius: 4px;\n    border-radius: 4px;\n    background-color: white;\n}\n\n/* http://www.mobify.com/blog/multiline-ellipsis-in-pure-css/ */\n\n.EllipsisMultilineText {\n    overflow: hidden;\n    max-height: 2.6em;\n    line-height: 1.3em;\n}\n\n.EllipsisMultilineText:before {\n    content:\"\";\n    float: left;\n    width: 5px;\n    max-height: 2.6em;\n}\n\n.EllipsisMultilineText > *:first-child {\n    float: right;\n    width: 100%;\n    margin-top: 0px;\n    margin-bottom: 0px;\n    margin-left: -5px;\n    word-wrap: break-word;\n}\n\n.EllipsisMultilineText:after {\n    content: \"\\2026\";\n\n    box-sizing: content-box;\n    -webkit-box-sizing: content-box;\n    -moz-box-sizing: content-box;\n\n    float: right; position: relative;\n    top: 1.3em; left: 100%;\n    width: 3em; margin-left: -3em;\n    padding-right: 5px;\n\n    text-align: right;\n}\n\n/* resize */\n\n.ResizeLeft, .ResizeLeft:hover {\n    position: relative;\n    float: left;\n    height: 100%;\n    width: 10px;\n}\n\n.ResizeLeft:hover{\n    cursor: col-resize;\n}\n\n/* virtual list */\n\n.VirtualListRow {\n    position: absolute;\n    overflow: hidden;\n    white-space: nowrap;\n    display: inline-block;\n}\n\n.VirtualListRow > .Text {\n    cursor: inherit;\n}\n\n/* id */\n\n#viewport {\n    position: absolute;\n    top: 32px;\n    left: 0px;\n    right: 300px;\n    bottom: 32px;\n}\n\n#menubar_ngl {\n    position: absolute;\n    width: 100%;\n    height: 32px;\n    padding: 0px;\n    margin: 0px;\n    z-index: 100;\n    top: 0px;\n    left: 0px;\n}\n\n    #menubar_ngl .menu {\n        float: left;\n        cursor: pointer;\n        position: relative;\n    }\n\n        #menubar_ngl .menu .title {\n            margin: 0px;\n            padding: 8px;\n        }\n\n        #menubar_ngl .menu .options {\n            display: none;\n            padding: 5px 0px;\n            width: 140px;\n            position: absolute;\n            top: 32px;\n        }\n\n        #menubar_ngl .menu:hover .options {\n            display: block;\n            max-height: 600px;\n            overflow: auto;\n        }\n\n            #menubar_ngl .menu .options .option {\n                background-color: transparent;\n                padding: 5px 10px;\n                margin: 0px !important;\n            }\n\n#sidebar_ngl {\n    position: absolute;\n    right: 0px;\n    top: 32px;\n    bottom: 0px;\n    width: 300px;\n    overflow: hidden;\n}\n\n    #sidebar_ngl .Panel {\n        margin-bottom: 10px;\n    }\n\n    #sidebar_ngl .Panel.collapsed {\n        margin-bottom: 0px;\n    }\n\n    #sidebar_ngl .CollapsibleContent {\n        margin-top: 10px;\n    }\n\n    #sidebar_ngl > .Panel {\n        padding: 10px;\n        border-top: 1px solid;\n    }\n\n    #sidebar_ngl > .Content > .Panel {\n        padding: 10px;\n        border-top: 1px solid;\n    }\n\n    #sidebar_ngl .Content {\n        top: 40px;\n        bottom: 0px;\n        position: absolute;\n        overflow: auto;\n        right: 0px;\n        width: 100%;\n    }\n\n#toolbar_ngl {\n    position: absolute;\n    left: 0px;\n    right: 300px;\n    bottom: 0px;\n    height: 32px;\n}\n\n    #toolbar_ngl .Panel {\n        padding: 6px;\n    }\n\n    #toolbar_ngl button {\n        margin-right: 6px;\n    }\n", ""]);
	
	// exports


/***/ })
/******/ ])});;
//# sourceMappingURL=index.js.map